From 90c70ba3aa0dcd93dd52a3721d0852405faf06a8 Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 11 Oct 2024 10:22:58 +0530 Subject: [PATCH 01/45] feat(devbox): Bootstrap code. Figuring out the workfow. --- press/press/doctype/devbox/__init__.py | 0 press/press/doctype/devbox/devbox.js | 22 +++++ press/press/doctype/devbox/devbox.json | 87 +++++++++++++++++++ press/press/doctype/devbox/devbox.py | 36 ++++++++ press/press/doctype/devbox/test_devbox.py | 9 ++ .../doctype/proxy_server/proxy_server.json | 4 +- .../doctype/proxy_server/proxy_server.py | 6 +- press/press/doctype/server/server.json | 16 +++- press/press/doctype/server/server.py | 3 +- 9 files changed, 172 insertions(+), 11 deletions(-) create mode 100644 press/press/doctype/devbox/__init__.py create mode 100644 press/press/doctype/devbox/devbox.js create mode 100644 press/press/doctype/devbox/devbox.json create mode 100644 press/press/doctype/devbox/devbox.py create mode 100644 press/press/doctype/devbox/test_devbox.py diff --git a/press/press/doctype/devbox/__init__.py b/press/press/doctype/devbox/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/press/press/doctype/devbox/devbox.js b/press/press/doctype/devbox/devbox.js new file mode 100644 index 0000000000..5260a566f1 --- /dev/null +++ b/press/press/doctype/devbox/devbox.js @@ -0,0 +1,22 @@ +// Copyright (c) 2024, Frappe and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Devbox', { + refresh(frm) { + frm.add_custom_button( + __('Get Available CPU and RAM'), + () => { + frm.call('get_available_cpu_and_ram'); + }, + __('Information'), + ); + + frm.add_custom_button( + __('Pull Latest Image'), + () => { + frm.call('pull_latest_image'); + }, + __('Container'), + ); + }, +}); diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json new file mode 100644 index 0000000000..3b737676d1 --- /dev/null +++ b/press/press/doctype/devbox/devbox.json @@ -0,0 +1,87 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2024-10-08 12:57:16.367361", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "server_section", + "server", + "status", + "machine_configuration_section", + "cpu_cores", + "ram", + "disk_mb" + ], + "fields": [ + { + "fieldname": "server_section", + "fieldtype": "Section Break", + "label": "Metadata" + }, + { + "fieldname": "server", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Server", + "options": "Server", + "reqd": 1 + }, + { + "fieldname": "status", + "fieldtype": "Select", + "label": "Status", + "options": "Pending\nStarting\nPaused\nRunning\nArchived\nExited" + }, + { + "fieldname": "machine_configuration_section", + "fieldtype": "Section Break", + "label": "Machine Configuration" + }, + { + "fieldname": "cpu_cores", + "fieldtype": "Int", + "in_list_view": 1, + "label": "CPU Cores (vCPU)", + "reqd": 1 + }, + { + "fieldname": "ram", + "fieldtype": "Int", + "in_list_view": 1, + "label": "RAM (MB)", + "reqd": 1 + }, + { + "fieldname": "disk_mb", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Disk (GB)", + "reqd": 1 + } + ], + "index_web_pages_for_search": 1, + "links": [], + "modified": "2024-10-08 13:19:33.087453", + "modified_by": "Administrator", + "module": "Press", + "name": "Devbox", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py new file mode 100644 index 0000000000..95e789c9f8 --- /dev/null +++ b/press/press/doctype/devbox/devbox.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024, Frappe and contributors +# For license information, please see license.txt + +# import frappe +import frappe +from frappe.model.document import Document + + +class Devbox(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + cpu_cores: DF.Int + disk_mb: DF.Int + ram: DF.Int + server: DF.Link + status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited"] + # end: auto-generated types + pass + + @frappe.whitelist() + def get_available_cpu_and_ram(self): + print("meow") + + @frappe.whitelist() + def pull_latest_image(self): + print("meow") + + + + diff --git a/press/press/doctype/devbox/test_devbox.py b/press/press/doctype/devbox/test_devbox.py new file mode 100644 index 0000000000..d95bd6dc89 --- /dev/null +++ b/press/press/doctype/devbox/test_devbox.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, Frappe and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestDevbox(FrappeTestCase): + pass diff --git a/press/press/doctype/proxy_server/proxy_server.json b/press/press/doctype/proxy_server/proxy_server.json index 6b1b73e31d..99e8a77c55 100644 --- a/press/press/doctype/proxy_server/proxy_server.json +++ b/press/press/doctype/proxy_server/proxy_server.json @@ -160,7 +160,7 @@ "fieldname": "provider", "fieldtype": "Select", "label": "Provider", - "options": "Generic\nScaleway\nAWS EC2\nOCI", + "options": "Generic\nScaleway\nAWS EC2\nOCI\nHetzner", "set_only_once": 1 }, { @@ -400,7 +400,7 @@ } ], "links": [], - "modified": "2024-09-10 15:44:10.989216", + "modified": "2024-10-01 16:20:05.048227", "modified_by": "Administrator", "module": "Press", "name": "Proxy Server", diff --git a/press/press/doctype/proxy_server/proxy_server.py b/press/press/doctype/proxy_server/proxy_server.py index f2d77c5f81..a964b538ff 100644 --- a/press/press/doctype/proxy_server/proxy_server.py +++ b/press/press/doctype/proxy_server/proxy_server.py @@ -26,9 +26,7 @@ class ProxyServer(BaseServer): if TYPE_CHECKING: from frappe.types import DF - from press.press.doctype.proxy_server_domain.proxy_server_domain import ( - ProxyServerDomain, - ) + from press.press.doctype.proxy_server_domain.proxy_server_domain import ProxyServerDomain agent_password: DF.Password | None cluster: DF.Link | None @@ -53,7 +51,7 @@ class ProxyServer(BaseServer): private_ip_interface_id: DF.Data | None private_mac_address: DF.Data | None private_vlan_id: DF.Data | None - provider: DF.Literal["Generic", "Scaleway", "AWS EC2", "OCI"] + provider: DF.Literal["Generic", "Scaleway", "AWS EC2", "OCI", "Hetzner"] proxysql_admin_password: DF.Password | None proxysql_monitor_password: DF.Password | None public: DF.Check diff --git a/press/press/doctype/server/server.json b/press/press/doctype/server/server.json index ba70493f3d..18b70408a5 100644 --- a/press/press/doctype/server/server.json +++ b/press/press/doctype/server/server.json @@ -21,6 +21,7 @@ "is_self_hosted", "is_server_renamed", "public", + "is_devbox_server", "billing_section", "team", "column_break_11", @@ -257,7 +258,7 @@ "fieldname": "provider", "fieldtype": "Select", "label": "Provider", - "options": "Generic\nScaleway\nAWS EC2\nOCI", + "options": "Generic\nScaleway\nAWS EC2\nOCI\nHetzner", "set_only_once": 1 }, { @@ -313,7 +314,7 @@ "options": "Virtual Machine" }, { - "default": "1", + "default": "0", "fieldname": "new_worker_allocation", "fieldtype": "Check", "label": "New Worker Allocation" @@ -444,7 +445,7 @@ "fieldtype": "Column Break" }, { - "default": "1", + "default": "0", "fieldname": "set_bench_memory_limits", "fieldtype": "Check", "label": "Set Bench Memory Limits" @@ -523,10 +524,17 @@ "fieldtype": "Int", "label": "Auto Add Storage Max", "non_negative": 1 + }, + { + "default": "0", + "fieldname": "is_devbox_server", + "fieldtype": "Check", + "label": "Is Devbox Server", + "set_only_once": 1 } ], "links": [], - "modified": "2024-09-24 12:56:06.423649", + "modified": "2024-10-08 12:33:27.346822", "modified_by": "Administrator", "module": "Press", "name": "Server", diff --git a/press/press/doctype/server/server.py b/press/press/doctype/server/server.py index 1f794ef553..4e31719f9d 100644 --- a/press/press/doctype/server/server.py +++ b/press/press/doctype/server/server.py @@ -1152,6 +1152,7 @@ class Server(BaseServer): hostname_abbreviation: DF.Data | None ignore_incidents_since: DF.Datetime | None ip: DF.Data | None + is_devbox_server: DF.Check is_managed_database: DF.Check is_primary: DF.Check is_replication_setup: DF.Check @@ -1169,7 +1170,7 @@ class Server(BaseServer): private_ip: DF.Data | None private_mac_address: DF.Data | None private_vlan_id: DF.Data | None - provider: DF.Literal["Generic", "Scaleway", "AWS EC2", "OCI"] + provider: DF.Literal["Generic", "Scaleway", "AWS EC2", "OCI", "Hetzner"] proxy_server: DF.Link | None public: DF.Check ram: DF.Float From 69c3f467d9a29e6d2ce7d35a97882a0643c2057f Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 18 Oct 2024 14:43:48 +0530 Subject: [PATCH 02/45] feat(devboxes): create a directory called devboxes inside /home/frappe/ --- press/playbooks/roles/devbox/tasks/main.yml | 7 +++++++ press/playbooks/server.yml | 1 + 2 files changed, 8 insertions(+) create mode 100644 press/playbooks/roles/devbox/tasks/main.yml diff --git a/press/playbooks/roles/devbox/tasks/main.yml b/press/playbooks/roles/devbox/tasks/main.yml new file mode 100644 index 0000000000..8e40d52d7b --- /dev/null +++ b/press/playbooks/roles/devbox/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- name: Create Devboxes Directory + become: yes + become_user: frappe + file: + dest: /home/frappe/devboxes + state: directory \ No newline at end of file diff --git a/press/playbooks/server.yml b/press/playbooks/server.yml index ed7991a64b..cd032437fb 100644 --- a/press/playbooks/server.yml +++ b/press/playbooks/server.yml @@ -10,6 +10,7 @@ - role: nginx - role: agent - role: bench + - role: devbox - role: docker - role: node_exporter - role: cadvisor From db49dc26b6d2156336aef98f3c9c6397646403ef Mon Sep 17 00:00:00 2001 From: Arun Date: Fri, 18 Oct 2024 16:01:16 +0530 Subject: [PATCH 03/45] fix(devbox): add property job setter --- press/press/doctype/devbox/devbox.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 95e789c9f8..03563f61db 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -24,7 +24,7 @@ class Devbox(Document): pass @frappe.whitelist() - def get_available_cpu_and_ram(self): + def get_available_cpu_and_ram(self): print("meow") @frappe.whitelist() @@ -34,3 +34,4 @@ def pull_latest_image(self): +x \ No newline at end of file From 6bc4f548312de2d430680754e3aa5f34c786150d Mon Sep 17 00:00:00 2001 From: Arun Date: Mon, 21 Oct 2024 11:47:23 +0530 Subject: [PATCH 04/45] feat(devboxes): Added Jobs and made changes to the Devbox doctype --- press/fixtures/agent_job_type.json | 48 ++++++++++++++++++++++++++ press/press/doctype/devbox/devbox.json | 28 ++++++++++++++- press/press/doctype/devbox/devbox.py | 22 ++++++++---- 3 files changed, 90 insertions(+), 8 deletions(-) diff --git a/press/fixtures/agent_job_type.json b/press/fixtures/agent_job_type.json index 2c6ac111b2..2ee7e794ea 100644 --- a/press/fixtures/agent_job_type.json +++ b/press/fixtures/agent_job_type.json @@ -2182,5 +2182,53 @@ "step_name": "Bench Restart" } ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-10-21 11:00:39.229673", + "name": "New Devbox", + "request_method": "POST", + "request_path": "/devboxes", + "steps": [ + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Initialize Devbox" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run Devbox" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Devbox Setup NGINX" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-10-21 11:18:53.122319", + "name": "Start Devbox", + "request_method": "POST", + "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", + "steps": [ + { + "parent": "Start Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run Devbox" + } + ] } ] \ No newline at end of file diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 3b737676d1..15438755a1 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -6,6 +6,10 @@ "engine": "InnoDB", "field_order": [ "server_section", + "subdomain", + "domain", + "initialized", + "column_break_cdoo", "server", "status", "machine_configuration_section", @@ -58,11 +62,33 @@ "in_list_view": 1, "label": "Disk (GB)", "reqd": 1 + }, + { + "fieldname": "subdomain", + "fieldtype": "Data", + "label": "Subdomain", + "reqd": 1 + }, + { + "fieldname": "domain", + "fieldtype": "Link", + "label": "Domain", + "options": "Root Domain" + }, + { + "fieldname": "column_break_cdoo", + "fieldtype": "Column Break" + }, + { + "default": "0", + "fieldname": "initialized", + "fieldtype": "Check", + "label": "Initialized" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-10-08 13:19:33.087453", + "modified": "2024-10-21 11:41:21.197374", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 03563f61db..adce0719d4 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -1,7 +1,8 @@ # Copyright (c) 2024, Frappe and contributors # For license information, please see license.txt -# import frappe +from __future__ import annotations + import frappe from frappe.model.document import Document @@ -17,21 +18,28 @@ class Devbox(Document): cpu_cores: DF.Int disk_mb: DF.Int + domain: DF.Link | None + initialized: DF.Check ram: DF.Int server: DF.Link status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited"] + subdomain: DF.Data # end: auto-generated types pass + def _get_devbox_name(self, subdomain: str): + """Get full devbox domain name given subdomain.""" + if not self.domain: + self.domain = frappe.db.get_single_value("Press Settings", "domain") + return f"{subdomain}.{self.domain}" + + def autoname(self): + self.name = self._get_devbox_name(subdomain=self.subdomain) + @frappe.whitelist() - def get_available_cpu_and_ram(self): + def get_available_cpu_and_ram(self): print("meow") @frappe.whitelist() def pull_latest_image(self): print("meow") - - - - -x \ No newline at end of file From fa56630fb2820f258da6606ce2368a8d91f38571 Mon Sep 17 00:00:00 2001 From: Arun Date: Tue, 22 Oct 2024 11:10:58 +0530 Subject: [PATCH 05/45] feat(devbox): process job updates. added few doctype fields as well to track the same --- press/agent.py | 83 ++++++-------------- press/press/doctype/agent_job/agent_job.json | 9 ++- press/press/doctype/agent_job/agent_job.py | 11 ++- press/press/doctype/devbox/devbox.js | 16 ++-- press/press/doctype/devbox/devbox.json | 12 ++- press/press/doctype/devbox/devbox.py | 31 ++++++++ 6 files changed, 91 insertions(+), 71 deletions(-) diff --git a/press/agent.py b/press/agent.py index 4fcfe0c3d7..2b54006d36 100644 --- a/press/agent.py +++ b/press/agent.py @@ -1,10 +1,9 @@ -# -*- coding: utf-8 -*- # Copyright (c) 2020, Frappe and contributors # For license information, please see license.txt -from contextlib import suppress import _io import json import os +from contextlib import suppress from datetime import date from typing import TYPE_CHECKING, List @@ -17,8 +16,8 @@ if TYPE_CHECKING: from io import BufferedReader - from press.press.doctype.app_patch.app_patch import AgentPatchConfig, AppPatch from press.press.doctype.agent_job.agent_job import AgentJob + from press.press.doctype.app_patch.app_patch import AgentPatchConfig, AppPatch from press.press.doctype.site.site import Site @@ -67,9 +66,7 @@ def new_bench(self, bench): return self.create_agent_job("New Bench", "benches", data, bench=bench.name) def archive_bench(self, bench): - return self.create_agent_job( - "Archive Bench", f"benches/{bench.name}/archive", bench=bench.name - ) + return self.create_agent_job("Archive Bench", f"benches/{bench.name}/archive", bench=bench.name) def restart_bench(self, bench, web_only=False): return self.create_agent_job( @@ -112,9 +109,7 @@ def _get_mariadb_root_password(self, site): return get_decrypted_password(doctype, name, field) def _get_managed_db_config(self, site): - managed_database_service = frappe.get_cached_value( - "Bench", site.bench, "managed_database_service" - ) + managed_database_service = frappe.get_cached_value("Bench", site.bench, "managed_database_service") if not managed_database_service: return {} @@ -188,9 +183,7 @@ def restore_site(self, site: "Site", skip_failing_patches=False): site=site.name, ) - def rename_site( - self, site, new_name: str, create_user: dict = None, config: dict = None - ): + def rename_site(self, site, new_name: str, create_user: dict = None, config: dict = None): data = {"new_name": new_name} if create_user: data["create_user"] = create_user @@ -382,9 +375,7 @@ def restore_site_tables(self, site): site=site.name, ) - def update_site_recover_move( - self, site, target, deploy_type, activate, rollback_scripts=None - ): + def update_site_recover_move(self, site, target, deploy_type, activate, rollback_scripts=None): data = {"target": target, "activate": activate, "rollback_scripts": rollback_scripts} return self.create_agent_job( f"Recover Failed Site {deploy_type}", @@ -451,18 +442,14 @@ def backup_site(self, site, with_files=False, offsite=False): settings = frappe.get_single("Press Settings") backups_path = os.path.join(site.name, str(date.today())) backup_bucket = get_backup_bucket(site.cluster, region=True) - bucket_name = ( - backup_bucket.get("name") if isinstance(backup_bucket, dict) else backup_bucket - ) + bucket_name = backup_bucket.get("name") if isinstance(backup_bucket, dict) else backup_bucket if settings.aws_s3_bucket or bucket_name: auth = { "ACCESS_KEY": settings.offsite_backups_access_key_id, "SECRET_KEY": settings.get_password("offsite_backups_secret_access_key"), "REGION": backup_bucket.get("region") if isinstance(backup_bucket, dict) else "", } - data.update( - {"offsite": {"bucket": bucket_name, "auth": auth, "path": backups_path}} - ) + data.update({"offsite": {"bucket": bucket_name, "auth": auth, "path": backups_path}}) else: log_error("Offsite Backups aren't set yet") @@ -513,15 +500,11 @@ def new_host(self, domain, skip_reload=False): ) def setup_wildcard_hosts(self, wildcards): - return self.create_agent_job( - "Add Wildcard Hosts to Proxy", "proxy/wildcards", wildcards - ) + return self.create_agent_job("Add Wildcard Hosts to Proxy", "proxy/wildcards", wildcards) def setup_redirects(self, site: str, domains: List[str], target: str): data = {"domains": domains, "target": target} - return self.create_agent_job( - "Setup Redirects on Hosts", "proxy/hosts/redirects", data, site=site - ) + return self.create_agent_job("Setup Redirects on Hosts", "proxy/hosts/redirects", data, site=site) def remove_redirects(self, site: str, domains: List[str]): data = {"domains": domains} @@ -545,16 +528,12 @@ def new_server(self, server): _server = frappe.get_doc("Server", server) ip = _server.ip if _server.is_self_hosted else _server.private_ip data = {"name": ip} - return self.create_agent_job( - "Add Upstream to Proxy", "proxy/upstreams", data, upstream=server - ) + return self.create_agent_job("Add Upstream to Proxy", "proxy/upstreams", data, upstream=server) def update_upstream_private_ip(self, server): ip, private_ip = frappe.db.get_value("Server", server, ["ip", "private_ip"]) data = {"name": private_ip} - return self.create_agent_job( - "Rename Upstream", f"proxy/upstreams/{ip}/rename", data, upstream=server - ) + return self.create_agent_job("Rename Upstream", f"proxy/upstreams/{ip}/rename", data, upstream=server) def new_upstream_file(self, server, site=None, code_server=None): _server = frappe.get_doc("Server", server) @@ -570,9 +549,7 @@ def new_upstream_file(self, server, site=None, code_server=None): upstream=server, ) - def remove_upstream_file( - self, server, site=None, site_name=None, code_server=None, skip_reload=False - ): + def remove_upstream_file(self, server, site=None, site_name=None, code_server=None, skip_reload=False): _server = frappe.get_doc("Server", server) ip = _server.ip if _server.is_self_hosted else _server.private_ip doctype = "Site" if site else "Code Server" @@ -647,9 +624,7 @@ def add_proxysql_user(self, site, database, username, password, database_server) "database": database, "backend": {"ip": database_server.private_ip, "id": database_server.server_id}, } - return self.create_agent_job( - "Add User to ProxySQL", "proxysql/users", data, site=site.name - ) + return self.create_agent_job("Add User to ProxySQL", "proxysql/users", data, site=site.name) def add_proxysql_backend(self, database_server): data = { @@ -673,9 +648,7 @@ def create_database_access_credentials(self, site, mode): "Database Server", database_server, "mariadb_root_password" ), } - credentials = self.post( - f"benches/{site.bench}/sites/{site.name}/credentials", data=data - ) + credentials = self.post(f"benches/{site.bench}/sites/{site.name}/credentials", data=data) return credentials def revoke_database_access_credentials(self, site): @@ -686,9 +659,7 @@ def revoke_database_access_credentials(self, site): "Database Server", database_server, "mariadb_root_password" ), } - return self.post( - f"benches/{site.bench}/sites/{site.name}/credentials/revoke", data=data - ) + return self.post(f"benches/{site.bench}/sites/{site.name}/credentials/revoke", data=data) def update_site_status(self, server, site, status, skip_reload=False): data = {"status": status, "skip_reload": skip_reload} @@ -729,9 +700,7 @@ def request(self, method, path, data=None, files=None, agent_job=None, raises=Tr "Press Settings", "Press Settings", "backbone_intermediate_ca" ) if frappe.conf.developer_mode and intermediate_ca: - root_ca = frappe.db.get_value( - "Certificate Authority", intermediate_ca, "parent_authority" - ) + root_ca = frappe.db.get_value("Certificate Authority", intermediate_ca, "parent_authority") verify = frappe.get_doc("Certificate Authority", root_ca).certificate_file else: verify = True @@ -782,13 +751,9 @@ def request(self, method, path, data=None, files=None, agent_job=None, raises=Tr ) def raise_if_past_requests_have_failed(self): - failures = frappe.db.get_value( - "Agent Request Failure", {"server": self.server}, "failure_count" - ) + failures = frappe.db.get_value("Agent Request Failure", {"server": self.server}, "failure_count") if failures: - raise AgentRequestSkippedException( - f"Previous {failures} requests have failed. Try again later." - ) + raise AgentRequestSkippedException(f"Previous {failures} requests have failed. Try again later.") def log_request_failure(self, exc): filters = { @@ -862,6 +827,7 @@ def create_agent_job( bench=None, site=None, code_server=None, + devbox=None, upstream=None, host=None, reference_doctype=None, @@ -893,6 +859,7 @@ def create_agent_job( "host": host, "site": site, "code_server": code_server, + "devbox": devbox, "upstream": upstream, "status": "Undelivered", "request_method": method, @@ -1087,9 +1054,7 @@ def upload_build_context_for_docker_build( file: "BufferedReader", dc_name: str, ) -> str | None: - if res := self.request( - "POST", f"builder/upload/{dc_name}", files={"build_context_file": file} - ): + if res := self.request("POST", f"builder/upload/{dc_name}", files={"build_context_file": file}): return res.get("filename") return None @@ -1139,9 +1104,7 @@ def get_site_apps(self, site): raw_apps_list = self.get( f"benches/{site.bench}/sites/{site.name}/apps", ) - apps: list[str] = [ - line.split()[0] for line in raw_apps_list["data"].splitlines() if line - ] + apps: list[str] = [line.split()[0] for line in raw_apps_list["data"].splitlines() if line] return apps diff --git a/press/press/doctype/agent_job/agent_job.json b/press/press/doctype/agent_job/agent_job.json index d629786440..3a2647e5e3 100644 --- a/press/press/doctype/agent_job/agent_job.json +++ b/press/press/doctype/agent_job/agent_job.json @@ -13,6 +13,7 @@ "bench", "site", "code_server", + "devbox", "upstream", "host", "request_section", @@ -250,11 +251,17 @@ { "fieldname": "column_break_ayyq", "fieldtype": "Column Break" + }, + { + "fieldname": "devbox", + "fieldtype": "Link", + "label": "Devbox", + "options": "Devbox" } ], "in_create": 1, "links": [], - "modified": "2024-08-23 16:32:27.447230", + "modified": "2024-10-22 10:55:39.763578", "modified_by": "Administrator", "module": "Press", "name": "Agent Job", diff --git a/press/press/doctype/agent_job/agent_job.py b/press/press/doctype/agent_job/agent_job.py index b42ef3aa2a..9a59113106 100644 --- a/press/press/doctype/agent_job/agent_job.py +++ b/press/press/doctype/agent_job/agent_job.py @@ -24,6 +24,7 @@ from press.press.doctype.agent_job_type.agent_job_type import ( get_retryable_job_types_and_max_retry_count, ) +from press.press.doctype.devbox.devbox import process_new_devbox_job_update from press.press.doctype.site_migration.site_migration import ( get_ongoing_migration, job_matches_site_migration, @@ -47,6 +48,7 @@ class AgentJob(Document): callback_failure_count: DF.Int code_server: DF.Link | None data: DF.Code | None + devbox: DF.Link | None duration: DF.Time | None end: DF.Datetime | None host: DF.Link | None @@ -938,7 +940,10 @@ def process_job_updates(job_name: str, response_data: dict | None = None): # no elif job.job_type == "Uninstall App from Site": process_uninstall_app_site_job_update(job) elif job.job_type == "Add Site to Upstream": - process_new_site_job_update(job) + if is_devbox(devbox_name=job.devbox): + process_new_devbox_job_update(job=job) + else: + process_new_site_job_update(job) elif job.job_type == "Add Code Server to Upstream" or job.job_type == "Setup Code Server": process_new_code_server_job_update(job) elif job.job_type == "Start Code Server": @@ -1105,3 +1110,7 @@ def update_query_result_status_timestamps(results): if result.end: result.end = convert_utc_to_system_timezone(result.end).replace(tzinfo=None) + + +def is_devbox(devbox_name: str): + return frappe.db.exists(dt="Devbox", dn=devbox_name) diff --git a/press/press/doctype/devbox/devbox.js b/press/press/doctype/devbox/devbox.js index 5260a566f1..a313a09c17 100644 --- a/press/press/doctype/devbox/devbox.js +++ b/press/press/doctype/devbox/devbox.js @@ -11,12 +11,14 @@ frappe.ui.form.on('Devbox', { __('Information'), ); - frm.add_custom_button( - __('Pull Latest Image'), - () => { - frm.call('pull_latest_image'); - }, - __('Container'), - ); + if (!frm.doc.initialized) { + frm.add_custom_button( + __('Initialize'), + () => { + frm.call('initialize_devbox'); + }, + __('Actions'), + ); + } }, }); diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 15438755a1..381299a5b6 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -9,6 +9,7 @@ "subdomain", "domain", "initialized", + "add_site_to_upstream", "column_break_cdoo", "server", "status", @@ -83,12 +84,19 @@ "default": "0", "fieldname": "initialized", "fieldtype": "Check", - "label": "Initialized" + "label": "Initialized", + "read_only": 1 + }, + { + "default": "0", + "fieldname": "add_site_to_upstream", + "fieldtype": "Check", + "label": "Add Site to Upstream" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-10-21 11:41:21.197374", + "modified": "2024-10-22 11:03:19.535266", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index adce0719d4..0bcff29abc 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -3,9 +3,16 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import frappe from frappe.model.document import Document +from press.agent import Agent + +if TYPE_CHECKING: + from press.press.doctype.agent_job.agent_job import AgentJob + class Devbox(Document): # begin: auto-generated types @@ -16,6 +23,7 @@ class Devbox(Document): if TYPE_CHECKING: from frappe.types import DF + add_site_to_upstream: DF.Check cpu_cores: DF.Int disk_mb: DF.Int domain: DF.Link | None @@ -40,6 +48,29 @@ def autoname(self): def get_available_cpu_and_ram(self): print("meow") + @frappe.whitelist() + def initialize_devbox(self): + devbox = self + server_agent = Agent(server_type="Server", server=devbox.server) + server_agent.create_agent_job("New Devbox", path="devboxes", data={"devbox_name: ": devbox.name}) + reverse_proxy = frappe.db.get_value(doctype="Server", filters=devbox.server, fieldname="proxy_server") + proxy_agent = Agent(server_type="Proxy Server", server=reverse_proxy) + server_private_ip = frappe.db.get_value( + doctype="Server", filters=devbox.server, fieldname="private_ip" + ) + proxy_agent.create_agent_job( + "Add Site to Upstream", + path=f"proxy/upstreams/{server_private_ip}/sites", + data={"name": devbox.name}, + upstream=devbox.server, + devbox=devbox.name, + ) + @frappe.whitelist() def pull_latest_image(self): print("meow") + + +def process_new_devbox_job_update(job: AgentJob): + if job.status == "Success": + frappe.db.set_value(dt="Devbox", dn=job.devbox, field="add_site_to_upstream", val=True) From 02149ab98be4e05e63cd902618f8aea846f8611f Mon Sep 17 00:00:00 2001 From: Arun Date: Tue, 22 Oct 2024 12:08:59 +0530 Subject: [PATCH 06/45] feat(devboxes): tracking machine status --- press/press/doctype/agent_job/agent_job.py | 2 ++ press/press/doctype/devbox/devbox.json | 12 ++++++++---- press/press/doctype/devbox/devbox.py | 21 +++++++++++++++------ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/press/press/doctype/agent_job/agent_job.py b/press/press/doctype/agent_job/agent_job.py index 9a59113106..0e74548540 100644 --- a/press/press/doctype/agent_job/agent_job.py +++ b/press/press/doctype/agent_job/agent_job.py @@ -1011,6 +1011,8 @@ def process_job_updates(job_name: str, response_data: dict | None = None): # no Bench.process_update_inplace(job) elif job.job_type == "Recover Update In Place": Bench.process_recover_update_inplace(job) + elif job.job_type == "New Devbox": + process_new_devbox_job_update(job=job) except Exception as e: failure_count = job.callback_failure_count + 1 diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 381299a5b6..3862f38522 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -84,8 +84,7 @@ "default": "0", "fieldname": "initialized", "fieldtype": "Check", - "label": "Initialized", - "read_only": 1 + "label": "Initialized" }, { "default": "0", @@ -96,7 +95,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-10-22 11:03:19.535266", + "modified": "2024-10-22 12:06:40.756899", "modified_by": "Administrator", "module": "Press", "name": "Devbox", @@ -117,5 +116,10 @@ ], "sort_field": "modified", "sort_order": "DESC", - "states": [] + "states": [ + { + "color": "Blue", + "title": "Starting" + } + ] } \ No newline at end of file diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 0bcff29abc..0d702b44eb 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -52,7 +52,12 @@ def get_available_cpu_and_ram(self): def initialize_devbox(self): devbox = self server_agent = Agent(server_type="Server", server=devbox.server) - server_agent.create_agent_job("New Devbox", path="devboxes", data={"devbox_name: ": devbox.name}) + server_agent.create_agent_job( + "New Devbox", + path="devboxes", + data={"devbox_name": devbox.name}, + devbox=devbox.name, + ) reverse_proxy = frappe.db.get_value(doctype="Server", filters=devbox.server, fieldname="proxy_server") proxy_agent = Agent(server_type="Proxy Server", server=reverse_proxy) server_private_ip = frappe.db.get_value( @@ -66,11 +71,15 @@ def initialize_devbox(self): devbox=devbox.name, ) - @frappe.whitelist() - def pull_latest_image(self): - print("meow") - def process_new_devbox_job_update(job: AgentJob): - if job.status == "Success": + if job.job_type == "New Devbox" and job.status == "Success": + frappe.db.set_value(dt="Devbox", dn=job.devbox, field="initialized", val=True) + + if job.job_type == "Add Site to Upstream" and job.status == "Success": frappe.db.set_value(dt="Devbox", dn=job.devbox, field="add_site_to_upstream", val=True) + + status = frappe.db.get_value("Devbox", job.devbox, ["initialized", "add_site_to_upstream"], as_dict=True) + + if status.initialized and status.add_site_to_upstream: + frappe.db.set_value(dt="Devbox", dn=job.devbox, field="status", val="Starting") From 7c9eb9ced9502e371e7ee77bf4cbadef6a336314 Mon Sep 17 00:00:00 2001 From: Arun Date: Tue, 22 Oct 2024 12:30:37 +0530 Subject: [PATCH 07/45] feat(devbox): add go to devbox link on desk --- press/press/doctype/devbox/devbox.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/press/press/doctype/devbox/devbox.js b/press/press/doctype/devbox/devbox.js index a313a09c17..aa1e6bccc3 100644 --- a/press/press/doctype/devbox/devbox.js +++ b/press/press/doctype/devbox/devbox.js @@ -20,5 +20,11 @@ frappe.ui.form.on('Devbox', { __('Actions'), ); } + + if (['Starting', 'Running'].includes(frm.doc.status)) { + frm.add_custom_button(__('Go to Devbox'), () => { + window.open(`https://${frm.doc.name}/vnc.html`, '_blank'); + }); + } }, }); From f2861ec1a022dce96d50365053debffa0dfd2a7c Mon Sep 17 00:00:00 2001 From: Arun Date: Tue, 22 Oct 2024 15:35:57 +0530 Subject: [PATCH 08/45] feat(devboxes): persist websockify port on sucessful running --- press/press/doctype/devbox/devbox.json | 16 +++++++++++++++- press/press/doctype/devbox/devbox.py | 5 +++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 3862f38522..ec8854f0b6 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -10,6 +10,8 @@ "domain", "initialized", "add_site_to_upstream", + "websockify_port", + "vnc_port", "column_break_cdoo", "server", "status", @@ -91,11 +93,23 @@ "fieldname": "add_site_to_upstream", "fieldtype": "Check", "label": "Add Site to Upstream" + }, + { + "fieldname": "websockify_port", + "fieldtype": "Int", + "label": "Websockify Port", + "read_only": 1 + }, + { + "fieldname": "vnc_port", + "fieldtype": "Int", + "label": "VNC Port", + "read_only": 1 } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-10-22 12:06:40.756899", + "modified": "2024-10-22 12:53:58.512208", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 0d702b44eb..0f4e1819dc 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -3,6 +3,7 @@ from __future__ import annotations +import json from typing import TYPE_CHECKING import frappe @@ -32,6 +33,8 @@ class Devbox(Document): server: DF.Link status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited"] subdomain: DF.Data + vnc_port: DF.Int + websockify_port: DF.Int # end: auto-generated types pass @@ -75,6 +78,8 @@ def initialize_devbox(self): def process_new_devbox_job_update(job: AgentJob): if job.job_type == "New Devbox" and job.status == "Success": frappe.db.set_value(dt="Devbox", dn=job.devbox, field="initialized", val=True) + websockify_port = json.loads(job.data)["message"]["websockify_port"] + frappe.db.set_value(dt="Devbox", dn=job.devbox, field="websockify_port", val=websockify_port) if job.job_type == "Add Site to Upstream" and job.status == "Success": frappe.db.set_value(dt="Devbox", dn=job.devbox, field="add_site_to_upstream", val=True) From a0f670747681c1be1cef8f0b0bc5b3495c6b0b93 Mon Sep 17 00:00:00 2001 From: Arun Date: Wed, 23 Oct 2024 19:49:26 +0530 Subject: [PATCH 09/45] fix(devbox): sync status --- press/press/doctype/devbox/devbox.js | 18 +++++++++++++++--- press/press/doctype/devbox/devbox.json | 12 +++++++++++- press/press/doctype/devbox/devbox.py | 11 +++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/press/press/doctype/devbox/devbox.js b/press/press/doctype/devbox/devbox.js index aa1e6bccc3..7e5c39626c 100644 --- a/press/press/doctype/devbox/devbox.js +++ b/press/press/doctype/devbox/devbox.js @@ -21,10 +21,22 @@ frappe.ui.form.on('Devbox', { ); } + frm.add_custom_button( + __('Sync Status'), + () => { + frm.call('sync_devbox_status'); + }, + __('Actions'), + ); + if (['Starting', 'Running'].includes(frm.doc.status)) { - frm.add_custom_button(__('Go to Devbox'), () => { - window.open(`https://${frm.doc.name}/vnc.html`, '_blank'); - }); + frm.add_custom_button( + __('Go to Devbox'), + () => { + window.open(`https://${frm.doc.name}/vnc.html`, '_blank'); + }, + __('Actions'), + ); } }, }); diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index ec8854f0b6..2d4c1e31da 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -16,6 +16,7 @@ "server", "status", "machine_configuration_section", + "container_id", "cpu_cores", "ram", "disk_mb" @@ -105,11 +106,16 @@ "fieldtype": "Int", "label": "VNC Port", "read_only": 1 + }, + { + "fieldname": "container_id", + "fieldtype": "Data", + "label": "Container ID" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-10-22 12:53:58.512208", + "modified": "2024-10-22 16:56:33.409187", "modified_by": "Administrator", "module": "Press", "name": "Devbox", @@ -134,6 +140,10 @@ { "color": "Blue", "title": "Starting" + }, + { + "color": "Green", + "title": "Running" } ] } \ No newline at end of file diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 0f4e1819dc..e111a43e64 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -25,6 +25,7 @@ class Devbox(Document): from frappe.types import DF add_site_to_upstream: DF.Check + container_id: DF.Data | None cpu_cores: DF.Int disk_mb: DF.Int domain: DF.Link | None @@ -74,6 +75,16 @@ def initialize_devbox(self): devbox=devbox.name, ) + @frappe.whitelist() + def sync_devbox_status(self): + agent = Agent(server_type="Server", server=self.server) + result = agent.post(f"devboxes/{self.name}/status") + status = result.get("output").title() + # hoping this is a error. I know this is shit code. + if len(status) > 10: + status = "Exited" + frappe.db.set_value(dt="Devbox", dn=self.name, field="status", val=status) + def process_new_devbox_job_update(job: AgentJob): if job.job_type == "New Devbox" and job.status == "Success": From 04fe4b43d7f55356e43696c445bb7afe2b665640 Mon Sep 17 00:00:00 2001 From: Arun Date: Wed, 23 Oct 2024 20:58:09 +0530 Subject: [PATCH 10/45] fix(devbox): process job updates --- press/fixtures/agent_job_type.json | 182 ++++++++++++++------- press/press/doctype/agent_job/agent_job.py | 2 +- press/press/doctype/devbox/devbox.js | 20 +++ press/press/doctype/devbox/devbox.json | 17 +- press/press/doctype/devbox/devbox.py | 27 +++ 5 files changed, 183 insertions(+), 65 deletions(-) diff --git a/press/fixtures/agent_job_type.json b/press/fixtures/agent_job_type.json index 2ee7e794ea..8a043203c6 100644 --- a/press/fixtures/agent_job_type.json +++ b/press/fixtures/agent_job_type.json @@ -1,4 +1,46 @@ [ + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-08-20 12:32:56.100866", + "name": "Update In Place", + "request_method": "POST", + "request_path": "/bench/{bench}/update_inplace", + "steps": [ + { + "parent": "Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Pull App Changes" + }, + { + "parent": "Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Migrate Sites" + }, + { + "parent": "Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rebuild Bench Assets" + }, + { + "parent": "Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Commit Container Changes" + }, + { + "parent": "Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Restart" + } + ] + }, { "disabled_auto_retry": 0, "docstatus": 0, @@ -1979,36 +2021,6 @@ } ] }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.626647", - "name": "Add Site to Upstream", - "request_method": "POST", - "request_path": "/proxy/upstreams/{upstream}/sites", - "steps": [ - { - "parent": "Add Site to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Add Site File to Upstream Directory" - }, - { - "parent": "Add Site to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Generate NGINX Configuration" - }, - { - "parent": "Add Site to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Reload NGINX" - } - ] - }, { "disabled_auto_retry": 0, "docstatus": 0, @@ -2123,24 +2135,6 @@ } ] }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-09-11 13:28:32.120581", - "name": "Ping Job", - "request_method": "POST", - "request_path": "ping_job", - "steps": [ - { - "parent": "Ping Job", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Ping Step" - } - ] - }, { "disabled_auto_retry": 1, "docstatus": 0, @@ -2188,28 +2182,82 @@ "docstatus": 0, "doctype": "Agent Job Type", "max_retry_count": 3, - "modified": "2024-10-21 11:00:39.229673", - "name": "New Devbox", + "modified": "2024-10-21 11:18:53.122319", + "name": "Start Devbox", "request_method": "POST", - "request_path": "/devboxes", + "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", "steps": [ { - "parent": "New Devbox", + "parent": "Start Devbox", "parentfield": "steps", "parenttype": "Agent Job Type", - "step_name": "Initialize Devbox" + "step_name": "Run Devbox" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-10-23 20:30:22.356484", + "name": "Stop Devbox", + "request_method": "POST", + "request_path": "devboxes/{devbox.name}/stop", + "steps": [ + { + "parent": "Stop Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Stop Devbox" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-09-11 13:28:32.120581", + "name": "Ping Job", + "request_method": "POST", + "request_path": "ping_job", + "steps": [ + { + "parent": "Ping Job", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Ping Step" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.626647", + "name": "Add Site to Upstream", + "request_method": "POST", + "request_path": "/proxy/upstreams/{upstream}/sites", + "steps": [ + { + "parent": "Add Site to Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Site File to Upstream Directory" }, { - "parent": "New Devbox", + "parent": "Add Site to Upstream", "parentfield": "steps", "parenttype": "Agent Job Type", - "step_name": "Run Devbox" + "step_name": "Generate NGINX Configuration" }, { - "parent": "New Devbox", + "parent": "Add Site to Upstream", "parentfield": "steps", "parenttype": "Agent Job Type", - "step_name": "Devbox Setup NGINX" + "step_name": "Reload NGINX" } ] }, @@ -2218,16 +2266,28 @@ "docstatus": 0, "doctype": "Agent Job Type", "max_retry_count": 3, - "modified": "2024-10-21 11:18:53.122319", - "name": "Start Devbox", + "modified": "2024-10-21 11:00:39.229673", + "name": "New Devbox", "request_method": "POST", - "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", + "request_path": "/devboxes", "steps": [ { - "parent": "Start Devbox", + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Initialize Devbox" + }, + { + "parent": "New Devbox", "parentfield": "steps", "parenttype": "Agent Job Type", "step_name": "Run Devbox" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Devbox Setup NGINX" } ] } diff --git a/press/press/doctype/agent_job/agent_job.py b/press/press/doctype/agent_job/agent_job.py index 0e74548540..27b342d967 100644 --- a/press/press/doctype/agent_job/agent_job.py +++ b/press/press/doctype/agent_job/agent_job.py @@ -1011,7 +1011,7 @@ def process_job_updates(job_name: str, response_data: dict | None = None): # no Bench.process_update_inplace(job) elif job.job_type == "Recover Update In Place": Bench.process_recover_update_inplace(job) - elif job.job_type == "New Devbox": + elif job.job_type == "New Devbox" or job.job_type == "Start Devbox" or job.job_type == "Stop Devbox": process_new_devbox_job_update(job=job) except Exception as e: diff --git a/press/press/doctype/devbox/devbox.js b/press/press/doctype/devbox/devbox.js index 7e5c39626c..668819c7ed 100644 --- a/press/press/doctype/devbox/devbox.js +++ b/press/press/doctype/devbox/devbox.js @@ -21,6 +21,26 @@ frappe.ui.form.on('Devbox', { ); } + if (frm.doc.status == 'Exited') { + frm.add_custom_button( + __('Start'), + () => { + frm.call('start_devbox'); + }, + __('Actions'), + ); + } + + if (!(frm.doc.status == 'Exited')) { + frm.add_custom_button( + __('Stop'), + () => { + frm.call('stop_devbox'); + }, + __('Actions'), + ); + } + frm.add_custom_button( __('Sync Status'), () => { diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 2d4c1e31da..b592f9fbc1 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -114,8 +114,14 @@ } ], "index_web_pages_for_search": 1, - "links": [], - "modified": "2024-10-22 16:56:33.409187", + "links": [ + { + "group": "Logs", + "link_doctype": "Agent Job", + "link_fieldname": "devbox" + } + ], + "modified": "2024-10-23 20:42:24.345812", "modified_by": "Administrator", "module": "Press", "name": "Devbox", @@ -144,6 +150,11 @@ { "color": "Green", "title": "Running" + }, + { + "color": "Red", + "title": "Exited" } - ] + ], + "track_changes": 1 } \ No newline at end of file diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index e111a43e64..71c1ea6ca6 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -75,6 +75,26 @@ def initialize_devbox(self): devbox=devbox.name, ) + @frappe.whitelist() + def start_devbox(self): + devbox = self + server_agent = Agent(server_type="Server", server=devbox.server) + server_agent.create_agent_job( + "Start Devbox", + path=f"devboxes/{devbox.name}/{devbox.websockify_port}/start", + devbox=devbox.name, + ) + + @frappe.whitelist() + def stop_devbox(self): + devbox = self + server_agent = Agent(server_type="Server", server=devbox.server) + server_agent.create_agent_job( + "Stop Devbox", + path=f"devboxes/{devbox.name}/stop", + devbox=devbox.name, + ) + @frappe.whitelist() def sync_devbox_status(self): agent = Agent(server_type="Server", server=self.server) @@ -95,6 +115,13 @@ def process_new_devbox_job_update(job: AgentJob): if job.job_type == "Add Site to Upstream" and job.status == "Success": frappe.db.set_value(dt="Devbox", dn=job.devbox, field="add_site_to_upstream", val=True) + if job.job_type == "Start Devbox" and job.status == "Success": + devbox = frappe.get_doc("Devbox", job.devbox) + devbox.sync_devbox_status() + + if job.job_type == "Stop Devbox" and job.status == "Success": + frappe.db.set_value(dt="Devbox", dn=job.devbox, field="status", val="Exited") + status = frappe.db.get_value("Devbox", job.devbox, ["initialized", "add_site_to_upstream"], as_dict=True) if status.initialized and status.add_site_to_upstream: From f8f8081f91fe0f6a3ad892d8b480145f27e1e7ea Mon Sep 17 00:00:00 2001 From: Arun Date: Wed, 23 Oct 2024 21:12:13 +0530 Subject: [PATCH 11/45] fix(ruff): ci was breaking --- press/agent.py | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/press/agent.py b/press/agent.py index 2b54006d36..21c18dea9c 100644 --- a/press/agent.py +++ b/press/agent.py @@ -1,11 +1,13 @@ # Copyright (c) 2020, Frappe and contributors # For license information, please see license.txt -import _io +from __future__ import annotations + +import _io # type: ignore import json import os from contextlib import suppress from datetime import date -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING import frappe import requests @@ -27,7 +29,7 @@ class Agent: from requests import Response - response: "Optional[Response]" + response: "Response | None" def __init__(self, server, server_type="Server"): self.server_type = server_type @@ -121,7 +123,7 @@ def _get_managed_db_config(self, site): as_dict=1, ) - def new_site(self, site, create_user: dict = None): + def new_site(self, site, create_user: dict | None = None): apps = [app.app for app in site.apps] data = { @@ -183,7 +185,7 @@ def restore_site(self, site: "Site", skip_failing_patches=False): site=site.name, ) - def rename_site(self, site, new_name: str, create_user: dict = None, config: dict = None): + def rename_site(self, site, new_name: str, create_user: dict | None = None, config: dict | None = None): data = {"new_name": new_name} if create_user: data["create_user"] = create_user @@ -229,7 +231,7 @@ def optimize_tables(self, site): site=site.name, ) - def rename_upstream_site(self, server: str, site, new_name: str, domains: List[str]): + def rename_upstream_site(self, server: str, site, new_name: str, domains: list[str]): _server = frappe.get_doc("Server", server) ip = _server.ip if _server.is_self_hosted else _server.private_ip data = {"new_name": new_name, "domains": domains} @@ -502,11 +504,11 @@ def new_host(self, domain, skip_reload=False): def setup_wildcard_hosts(self, wildcards): return self.create_agent_job("Add Wildcard Hosts to Proxy", "proxy/wildcards", wildcards) - def setup_redirects(self, site: str, domains: List[str], target: str): + def setup_redirects(self, site: str, domains: list[str], target: str): data = {"domains": domains, "target": target} return self.create_agent_job("Setup Redirects on Hosts", "proxy/hosts/redirects", data, site=site) - def remove_redirects(self, site: str, domains: List[str]): + def remove_redirects(self, site: str, domains: list[str]): data = {"domains": domains} return self.create_agent_job( "Remove Redirects on Hosts", @@ -648,8 +650,7 @@ def create_database_access_credentials(self, site, mode): "Database Server", database_server, "mariadb_root_password" ), } - credentials = self.post(f"benches/{site.bench}/sites/{site.name}/credentials", data=data) - return credentials + return self.post(f"benches/{site.bench}/sites/{site.name}/credentials", data=data) def revoke_database_access_credentials(self, site): database_server = frappe.db.get_value("Bench", site.bench, "database_server") @@ -916,12 +917,10 @@ def get_similar_in_execution_job( def update_monitor_rules(self, rules, routes): data = {"rules": rules, "routes": routes} - status = self.post("monitor/rules", data=data) - return status + return self.post("monitor/rules", data=data) def get_job_status(self, id): - status = self.get(f"jobs/{id}") - return status + return self.get(f"jobs/{id}") def get_site_sid(self, site, user=None): if user: @@ -935,6 +934,7 @@ def get_site_info(self, site): result = self.get(f"benches/{site.bench}/sites/{site.name}/info") if result: return result["data"] + return None def get_sites_info(self, bench, since): return self.post(f"benches/{bench.name}/info", data={"since": since}) @@ -943,6 +943,7 @@ def get_site_analytics(self, site): result = self.get(f"benches/{site.bench}/sites/{site.name}/analytics") if result: return result["data"] + return None def get_sites_analytics(self, bench): return self.get(f"benches/{bench.name}/analytics") @@ -984,16 +985,13 @@ def ping(self): return self.get("ping")["message"] def fetch_monitor_data(self, bench): - data = self.post(f"benches/{bench}/monitor")["data"] - return data + return self.post(f"benches/{bench}/monitor")["data"] def fetch_site_status(self, site): - data = self.get(f"benches/{site.bench}/sites/{site.name}/status")["data"] - return data + return self.get(f"benches/{site.bench}/sites/{site.name}/status")["data"] def fetch_bench_status(self, bench): - data = self.get(f"benches/{bench}/status") - return data + return self.get(f"benches/{bench}/status") def run_after_migrate_steps(self, site): data = { From f457057f9159109ce2958c29622ded1fa78cbd8e Mon Sep 17 00:00:00 2001 From: Arun Date: Wed, 23 Oct 2024 21:17:02 +0530 Subject: [PATCH 12/45] style(ruff): was breaking ci --- .../doctype/proxy_server/proxy_server.py | 70 ++++++------------- 1 file changed, 20 insertions(+), 50 deletions(-) diff --git a/press/press/doctype/proxy_server/proxy_server.py b/press/press/doctype/proxy_server/proxy_server.py index a964b538ff..d9c5afabab 100644 --- a/press/press/doctype/proxy_server/proxy_server.py +++ b/press/press/doctype/proxy_server/proxy_server.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- # Copyright (c) 2020, Frappe and contributors # For license information, please see license.txt - +from __future__ import annotations from typing import TYPE_CHECKING @@ -9,13 +8,13 @@ from frappe.utils import unique from press.agent import Agent -from press.press.doctype.root_domain.root_domain import RootDomain from press.press.doctype.server.server import BaseServer from press.runner import Ansible from press.utils import log_error if TYPE_CHECKING: from press.press.doctype.bench.bench import Bench + from press.press.doctype.root_domain.root_domain import RootDomain class ProxyServer(BaseServer): @@ -26,6 +25,7 @@ class ProxyServer(BaseServer): if TYPE_CHECKING: from frappe.types import DF + from press.press.doctype.proxy_server_domain.proxy_server_domain import ProxyServerDomain agent_password: DF.Password | None @@ -81,7 +81,7 @@ def validate_domains(self): code_servers = [row.code_server for row in self.domains] # Always include self.domain in the domains child table # Remove duplicates - domains = unique([self.domain] + domains) + domains = unique([self.domain, *domains]) self.domains = [] for i, domain in enumerate(domains): if not frappe.db.exists( @@ -131,23 +131,17 @@ def _setup_server(self): "TLS Certificate", {"wildcard": True, "domain": self.domain}, "name" ) certificate = frappe.get_doc("TLS Certificate", certificate_name) - monitoring_password = frappe.get_doc("Cluster", self.cluster).get_password( - "monitoring_password" - ) + monitoring_password = frappe.get_doc("Cluster", self.cluster).get_password("monitoring_password") log_server = frappe.db.get_single_value("Press Settings", "log_server") if log_server: - kibana_password = frappe.get_doc("Log Server", log_server).get_password( - "kibana_password" - ) + kibana_password = frappe.get_doc("Log Server", log_server).get_password("kibana_password") else: kibana_password = None try: ansible = Ansible( - playbook="self_hosted_proxy.yml" - if getattr(self, "is_self_hosted", False) - else "proxy.yml", + playbook="self_hosted_proxy.yml" if getattr(self, "is_self_hosted", False) else "proxy.yml", server=self, user=self.ssh_user or "root", port=self.ssh_port or 22, @@ -179,9 +173,7 @@ def _setup_server(self): self.save() def _install_exporters(self): - monitoring_password = frappe.get_doc("Cluster", self.cluster).get_password( - "monitoring_password" - ) + monitoring_password = frappe.get_doc("Cluster", self.cluster).get_password("monitoring_password") try: ansible = Ansible( playbook="proxy_exporters.yml", @@ -199,9 +191,7 @@ def _install_exporters(self): @frappe.whitelist() def setup_ssh_proxy(self): - frappe.enqueue_doc( - self.doctype, self.name, "_setup_ssh_proxy", queue="long", timeout=1200 - ) + frappe.enqueue_doc(self.doctype, self.name, "_setup_ssh_proxy", queue="long", timeout=1200) def _setup_ssh_proxy(self): settings = frappe.db.get_value( @@ -236,9 +226,7 @@ def _setup_ssh_proxy(self): def setup_fail2ban(self): self.status = "Installing" self.save() - frappe.enqueue_doc( - self.doctype, self.name, "_setup_fail2ban", queue="long", timeout=1200 - ) + frappe.enqueue_doc(self.doctype, self.name, "_setup_fail2ban", queue="long", timeout=1200) def _setup_fail2ban(self): try: @@ -259,9 +247,7 @@ def _setup_fail2ban(self): @frappe.whitelist() def setup_proxysql(self): - frappe.enqueue_doc( - self.doctype, self.name, "_setup_proxysql", queue="long", timeout=1200 - ) + frappe.enqueue_doc(self.doctype, self.name, "_setup_proxysql", queue="long", timeout=1200) def _setup_proxysql(self): try: @@ -292,9 +278,7 @@ def _setup_proxysql(self): def setup_replication(self): self.status = "Installing" self.save() - frappe.enqueue_doc( - self.doctype, self.name, "_setup_replication", queue="long", timeout=1200 - ) + frappe.enqueue_doc(self.doctype, self.name, "_setup_replication", queue="long", timeout=1200) def _setup_replication(self): self._setup_secondary() @@ -349,9 +333,7 @@ def trigger_failover(self): return self.status = "Installing" self.save() - frappe.enqueue_doc( - self.doctype, self.name, "_trigger_failover", queue="long", timeout=3600 - ) + frappe.enqueue_doc(self.doctype, self.name, "_trigger_failover", queue="long", timeout=3600) def stop_primary(self): primary = frappe.get_doc("Proxy Server", self.primary) @@ -385,9 +367,7 @@ def remove_primarys_access(self): playbook="failover_remove_primary_access.yml", server=self, variables={ - "primary_public_key": frappe.db.get_value( - "Proxy Server", self.primary, "frappe_public_key" - ) + "primary_public_key": frappe.db.get_value("Proxy Server", self.primary, "frappe_public_key") }, ) ansible.run() @@ -443,9 +423,7 @@ def add_ssh_users_for_existing_benches(self): bench.add_ssh_user() def update_app_servers(self): - frappe.db.set_value( - "Server", {"proxy_server": self.primary}, "proxy_server", self.name - ) + frappe.db.set_value("Server", {"proxy_server": self.primary}, "proxy_server", self.name) def switch_primary(self): frappe.db.set_value("Proxy Server", self.primary, "is_primary", False) @@ -456,9 +434,7 @@ def switch_primary(self): @frappe.whitelist() def setup_proxysql_monitor(self): - frappe.enqueue_doc( - self.doctype, self.name, "_setup_proxysql_monitor", queue="long", timeout=1200 - ) + frappe.enqueue_doc(self.doctype, self.name, "_setup_proxysql_monitor", queue="long", timeout=1200) def _setup_proxysql_monitor(self): try: @@ -484,9 +460,7 @@ def _setup_proxysql_monitor(self): @frappe.whitelist() def setup_wireguard(self): if not self.private_ip_interface_id: - play = frappe.get_last_doc( - "Ansible Play", {"play": "Ping Server", "server": self.name} - ) + play = frappe.get_last_doc("Ansible Play", {"play": "Ping Server", "server": self.name}) task = frappe.get_doc("Ansible Task", {"play": play.name, "task": "Gather Facts"}) import json @@ -495,9 +469,7 @@ def setup_wireguard(self): if task_res[i]["ipv4"]["address"] == self.private_ip: self.private_ip_interface_id = task_res[i]["device"] self.save() - frappe.enqueue_doc( - self.doctype, self.name, "_setup_wireguard", queue="long", timeout=1200 - ) + frappe.enqueue_doc(self.doctype, self.name, "_setup_wireguard", queue="long", timeout=1200) def _setup_wireguard(self): try: @@ -514,7 +486,7 @@ def _setup_wireguard(self): "wireguard_private_key": False, "wireguard_public_key": False, "peers": "", - "reload_wireguard": True if self.is_wireguard_setup else False, + "reload_wireguard": bool(self.is_wireguard_setup), }, ) play = ansible.run() @@ -534,9 +506,7 @@ def _setup_wireguard(self): @frappe.whitelist() def reload_wireguard(self): - frappe.enqueue_doc( - "Proxy Server", self.name, "_reload_wireguard", queue="default", timeout=1200 - ) + frappe.enqueue_doc("Proxy Server", self.name, "_reload_wireguard", queue="default", timeout=1200) def _reload_wireguard(self): import json From 0ad1b784bc80856397d98c62855e6c536677b2c9 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Tue, 29 Oct 2024 06:33:23 +0000 Subject: [PATCH 13/45] feat(devboxes): wip added dockerfile to build devboxes --- devbox-dockerfile/Dockerfile | 49 ++++++++++++++++++++++++++++++ devbox-dockerfile/entrypoint.sh | 2 ++ devbox-dockerfile/supervisord.conf | 48 +++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 devbox-dockerfile/Dockerfile create mode 100644 devbox-dockerfile/entrypoint.sh create mode 100644 devbox-dockerfile/supervisord.conf diff --git a/devbox-dockerfile/Dockerfile b/devbox-dockerfile/Dockerfile new file mode 100644 index 0000000000..860ad01af2 --- /dev/null +++ b/devbox-dockerfile/Dockerfile @@ -0,0 +1,49 @@ +FROM debian:12-slim + +ENV DEBIAN_FRONTEND=noninteractive + +# Install required packages +RUN apt-get update && apt-get install -y \ + xfce4 \ + xfce4-terminal \ + tigervnc-standalone-server \ + tigervnc-common \ + novnc \ + websockify \ + supervisor \ + curl \ + wget \ + git \ + net-tools \ + procps \ + xauth \ + dbus-x11 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install code-server +RUN curl -fsSL https://code-server.dev/install.sh | sh + +# Create necessary directories and files +RUN mkdir -p /root/.vnc /var/log/supervisor && \ + touch /root/.Xauthority + +# Set up VNC configuration +COPY xstartup /root/.vnc/xstartup +RUN chmod +x /root/.vnc/xstartup + +# Set VNC password +RUN echo "password" | vncpasswd -f > /root/.vnc/passwd && \ + chmod 600 /root/.vnc/passwd + +# Copy supervisor configuration +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# Create cleanup script +COPY cleanup.sh /cleanup.sh +RUN chmod +x /cleanup.sh + +# Expose ports +EXPOSE 8080 8443 5901 + +CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] \ No newline at end of file diff --git a/devbox-dockerfile/entrypoint.sh b/devbox-dockerfile/entrypoint.sh new file mode 100644 index 0000000000..e7a619f380 --- /dev/null +++ b/devbox-dockerfile/entrypoint.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf \ No newline at end of file diff --git a/devbox-dockerfile/supervisord.conf b/devbox-dockerfile/supervisord.conf new file mode 100644 index 0000000000..3685f514c5 --- /dev/null +++ b/devbox-dockerfile/supervisord.conf @@ -0,0 +1,48 @@ +[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:cleanup] +command=/cleanup.sh +autostart=true +autorestart=false +startsecs=0 +priority=1 + +[program:vncserver] +command=/usr/bin/vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup /root/.vnc/xstartup +user=root +autostart=true +autorestart=unexpected +startsecs=5 +startretries=3 +exitcodes=0 +stopsignal=QUIT +stopwaitsecs=10 +priority=100 +stdout_logfile=/var/log/supervisor/vncserver.log +stderr_logfile=/var/log/supervisor/vncserver.err + +[program:novnc] +command=/usr/bin/websockify --web=/usr/share/novnc 8080 localhost:5901 +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +priority=200 +stdout_logfile=/var/log/supervisor/novnc.log +stderr_logfile=/var/log/supervisor/novnc.err + +[program:code-server] +command=/usr/bin/code-server --bind-addr 0.0.0.0:8443 --auth none +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +priority=300 +stdout_logfile=/var/log/supervisor/code-server.log +stderr_logfile=/var/log/supervisor/code-server.err \ No newline at end of file From 611690dfb92af5a22b653d4fe0b8a1e34fbd4e3b Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Wed, 30 Oct 2024 17:08:31 +0000 Subject: [PATCH 14/45] feat(devboxes): install bench dependencies --- devbox-dockerfile/Dockerfile | 44 +++++-- devbox-dockerfile/supervisord.conf | 183 ++++++++++++++++++++++++++--- 2 files changed, 198 insertions(+), 29 deletions(-) diff --git a/devbox-dockerfile/Dockerfile b/devbox-dockerfile/Dockerfile index 860ad01af2..30617e65c9 100644 --- a/devbox-dockerfile/Dockerfile +++ b/devbox-dockerfile/Dockerfile @@ -18,32 +18,56 @@ RUN apt-get update && apt-get install -y \ procps \ xauth \ dbus-x11 \ + firefox-esr \ + mariadb-server \ + mariadb-client \ + python3-dev \ + python3-pip \ + redis-server \ + xvfb \ + libfontconfig \ + wkhtmltopdf \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # Install code-server RUN curl -fsSL https://code-server.dev/install.sh | sh +# Install NVM, Node.js, and Yarn +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash && \ + export NVM_DIR="/root/.nvm" && \ + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \ + [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" && \ + nvm install 18 && \ + npm install -g yarn + +# Install Bench CLI +RUN pip3 install frappe-bench --break-system-packages + # Create necessary directories and files RUN mkdir -p /root/.vnc /var/log/supervisor && \ touch /root/.Xauthority -# Set up VNC configuration -COPY xstartup /root/.vnc/xstartup -RUN chmod +x /root/.vnc/xstartup - -# Set VNC password +# Set up VNC password and xstartup RUN echo "password" | vncpasswd -f > /root/.vnc/passwd && \ chmod 600 /root/.vnc/passwd +# Create xstartup file +RUN echo '#!/bin/bash\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexec startxfce4' > /root/.vnc/xstartup && \ + chmod +x /root/.vnc/xstartup + # Copy supervisor configuration COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -# Create cleanup script -COPY cleanup.sh /cleanup.sh -RUN chmod +x /cleanup.sh - # Expose ports EXPOSE 8080 8443 5901 -CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] \ No newline at end of file +# Create startup script +RUN echo '#!/bin/bash\nrm -rf /tmp/.X* /tmp/.x* /tmp/ssh*\nexec /usr/bin/supervisord -n -c /etc/supervisor/conf.d/supervisord.conf' > /start.sh && \ + chmod +x /start.sh + +# Add NVM to PATH +ENV NVM_DIR=/root/.nvm +ENV PATH="/root/.nvm/versions/node/v18/bin:${PATH}" + +CMD ["/start.sh"] \ No newline at end of file diff --git a/devbox-dockerfile/supervisord.conf b/devbox-dockerfile/supervisord.conf index 3685f514c5..4d456fa97e 100644 --- a/devbox-dockerfile/supervisord.conf +++ b/devbox-dockerfile/supervisord.conf @@ -4,45 +4,190 @@ user=root logfile=/var/log/supervisor/supervisord.log pidfile=/var/run/supervisord.pid -[program:cleanup] -command=/cleanup.sh +[program:vncserver] +priority=10 +directory=/root +command=/usr/bin/vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup /root/.vnc/xstartup +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/vncserver.stderr.log +stdout_logfile=/var/log/supervisor/vncserver.stdout.log +stopasgroup=true +killasgroup=true + +[program:novnc] +priority=20 +directory=/usr/share/novnc +command=/usr/bin/websockify --web=/usr/share/novnc 8080 localhost:5901 +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/novnc.stderr.log +stdout_logfile=/var/log/supervisor/novnc.stdout.log + +[program:code-server] +priority=30 +directory=/root +command=/usr/bin/code-server --bind-addr 0.0.0.0:8443 --auth none +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/code-server.stderr.log +stdout_logfile=/var/log/supervisor/code-server.stdout.log + +[program:redis] +priority=40 +command=/usr/bin/redis-server +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/redis.stderr.log +stdout_logfile=/var/log/supervisor/redis.stdout.log + +[program:mariadb] +priority=50 +command=/usr/bin/mysqld_safe +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/mariadb.stderr.log +stdout_logfile=/var/log/supervisor/mariadb.stdout.log[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid + +[program:vncserver] +priority=10 +directory=/root +command=/usr/bin/vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup /root/.vnc/xstartup +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/vncserver.stderr.log +stdout_logfile=/var/log/supervisor/vncserver.stdout.log +stopasgroup=true +killasgroup=true + +[program:novnc] +priority=20 +directory=/usr/share/novnc +command=/usr/bin/websockify --web=/usr/share/novnc 8080 localhost:5901 +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/novnc.stderr.log +stdout_logfile=/var/log/supervisor/novnc.stdout.log + +[program:code-server] +priority=30 +directory=/root +command=/usr/bin/code-server --bind-addr 0.0.0.0:8443 --auth none +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/code-server.stderr.log +stdout_logfile=/var/log/supervisor/code-server.stdout.log + +[program:redis] +priority=40 +command=/usr/bin/redis-server +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/redis.stderr.log +stdout_logfile=/var/log/supervisor/redis.stdout.log + +[program:mariadb] +priority=50 +command=/usr/bin/mysqld_safe +user=root autostart=true -autorestart=false -startsecs=0 -priority=1 +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/mariadb.stderr.log +stdout_logfile=/var/log/supervisor/mariadb.stdout.log[supervisord] +nodaemon=true +user=root +logfile=/var/log/supervisor/supervisord.log +pidfile=/var/run/supervisord.pid [program:vncserver] +priority=10 +directory=/root command=/usr/bin/vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup /root/.vnc/xstartup user=root autostart=true -autorestart=unexpected -startsecs=5 +autorestart=true +startsecs=3 startretries=3 -exitcodes=0 -stopsignal=QUIT -stopwaitsecs=10 -priority=100 -stdout_logfile=/var/log/supervisor/vncserver.log -stderr_logfile=/var/log/supervisor/vncserver.err +stderr_logfile=/var/log/supervisor/vncserver.stderr.log +stdout_logfile=/var/log/supervisor/vncserver.stdout.log +stopasgroup=true +killasgroup=true [program:novnc] +priority=20 +directory=/usr/share/novnc command=/usr/bin/websockify --web=/usr/share/novnc 8080 localhost:5901 user=root autostart=true autorestart=true startsecs=3 startretries=3 -priority=200 -stdout_logfile=/var/log/supervisor/novnc.log -stderr_logfile=/var/log/supervisor/novnc.err +stderr_logfile=/var/log/supervisor/novnc.stderr.log +stdout_logfile=/var/log/supervisor/novnc.stdout.log [program:code-server] +priority=30 +directory=/root command=/usr/bin/code-server --bind-addr 0.0.0.0:8443 --auth none user=root autostart=true autorestart=true startsecs=3 startretries=3 -priority=300 -stdout_logfile=/var/log/supervisor/code-server.log -stderr_logfile=/var/log/supervisor/code-server.err \ No newline at end of file +stderr_logfile=/var/log/supervisor/code-server.stderr.log +stdout_logfile=/var/log/supervisor/code-server.stdout.log + +[program:redis] +priority=40 +command=/usr/bin/redis-server +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/redis.stderr.log +stdout_logfile=/var/log/supervisor/redis.stdout.log + +[program:mariadb] +priority=50 +command=/usr/bin/mysqld_safe +user=root +autostart=true +autorestart=true +startsecs=3 +startretries=3 +stderr_logfile=/var/log/supervisor/mariadb.stderr.log +stdout_logfile=/var/log/supervisor/mariadb.stdout.log \ No newline at end of file From 7217ef58704c27378441d87e5c5ed1cd782276c1 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 4 Nov 2024 08:25:47 +0000 Subject: [PATCH 15/45] fix(devbox image): working image with proper perms --- devbox-dockerfile/Dockerfile | 117 ++++++++++++++------ devbox-dockerfile/start.sh | 20 ++++ devbox-dockerfile/supervisord.conf | 169 +++++------------------------ 3 files changed, 132 insertions(+), 174 deletions(-) create mode 100644 devbox-dockerfile/start.sh diff --git a/devbox-dockerfile/Dockerfile b/devbox-dockerfile/Dockerfile index 30617e65c9..c932e1569a 100644 --- a/devbox-dockerfile/Dockerfile +++ b/devbox-dockerfile/Dockerfile @@ -1,7 +1,9 @@ FROM debian:12-slim -ENV DEBIAN_FRONTEND=noninteractive - +ENV DEBIAN_FRONTEND=noninteractive \ + LANG=en_US.UTF-8 \ + LC_ALL=C.UTF-8 + # Install required packages RUN apt-get update && apt-get install -y \ xfce4 \ @@ -27,47 +29,100 @@ RUN apt-get update && apt-get install -y \ xvfb \ libfontconfig \ wkhtmltopdf \ + sudo \ + x11-xserver-utils \ + xfonts-base \ + pm-utils \ + pulseaudio \ + dbus-x11 \ + policykit-1-gnome \ + python3-venv \ + cron \ + locales \ && apt-get clean \ - && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* \ + && locale-gen en_US.UTF-8 -# Install code-server -RUN curl -fsSL https://code-server.dev/install.sh | sh +# Configure MariaDB root password +RUN service mariadb start && \ + mysqladmin -u root password 'frappe' && \ + mysql -u root -pfrappe -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'frappe' WITH GRANT OPTION; FLUSH PRIVILEGES;" + +# Add frappe user and add to sudoers +RUN useradd -m -s /bin/bash frappe && \ + echo "frappe:password" | chpasswd && \ + usermod -aG sudo frappe && \ + echo "frappe ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + +# Create necessary directories and set permissions +RUN mkdir -p /home/frappe/.config /home/frappe/.vnc /home/frappe/.local && \ + mkdir -p /var/log/supervisor && \ + mkdir -p /run/user/1000 && \ + mkdir -p /var/run/dbus && \ + mkdir -p /var/lib/dbus && \ + touch /home/frappe/.Xauthority && \ + dbus-uuidgen > /var/lib/dbus/machine-id && \ + chown -R frappe:frappe /home/frappe && \ + chown -R frappe:frappe /var/log/supervisor && \ + chown -R frappe:frappe /run/user/1000 && \ + chmod -R 755 /home/frappe/.config && \ + chmod -R 755 /home/frappe/.local && \ + chmod 700 /run/user/1000 && \ + chmod 755 /var/run/dbus && \ + chmod -R 755 /var/lib/dbus + +# Set up VNC configuration +RUN mkdir -p /home/frappe/.vnc && \ + echo "#!/bin/bash\n\ +export XDG_SESSION_TYPE=x11\n\ +export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket\n\ +export XDG_RUNTIME_DIR=/run/user/1000\n\ +unset SESSION_MANAGER\n\ +unset DBUS_SESSION_BUS_ADDRESS\n\ +exec dbus-launch --exit-with-session startxfce4" > /home/frappe/.vnc/xstartup && \ + chmod +x /home/frappe/.vnc/xstartup && \ + echo "password" | vncpasswd -f > /home/frappe/.vnc/passwd && \ + chmod 600 /home/frappe/.vnc/passwd && \ + chown -R frappe:frappe /home/frappe/.vnc + +# Install bench CLI and set up directory +RUN pip3 install frappe-bench --break-system-packages + +# Switch to frappe user for remaining operations +USER frappe +WORKDIR /home/frappe +ENV PATH="/home/frappe/.local/bin:$PATH" # Install NVM, Node.js, and Yarn -RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash && \ - export NVM_DIR="/root/.nvm" && \ +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash && \ + export NVM_DIR="/home/frappe/.nvm" && \ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \ [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" && \ + echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc && \ + echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc && \ + echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> ~/.bashrc && \ + . ~/.bashrc && \ nvm install 18 && \ + nvm use 18 && \ + nvm alias default 18 && \ npm install -g yarn -# Install Bench CLI -RUN pip3 install frappe-bench --break-system-packages - -# Create necessary directories and files -RUN mkdir -p /root/.vnc /var/log/supervisor && \ - touch /root/.Xauthority - -# Set up VNC password and xstartup -RUN echo "password" | vncpasswd -f > /root/.vnc/passwd && \ - chmod 600 /root/.vnc/passwd +# Install code-serv +RUN curl -fsSL https://code-server.dev/install.sh | sh -# Create xstartup file -RUN echo '#!/bin/bash\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexec startxfce4' > /root/.vnc/xstartup && \ - chmod +x /root/.vnc/xstartup +# Copy supervisor configuration and startup script +COPY --chown=frappe:frappe supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY --chown=frappe:frappe start.sh /home/frappe/start.sh +RUN chmod +x /home/frappe/start.sh -# Copy supervisor configuration -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +# Set environment variables +ENV NVM_DIR=/home/frappe/.nvm +ENV PATH="/home/frappe/.nvm/versions/node/v18/bin:/home/frappe/.local/bin:${PATH}" +ENV XDG_RUNTIME_DIR=/run/user/1000 +ENV DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket # Expose ports EXPOSE 8080 8443 5901 -# Create startup script -RUN echo '#!/bin/bash\nrm -rf /tmp/.X* /tmp/.x* /tmp/ssh*\nexec /usr/bin/supervisord -n -c /etc/supervisor/conf.d/supervisord.conf' > /start.sh && \ - chmod +x /start.sh - -# Add NVM to PATH -ENV NVM_DIR=/root/.nvm -ENV PATH="/root/.nvm/versions/node/v18/bin:${PATH}" - -CMD ["/start.sh"] \ No newline at end of file +# Set the default command +CMD ["/home/frappe/start.sh"] \ No newline at end of file diff --git a/devbox-dockerfile/start.sh b/devbox-dockerfile/start.sh new file mode 100644 index 0000000000..62c96308ae --- /dev/null +++ b/devbox-dockerfile/start.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Stop VNC server if running +pkill Xtigervnc || true + +# Clean up only specific X server files +rm -f /tmp/.X1-lock /tmp/.X11-unix/X1 || true + +# Start dbus daemon using sudo +sudo dbus-daemon --system --nofork --nopidfile & + +# Initialize Xauthority +touch ~/.Xauthority +chmod 600 ~/.Xauthority + +# Start VNC server +vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup ~/.vnc/xstartup + +# Start supervisord +exec supervisord -n -c /etc/supervisor/conf.d/supervisord.conf \ No newline at end of file diff --git a/devbox-dockerfile/supervisord.conf b/devbox-dockerfile/supervisord.conf index 4d456fa97e..1e34adc6fb 100644 --- a/devbox-dockerfile/supervisord.conf +++ b/devbox-dockerfile/supervisord.conf @@ -1,146 +1,27 @@ [supervisord] nodaemon=true -user=root +user=frappe logfile=/var/log/supervisor/supervisord.log -pidfile=/var/run/supervisord.pid +pidfile=/run/user/1000/supervisord.pid -[program:vncserver] -priority=10 -directory=/root -command=/usr/bin/vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup /root/.vnc/xstartup -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/vncserver.stderr.log -stdout_logfile=/var/log/supervisor/vncserver.stdout.log -stopasgroup=true -killasgroup=true - -[program:novnc] -priority=20 -directory=/usr/share/novnc -command=/usr/bin/websockify --web=/usr/share/novnc 8080 localhost:5901 -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/novnc.stderr.log -stdout_logfile=/var/log/supervisor/novnc.stdout.log - -[program:code-server] -priority=30 -directory=/root -command=/usr/bin/code-server --bind-addr 0.0.0.0:8443 --auth none -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/code-server.stderr.log -stdout_logfile=/var/log/supervisor/code-server.stdout.log - -[program:redis] -priority=40 -command=/usr/bin/redis-server -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/redis.stderr.log -stdout_logfile=/var/log/supervisor/redis.stdout.log - -[program:mariadb] -priority=50 -command=/usr/bin/mysqld_safe -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/mariadb.stderr.log -stdout_logfile=/var/log/supervisor/mariadb.stdout.log[supervisord] -nodaemon=true -user=root -logfile=/var/log/supervisor/supervisord.log -pidfile=/var/run/supervisord.pid - -[program:vncserver] -priority=10 -directory=/root -command=/usr/bin/vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup /root/.vnc/xstartup -user=root +[program:dbus] +priority=1 +command=sudo /usr/bin/dbus-daemon --system --nofork --nopidfile +user=frappe +startsecs=5 autostart=true autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/vncserver.stderr.log -stdout_logfile=/var/log/supervisor/vncserver.stdout.log -stopasgroup=true -killasgroup=true - -[program:novnc] -priority=20 -directory=/usr/share/novnc -command=/usr/bin/websockify --web=/usr/share/novnc 8080 localhost:5901 -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/novnc.stderr.log -stdout_logfile=/var/log/supervisor/novnc.stdout.log - -[program:code-server] -priority=30 -directory=/root -command=/usr/bin/code-server --bind-addr 0.0.0.0:8443 --auth none -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/code-server.stderr.log -stdout_logfile=/var/log/supervisor/code-server.stdout.log - -[program:redis] -priority=40 -command=/usr/bin/redis-server -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/redis.stderr.log -stdout_logfile=/var/log/supervisor/redis.stdout.log - -[program:mariadb] -priority=50 -command=/usr/bin/mysqld_safe -user=root -autostart=true -autorestart=true -startsecs=3 -startretries=3 -stderr_logfile=/var/log/supervisor/mariadb.stderr.log -stdout_logfile=/var/log/supervisor/mariadb.stdout.log[supervisord] -nodaemon=true -user=root -logfile=/var/log/supervisor/supervisord.log -pidfile=/var/run/supervisord.pid [program:vncserver] priority=10 -directory=/root -command=/usr/bin/vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup /root/.vnc/xstartup -user=root +directory=/home/frappe +command=vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup /home/frappe/.vnc/xstartup +user=frappe +environment=HOME="/home/frappe",USER="frappe",DISPLAY=":1",XDG_RUNTIME_DIR="/run/user/1000",LANG="en_US.UTF-8",LC_ALL="C.UTF-8",DBUS_SESSION_BUS_ADDRESS="unix:path=/run/dbus/system_bus_socket" autostart=true autorestart=true -startsecs=3 -startretries=3 +startsecs=5 +startretries=5 stderr_logfile=/var/log/supervisor/vncserver.stderr.log stdout_logfile=/var/log/supervisor/vncserver.stdout.log stopasgroup=true @@ -150,44 +31,46 @@ killasgroup=true priority=20 directory=/usr/share/novnc command=/usr/bin/websockify --web=/usr/share/novnc 8080 localhost:5901 -user=root +user=frappe +environment=HOME="/home/frappe",USER="frappe" autostart=true autorestart=true -startsecs=3 +startsecs=5 startretries=3 stderr_logfile=/var/log/supervisor/novnc.stderr.log stdout_logfile=/var/log/supervisor/novnc.stdout.log [program:code-server] priority=30 -directory=/root +directory=/home/frappe command=/usr/bin/code-server --bind-addr 0.0.0.0:8443 --auth none -user=root +user=frappe +environment=HOME="/home/frappe",USER="frappe",XDG_DATA_HOME="/home/frappe/.local/share",XDG_CONFIG_HOME="/home/frappe/.config" autostart=true autorestart=true -startsecs=3 +startsecs=5 startretries=3 stderr_logfile=/var/log/supervisor/code-server.stderr.log stdout_logfile=/var/log/supervisor/code-server.stdout.log [program:redis] priority=40 -command=/usr/bin/redis-server -user=root +command=sudo /usr/bin/redis-server +user=frappe autostart=true autorestart=true -startsecs=3 +startsecs=5 startretries=3 stderr_logfile=/var/log/supervisor/redis.stderr.log stdout_logfile=/var/log/supervisor/redis.stdout.log [program:mariadb] priority=50 -command=/usr/bin/mysqld_safe -user=root +command=sudo /usr/bin/mysqld_safe +user=frappe autostart=true autorestart=true -startsecs=3 +startsecs=5 startretries=3 stderr_logfile=/var/log/supervisor/mariadb.stderr.log stdout_logfile=/var/log/supervisor/mariadb.stdout.log \ No newline at end of file From ced6cd5838145d143b063a4162022076baba7b59 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 4 Nov 2024 08:29:42 +0000 Subject: [PATCH 16/45] fix(devbox-image): remove fiile --- devbox-dockerfile/entrypoint.sh | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 devbox-dockerfile/entrypoint.sh diff --git a/devbox-dockerfile/entrypoint.sh b/devbox-dockerfile/entrypoint.sh deleted file mode 100644 index e7a619f380..0000000000 --- a/devbox-dockerfile/entrypoint.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf \ No newline at end of file From afd5ff4b3ba780603cd24de475ac3e7fed7fbe53 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 4 Nov 2024 16:18:16 +0000 Subject: [PATCH 17/45] feat(devbox-image): with athuentication a truntime --- devbox-dockerfile/Dockerfile | 26 ++++++++++++++---------- devbox-dockerfile/start.sh | 38 +++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 11 deletions(-) mode change 100644 => 100755 devbox-dockerfile/start.sh diff --git a/devbox-dockerfile/Dockerfile b/devbox-dockerfile/Dockerfile index c932e1569a..81c7759efa 100644 --- a/devbox-dockerfile/Dockerfile +++ b/devbox-dockerfile/Dockerfile @@ -2,8 +2,10 @@ FROM debian:12-slim ENV DEBIAN_FRONTEND=noninteractive \ LANG=en_US.UTF-8 \ - LC_ALL=C.UTF-8 - + LC_ALL=C.UTF-8 \ + PASSWORD=password \ + VNC_PASSWORD=password + # Install required packages RUN apt-get update && apt-get install -y \ xfce4 \ @@ -81,11 +83,9 @@ unset SESSION_MANAGER\n\ unset DBUS_SESSION_BUS_ADDRESS\n\ exec dbus-launch --exit-with-session startxfce4" > /home/frappe/.vnc/xstartup && \ chmod +x /home/frappe/.vnc/xstartup && \ - echo "password" | vncpasswd -f > /home/frappe/.vnc/passwd && \ - chmod 600 /home/frappe/.vnc/passwd && \ chown -R frappe:frappe /home/frappe/.vnc -# Install bench CLI and set up directory +# Install bench CLI RUN pip3 install frappe-bench --break-system-packages # Switch to frappe user for remaining operations @@ -107,19 +107,25 @@ RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | b nvm alias default 18 && \ npm install -g yarn -# Install code-serv +# Install code-server RUN curl -fsSL https://code-server.dev/install.sh | sh +# Create code-server config directory and default config +RUN mkdir -p /home/frappe/.config/code-server && \ + echo "bind-addr: 0.0.0.0:8443\n\ +auth: password\n\ +cert: false" > /home/frappe/.config/code-server/config.yaml + # Copy supervisor configuration and startup script COPY --chown=frappe:frappe supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY --chown=frappe:frappe start.sh /home/frappe/start.sh RUN chmod +x /home/frappe/start.sh # Set environment variables -ENV NVM_DIR=/home/frappe/.nvm -ENV PATH="/home/frappe/.nvm/versions/node/v18/bin:/home/frappe/.local/bin:${PATH}" -ENV XDG_RUNTIME_DIR=/run/user/1000 -ENV DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket +ENV NVM_DIR=/home/frappe/.nvm \ + PATH="/home/frappe/.nvm/versions/node/v18/bin:/home/frappe/.local/bin:${PATH}" \ + XDG_RUNTIME_DIR=/run/user/1000 \ + DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket # Expose ports EXPOSE 8080 8443 5901 diff --git a/devbox-dockerfile/start.sh b/devbox-dockerfile/start.sh old mode 100644 new mode 100755 index 62c96308ae..06f41a2571 --- a/devbox-dockerfile/start.sh +++ b/devbox-dockerfile/start.sh @@ -9,12 +9,48 @@ rm -f /tmp/.X1-lock /tmp/.X11-unix/X1 || true # Start dbus daemon using sudo sudo dbus-daemon --system --nofork --nopidfile & +# Wait for DBus to start properly +sleep 2 + +# Check if DBus is running +if ! pgrep -x "dbus-daemon" > /dev/null; then + echo "Error: dbus-daemon failed to start!" + exit 1 +fi + # Initialize Xauthority touch ~/.Xauthority chmod 600 ~/.Xauthority +# Validate and set VNC password +if [ ! -z "$VNC_PASSWORD" ]; then + if [ ${#VNC_PASSWORD} -lt 6 ]; then + echo "Error: VNC password must be at least 6 characters long" + exit 1 + fi + echo "$VNC_PASSWORD" | vncpasswd -f > ~/.vnc/passwd + chmod 600 ~/.vnc/passwd +fi + +# Validate and set code-server password +if [ ! -z "$PASSWORD" ]; then + if [ ${#PASSWORD} -lt 6 ]; then + echo "Error: Code-server password must be at least 6 characters long" + exit 1 + fi + mkdir -p ~/.config/code-server + echo "bind-addr: 0.0.0.0:8443 +auth: password +password: $PASSWORD +cert: false" > ~/.config/code-server/config.yaml + chmod 600 ~/.config/code-server/config.yaml +fi + # Start VNC server -vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup ~/.vnc/xstartup +if ! vncserver :1 -geometry 1280x800 -depth 24 -localhost no -xstartup ~/.vnc/xstartup; then + echo "Error: VNC server failed to start!" + exit 1 +fi # Start supervisord exec supervisord -n -c /etc/supervisor/conf.d/supervisord.conf \ No newline at end of file From 0adf86aa600d9895ef127416d94d90fb6a2be83f Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 4 Nov 2024 16:25:17 +0000 Subject: [PATCH 18/45] chore(devbox): readme --- devbox-dockerfile/readme.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 devbox-dockerfile/readme.md diff --git a/devbox-dockerfile/readme.md b/devbox-dockerfile/readme.md new file mode 100644 index 0000000000..35efd9c8cd --- /dev/null +++ b/devbox-dockerfile/readme.md @@ -0,0 +1,12 @@ +``` +docker build -t your_image_name . + +docker run -d \ + -p 8080:8080 \ + -p 8443:8443 \ + -p 5901:5901 \ + -e PASSWORD="your_code_server_password" \ + -e VNC_PASSWORD="your_vnc_password" \ + your_image_name + +``` \ No newline at end of file From be54a12f0374674ae3e40c64b42998ddca448156 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 4 Nov 2024 16:39:01 +0000 Subject: [PATCH 19/45] chore(devbox): readme --- devbox-dockerfile/readme.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/devbox-dockerfile/readme.md b/devbox-dockerfile/readme.md index 35efd9c8cd..4ba74cbf78 100644 --- a/devbox-dockerfile/readme.md +++ b/devbox-dockerfile/readme.md @@ -1,10 +1,26 @@ +### Create the volumes for persistence + +```shell +docker volume create db-data + +docker volume create home ``` + +### Build + +```shell docker build -t your_image_name . +``` + +### Run +``` docker run -d \ -p 8080:8080 \ -p 8443:8443 \ -p 5901:5901 \ + -v db-data:/var/lib/mysql \ + -v home:/home/frappe \ -e PASSWORD="your_code_server_password" \ -e VNC_PASSWORD="your_vnc_password" \ your_image_name From a9d5fe7bca682c7fc5e552661f37d0b5f54850fe Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 4 Nov 2024 16:41:32 +0000 Subject: [PATCH 20/45] chore(devbox): readme --- devbox-dockerfile/readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/devbox-dockerfile/readme.md b/devbox-dockerfile/readme.md index 4ba74cbf78..5d0e64860b 100644 --- a/devbox-dockerfile/readme.md +++ b/devbox-dockerfile/readme.md @@ -14,6 +14,10 @@ docker build -t your_image_name . ### Run +8080 is for NOVNC +8443 is for VSCode Server +5901 is for Bare VNC Port + ``` docker run -d \ -p 8080:8080 \ From ad9d7448f85afa888f795b28577eec75b8374ec9 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 4 Nov 2024 16:42:00 +0000 Subject: [PATCH 21/45] chore(devbox): readme --- devbox-dockerfile/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devbox-dockerfile/readme.md b/devbox-dockerfile/readme.md index 5d0e64860b..25ea2b934b 100644 --- a/devbox-dockerfile/readme.md +++ b/devbox-dockerfile/readme.md @@ -14,8 +14,8 @@ docker build -t your_image_name . ### Run -8080 is for NOVNC -8443 is for VSCode Server +8080 is for NOVNC \ +8443 is for VSCode Server \ 5901 is for Bare VNC Port ``` From 9e50bf481c3760204028e795c8942edc46d1a225 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Tue, 5 Nov 2024 18:07:07 +0000 Subject: [PATCH 22/45] feat(devboxes): adding code server and made changes to desk spin up commands --- devbox-dockerfile/Dockerfile | 2 +- devbox-dockerfile/readme.md | 4 ++-- devbox-dockerfile/supervisord.conf | 2 +- press/press/doctype/devbox/devbox.json | 32 ++++++++++++++++++++++++-- press/press/doctype/devbox/devbox.py | 29 +++++++++++++++++++---- 5 files changed, 59 insertions(+), 10 deletions(-) diff --git a/devbox-dockerfile/Dockerfile b/devbox-dockerfile/Dockerfile index 81c7759efa..5e3b67a5df 100644 --- a/devbox-dockerfile/Dockerfile +++ b/devbox-dockerfile/Dockerfile @@ -128,7 +128,7 @@ ENV NVM_DIR=/home/frappe/.nvm \ DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket # Expose ports -EXPOSE 8080 8443 5901 +EXPOSE 6969 8443 5901 # Set the default command CMD ["/home/frappe/start.sh"] \ No newline at end of file diff --git a/devbox-dockerfile/readme.md b/devbox-dockerfile/readme.md index 25ea2b934b..18b1b2d4da 100644 --- a/devbox-dockerfile/readme.md +++ b/devbox-dockerfile/readme.md @@ -14,13 +14,13 @@ docker build -t your_image_name . ### Run -8080 is for NOVNC \ +6969 is for NOVNC \ 8443 is for VSCode Server \ 5901 is for Bare VNC Port ``` docker run -d \ - -p 8080:8080 \ + -p 6969:6969 \ -p 8443:8443 \ -p 5901:5901 \ -v db-data:/var/lib/mysql \ diff --git a/devbox-dockerfile/supervisord.conf b/devbox-dockerfile/supervisord.conf index 1e34adc6fb..75d3b632a3 100644 --- a/devbox-dockerfile/supervisord.conf +++ b/devbox-dockerfile/supervisord.conf @@ -30,7 +30,7 @@ killasgroup=true [program:novnc] priority=20 directory=/usr/share/novnc -command=/usr/bin/websockify --web=/usr/share/novnc 8080 localhost:5901 +command=/usr/bin/websockify --web=/usr/share/novnc 6969 localhost:5901 user=frappe environment=HOME="/home/frappe",USER="frappe" autostart=true diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index b592f9fbc1..9b3cdbd7a1 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -9,12 +9,16 @@ "subdomain", "domain", "initialized", - "add_site_to_upstream", "websockify_port", + "codeserver_port", "vnc_port", + "browser_port", "column_break_cdoo", "server", "status", + "add_site_to_upstream", + "vnc_password", + "codeserver_password", "machine_configuration_section", "container_id", "cpu_cores", @@ -111,6 +115,30 @@ "fieldname": "container_id", "fieldtype": "Data", "label": "Container ID" + }, + { + "fieldname": "codeserver_port", + "fieldtype": "Int", + "label": "Codeserver Port", + "read_only": 1 + }, + { + "fieldname": "browser_port", + "fieldtype": "Int", + "label": "Browser Port", + "read_only": 1 + }, + { + "fieldname": "vnc_password", + "fieldtype": "Data", + "label": "VNC Password", + "read_only": 1 + }, + { + "fieldname": "codeserver_password", + "fieldtype": "Data", + "label": "Codeserver Password", + "read_only": 1 } ], "index_web_pages_for_search": 1, @@ -121,7 +149,7 @@ "link_fieldname": "devbox" } ], - "modified": "2024-10-23 20:42:24.345812", + "modified": "2024-11-05 22:19:26.735978", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 71c1ea6ca6..70900142a8 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -4,6 +4,8 @@ from __future__ import annotations import json +import secrets +import string from typing import TYPE_CHECKING import frappe @@ -25,6 +27,9 @@ class Devbox(Document): from frappe.types import DF add_site_to_upstream: DF.Check + browser_port: DF.Int + codeserver_password: DF.Data | None + codeserver_port: DF.Int container_id: DF.Data | None cpu_cores: DF.Int disk_mb: DF.Int @@ -34,6 +39,7 @@ class Devbox(Document): server: DF.Link status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited"] subdomain: DF.Data + vnc_password: DF.Data | None vnc_port: DF.Int websockify_port: DF.Int # end: auto-generated types @@ -55,11 +61,20 @@ def get_available_cpu_and_ram(self): @frappe.whitelist() def initialize_devbox(self): devbox = self + devbox.vnc_password = "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(8)) + devbox.codeserver_password = "".join( + secrets.choice(string.ascii_letters + string.digits) for _ in range(8) + ) + devbox.save() server_agent = Agent(server_type="Server", server=devbox.server) server_agent.create_agent_job( "New Devbox", path="devboxes", - data={"devbox_name": devbox.name}, + data={ + "devbox_name": devbox.name, + "vnc_password": devbox.vnc_password, + "codeserver_password": devbox.codeserver_password, + }, devbox=devbox.name, ) reverse_proxy = frappe.db.get_value(doctype="Server", filters=devbox.server, fieldname="proxy_server") @@ -108,9 +123,15 @@ def sync_devbox_status(self): def process_new_devbox_job_update(job: AgentJob): if job.job_type == "New Devbox" and job.status == "Success": - frappe.db.set_value(dt="Devbox", dn=job.devbox, field="initialized", val=True) - websockify_port = json.loads(job.data)["message"]["websockify_port"] - frappe.db.set_value(dt="Devbox", dn=job.devbox, field="websockify_port", val=websockify_port) + data = json.loads(job.data)["message"] + update_fields = { + "initialized": True, + "websockify_port": data["websockify_port"], + "vnc_port": data["vnc_port"], + "codeserver_port": data["codeserver_port"], + "browser_port": data["browser_port"], + } + frappe.db.set_value("Devbox", job.devbox, update_fields) if job.job_type == "Add Site to Upstream" and job.status == "Success": frappe.db.set_value(dt="Devbox", dn=job.devbox, field="add_site_to_upstream", val=True) From 4ce5cb1a6c054aeeade2cbb923d0fce7608b664a Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Thu, 14 Nov 2024 16:01:26 +0000 Subject: [PATCH 23/45] chore(devboxes): send all required params to start devbox --- press/press/doctype/devbox/devbox.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 70900142a8..e1c62abbdd 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -96,7 +96,15 @@ def start_devbox(self): server_agent = Agent(server_type="Server", server=devbox.server) server_agent.create_agent_job( "Start Devbox", - path=f"devboxes/{devbox.name}/{devbox.websockify_port}/start", + path=f"devboxes/{devbox.name}/start", + data={ + "vnc_password": devbox.vnc_password, + "codeserver_password": devbox.codeserver_password, + "websockify_port": devbox.websockify_port, + "vnc_port": devbox.vnc_port, + "codeserver_port": devbox.codeserver_port, + "browser_port": devbox.browser_port, + }, devbox=devbox.name, ) From 9586a351a9da63460ef4d0be31f5eeb22a773f3d Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Tue, 10 Dec 2024 17:02:20 +0530 Subject: [PATCH 24/45] feat(ui): Add DevBoxes in side bar --- dashboard/src2/components/NavigationItems.vue | 7 +++++++ press/press/doctype/team/team.json | 9 ++++++++- press/press/doctype/team/team.py | 6 ++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/dashboard/src2/components/NavigationItems.vue b/dashboard/src2/components/NavigationItems.vue index 03055b9b4a..e6fe1a8557 100644 --- a/dashboard/src2/components/NavigationItems.vue +++ b/dashboard/src2/components/NavigationItems.vue @@ -134,6 +134,13 @@ export default { isActive: ['SQL Playground', 'Log Browser'].includes(routeName), disabled: enforce2FA }, + { + name: 'Dev Boxes', + icon: () => h(Package), + route: '/devboxes', + condition: this.$team.doc?.devboxes_enabled, + disabled: enforce2FA + }, { name: 'Billing', icon: () => h(WalletCards), diff --git a/press/press/doctype/team/team.json b/press/press/doctype/team/team.json index abf3b64972..b2b2dd303d 100644 --- a/press/press/doctype/team/team.json +++ b/press/press/doctype/team/team.json @@ -64,6 +64,7 @@ "self_hosted_servers_enabled", "security_portal_enabled", "benches_enabled", + "devboxes_enabled", "section_break_28", "communication_emails", "discounts_section", @@ -438,6 +439,12 @@ "fieldname": "billing_email", "fieldtype": "Data", "label": "Billing Email" + }, + { + "default": "0", + "fieldname": "devboxes_enabled", + "fieldtype": "Check", + "label": "Devboxes Enabled" } ], "links": [ @@ -497,7 +504,7 @@ "link_fieldname": "team" } ], - "modified": "2024-11-11 10:27:47.247515", + "modified": "2024-12-10 16:56:26.933289", "modified_by": "Administrator", "module": "Press", "name": "Team", diff --git a/press/press/doctype/team/team.py b/press/press/doctype/team/team.py index a1adc8d108..227f68471d 100644 --- a/press/press/doctype/team/team.py +++ b/press/press/doctype/team/team.py @@ -4,6 +4,7 @@ import os from hashlib import blake2b +from typing import TYPE_CHECKING import frappe from frappe import _ @@ -23,6 +24,9 @@ ) from press.utils.telemetry import capture +if TYPE_CHECKING: + from press.press.doctype.account_request.account_request import AccountRequest + class Team(Document): # begin: auto-generated types @@ -51,6 +55,7 @@ class Team(Document): currency: DF.Link | None database_access_enabled: DF.Check default_payment_method: DF.Link | None + devboxes_enabled: DF.Check discounts: DF.Table[InvoiceDiscount] enable_inplace_updates: DF.Check enable_performance_tuning: DF.Check @@ -111,6 +116,7 @@ class Team(Document): "is_developer", "enable_performance_tuning", "enable_inplace_updates", + "devboxes_enabled" ) def get_doc(self, doc): From d2a2465fa9ae8592c646b573f36b7edc62fc23af Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Thu, 12 Dec 2024 16:58:09 +0530 Subject: [PATCH 25/45] chore(devbox): code-server-auth --- devbox-dockerfile/Dockerfile | 16 ++++++++-------- devbox-dockerfile/supervisord.conf | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/devbox-dockerfile/Dockerfile b/devbox-dockerfile/Dockerfile index 5e3b67a5df..270d04090e 100644 --- a/devbox-dockerfile/Dockerfile +++ b/devbox-dockerfile/Dockerfile @@ -76,12 +76,12 @@ RUN mkdir -p /home/frappe/.config /home/frappe/.vnc /home/frappe/.local && \ # Set up VNC configuration RUN mkdir -p /home/frappe/.vnc && \ echo "#!/bin/bash\n\ -export XDG_SESSION_TYPE=x11\n\ -export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket\n\ -export XDG_RUNTIME_DIR=/run/user/1000\n\ -unset SESSION_MANAGER\n\ -unset DBUS_SESSION_BUS_ADDRESS\n\ -exec dbus-launch --exit-with-session startxfce4" > /home/frappe/.vnc/xstartup && \ + export XDG_SESSION_TYPE=x11\n\ + export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket\n\ + export XDG_RUNTIME_DIR=/run/user/1000\n\ + unset SESSION_MANAGER\n\ + unset DBUS_SESSION_BUS_ADDRESS\n\ + exec dbus-launch --exit-with-session startxfce4" > /home/frappe/.vnc/xstartup && \ chmod +x /home/frappe/.vnc/xstartup && \ chown -R frappe:frappe /home/frappe/.vnc @@ -113,8 +113,8 @@ RUN curl -fsSL https://code-server.dev/install.sh | sh # Create code-server config directory and default config RUN mkdir -p /home/frappe/.config/code-server && \ echo "bind-addr: 0.0.0.0:8443\n\ -auth: password\n\ -cert: false" > /home/frappe/.config/code-server/config.yaml + auth: password\n\ + cert: false" > /home/frappe/.config/code-server/config.yaml # Copy supervisor configuration and startup script COPY --chown=frappe:frappe supervisord.conf /etc/supervisor/conf.d/supervisord.conf diff --git a/devbox-dockerfile/supervisord.conf b/devbox-dockerfile/supervisord.conf index 75d3b632a3..624c9c898b 100644 --- a/devbox-dockerfile/supervisord.conf +++ b/devbox-dockerfile/supervisord.conf @@ -43,7 +43,7 @@ stdout_logfile=/var/log/supervisor/novnc.stdout.log [program:code-server] priority=30 directory=/home/frappe -command=/usr/bin/code-server --bind-addr 0.0.0.0:8443 --auth none +command=/usr/bin/code-server --config /home/frappe/.config/code-server/config.yaml user=frappe environment=HOME="/home/frappe",USER="frappe",XDG_DATA_HOME="/home/frappe/.local/share",XDG_CONFIG_HOME="/home/frappe/.config" autostart=true From 231d537ce17257167470f740c875bcd0b37fab6c Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Thu, 12 Dec 2024 18:27:00 +0530 Subject: [PATCH 26/45] feat(devbox): store docker volume sizes --- press/fixtures/agent_job_type.json | 813 ++--------------------- press/fixtures/bench_dependency.json | 196 ------ press/fixtures/frappe_version.json | 75 --- press/fixtures/mariadb_variable.json | 36 +- press/fixtures/role.json | 30 +- press/playbooks/roles/user/files/sudoers | 1 + press/press/doctype/devbox/devbox.js | 8 + press/press/doctype/devbox/devbox.json | 23 +- press/press/doctype/devbox/devbox.py | 11 + 9 files changed, 116 insertions(+), 1077 deletions(-) diff --git a/press/fixtures/agent_job_type.json b/press/fixtures/agent_job_type.json index 2e2d2e63fe..e88a7c0b91 100644 --- a/press/fixtures/agent_job_type.json +++ b/press/fixtures/agent_job_type.json @@ -10,33 +10,18 @@ "request_path": "/bench/{bench}/update_inplace", "steps": [ { - "parent": "Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Pull App Changes" }, { - "parent": "Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Migrate Sites" }, { - "parent": "Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rebuild Bench Assets" }, { - "parent": "Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Commit Container Changes" }, { - "parent": "Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Restart" } ] @@ -52,21 +37,12 @@ "request_path": "/proxy/upstreams/{ip}/rename", "steps": [ { - "parent": "Rename Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rename Upstream Directory" }, { - "parent": "Rename Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Rename Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -82,57 +58,30 @@ "request_path": "benches/{site.bench}/sites/{site.name}/rename", "steps": [ { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Maintenance Mode" }, { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Wait for Enqueued Jobs" }, { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Site Configuration" }, { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rename Site" }, { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" }, { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" }, { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Scheduler" }, { - "parent": "Rename Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Create User" } ] @@ -148,21 +97,12 @@ "request_path": null, "steps": [ { - "parent": "Recover Failed Site Migration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Move Site" }, { - "parent": "Recover Failed Site Migration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Restore Touched Tables" }, { - "parent": "Recover Failed Site Migration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" } ] @@ -178,21 +118,12 @@ "request_path": "benches/{bench}/sites/{site}/domains", "steps": [ { - "parent": "Add Domain", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Site Configuration" }, { - "parent": "Add Domain", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Add Domain", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -208,21 +139,12 @@ "request_path": "benches/{bench}/sites/{site}/domains/{domain}", "steps": [ { - "parent": "Remove Domain", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Site Configuration" }, { - "parent": "Remove Domain", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Remove Domain", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -238,45 +160,24 @@ "request_path": "/benches/{bench}/sites/{site}/update/pull", "steps": [ { - "parent": "Update Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Maintenance Mode" }, { - "parent": "Update Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Wait for Enqueued Jobs" }, { - "parent": "Update Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Move Site" }, { - "parent": "Update Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Update Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX Target" }, { - "parent": "Update Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" }, { - "parent": "Update Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" } ] @@ -292,75 +193,39 @@ "request_path": "/benches/{bench}/sites/{site}/update/migrate", "steps": [ { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Maintenance Mode" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Wait for Enqueued Jobs" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Clear Backup Directory" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Backup Site Tables" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Move Site" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX Target" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Run App Specific Scripts" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Migrate Site" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" }, { - "parent": "Update Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Build Search Index" } ] @@ -376,21 +241,12 @@ "request_path": "/proxy/hosts", "steps": [ { - "parent": "Add Host to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Host to Proxy" }, { - "parent": "Add Host to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Add Host to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -406,21 +262,12 @@ "request_path": "/proxy/upstreams/{upstream}/sites", "steps": [ { - "parent": "Add Code Server to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Site File to Upstream Directory" }, { - "parent": "Add Code Server to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Add Code Server to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -436,21 +283,12 @@ "request_path": "/proxy/upstreams/{upstream}/sites", "steps": [ { - "parent": "Remove Code Server from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Site File from Upstream Directory" }, { - "parent": "Remove Code Server from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Remove Code Server from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -466,27 +304,15 @@ "request_path": "benches/{bench}/codeserver", "steps": [ { - "parent": "Setup Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Create Code Server Config" }, { - "parent": "Setup Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Start Code Server" }, { - "parent": "Setup Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Setup Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -502,9 +328,6 @@ "request_path": "benches/{bench}/codeserver/start", "steps": [ { - "parent": "Start Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Start Code Server" } ] @@ -520,9 +343,6 @@ "request_path": "benches/{bench}/codeserver/stop", "steps": [ { - "parent": "Stop Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Stop Code Server" } ] @@ -538,21 +358,12 @@ "request_path": "benches/{bench}/codeserver/archive", "steps": [ { - "parent": "Archive Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Code Server" }, { - "parent": "Archive Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Archive Code Server", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -568,21 +379,12 @@ "request_path": "/proxy/upstreams", "steps": [ { - "parent": "Add Upstream to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Upstream Directory" }, { - "parent": "Add Upstream to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Add Upstream to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -598,9 +400,6 @@ "request_path": "/benches/{bench}/sites/{site}/apps", "steps": [ { - "parent": "Install App on Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Install App on Site" } ] @@ -616,69 +415,36 @@ "request_path": "/benches/{bench}/sites/restore", "steps": [ { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Download Backup Files" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "New Site" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Site Configuration" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Restore Site" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Delete Downloaded Backup Files" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Uninstall Unavailable Apps" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Migrate Site" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Set Administrator Password" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Scheduler" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "New Site from Backup", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -694,9 +460,6 @@ "request_path": "benches/{bench}/sites/{site}/reinstall", "steps": [ { - "parent": "Reinstall Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reinstall Site" } ] @@ -712,21 +475,12 @@ "request_path": "/proxy/upstreams/{upstream}/sites/{site}/status", "steps": [ { - "parent": "Update Site Status", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Site File" }, { - "parent": "Update Site Status", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Update Site Status", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -742,9 +496,6 @@ "request_path": "/benches/{bench}/sites/{site}/apps", "steps": [ { - "parent": "Uninstall App from Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Uninstall App from Site" } ] @@ -760,33 +511,18 @@ "request_path": "/benches/{bench}/sites/{site}/update/pull/recover", "steps": [ { - "parent": "Recover Failed Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Move Site" }, { - "parent": "Recover Failed Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Recover Failed Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX Target" }, { - "parent": "Recover Failed Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" }, { - "parent": "Recover Failed Site Pull", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" } ] @@ -802,9 +538,6 @@ "request_path": "/benches/{bench}/sites/{site}/update/recover", "steps": [ { - "parent": "Recover Failed Site Update", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" } ] @@ -820,45 +553,24 @@ "request_path": "/benches/{bench}/sites/{site}/update/migrate/recover", "steps": [ { - "parent": "Recover Failed Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Move Site" }, { - "parent": "Recover Failed Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Recover Failed Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX Target" }, { - "parent": "Recover Failed Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" }, { - "parent": "Recover Failed Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Restore Touched Tables" }, { - "parent": "Recover Failed Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Run App Specific Scripts" }, { - "parent": "Recover Failed Site Migrate", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" } ] @@ -874,21 +586,12 @@ "request_path": "/proxy/hosts/{host}", "steps": [ { - "parent": "Remove Host from Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Host from Proxy" }, { - "parent": "Remove Host from Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Remove Host from Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -904,9 +607,6 @@ "request_path": "/benches/{bench}/sites/{site}/migrate", "steps": [ { - "parent": "Migrate Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Migrate Site" } ] @@ -922,9 +622,6 @@ "request_path": "/benches/{bench}/info", "steps": [ { - "parent": "Fetch Sites Info", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Fetch Sites Info" } ] @@ -940,27 +637,15 @@ "request_path": "/proxy/hosts/redirects", "steps": [ { - "parent": "Setup Redirects on Hosts", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Redirect on Host" }, { - "parent": "Setup Redirects on Hosts", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Setup Redirect on Host" }, { - "parent": "Setup Redirects on Hosts", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Setup Redirects on Hosts", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -976,21 +661,12 @@ "request_path": "/proxy/hosts/redirects", "steps": [ { - "parent": "Remove Redirects on Hosts", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Redirect on Host" }, { - "parent": "Remove Redirects on Hosts", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Remove Redirects on Hosts", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -1006,33 +682,18 @@ "request_path": "/proxy/upstreams/{upstream}/sites/{site}/rename", "steps": [ { - "parent": "Rename Site on Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rename Site File in Upstream Directory" }, { - "parent": "Rename Site on Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rename Host Directory" }, { - "parent": "Rename Site on Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rename Site in Host Directory" }, { - "parent": "Rename Site on Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Rename Site on Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -1048,21 +709,12 @@ "request_path": "/proxy/wildcards", "steps": [ { - "parent": "Add Wildcard Hosts to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Wildcard Hosts to Proxy" }, { - "parent": "Add Wildcard Hosts to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Add Wildcard Hosts to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -1078,15 +730,9 @@ "request_path": "/benches/{site.bench}/sites/{site.name}/erpnext", "steps": [ { - "parent": "Setup ERPNext", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Create User" }, { - "parent": "Setup ERPNext", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update ERPNext Configuration" } ] @@ -1102,15 +748,9 @@ "request_path": "/benches/{bench}/sites/{site}/cache", "steps": [ { - "parent": "Clear Cache", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Clear Cache" }, { - "parent": "Clear Cache", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Clear Website Cache" } ] @@ -1126,15 +766,9 @@ "request_path": "/benches/{bench}/sites/{site}/update/migrate/restore", "steps": [ { - "parent": "Restore Site Tables", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Restore Site Tables" }, { - "parent": "Restore Site Tables", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" } ] @@ -1150,21 +784,12 @@ "request_path": "/ssh/users", "steps": [ { - "parent": "Add User to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add User to Proxy" }, { - "parent": "Add User to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Certificate to User" }, { - "parent": "Add User to Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Principal to User" } ] @@ -1180,15 +805,9 @@ "request_path": "/ssh/users/{user}", "steps": [ { - "parent": "Remove User from Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove User from Proxy" }, { - "parent": "Remove User from Proxy", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Principal from User" } ] @@ -1204,9 +823,6 @@ "request_path": "/proxysql/users", "steps": [ { - "parent": "Add User to ProxySQL", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add User to ProxySQL" } ] @@ -1222,9 +838,6 @@ "request_path": "/proxysql/users/{username}", "steps": [ { - "parent": "Remove User from ProxySQL", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove User from ProxySQL" } ] @@ -1240,21 +853,12 @@ "request_path": "/minio/create", "steps": [ { - "parent": "Create Minio User", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Create Minio User" }, { - "parent": "Create Minio User", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Create Minio Policy" }, { - "parent": "Create Minio User", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Minio Policy" } ] @@ -1270,9 +874,6 @@ "request_path": "/minio/remove", "steps": [ { - "parent": "Remove Minio User", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Minio User" } ] @@ -1288,9 +889,6 @@ "request_path": "/minio/update", "steps": [ { - "parent": "Enable Minio User", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Minio User" } ] @@ -1306,9 +904,6 @@ "request_path": "/minio/update", "steps": [ { - "parent": "Disable Minio User", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Minio User" } ] @@ -1324,21 +919,12 @@ "request_path": "server/cleanup", "steps": [ { - "parent": "Cleanup Unused Files", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Archived Benches" }, { - "parent": "Cleanup Unused Files", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Temporary Files" }, { - "parent": "Cleanup Unused Files", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Unused Docker Artefacts" } ] @@ -1354,9 +940,6 @@ "request_path": "/proxysql/backends", "steps": [ { - "parent": "Add Backend to ProxySQL", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Backend to ProxySQL" } ] @@ -1372,9 +955,6 @@ "request_path": "/benches/{bench}/sites/{site}/update/saas", "steps": [ { - "parent": "Update Saas Plan", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Saas Plan" } ] @@ -1390,33 +970,18 @@ "request_path": "benches/{bench}/sites/{site}/run_after_migrate_steps", "steps": [ { - "parent": "Run After Migrate Steps", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Set Administrator Password" }, { - "parent": "Run After Migrate Steps", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Run After Migrate Steps", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" }, { - "parent": "Run After Migrate Steps", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" }, { - "parent": "Run After Migrate Steps", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Scheduler" } ] @@ -1432,51 +997,27 @@ "request_path": "/benches/{bench}/sites/{site}/move_to_bench", "steps": [ { - "parent": "Move Site to Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Maintenance Mode" }, { - "parent": "Move Site to Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Wait for Enqueued Jobs" }, { - "parent": "Move Site to Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Move Site" }, { - "parent": "Move Site to Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Move Site to Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX Target" }, { - "parent": "Move Site to Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" }, { - "parent": "Move Site to Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Migrate Site" }, { - "parent": "Move Site to Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Disable Maintenance Mode" } ] @@ -1492,9 +1033,6 @@ "request_path": "benches/{bench}/sites/{site}/usage", "steps": [ { - "parent": "Reset Site Usage", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reset Site Usage" } ] @@ -1510,15 +1048,9 @@ "request_path": "/proxy/reload", "steps": [ { - "parent": "Reload NGINX Job", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Reload NGINX Job", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -1534,15 +1066,9 @@ "request_path": null, "steps": [ { - "parent": "Backup Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Backup Site" }, { - "parent": "Backup Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Upload Site Backup to S3" } ] @@ -1558,9 +1084,6 @@ "request_path": "/benches/{bench}/restart", "steps": [ { - "parent": "Bench Restart", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Restart" } ] @@ -1576,15 +1099,9 @@ "request_path": "/benches/{bench}/archive", "steps": [ { - "parent": "Archive Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Disable Production" }, { - "parent": "Archive Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Move Bench to Archived Directory" } ] @@ -1600,27 +1117,15 @@ "request_path": "/benches", "steps": [ { - "parent": "New Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Initialize Bench" }, { - "parent": "New Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Bench Configuration" }, { - "parent": "New Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Deploy Bench" }, { - "parent": "New Bench", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" } ] @@ -1636,21 +1141,12 @@ "request_path": "benches/{bench}/limit", "steps": [ { - "parent": "Force Update Bench Limits", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Stop Bench" }, { - "parent": "Force Update Bench Limits", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Bench Memory Limits" }, { - "parent": "Force Update Bench Limits", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Start Bench" } ] @@ -1666,33 +1162,18 @@ "request_path": "/benches/{bench}/config", "steps": [ { - "parent": "Update Bench Configuration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Bench Configuration" }, { - "parent": "Update Bench Configuration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Update Bench Configuration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate Docker Compose File" }, { - "parent": "Update Bench Configuration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Bench Memory Limits" }, { - "parent": "Update Bench Configuration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Deploy Bench" } ] @@ -1708,9 +1189,6 @@ "request_path": "benches/{bench}/rebuild", "steps": [ { - "parent": "Rebuild Bench Assets", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rebuild Bench Assets" } ] @@ -1726,9 +1204,6 @@ "request_path": "benches/{bench}/sites/{site}/optimize", "steps": [ { - "parent": "Optimize Tables", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Optimize Tables" } ] @@ -1744,9 +1219,6 @@ "request_path": "builder/build", "steps": [ { - "parent": "Docker Image Build", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Docker Image Build" } ] @@ -1762,21 +1234,12 @@ "request_path": "/bench/{bench}/patch/{app}", "steps": [ { - "parent": "Patch App", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Git Apply" }, { - "parent": "Patch App", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rebuild Bench Assets" }, { - "parent": "Patch App", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Restart" } ] @@ -1792,9 +1255,6 @@ "request_path": "/benches/{bench}/supervisorctl", "steps": [ { - "parent": "Call Bench Supervisorctl", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Run Supervisorctl Command" } ] @@ -1810,21 +1270,12 @@ "request_path": "/builder/build", "steps": [ { - "parent": "Run Remote Builder", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Build Image" }, { - "parent": "Run Remote Builder", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Push Docker Image" }, { - "parent": "Run Remote Builder", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Cleanup Context" } ] @@ -1840,9 +1291,6 @@ "request_path": "/benches/{bench}/sites/{site}/add-database-index", "steps": [ { - "parent": "Add Database Index", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Add Database Index With Bench Command" } ] @@ -1858,63 +1306,33 @@ "request_path": "/benches/{bench}/sites/{site}/restore", "steps": [ { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Download Backup Files" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Restore Site" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Checksum of Downloaded Backup Files" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Delete Downloaded Backup Files" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Uninstall Unavailable Apps" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Migrate Site" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Set Administrator Password" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Scheduler" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Restore Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -1930,9 +1348,6 @@ "request_path": "/database/column-stats", "steps": [ { - "parent": "Column Statistics", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Fetch Column Statistics" } ] @@ -1948,9 +1363,6 @@ "request_path": "/benches/{bench}/sites/{site}/complete-setup-wizard", "steps": [ { - "parent": "Complete Setup Wizard", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Complete Setup Wizard" } ] @@ -1966,9 +1378,6 @@ "request_path": "/benches/{bench}/sites/{site}/create-user", "steps": [ { - "parent": "Create User", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Create User" } ] @@ -1984,45 +1393,24 @@ "request_path": "/benches/{bench}/sites", "steps": [ { - "parent": "New Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "New Site" }, { - "parent": "New Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Install Apps" }, { - "parent": "New Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Site Configuration" }, { - "parent": "New Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Scheduler" }, { - "parent": "New Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Create User" }, { - "parent": "New Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "New Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -2038,9 +1426,6 @@ "request_path": "/benches/{bench}/sites/{site}/config", "steps": [ { - "parent": "Update Site Configuration", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Update Site Configuration" } ] @@ -2056,21 +1441,12 @@ "request_path": "/proxy/upstreams/{upstream}/sites/{site}", "steps": [ { - "parent": "Remove Site from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Remove Site File from Upstream Directory" }, { - "parent": "Remove Site from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Generate NGINX Configuration" }, { - "parent": "Remove Site from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -2086,21 +1462,12 @@ "request_path": null, "steps": [ { - "parent": "Archive Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Archive Site" }, { - "parent": "Archive Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Archive Site", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Reload NGINX" } ] @@ -2116,27 +1483,15 @@ "request_path": "/bench/{bench}/recover_update_inplace", "steps": [ { - "parent": "Recover Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Enable Maintenance Mode" }, { - "parent": "Recover Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Deploy Bench" }, { - "parent": "Recover Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Setup NGINX" }, { - "parent": "Recover Update In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Recover Sites" } ] @@ -2152,33 +1507,18 @@ "request_path": "/bench/{bench}/update_inplace", "steps": [ { - "parent": "Update Bench In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Pull App Changes" }, { - "parent": "Update Bench In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Migrate Sites" }, { - "parent": "Update Bench In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Rebuild Bench Assets" }, { - "parent": "Update Bench In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Commit Container Changes" }, { - "parent": "Update Bench In Place", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Bench Restart" } ] @@ -2194,9 +1534,6 @@ "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", "steps": [ { - "parent": "Start Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", "step_name": "Run Devbox" } ] @@ -2206,16 +1543,13 @@ "docstatus": 0, "doctype": "Agent Job Type", "max_retry_count": 3, - "modified": "2024-10-23 20:30:22.356484", - "name": "Stop Devbox", + "modified": "2024-09-11 13:28:32.120581", + "name": "Ping Job", "request_method": "POST", - "request_path": "devboxes/{devbox.name}/stop", + "request_path": "ping_job", "steps": [ { - "parent": "Stop Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Stop Devbox" + "step_name": "Ping Step" } ] }, @@ -2223,47 +1557,29 @@ "disabled_auto_retry": 1, "docstatus": 0, "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-09-11 13:28:32.120581", - "name": "Ping Job", + "max_retry_count": 1, + "modified": "2024-10-28 14:49:19.894247", + "name": "Fetch Database Table Schema", "request_method": "POST", - "request_path": "ping_job", + "request_path": "/benches/{bench}/sites/{site}/database/schema", "steps": [ { - "parent": "Ping Job", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Ping Step" + "step_name": "Fetch Database Table Schema" } ] }, { - "disabled_auto_retry": 0, + "disabled_auto_retry": 1, "docstatus": 0, "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.626647", - "name": "Add Site to Upstream", + "max_retry_count": 1, + "modified": "2024-11-04 14:49:18.592247", + "name": "Create Database User", "request_method": "POST", - "request_path": "/proxy/upstreams/{upstream}/sites", + "request_path": "/benches/{bench}/sites/{site}/database/users", "steps": [ { - "parent": "Add Site to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Add Site File to Upstream Directory" - }, - { - "parent": "Add Site to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Generate NGINX Configuration" - }, - { - "parent": "Add Site to Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Reload NGINX" + "step_name": "Create Database User" } ] }, @@ -2271,29 +1587,14 @@ "disabled_auto_retry": 1, "docstatus": 0, "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-10-21 11:00:39.229673", - "name": "New Devbox", - "request_method": "POST", - "request_path": "/devboxes", + "max_retry_count": 1, + "modified": "2024-11-04 14:49:18.592247", + "name": "Remove Database User", + "request_method": "DELETE", + "request_path": "/benches/{bench}/sites/{site}/database/users/{username}", "steps": [ { - "parent": "New Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Initialize Devbox" - }, - { - "parent": "New Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Run Devbox" - }, - { - "parent": "New Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Devbox Setup NGINX" + "step_name": "Remove Database User" } ] }, @@ -2302,16 +1603,13 @@ "docstatus": 0, "doctype": "Agent Job Type", "max_retry_count": 1, - "modified": "2024-10-28 14:49:19.894247", - "name": "Fetch Database Table Schema", + "modified": "2024-11-04 14:49:18.592247", + "name": "Modify Database User Permissions", "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/database/schema", + "request_path": "/benches/{bench}/sites/{site}/database/users/{db_user}/permissions", "steps": [ { - "parent": "Fetch Database Table Schema", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Fetch Database Table Schema" + "step_name": "Modify Database User Permissions" } ] }, @@ -2319,17 +1617,14 @@ "disabled_auto_retry": 1, "docstatus": 0, "doctype": "Agent Job Type", - "max_retry_count": 1, - "modified": "2024-11-04 14:49:18.592247", - "name": "Create Database User", + "max_retry_count": 3, + "modified": "2024-10-23 20:30:22.356484", + "name": "Stop Devbox", "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/database/users", + "request_path": "devboxes/{devbox.name}/stop", "steps": [ { - "parent": "Create Database User", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Create Database User" + "step_name": "Stop Devbox" } ] }, @@ -2337,35 +1632,47 @@ "disabled_auto_retry": 1, "docstatus": 0, "doctype": "Agent Job Type", - "max_retry_count": 1, - "modified": "2024-11-04 14:49:18.592247", - "name": "Remove Database User", - "request_method": "DELETE", - "request_path": "/benches/{bench}/sites/{site}/database/users/{username}", + "max_retry_count": 3, + "modified": "2024-12-11 18:08:04.411669", + "name": "New Devbox", + "request_method": "POST", + "request_path": "/devboxes", "steps": [ { - "parent": "Remove Database User", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Remove Database User" + "step_name": "Initialize Devbox" + }, + { + "step_name": "Create Devbox Database Volume" + }, + { + "step_name": "Create Devbox Home Volume" + }, + { + "step_name": "Run Devbox" + }, + { + "step_name": "Devbox Setup NGINX" } ] }, { - "disabled_auto_retry": 1, + "disabled_auto_retry": 0, "docstatus": 0, "doctype": "Agent Job Type", - "max_retry_count": 1, - "modified": "2024-11-04 14:49:18.592247", - "name": "Modify Database User Permissions", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.626647", + "name": "Add Site to Upstream", "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/database/users/{db_user}/permissions", + "request_path": "/proxy/upstreams/{upstream}/sites", "steps": [ { - "parent": "Modify Database User Permissions", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Modify Database User Permissions" + "step_name": "Add Site File to Upstream Directory" + }, + { + "step_name": "Generate NGINX Configuration" + }, + { + "step_name": "Reload NGINX" } ] } diff --git a/press/fixtures/bench_dependency.json b/press/fixtures/bench_dependency.json index da83aa5232..dfb55fd298 100644 --- a/press/fixtures/bench_dependency.json +++ b/press/fixtures/bench_dependency.json @@ -7,74 +7,38 @@ "name": "PYTHON_VERSION", "supported_versions": [ { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "3.7" }, { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "3.7" }, { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "3.8" }, { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "3.10" }, { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "3.10" }, { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "3.10" }, { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "3.11" }, { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "3.11" }, { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "3.11" } @@ -89,50 +53,26 @@ "name": "NODE_VERSION", "supported_versions": [ { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "18.16.0" }, { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "18.16.0" }, { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "16.11.0" }, { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "16.16.0" }, { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "14.19.0" }, { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "12.19.0" } @@ -147,122 +87,62 @@ "name": "WKHTMLTOPDF_VERSION", "supported_versions": [ { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "0.12.4" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "0.12.4" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "0.12.4" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "0.12.4" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "0.12.4" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "0.12.5" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "0.12.5" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "0.12.5" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "0.12.5" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "0.12.5" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "0.12.6" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "0.12.6" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "0.12.6" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "0.12.6" }, { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "0.12.6" } @@ -277,114 +157,58 @@ "name": "BENCH_VERSION", "supported_versions": [ { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "5.15.2" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "5.15.2" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "5.15.2" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "5.16.0" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "5.17.2" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "5.17.2" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "5.17.2" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "5.17.2" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "5.17.2" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "5.18.0" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "5.18.0" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "5.18.0" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "5.18.0" }, { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "5.18.0" } @@ -399,42 +223,22 @@ "name": "NVM_VERSION", "supported_versions": [ { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Nightly", "version": "0.39.1" }, { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 12", "version": "0.39.1" }, { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 13", "version": "0.39.1" }, { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 14", "version": "0.39.1" }, { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", "supported_frappe_version": "Version 15", "version": "0.39.1" } diff --git a/press/fixtures/frappe_version.json b/press/fixtures/frappe_version.json index bf5258d220..080d6c821e 100644 --- a/press/fixtures/frappe_version.json +++ b/press/fixtures/frappe_version.json @@ -4,37 +4,22 @@ "dependencies": [ { "dependency": "NVM_VERSION", - "parent": "Version 12", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.36.0" }, { "dependency": "NODE_VERSION", - "parent": "Version 12", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "12.19.0" }, { "dependency": "PYTHON_VERSION", - "parent": "Version 12", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "3.7" }, { "dependency": "WKHTMLTOPDF_VERSION", - "parent": "Version 12", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.12.5" }, { "dependency": "BENCH_VERSION", - "parent": "Version 12", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "5.15.2" } ], @@ -51,37 +36,22 @@ "dependencies": [ { "dependency": "NVM_VERSION", - "parent": "Version 13", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.36.0" }, { "dependency": "NODE_VERSION", - "parent": "Version 13", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "14.19.0" }, { "dependency": "PYTHON_VERSION", - "parent": "Version 13", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "3.8" }, { "dependency": "WKHTMLTOPDF_VERSION", - "parent": "Version 13", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.12.5" }, { "dependency": "BENCH_VERSION", - "parent": "Version 13", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "5.15.2" } ], @@ -98,37 +68,22 @@ "dependencies": [ { "dependency": "NVM_VERSION", - "parent": "Nightly", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.36.0" }, { "dependency": "NODE_VERSION", - "parent": "Nightly", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "18.16.0" }, { "dependency": "PYTHON_VERSION", - "parent": "Nightly", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "3.11" }, { "dependency": "WKHTMLTOPDF_VERSION", - "parent": "Nightly", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.12.5" }, { "dependency": "BENCH_VERSION", - "parent": "Nightly", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "5.22.6" } ], @@ -145,37 +100,22 @@ "dependencies": [ { "dependency": "NVM_VERSION", - "parent": "Version 14", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.36.0" }, { "dependency": "NODE_VERSION", - "parent": "Version 14", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "14.19.0" }, { "dependency": "PYTHON_VERSION", - "parent": "Version 14", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "3.10" }, { "dependency": "WKHTMLTOPDF_VERSION", - "parent": "Version 14", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.12.5" }, { "dependency": "BENCH_VERSION", - "parent": "Version 14", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "5.15.2" } ], @@ -192,37 +132,22 @@ "dependencies": [ { "dependency": "NVM_VERSION", - "parent": "Version 15", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.36.0" }, { "dependency": "NODE_VERSION", - "parent": "Version 15", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "18.16.0" }, { "dependency": "PYTHON_VERSION", - "parent": "Version 15", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "3.11" }, { "dependency": "WKHTMLTOPDF_VERSION", - "parent": "Version 15", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "0.12.5" }, { "dependency": "BENCH_VERSION", - "parent": "Version 15", - "parentfield": "dependencies", - "parenttype": "Frappe Version", "version": "5.22.6" } ], diff --git a/press/fixtures/mariadb_variable.json b/press/fixtures/mariadb_variable.json index c2ef43e9e2..cc76bf17e6 100644 --- a/press/fixtures/mariadb_variable.json +++ b/press/fixtures/mariadb_variable.json @@ -155,6 +155,18 @@ "set_on_new_servers": 0, "skippable": 0 }, + { + "datatype": "Str", + "default_value": "3307", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2024-11-22 12:52:35.958089", + "name": "extra_port", + "set_on_new_servers": 0, + "skippable": 0 + }, { "datatype": "Str", "default_value": "200", @@ -370,29 +382,5 @@ "name": "myisam_recover_options", "set_on_new_servers": 0, "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "3307", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2024-11-22 12:52:35.958089", - "name": "extra_port", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "MIXED", - "doc_section": "replication-and-binary-log", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2024-12-12 12:59:33.579411", - "name": "binlog_format", - "set_on_new_servers": 0, - "skippable": 0 } ] \ No newline at end of file diff --git a/press/fixtures/role.json b/press/fixtures/role.json index 8baf5ba985..ce89d14718 100644 --- a/press/fixtures/role.json +++ b/press/fixtures/role.json @@ -1,65 +1,41 @@ [ { - "bulk_actions": 0, - "dashboard": 0, "desk_access": 0, "disabled": 0, "docstatus": 0, "doctype": "Role", - "form_sidebar": 0, "home_page": null, "is_custom": 0, - "list_sidebar": 0, "modified": "2024-05-27 11:14:43.545958", "name": "Press Support Agent", - "notifications": 0, "restrict_to_domain": null, "role_name": "Press Support Agent", - "search_bar": 0, - "timeline": 0, - "two_factor_auth": 0, - "view_switcher": 0 + "two_factor_auth": 0 }, { - "bulk_actions": 0, - "dashboard": 0, "desk_access": 0, "disabled": 0, "docstatus": 0, "doctype": "Role", - "form_sidebar": 0, "home_page": null, "is_custom": 0, - "list_sidebar": 0, "modified": "2020-04-06 22:48:03.538506", "name": "Press Admin", - "notifications": 0, "restrict_to_domain": null, "role_name": "Press Admin", - "search_bar": 0, - "timeline": 0, - "two_factor_auth": 0, - "view_switcher": 0 + "two_factor_auth": 0 }, { - "bulk_actions": 0, - "dashboard": 0, "desk_access": 0, "disabled": 0, "docstatus": 0, "doctype": "Role", - "form_sidebar": 0, "home_page": null, "is_custom": 0, - "list_sidebar": 0, "modified": "2020-04-06 22:48:33.006868", "name": "Press Member", - "notifications": 0, "restrict_to_domain": null, "role_name": "Press Member", - "search_bar": 0, - "timeline": 0, - "two_factor_auth": 0, - "view_switcher": 0 + "two_factor_auth": 0 } ] \ No newline at end of file diff --git a/press/playbooks/roles/user/files/sudoers b/press/playbooks/roles/user/files/sudoers index d909b662a2..639cea598d 100644 --- a/press/playbooks/roles/user/files/sudoers +++ b/press/playbooks/roles/user/files/sudoers @@ -6,4 +6,5 @@ frappe ALL = (root) NOPASSWD: /bin/systemctl * alertmanager frappe ALL = (root) NOPASSWD: /usr/bin/supervisorctl frappe ALL = (root) NOPASSWD: /usr/sbin/nginx frappe ALL = (root) NOPASSWD: /usr/local/bin/bench +frappe ALL = (root) NOPASSWD: /usr/bin/du diff --git a/press/press/doctype/devbox/devbox.js b/press/press/doctype/devbox/devbox.js index 668819c7ed..b7a9b02ea1 100644 --- a/press/press/doctype/devbox/devbox.js +++ b/press/press/doctype/devbox/devbox.js @@ -49,6 +49,14 @@ frappe.ui.form.on('Devbox', { __('Actions'), ); + frm.add_custom_button( + __('Sync Docker Volumes Size'), + () => { + frm.call('sync_devbox_docker_volumes_size'); + }, + __('Actions'), + ); + if (['Starting', 'Running'].includes(frm.doc.status)) { frm.add_custom_button( __('Go to Devbox'), diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 9b3cdbd7a1..49633be328 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -23,7 +23,10 @@ "container_id", "cpu_cores", "ram", - "disk_mb" + "disk_mb", + "column_break_lmyb", + "home_volume_size", + "database_volume_size" ], "fields": [ { @@ -139,6 +142,22 @@ "fieldtype": "Data", "label": "Codeserver Password", "read_only": 1 + }, + { + "fieldname": "home_volume_size", + "fieldtype": "Data", + "label": "Home Volume Size", + "read_only": 1 + }, + { + "fieldname": "database_volume_size", + "fieldtype": "Data", + "label": "Database Volume Size", + "read_only": 1 + }, + { + "fieldname": "column_break_lmyb", + "fieldtype": "Column Break" } ], "index_web_pages_for_search": 1, @@ -149,7 +168,7 @@ "link_fieldname": "devbox" } ], - "modified": "2024-11-05 22:19:26.735978", + "modified": "2024-12-12 18:22:16.606760", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index e1c62abbdd..d74100e91f 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -32,8 +32,10 @@ class Devbox(Document): codeserver_port: DF.Int container_id: DF.Data | None cpu_cores: DF.Int + database_volume_size: DF.Data | None disk_mb: DF.Int domain: DF.Link | None + home_volume_size: DF.Data | None initialized: DF.Check ram: DF.Int server: DF.Link @@ -43,6 +45,7 @@ class Devbox(Document): vnc_port: DF.Int websockify_port: DF.Int # end: auto-generated types + pass def _get_devbox_name(self, subdomain: str): @@ -128,6 +131,14 @@ def sync_devbox_status(self): status = "Exited" frappe.db.set_value(dt="Devbox", dn=self.name, field="status", val=status) + @frappe.whitelist() + def sync_devbox_docker_volumes_size(self): + agent = Agent(server_type="Server", server=self.server) + parsed_result = agent.post(f"devboxes/{self.name}/docker_volumes_size")["message"] + + for field in ["database_volume_size", "home_volume_size"]: + frappe.db.set_value(dt="Devbox", dn=self.name, field=field, val=parsed_result.get(field)) + def process_new_devbox_job_update(job: AgentJob): if job.job_type == "New Devbox" and job.status == "Success": From 535d08d181cfe34b18029a77d6ce27d17f68b750 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Fri, 13 Dec 2024 12:50:22 +0530 Subject: [PATCH 27/45] feat(devbox): sync all devboxes --- press/hooks.py | 1 + press/press/doctype/devbox/devbox.json | 9 +++++++- press/press/doctype/devbox/devbox.py | 1 + press/press/doctype/devbox/devbox_helper.py | 23 +++++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 press/press/doctype/devbox/devbox_helper.py diff --git a/press/hooks.py b/press/hooks.py index af6b0eabc5..a59b1191c2 100644 --- a/press/hooks.py +++ b/press/hooks.py @@ -271,6 +271,7 @@ "press.press.doctype.deploy_candidate.deploy_candidate.run_scheduled_builds", "press.press.doctype.agent_request_failure.agent_request_failure.remove_old_failures", "press.saas.doctype.site_access_token.site_access_token.cleanup_expired_access_tokens", + "press.press.doctype.devbox.devbox_helper.sync_all_active_devboxes", ], "*/10 * * * *": [ "press.saas.doctype.product_trial.product_trial.replenish_standby_sites", diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 49633be328..e7d5f61044 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -9,6 +9,7 @@ "subdomain", "domain", "initialized", + "is_removed", "websockify_port", "codeserver_port", "vnc_port", @@ -158,6 +159,12 @@ { "fieldname": "column_break_lmyb", "fieldtype": "Column Break" + }, + { + "default": "0", + "fieldname": "is_removed", + "fieldtype": "Check", + "label": "Removed" } ], "index_web_pages_for_search": 1, @@ -168,7 +175,7 @@ "link_fieldname": "devbox" } ], - "modified": "2024-12-12 18:22:16.606760", + "modified": "2024-12-13 11:10:28.142206", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index d74100e91f..0a6b72cb29 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -37,6 +37,7 @@ class Devbox(Document): domain: DF.Link | None home_volume_size: DF.Data | None initialized: DF.Check + is_removed: DF.Check ram: DF.Int server: DF.Link status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited"] diff --git a/press/press/doctype/devbox/devbox_helper.py b/press/press/doctype/devbox/devbox_helper.py new file mode 100644 index 0000000000..8161547802 --- /dev/null +++ b/press/press/doctype/devbox/devbox_helper.py @@ -0,0 +1,23 @@ +import frappe + +from press.press.doctype.devbox.devbox import Devbox + + +def sync_all_active_devboxes(): + devboxes = frappe.get_all("Devbox", filters={"is_removed": False}, pluck="name") + print(devboxes) + for devbox_name in devboxes: + frappe.enqueue( + "press.press.doctype.devbox.devbox_helper.sync_devbox", + devbox_name=devbox_name, + queue="sync", + deduplicate=True, + enqueue_after_commit=True, + job_id=f"sync_devbox:{devbox_name}", + ) + + +def sync_devbox(devbox_name): + devbox = Devbox("Devbox", devbox_name) + devbox.sync_devbox_status() + devbox.sync_devbox_docker_volumes_size() From 8ad1b76d3e462b1dc02ddd8d659b74fd54cec3d2 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Fri, 13 Dec 2024 18:10:40 +0530 Subject: [PATCH 28/45] feat(devbox): Destroy Devbox --- press/fixtures/agent_job_type.json | 96 +++++++++++++-------- press/press/doctype/agent_job/agent_job.py | 2 +- press/press/doctype/devbox/devbox.js | 37 ++++---- press/press/doctype/devbox/devbox.json | 8 +- press/press/doctype/devbox/devbox.py | 30 ++++++- press/press/doctype/devbox/devbox_helper.py | 3 +- 6 files changed, 117 insertions(+), 59 deletions(-) diff --git a/press/fixtures/agent_job_type.json b/press/fixtures/agent_job_type.json index e88a7c0b91..f153ebb741 100644 --- a/press/fixtures/agent_job_type.json +++ b/press/fixtures/agent_job_type.json @@ -1430,27 +1430,6 @@ } ] }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.587094", - "name": "Remove Site from Upstream", - "request_method": "DELETE", - "request_path": "/proxy/upstreams/{upstream}/sites/{site}", - "steps": [ - { - "step_name": "Remove Site File from Upstream Directory" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, { "disabled_auto_retry": 0, "docstatus": 0, @@ -1523,21 +1502,6 @@ } ] }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-10-21 11:18:53.122319", - "name": "Start Devbox", - "request_method": "POST", - "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", - "steps": [ - { - "step_name": "Run Devbox" - } - ] - }, { "disabled_auto_retry": 1, "docstatus": 0, @@ -1675,5 +1639,65 @@ "step_name": "Reload NGINX" } ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-10-21 11:18:53.122319", + "name": "Start Devbox", + "request_method": "POST", + "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", + "steps": [ + { + "step_name": "Run Devbox" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.587094", + "name": "Remove Site from Upstream", + "request_method": "DELETE", + "request_path": "/proxy/upstreams/{upstream}/sites/{site}", + "steps": [ + { + "step_name": "Remove Site File from Upstream Directory" + }, + { + "step_name": "Generate NGINX Configuration" + }, + { + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-12-13 16:38:43.930665", + "name": "Destroy Devbox", + "request_method": "POST", + "request_path": "/devboxes/{devbox.name}/destroy", + "steps": [ + { + "step_name": "Delete Devbox Directory" + }, + { + "step_name": "Stop Devbox" + }, + { + "step_name": "Delete Devbox Database Volume" + }, + { + "step_name": "Delete Devbox Home Volume" + } + ] } ] \ No newline at end of file diff --git a/press/press/doctype/agent_job/agent_job.py b/press/press/doctype/agent_job/agent_job.py index e50852cb06..4d74c9c935 100644 --- a/press/press/doctype/agent_job/agent_job.py +++ b/press/press/doctype/agent_job/agent_job.py @@ -1029,7 +1029,7 @@ def process_job_updates(job_name: str, response_data: dict | None = None): # no Bench.process_update_inplace(job) elif job.job_type == "Recover Update In Place": Bench.process_recover_update_inplace(job) - elif job.job_type == "New Devbox" or job.job_type == "Start Devbox" or job.job_type == "Stop Devbox": + elif job.job_type in ("New Devbox", "Start Devbox", "Stop Devbox", "Destroy Devbox"): process_new_devbox_job_update(job=job) elif job.job_type == "Fetch Database Table Schema": SiteDatabaseTableSchema.process_job_update(job) diff --git a/press/press/doctype/devbox/devbox.js b/press/press/doctype/devbox/devbox.js index b7a9b02ea1..ad7471fc7f 100644 --- a/press/press/doctype/devbox/devbox.js +++ b/press/press/doctype/devbox/devbox.js @@ -39,23 +39,23 @@ frappe.ui.form.on('Devbox', { }, __('Actions'), ); - } - frm.add_custom_button( - __('Sync Status'), - () => { - frm.call('sync_devbox_status'); - }, - __('Actions'), - ); + frm.add_custom_button( + __('Sync Status'), + () => { + frm.call('sync_devbox_status'); + }, + __('Actions'), + ); - frm.add_custom_button( - __('Sync Docker Volumes Size'), - () => { - frm.call('sync_devbox_docker_volumes_size'); - }, - __('Actions'), - ); + frm.add_custom_button( + __('Sync Docker Volumes Size'), + () => { + frm.call('sync_devbox_docker_volumes_size'); + }, + __('Actions'), + ); + } if (['Starting', 'Running'].includes(frm.doc.status)) { frm.add_custom_button( @@ -66,5 +66,12 @@ frappe.ui.form.on('Devbox', { __('Actions'), ); } + frm.add_custom_button( + __('Destroy Devbox'), + () => { + frm.call('destroy_devbox'); + }, + __('Actions'), + ); }, }); diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index e7d5f61044..268510bd4f 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -9,7 +9,7 @@ "subdomain", "domain", "initialized", - "is_removed", + "is_destroyed", "websockify_port", "codeserver_port", "vnc_port", @@ -162,9 +162,9 @@ }, { "default": "0", - "fieldname": "is_removed", + "fieldname": "is_destroyed", "fieldtype": "Check", - "label": "Removed" + "label": "Destroyed" } ], "index_web_pages_for_search": 1, @@ -175,7 +175,7 @@ "link_fieldname": "devbox" } ], - "modified": "2024-12-13 11:10:28.142206", + "modified": "2024-12-13 14:11:07.884598", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 0a6b72cb29..41d918d258 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -37,7 +37,7 @@ class Devbox(Document): domain: DF.Link | None home_volume_size: DF.Data | None initialized: DF.Check - is_removed: DF.Check + is_destroyed: DF.Check ram: DF.Int server: DF.Link status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited"] @@ -62,6 +62,28 @@ def autoname(self): def get_available_cpu_and_ram(self): print("meow") + @frappe.whitelist() + def destroy_devbox(self): + devbox = self + reverse_proxy = frappe.db.get_value(doctype="Server", filters=devbox.server, fieldname="proxy_server") + proxy_agent = Agent(server_type="Proxy Server", server=reverse_proxy) + server_private_ip = frappe.db.get_value( + doctype="Server", filters=devbox.server, fieldname="private_ip" + ) + proxy_agent.create_agent_job( + "Remove Site from Upstream", + path=f"/proxy/upstreams/{server_private_ip}/sites/{devbox.name}", + data={"name": devbox.name}, + devbox=devbox.name, + method="DELETE", + ) + server_agent = Agent(server_type="Server", server=devbox.server) + server_agent.create_agent_job( + "Destroy Devbox", + path=f"/devboxes/{devbox.name}/destroy", + devbox=devbox.name, + ) + @frappe.whitelist() def initialize_devbox(self): devbox = self @@ -153,6 +175,12 @@ def process_new_devbox_job_update(job: AgentJob): } frappe.db.set_value("Devbox", job.devbox, update_fields) + if job.job_type == "Destroy Devbox" and job.status == "Success": + update_fields = { + "is_destroyed": True, + } + frappe.db.set_value("Devbox", job.devbox, update_fields) + if job.job_type == "Add Site to Upstream" and job.status == "Success": frappe.db.set_value(dt="Devbox", dn=job.devbox, field="add_site_to_upstream", val=True) diff --git a/press/press/doctype/devbox/devbox_helper.py b/press/press/doctype/devbox/devbox_helper.py index 8161547802..7c081cd914 100644 --- a/press/press/doctype/devbox/devbox_helper.py +++ b/press/press/doctype/devbox/devbox_helper.py @@ -4,8 +4,7 @@ def sync_all_active_devboxes(): - devboxes = frappe.get_all("Devbox", filters={"is_removed": False}, pluck="name") - print(devboxes) + devboxes = frappe.get_all("Devbox", filters={"is_destroyed": False}, pluck="name") for devbox_name in devboxes: frappe.enqueue( "press.press.doctype.devbox.devbox_helper.sync_devbox", From 84d3ffa819fb29d10e712acd6c37b30cb3944150 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 16 Dec 2024 10:53:02 +0530 Subject: [PATCH 29/45] chore(Devbox): added team field and rearranged fields --- press/press/doctype/devbox/devbox.json | 37 +++++++++++++++++++------- press/press/doctype/devbox/devbox.py | 1 + 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 268510bd4f..8b79d1bc70 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -8,16 +8,19 @@ "server_section", "subdomain", "domain", + "status", + "add_site_to_upstream", "initialized", "is_destroyed", + "column_break_ydvd", + "server", + "team", + "ports_and_config_tab", "websockify_port", "codeserver_port", "vnc_port", + "column_break_onqt", "browser_port", - "column_break_cdoo", - "server", - "status", - "add_site_to_upstream", "vnc_password", "codeserver_password", "machine_configuration_section", @@ -87,10 +90,6 @@ "label": "Domain", "options": "Root Domain" }, - { - "fieldname": "column_break_cdoo", - "fieldtype": "Column Break" - }, { "default": "0", "fieldname": "initialized", @@ -165,6 +164,26 @@ "fieldname": "is_destroyed", "fieldtype": "Check", "label": "Destroyed" + }, + { + "fieldname": "ports_and_config_tab", + "fieldtype": "Tab Break", + "label": "Ports and Config" + }, + { + "fieldname": "column_break_onqt", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_ydvd", + "fieldtype": "Column Break" + }, + { + "fieldname": "team", + "fieldtype": "Link", + "label": "Team", + "options": "Team", + "reqd": 1 } ], "index_web_pages_for_search": 1, @@ -175,7 +194,7 @@ "link_fieldname": "devbox" } ], - "modified": "2024-12-13 14:11:07.884598", + "modified": "2024-12-16 10:41:42.488282", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 41d918d258..34a7bf8b88 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -42,6 +42,7 @@ class Devbox(Document): server: DF.Link status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited"] subdomain: DF.Data + team: DF.Link vnc_password: DF.Data | None vnc_port: DF.Int websockify_port: DF.Int From 187f18d1470ad61a2046d7d2e5175cc5b2c9c8a9 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Tue, 17 Dec 2024 16:17:23 +0530 Subject: [PATCH 30/45] fix(devbox) : check for domain existence while new site and new devbox --- press/api/site.py | 3 ++- press/press/doctype/devbox/devbox.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/press/api/site.py b/press/api/site.py index 69863fcf40..e4be5b52a3 100644 --- a/press/api/site.py +++ b/press/api/site.py @@ -1581,9 +1581,10 @@ def restore(name, files, skip_failing_patches=False): @frappe.whitelist() def exists(subdomain, domain): + from press.press.doctype.devbox.devbox import Devbox from press.press.doctype.site.site import Site - return Site.exists(subdomain, domain) + return Site.exists(subdomain, domain) or Devbox.exists(subdomain, domain) @frappe.whitelist() diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 34a7bf8b88..8c5ff82f7f 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -59,6 +59,24 @@ def _get_devbox_name(self, subdomain: str): def autoname(self): self.name = self._get_devbox_name(subdomain=self.subdomain) + @classmethod + def exists(cls, subdomain, domain) -> bool: + """Check if subdomain is available""" + banned_domains = frappe.get_all("Blocked Domain", {"block_for_all": 1}, pluck="name") + if banned_domains and subdomain in banned_domains: + return True + return bool( + frappe.db.exists("Blocked Domain", {"name": subdomain, "root_domain": domain}) + or frappe.db.exists( + "Site", + { + "subdomain": subdomain, + "domain": domain, + "is_destroyed": False, + }, + ) + ) + @frappe.whitelist() def get_available_cpu_and_ram(self): print("meow") From 4d39c3237cc2160c2b8755218f25042c79d34427 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Fri, 20 Dec 2024 13:46:36 +0530 Subject: [PATCH 31/45] chore(devbox): field cleanups --- press/press/doctype/devbox/devbox.json | 28 ++------------------- press/press/doctype/devbox/devbox.py | 35 +++++++++++++++++--------- 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 8b79d1bc70..0e8b204c12 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -25,9 +25,6 @@ "codeserver_password", "machine_configuration_section", "container_id", - "cpu_cores", - "ram", - "disk_mb", "column_break_lmyb", "home_volume_size", "database_volume_size" @@ -50,34 +47,13 @@ "fieldname": "status", "fieldtype": "Select", "label": "Status", - "options": "Pending\nStarting\nPaused\nRunning\nArchived\nExited" + "options": "Pending\nStarting\nPaused\nRunning\nArchived\nExited\nDestroyed" }, { "fieldname": "machine_configuration_section", "fieldtype": "Section Break", "label": "Machine Configuration" }, - { - "fieldname": "cpu_cores", - "fieldtype": "Int", - "in_list_view": 1, - "label": "CPU Cores (vCPU)", - "reqd": 1 - }, - { - "fieldname": "ram", - "fieldtype": "Int", - "in_list_view": 1, - "label": "RAM (MB)", - "reqd": 1 - }, - { - "fieldname": "disk_mb", - "fieldtype": "Int", - "in_list_view": 1, - "label": "Disk (GB)", - "reqd": 1 - }, { "fieldname": "subdomain", "fieldtype": "Data", @@ -194,7 +170,7 @@ "link_fieldname": "devbox" } ], - "modified": "2024-12-16 10:41:42.488282", + "modified": "2024-12-20 13:27:23.759545", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 8c5ff82f7f..c888e1ef59 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -31,16 +31,13 @@ class Devbox(Document): codeserver_password: DF.Data | None codeserver_port: DF.Int container_id: DF.Data | None - cpu_cores: DF.Int database_volume_size: DF.Data | None - disk_mb: DF.Int domain: DF.Link | None home_volume_size: DF.Data | None initialized: DF.Check is_destroyed: DF.Check - ram: DF.Int server: DF.Link - status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited"] + status: DF.Literal["Pending", "Starting", "Paused", "Running", "Archived", "Exited", "Destroyed"] subdomain: DF.Data team: DF.Link vnc_password: DF.Data | None @@ -50,6 +47,14 @@ class Devbox(Document): pass + def validate(self): + from press.press.doctype.site.site import Site + + if not self.domain: + self.domain = frappe.db.get_single_value("Press Settings", "domain") + if Site.exists(self.subdomain, self.domain) or self.exists(self.subdomain, self.domain): + frappe.throw(exc=frappe.ValidationError, msg="Subdomain already exists") + def _get_devbox_name(self, subdomain: str): """Get full devbox domain name given subdomain.""" if not self.domain: @@ -165,13 +170,16 @@ def stop_devbox(self): @frappe.whitelist() def sync_devbox_status(self): - agent = Agent(server_type="Server", server=self.server) - result = agent.post(f"devboxes/{self.name}/status") - status = result.get("output").title() - # hoping this is a error. I know this is shit code. - if len(status) > 10: - status = "Exited" - frappe.db.set_value(dt="Devbox", dn=self.name, field="status", val=status) + try: + agent = Agent(server_type="Server", server=self.server) + result = agent.post(f"devboxes/{self.name}/status") + status = result.get("output").title() + # hoping this is a error. I know this is shit code. + if len(status) > 10: + status = "Exited" + frappe.db.set_value(dt="Devbox", dn=self.name, field="status", val=status) + except Exception: + pass @frappe.whitelist() def sync_devbox_docker_volumes_size(self): @@ -197,6 +205,7 @@ def process_new_devbox_job_update(job: AgentJob): if job.job_type == "Destroy Devbox" and job.status == "Success": update_fields = { "is_destroyed": True, + "status": "Destroyed", } frappe.db.set_value("Devbox", job.devbox, update_fields) @@ -209,8 +218,10 @@ def process_new_devbox_job_update(job: AgentJob): if job.job_type == "Stop Devbox" and job.status == "Success": frappe.db.set_value(dt="Devbox", dn=job.devbox, field="status", val="Exited") + devbox = frappe.get_doc("Devbox", job.devbox) + devbox.sync_devbox_status() status = frappe.db.get_value("Devbox", job.devbox, ["initialized", "add_site_to_upstream"], as_dict=True) if status.initialized and status.add_site_to_upstream: - frappe.db.set_value(dt="Devbox", dn=job.devbox, field="status", val="Starting") + frappe.db.set_value(dt="Devbox", dn=job.devbox, field="status", val="Running") From 78ec224d01644cc54ff90e1296b9eb4057c9e3b2 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 23 Dec 2024 13:30:26 +0530 Subject: [PATCH 32/45] fix(devbox): no need to run bench role if said server is a devbox server --- press/playbooks/server.yml | 13 +++++++++++-- press/press/doctype/server/server.py | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/press/playbooks/server.yml b/press/playbooks/server.yml index d759d70daa..08e5418077 100644 --- a/press/playbooks/server.yml +++ b/press/playbooks/server.yml @@ -10,8 +10,6 @@ - role: nginx - role: agent - role: mount - - role: bench - - role: devbox - role: docker - role: node_exporter - role: cadvisor @@ -27,3 +25,14 @@ - role: pam - role: user_ssh_certificate - role: earlyoom_memory_limits + + tasks: + - name: Include devbox role if is_devbox is true (i.e., devbox should run only if bench does not) + include_role: + name: devbox + when: is_devbox_server | default(false) + + - name: Include bench role if is_devbox is false + include_role: + name: bench + when: not (is_devbox_server | default(false)) diff --git a/press/press/doctype/server/server.py b/press/press/doctype/server/server.py index 76d56cffea..e07fbd1a78 100644 --- a/press/press/doctype/server/server.py +++ b/press/press/doctype/server/server.py @@ -1452,6 +1452,7 @@ def _setup_server(self): "certificate_full_chain": certificate.full_chain, "certificate_intermediate_chain": certificate.intermediate_chain, "docker_depends_on_mounts": self.docker_depends_on_mounts, + "is_devbox_server": self.is_devbox_server, **self.get_mount_variables(), }, ) From 7a52e578baa38aa28f9f537a34d09e21a8881449 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Mon, 23 Dec 2024 19:02:41 +0530 Subject: [PATCH 33/45] fix(devbox): sane port assignmnet, remove dumb methods, more precise sync logic --- press/press/doctype/devbox/devbox.js | 38 ++++++++++++--------- press/press/doctype/devbox/devbox.py | 31 ++++++++++------- press/press/doctype/devbox/devbox_helper.py | 6 +++- 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/press/press/doctype/devbox/devbox.js b/press/press/doctype/devbox/devbox.js index ad7471fc7f..3841e9b10e 100644 --- a/press/press/doctype/devbox/devbox.js +++ b/press/press/doctype/devbox/devbox.js @@ -2,16 +2,18 @@ // For license information, please see license.txt frappe.ui.form.on('Devbox', { + setup: function (frm) { + frm.set_query('server', function () { + // Replace your_link_field with the actual field name + return { + filters: [ + ['Server', 'is_devbox_server', '=', true], // Replace YourLinkedDocType with the linked DocType + ], + }; + }); + }, refresh(frm) { - frm.add_custom_button( - __('Get Available CPU and RAM'), - () => { - frm.call('get_available_cpu_and_ram'); - }, - __('Information'), - ); - - if (!frm.doc.initialized) { + if (!frm.doc.initialized && frm.doc.status == 'Pending') { frm.add_custom_button( __('Initialize'), () => { @@ -31,14 +33,16 @@ frappe.ui.form.on('Devbox', { ); } - if (!(frm.doc.status == 'Exited')) { - frm.add_custom_button( - __('Stop'), - () => { - frm.call('stop_devbox'); - }, - __('Actions'), - ); + if (!(frm.doc.status == 'Destroyed')) { + if (!(frm.doc.status == 'Exited') || !(frm.doc.status == 'Pending')) { + frm.add_custom_button( + __('Stop'), + () => { + frm.call('stop_devbox'); + }, + __('Actions'), + ); + } frm.add_custom_button( __('Sync Status'), diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index c888e1ef59..f7525ae01d 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -82,10 +82,6 @@ def exists(cls, subdomain, domain) -> bool: ) ) - @frappe.whitelist() - def get_available_cpu_and_ram(self): - print("meow") - @frappe.whitelist() def destroy_devbox(self): devbox = self @@ -150,10 +146,6 @@ def start_devbox(self): data={ "vnc_password": devbox.vnc_password, "codeserver_password": devbox.codeserver_password, - "websockify_port": devbox.websockify_port, - "vnc_port": devbox.vnc_port, - "codeserver_port": devbox.codeserver_port, - "browser_port": devbox.browser_port, }, devbox=devbox.name, ) @@ -201,6 +193,7 @@ def process_new_devbox_job_update(job: AgentJob): "browser_port": data["browser_port"], } frappe.db.set_value("Devbox", job.devbox, update_fields) + devbox_setup_complete_check(job) if job.job_type == "Destroy Devbox" and job.status == "Success": update_fields = { @@ -211,17 +204,29 @@ def process_new_devbox_job_update(job: AgentJob): if job.job_type == "Add Site to Upstream" and job.status == "Success": frappe.db.set_value(dt="Devbox", dn=job.devbox, field="add_site_to_upstream", val=True) + devbox_setup_complete_check(job) if job.job_type == "Start Devbox" and job.status == "Success": - devbox = frappe.get_doc("Devbox", job.devbox) + data = json.loads(job.data)["message"] + update_fields = { + "websockify_port": data["websockify_port"], + "vnc_port": data["vnc_port"], + "codeserver_port": data["codeserver_port"], + "browser_port": data["browser_port"], + } + frappe.db.set_value("Devbox", job.devbox, update_fields) + devbox = Devbox("Devbox", job.devbox) devbox.sync_devbox_status() if job.job_type == "Stop Devbox" and job.status == "Success": - frappe.db.set_value(dt="Devbox", dn=job.devbox, field="status", val="Exited") - devbox = frappe.get_doc("Devbox", job.devbox) - devbox.sync_devbox_status() + update_fields = { + "status": "Exited", + } + frappe.db.set_value("Devbox", job.devbox, update_fields) + frappe.db.commit() - status = frappe.db.get_value("Devbox", job.devbox, ["initialized", "add_site_to_upstream"], as_dict=True) +def devbox_setup_complete_check(job: AgentJob): + status = frappe.db.get_value("Devbox", job.devbox, ["initialized", "add_site_to_upstream"], as_dict=True) if status.initialized and status.add_site_to_upstream: frappe.db.set_value(dt="Devbox", dn=job.devbox, field="status", val="Running") diff --git a/press/press/doctype/devbox/devbox_helper.py b/press/press/doctype/devbox/devbox_helper.py index 7c081cd914..69006124d9 100644 --- a/press/press/doctype/devbox/devbox_helper.py +++ b/press/press/doctype/devbox/devbox_helper.py @@ -4,7 +4,11 @@ def sync_all_active_devboxes(): - devboxes = frappe.get_all("Devbox", filters={"is_destroyed": False}, pluck="name") + devboxes = frappe.get_all( + "Devbox", + filters={"is_destroyed": False, "initialized": True, "add_site_to_upstream": True}, + pluck="name", + ) for devbox_name in devboxes: frappe.enqueue( "press.press.doctype.devbox.devbox_helper.sync_devbox", From 6c4d316a5abdd080dcd9aa919cd732737ef75e90 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Fri, 27 Dec 2024 13:48:57 +0530 Subject: [PATCH 34/45] fix(merge-conflict): Re-added omitted code which somehow got deleted before. --- press/fixtures/agent_job_type.json | 30 ++++++++++++++++++++++++++++ press/fixtures/mariadb_variable.json | 12 +++++++++++ 2 files changed, 42 insertions(+) diff --git a/press/fixtures/agent_job_type.json b/press/fixtures/agent_job_type.json index 4fc39a63d1..30011ec41a 100644 --- a/press/fixtures/agent_job_type.json +++ b/press/fixtures/agent_job_type.json @@ -1606,5 +1606,35 @@ "step_name": "Analyze Slow Queries" } ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.587094", + "name": "Remove Site from Upstream", + "request_method": "DELETE", + "request_path": "/proxy/upstreams/{upstream}/sites/{site}", + "steps": [ + { + "parent": "Remove Site from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Site File from Upstream Directory" + }, + { + "parent": "Remove Site from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Remove Site from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] } ] \ No newline at end of file diff --git a/press/fixtures/mariadb_variable.json b/press/fixtures/mariadb_variable.json index cc76bf17e6..d7067706ce 100644 --- a/press/fixtures/mariadb_variable.json +++ b/press/fixtures/mariadb_variable.json @@ -382,5 +382,17 @@ "name": "myisam_recover_options", "set_on_new_servers": 0, "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "MIXED", + "doc_section": "replication-and-binary-log", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2024-12-12 12:59:33.579411", + "name": "binlog_format", + "set_on_new_servers": 0, + "skippable": 0 } ] \ No newline at end of file From bbfcb9aeb5c19c01aad58e18e606f5f0500bd998 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Wed, 1 Jan 2025 12:53:15 +0530 Subject: [PATCH 35/45] fix(devbox): added agent job as fixtures and fixed lint issues with team.py doctype --- press/fixtures/agent_job_type.json | 114 ++++ press/fixtures/mariadb_variable.json | 794 +++++++++++++-------------- press/press/doctype/team/team.py | 2 +- 3 files changed, 512 insertions(+), 398 deletions(-) diff --git a/press/fixtures/agent_job_type.json b/press/fixtures/agent_job_type.json index 30011ec41a..dd65569569 100644 --- a/press/fixtures/agent_job_type.json +++ b/press/fixtures/agent_job_type.json @@ -1636,5 +1636,119 @@ "step_name": "Reload NGINX" } ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-12-11 18:08:04.411669", + "name": "New Devbox", + "request_method": "POST", + "request_path": "/devboxes", + "steps": [ + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Initialize Devbox" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create Devbox Database Volume" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create Devbox Home Volume" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run Devbox" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Devbox Setup NGINX" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-12-17 16:27:51.442551", + "name": "Destroy Devbox", + "request_method": "POST", + "request_path": "/devboxes/{devbox.name}/destroy", + "steps": [ + { + "parent": "Destroy Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Stop Devbox" + }, + { + "parent": "Destroy Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Delete Devbox Directory" + }, + { + "parent": "Destroy Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Delete Devbox Database Volume" + }, + { + "parent": "Destroy Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Delete Devbox Home Volume" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-10-21 11:18:53.122319", + "name": "Start Devbox", + "request_method": "POST", + "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", + "steps": [ + { + "parent": "Start Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run Devbox" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-10-23 20:30:22.356484", + "name": "Stop Devbox", + "request_method": "POST", + "request_path": "devboxes/{devbox.name}/stop", + "steps": [ + { + "parent": "Stop Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Stop Devbox" + } + ] } ] \ No newline at end of file diff --git a/press/fixtures/mariadb_variable.json b/press/fixtures/mariadb_variable.json index d7067706ce..8ff7ff8634 100644 --- a/press/fixtures/mariadb_variable.json +++ b/press/fixtures/mariadb_variable.json @@ -1,398 +1,398 @@ [ - { - "datatype": "Str", - "default_value": "0", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 18:21:51.984252", - "name": "performance_schema", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "\"\"", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.751992", - "name": "performance-schema-instrument", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.766945", - "name": "performance-schema-consumer-events-stages-current", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.784028", - "name": "performance-schema-consumer-events-stages-history", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.809367", - "name": "performance-schema-consumer-events-stages-history-long", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.833060", - "name": "performance-schema-consumer-events-statements-current", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.851892", - "name": "performance-schema-consumer-events-statements-history", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.870716", - "name": "performance-schema-consumer-events-statements-history-long", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.951921", - "name": "performance-schema-consumer-events-waits-current", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.971205", - "name": "performance-schema-consumer-events-waits-history", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "OFF", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-07-27 17:55:19.987419", - "name": "performance-schema-consumer-events-waits-history-long", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Int", - "default_value": "5120", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-11-22 12:51:29.101315", - "name": "tmp_disk_table_size", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "5", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-11-22 12:52:00.473677", - "name": "extra_max_connections", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "3307", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2024-11-22 12:52:35.958089", - "name": "extra_port", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "200", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-11-22 12:50:54.084797", - "name": "max_connections", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": null, - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-01-12 14:21:03.949888", - "name": "max_user_connections", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": null, - "doc_section": "replication-and-binary-log", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-03-05 12:59:31.069472", - "name": "binlog_expire_logs_seconds", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Int", - "default_value": "32", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-06-12 10:30:47.403256", - "name": "max_heap_table_size", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "", - "doc_section": "replication-and-binary-log", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2023-08-03 14:20:47.702196", - "name": "expire_logs_days", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "37", - "doc_section": "innodb", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2023-09-15 15:21:13.086214", - "name": "innodb_old_blocks_pct", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Int", - "default_value": null, - "doc_section": "innodb", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2023-06-15 14:41:36.038646", - "name": "innodb_buffer_pool_size", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "/var/lib/mysql/mysql-bin", - "doc_section": "replication-and-binary-log", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2023-06-15 14:41:09.156699", - "name": "log_bin", - "set_on_new_servers": 0, - "skippable": 1 - }, - { - "datatype": "Str", - "default_value": "5000", - "doc_section": "innodb", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-11-22 12:50:46.547631", - "name": "innodb_old_blocks_time", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Int", - "default_value": "512", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-11-22 12:51:34.994866", - "name": "max_allowed_packet", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "3600", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-11-22 12:50:58.514076", - "name": "max_statement_time", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "ON", - "doc_section": "innodb", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-12-04 16:30:16.720727", - "name": "innodb_print_all_deadlocks", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": null, - "doc_section": "innodb", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-08-31 13:53:59.926965", - "name": "innodb_strict_mode", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "50", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-08-14 15:54:38.037523", - "name": "innodb_lock_wait_timeout", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": null, - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-10-09 09:00:46.202412", - "name": "net_buffer_length", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": null, - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-10-21 13:02:20.343316", - "name": "net_read_timeout", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": null, - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 1, - "modified": "2024-10-21 13:03:05.958798", - "name": "net_write_timeout", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "FORCE", - "doc_section": "server", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2024-11-22 12:31:31.593757", - "name": "myisam_recover_options", - "set_on_new_servers": 0, - "skippable": 0 - }, - { - "datatype": "Str", - "default_value": "MIXED", - "doc_section": "replication-and-binary-log", - "docstatus": 0, - "doctype": "MariaDB Variable", - "dynamic": 0, - "modified": "2024-12-12 12:59:33.579411", - "name": "binlog_format", - "set_on_new_servers": 0, - "skippable": 0 - } -] \ No newline at end of file + { + "datatype": "Str", + "default_value": "0", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 18:21:51.984252", + "name": "performance_schema", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "\"\"", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.751992", + "name": "performance-schema-instrument", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.766945", + "name": "performance-schema-consumer-events-stages-current", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.784028", + "name": "performance-schema-consumer-events-stages-history", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.809367", + "name": "performance-schema-consumer-events-stages-history-long", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.833060", + "name": "performance-schema-consumer-events-statements-current", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.851892", + "name": "performance-schema-consumer-events-statements-history", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.870716", + "name": "performance-schema-consumer-events-statements-history-long", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.951921", + "name": "performance-schema-consumer-events-waits-current", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.971205", + "name": "performance-schema-consumer-events-waits-history", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "OFF", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-07-27 17:55:19.987419", + "name": "performance-schema-consumer-events-waits-history-long", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Int", + "default_value": "5120", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-11-22 12:51:29.101315", + "name": "tmp_disk_table_size", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "5", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-11-22 12:52:00.473677", + "name": "extra_max_connections", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "200", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-11-22 12:50:54.084797", + "name": "max_connections", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": null, + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-01-12 14:21:03.949888", + "name": "max_user_connections", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": null, + "doc_section": "replication-and-binary-log", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-03-05 12:59:31.069472", + "name": "binlog_expire_logs_seconds", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Int", + "default_value": "32", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-06-12 10:30:47.403256", + "name": "max_heap_table_size", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "", + "doc_section": "replication-and-binary-log", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2023-08-03 14:20:47.702196", + "name": "expire_logs_days", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "37", + "doc_section": "innodb", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2023-09-15 15:21:13.086214", + "name": "innodb_old_blocks_pct", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Int", + "default_value": null, + "doc_section": "innodb", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2023-06-15 14:41:36.038646", + "name": "innodb_buffer_pool_size", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "/var/lib/mysql/mysql-bin", + "doc_section": "replication-and-binary-log", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2023-06-15 14:41:09.156699", + "name": "log_bin", + "set_on_new_servers": 0, + "skippable": 1 + }, + { + "datatype": "Str", + "default_value": "5000", + "doc_section": "innodb", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-11-22 12:50:46.547631", + "name": "innodb_old_blocks_time", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Int", + "default_value": "512", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-11-22 12:51:34.994866", + "name": "max_allowed_packet", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "3600", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-11-22 12:50:58.514076", + "name": "max_statement_time", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "ON", + "doc_section": "innodb", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-12-04 16:30:16.720727", + "name": "innodb_print_all_deadlocks", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": null, + "doc_section": "innodb", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-08-31 13:53:59.926965", + "name": "innodb_strict_mode", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "50", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-08-14 15:54:38.037523", + "name": "innodb_lock_wait_timeout", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": null, + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-10-09 09:00:46.202412", + "name": "net_buffer_length", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": null, + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-10-21 13:02:20.343316", + "name": "net_read_timeout", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": null, + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 1, + "modified": "2024-10-21 13:03:05.958798", + "name": "net_write_timeout", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "FORCE", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2024-11-22 12:31:31.593757", + "name": "myisam_recover_options", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "3307", + "doc_section": "server", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2024-11-22 12:52:35.958089", + "name": "extra_port", + "set_on_new_servers": 0, + "skippable": 0 + }, + { + "datatype": "Str", + "default_value": "MIXED", + "doc_section": "replication-and-binary-log", + "docstatus": 0, + "doctype": "MariaDB Variable", + "dynamic": 0, + "modified": "2024-12-12 12:59:33.579411", + "name": "binlog_format", + "set_on_new_servers": 0, + "skippable": 0 + } + ] \ No newline at end of file diff --git a/press/press/doctype/team/team.py b/press/press/doctype/team/team.py index b63f2ff3ab..ff311ccb2d 100644 --- a/press/press/doctype/team/team.py +++ b/press/press/doctype/team/team.py @@ -117,7 +117,7 @@ class Team(Document): "enable_performance_tuning", "enable_inplace_updates", "servers_enabled", - "devboxes_enabled" + "devboxes_enabled", ) def get_doc(self, doc): From b59522f9d4fd15565d1a42318fcbd123081e3ed5 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Wed, 1 Jan 2025 15:18:02 +0530 Subject: [PATCH 36/45] feat(devboxes): Added new doctype devbox image to track images --- .cspell.json | 5 +- press/press/doctype/devbox/devbox.json | 12 ++- press/press/doctype/devbox/devbox.py | 1 + press/press/doctype/devbox_image/__init__.py | 0 .../doctype/devbox_image/devbox_image.js | 8 ++ .../doctype/devbox_image/devbox_image.json | 88 +++++++++++++++++++ .../doctype/devbox_image/devbox_image.py | 34 +++++++ .../doctype/devbox_image/test_devbox_image.py | 9 ++ 8 files changed, 153 insertions(+), 4 deletions(-) create mode 100644 press/press/doctype/devbox_image/__init__.py create mode 100644 press/press/doctype/devbox_image/devbox_image.js create mode 100644 press/press/doctype/devbox_image/devbox_image.json create mode 100644 press/press/doctype/devbox_image/devbox_image.py create mode 100644 press/press/doctype/devbox_image/test_devbox_image.py diff --git a/.cspell.json b/.cspell.json index 728e46faf3..44f9b3625e 100644 --- a/.cspell.json +++ b/.cspell.json @@ -58,7 +58,10 @@ "behavior", "inplace", "supectl", - "uncollectible" + "uncollectible", + "devbox", + "devboxes", + "websockify" ], "allowCompoundWords": true, "ignorePaths": [ diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 0e8b204c12..5f93370cd9 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -15,6 +15,7 @@ "column_break_ydvd", "server", "team", + "docker_image", "ports_and_config_tab", "websockify_port", "codeserver_port", @@ -92,8 +93,7 @@ }, { "fieldname": "container_id", - "fieldtype": "Data", - "label": "Container ID" + "fieldtype": "Data" }, { "fieldname": "codeserver_port", @@ -160,6 +160,12 @@ "label": "Team", "options": "Team", "reqd": 1 + }, + { + "fieldname": "docker_image", + "fieldtype": "Link", + "label": "Docker Image", + "options": "Devbox Image" } ], "index_web_pages_for_search": 1, @@ -170,7 +176,7 @@ "link_fieldname": "devbox" } ], - "modified": "2024-12-20 13:27:23.759545", + "modified": "2025-01-01 14:33:54.040552", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index f7525ae01d..210558054d 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -32,6 +32,7 @@ class Devbox(Document): codeserver_port: DF.Int container_id: DF.Data | None database_volume_size: DF.Data | None + docker_image: DF.Link | None domain: DF.Link | None home_volume_size: DF.Data | None initialized: DF.Check diff --git a/press/press/doctype/devbox_image/__init__.py b/press/press/doctype/devbox_image/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/press/press/doctype/devbox_image/devbox_image.js b/press/press/doctype/devbox_image/devbox_image.js new file mode 100644 index 0000000000..986428f319 --- /dev/null +++ b/press/press/doctype/devbox_image/devbox_image.js @@ -0,0 +1,8 @@ +// Copyright (c) 2025, Frappe and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Devbox Image", { +// refresh(frm) { + +// }, +// }); diff --git a/press/press/doctype/devbox_image/devbox_image.json b/press/press/doctype/devbox_image/devbox_image.json new file mode 100644 index 0000000000..9a7bb62904 --- /dev/null +++ b/press/press/doctype/devbox_image/devbox_image.json @@ -0,0 +1,88 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2025-01-01 14:11:46.208813", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "registry_domain", + "namespace", + "image_name", + "column_break_dbyy", + "image_tag", + "image_id", + "image_reference" + ], + "fields": [ + { + "default": "arunmathaisk", + "fieldname": "namespace", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Namespace", + "reqd": 1 + }, + { + "fieldname": "column_break_dbyy", + "fieldtype": "Column Break" + }, + { + "default": "latest", + "fieldname": "image_tag", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Image Tag", + "reqd": 1 + }, + { + "fieldname": "image_id", + "fieldtype": "Data", + "label": "Image ID" + }, + { + "default": "docker.io", + "fieldname": "registry_domain", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Registry Domain", + "reqd": 1 + }, + { + "default": "devbox-vanilla", + "fieldname": "image_name", + "fieldtype": "Data", + "label": "Image Name" + }, + { + "fieldname": "image_reference", + "fieldtype": "Data", + "label": "Image Reference ", + "read_only": 1, + "unique": 1 + } + ], + "index_web_pages_for_search": 1, + "links": [], + "modified": "2025-01-01 14:48:46.076939", + "modified_by": "Administrator", + "module": "Press", + "name": "Devbox Image", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/press/press/doctype/devbox_image/devbox_image.py b/press/press/doctype/devbox_image/devbox_image.py new file mode 100644 index 0000000000..d73f2c77e0 --- /dev/null +++ b/press/press/doctype/devbox_image/devbox_image.py @@ -0,0 +1,34 @@ +# Copyright (c) 2025, Frappe and contributors +# For license information, please see license.txt + +# import frappe +from __future__ import annotations + +from frappe.model.document import Document +from frappe.model.naming import make_autoname + + +class DevboxImage(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + image_id: DF.Data | None + image_name: DF.Data | None + image_reference: DF.Data | None + image_tag: DF.Data + namespace: DF.Data + registry_domain: DF.Data + # end: auto-generated types + pass + + def autoname(self): + series = "devbox-image-.######" + self.name = make_autoname(series) + + def before_save(self): + self.image_reference = f"{self.registry_domain}/{self.namespace}/{self.image_name}:{self.image_tag}" diff --git a/press/press/doctype/devbox_image/test_devbox_image.py b/press/press/doctype/devbox_image/test_devbox_image.py new file mode 100644 index 0000000000..196f82d937 --- /dev/null +++ b/press/press/doctype/devbox_image/test_devbox_image.py @@ -0,0 +1,9 @@ +# Copyright (c) 2025, Frappe and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestDevboxImage(FrappeTestCase): + pass From 6930462c72be90bbd75488b32df22736f5f20c50 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Wed, 1 Jan 2025 21:47:13 +0530 Subject: [PATCH 37/45] feat(devbox): Link devbox to devbox image doctype --- press/fixtures/agent_job_type.json | 4160 ++++++++++++++---------- press/press/doctype/devbox/devbox.json | 5 +- press/press/doctype/devbox/devbox.py | 6 +- 3 files changed, 2415 insertions(+), 1756 deletions(-) diff --git a/press/fixtures/agent_job_type.json b/press/fixtures/agent_job_type.json index dd65569569..89d2959e3c 100644 --- a/press/fixtures/agent_job_type.json +++ b/press/fixtures/agent_job_type.json @@ -1,1754 +1,2408 @@ [ - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-08-20 12:32:56.100866", - "name": "Update In Place", - "request_method": "POST", - "request_path": "/bench/{bench}/update_inplace", - "steps": [ - { - "step_name": "Pull App Changes" - }, - { - "step_name": "Migrate Sites" - }, - { - "step_name": "Rebuild Bench Assets" - }, - { - "step_name": "Commit Container Changes" - }, - { - "step_name": "Bench Restart" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.228754", - "name": "Rename Upstream", - "request_method": "POST", - "request_path": "/proxy/upstreams/{ip}/rename", - "steps": [ - { - "step_name": "Rename Upstream Directory" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2024-08-09 10:07:51.319214", - "name": "Rename Site", - "request_method": "POST", - "request_path": "benches/{site.bench}/sites/{site.name}/rename", - "steps": [ - { - "step_name": "Enable Maintenance Mode" - }, - { - "step_name": "Wait for Enqueued Jobs" - }, - { - "step_name": "Update Site Configuration" - }, - { - "step_name": "Rename Site" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - }, - { - "step_name": "Disable Maintenance Mode" - }, - { - "step_name": "Enable Scheduler" - }, - { - "step_name": "Create User" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.549528", - "name": "Recover Failed Site Migration", - "request_method": null, - "request_path": null, - "steps": [ - { - "step_name": "Move Site" - }, - { - "step_name": "Restore Touched Tables" - }, - { - "step_name": "Disable Maintenance Mode" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.927111", - "name": "Add Domain", - "request_method": "POST", - "request_path": "benches/{bench}/sites/{site}/domains", - "steps": [ - { - "step_name": "Update Site Configuration" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.946695", - "name": "Remove Domain", - "request_method": "DELETE", - "request_path": "benches/{bench}/sites/{site}/domains/{domain}", - "steps": [ - { - "step_name": "Update Site Configuration" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.762138", - "name": "Update Site Pull", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/update/pull", - "steps": [ - { - "step_name": "Enable Maintenance Mode" - }, - { - "step_name": "Wait for Enqueued Jobs" - }, - { - "step_name": "Move Site" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Bench Setup NGINX Target" - }, - { - "step_name": "Reload NGINX" - }, - { - "step_name": "Disable Maintenance Mode" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.585210", - "name": "Update Site Migrate", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/update/migrate", - "steps": [ - { - "step_name": "Enable Maintenance Mode" - }, - { - "step_name": "Wait for Enqueued Jobs" - }, - { - "step_name": "Clear Backup Directory" - }, - { - "step_name": "Backup Site Tables" - }, - { - "step_name": "Move Site" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Bench Setup NGINX Target" - }, - { - "step_name": "Reload NGINX" - }, - { - "step_name": "Run App Specific Scripts" - }, - { - "step_name": "Migrate Site" - }, - { - "step_name": "Disable Maintenance Mode" - }, - { - "step_name": "Build Search Index" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.646447", - "name": "Add Host to Proxy", - "request_method": "POST", - "request_path": "/proxy/hosts", - "steps": [ - { - "step_name": "Add Host to Proxy" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.671517", - "name": "Add Code Server to Upstream", - "request_method": "POST", - "request_path": "/proxy/upstreams/{upstream}/sites", - "steps": [ - { - "step_name": "Add Site File to Upstream Directory" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.651948", - "name": "Remove Code Server from Upstream", - "request_method": "POST", - "request_path": "/proxy/upstreams/{upstream}/sites", - "steps": [ - { - "step_name": "Remove Site File from Upstream Directory" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.724970", - "name": "Setup Code Server", - "request_method": "POST", - "request_path": "benches/{bench}/codeserver", - "steps": [ - { - "step_name": "Create Code Server Config" - }, - { - "step_name": "Start Code Server" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.707766", - "name": "Start Code Server", - "request_method": "POST", - "request_path": "benches/{bench}/codeserver/start", - "steps": [ - { - "step_name": "Start Code Server" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.743617", - "name": "Stop Code Server", - "request_method": "POST", - "request_path": "benches/{bench}/codeserver/stop", - "steps": [ - { - "step_name": "Stop Code Server" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.690936", - "name": "Archive Code Server", - "request_method": "POST", - "request_path": "benches/{bench}/codeserver/archive", - "steps": [ - { - "step_name": "Remove Code Server" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.607088", - "name": "Add Upstream to Proxy", - "request_method": "POST", - "request_path": "/proxy/upstreams", - "steps": [ - { - "step_name": "Add Upstream Directory" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.677444", - "name": "Install App on Site", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/apps", - "steps": [ - { - "step_name": "Install App on Site" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.839292", - "name": "New Site from Backup", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/restore", - "steps": [ - { - "step_name": "Download Backup Files" - }, - { - "step_name": "New Site" - }, - { - "step_name": "Update Site Configuration" - }, - { - "step_name": "Restore Site" - }, - { - "step_name": "Delete Downloaded Backup Files" - }, - { - "step_name": "Uninstall Unavailable Apps" - }, - { - "step_name": "Migrate Site" - }, - { - "step_name": "Set Administrator Password" - }, - { - "step_name": "Enable Scheduler" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.690831", - "name": "Reinstall Site", - "request_method": "POST", - "request_path": "benches/{bench}/sites/{site}/reinstall", - "steps": [ - { - "step_name": "Reinstall Site" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.706871", - "name": "Update Site Status", - "request_method": "POST", - "request_path": "/proxy/upstreams/{upstream}/sites/{site}/status", - "steps": [ - { - "step_name": "Update Site File" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.740351", - "name": "Uninstall App from Site", - "request_method": "DELETE", - "request_path": "/benches/{bench}/sites/{site}/apps", - "steps": [ - { - "step_name": "Uninstall App from Site" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.805097", - "name": "Recover Failed Site Pull", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/update/pull/recover", - "steps": [ - { - "step_name": "Move Site" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Bench Setup NGINX Target" - }, - { - "step_name": "Reload NGINX" - }, - { - "step_name": "Disable Maintenance Mode" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.786058", - "name": "Recover Failed Site Update", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/update/recover", - "steps": [ - { - "step_name": "Disable Maintenance Mode" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.625189", - "name": "Recover Failed Site Migrate", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/update/migrate/recover", - "steps": [ - { - "step_name": "Move Site" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Bench Setup NGINX Target" - }, - { - "step_name": "Reload NGINX" - }, - { - "step_name": "Restore Touched Tables" - }, - { - "step_name": "Run App Specific Scripts" - }, - { - "step_name": "Disable Maintenance Mode" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.893005", - "name": "Remove Host from Proxy", - "request_method": "DELETE", - "request_path": "/proxy/hosts/{host}", - "steps": [ - { - "step_name": "Remove Host from Proxy" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.911153", - "name": "Migrate Site", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/migrate", - "steps": [ - { - "step_name": "Migrate Site" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.963183", - "name": "Fetch Sites Info", - "request_method": "POST", - "request_path": "/benches/{bench}/info", - "steps": [ - { - "step_name": "Fetch Sites Info" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.000340", - "name": "Setup Redirects on Hosts", - "request_method": "POST", - "request_path": "/proxy/hosts/redirects", - "steps": [ - { - "step_name": "Remove Redirect on Host" - }, - { - "step_name": "Setup Redirect on Host" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.979580", - "name": "Remove Redirects on Hosts", - "request_method": "DELETE", - "request_path": "/proxy/hosts/redirects", - "steps": [ - { - "step_name": "Remove Redirect on Host" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.100535", - "name": "Rename Site on Upstream", - "request_method": "POST", - "request_path": "/proxy/upstreams/{upstream}/sites/{site}/rename", - "steps": [ - { - "step_name": "Rename Site File in Upstream Directory" - }, - { - "step_name": "Rename Host Directory" - }, - { - "step_name": "Rename Site in Host Directory" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.131920", - "name": "Add Wildcard Hosts to Proxy", - "request_method": "POST", - "request_path": "/proxy/wildcards", - "steps": [ - { - "step_name": "Add Wildcard Hosts to Proxy" - }, - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.180358", - "name": "Setup ERPNext", - "request_method": "POST", - "request_path": "/benches/{site.bench}/sites/{site.name}/erpnext", - "steps": [ - { - "step_name": "Create User" - }, - { - "step_name": "Update ERPNext Configuration" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.157390", - "name": "Clear Cache", - "request_method": "DELETE", - "request_path": "/benches/{bench}/sites/{site}/cache", - "steps": [ - { - "step_name": "Clear Cache" - }, - { - "step_name": "Clear Website Cache" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.203468", - "name": "Restore Site Tables", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/update/migrate/restore", - "steps": [ - { - "step_name": "Restore Site Tables" - }, - { - "step_name": "Disable Maintenance Mode" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.283667", - "name": "Add User to Proxy", - "request_method": "POST", - "request_path": "/ssh/users", - "steps": [ - { - "step_name": "Add User to Proxy" - }, - { - "step_name": "Add Certificate to User" - }, - { - "step_name": "Add Principal to User" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.308026", - "name": "Remove User from Proxy", - "request_method": "DELETE", - "request_path": "/ssh/users/{user}", - "steps": [ - { - "step_name": "Remove User from Proxy" - }, - { - "step_name": "Remove Principal from User" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.327716", - "name": "Add User to ProxySQL", - "request_method": "POST", - "request_path": "/proxysql/users", - "steps": [ - { - "step_name": "Add User to ProxySQL" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.345276", - "name": "Remove User from ProxySQL", - "request_method": "DELETE", - "request_path": "/proxysql/users/{username}", - "steps": [ - { - "step_name": "Remove User from ProxySQL" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.362722", - "name": "Create Minio User", - "request_method": "POST", - "request_path": "/minio/create", - "steps": [ - { - "step_name": "Create Minio User" - }, - { - "step_name": "Create Minio Policy" - }, - { - "step_name": "Add Minio Policy" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.379874", - "name": "Remove Minio User", - "request_method": "POST", - "request_path": "/minio/remove", - "steps": [ - { - "step_name": "Remove Minio User" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.392780", - "name": "Enable Minio User", - "request_method": "POST", - "request_path": "/minio/update", - "steps": [ - { - "step_name": "Enable Minio User" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.405690", - "name": "Disable Minio User", - "request_method": "POST", - "request_path": "/minio/update", - "steps": [ - { - "step_name": "Disable Minio User" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.256524", - "name": "Cleanup Unused Files", - "request_method": "POST", - "request_path": "server/cleanup", - "steps": [ - { - "step_name": "Remove Archived Benches" - }, - { - "step_name": "Remove Temporary Files" - }, - { - "step_name": "Remove Unused Docker Artefacts" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.446023", - "name": "Add Backend to ProxySQL", - "request_method": "POST", - "request_path": "/proxysql/backends", - "steps": [ - { - "step_name": "Add Backend to ProxySQL" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.419313", - "name": "Update Saas Plan", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/update/saas", - "steps": [ - { - "step_name": "Update Saas Plan" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.502147", - "name": "Run After Migrate Steps", - "request_method": "POST", - "request_path": "benches/{bench}/sites/{site}/run_after_migrate_steps", - "steps": [ - { - "step_name": "Set Administrator Password" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - }, - { - "step_name": "Disable Maintenance Mode" - }, - { - "step_name": "Enable Scheduler" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.531987", - "name": "Move Site to Bench", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/move_to_bench", - "steps": [ - { - "step_name": "Enable Maintenance Mode" - }, - { - "step_name": "Wait for Enqueued Jobs" - }, - { - "step_name": "Move Site" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Bench Setup NGINX Target" - }, - { - "step_name": "Reload NGINX" - }, - { - "step_name": "Migrate Site" - }, - { - "step_name": "Disable Maintenance Mode" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.556954", - "name": "Reset Site Usage", - "request_method": "DELETE", - "request_path": "benches/{bench}/sites/{site}/usage", - "steps": [ - { - "step_name": "Reset Site Usage" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.759939", - "name": "Reload NGINX Job", - "request_method": "POST", - "request_path": "/proxy/reload", - "steps": [ - { - "step_name": "Generate NGINX Configuration" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.725087", - "name": "Backup Site", - "request_method": null, - "request_path": null, - "steps": [ - { - "step_name": "Backup Site" - }, - { - "step_name": "Upload Site Backup to S3" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.432717", - "name": "Bench Restart", - "request_method": "POST", - "request_path": "/benches/{bench}/restart", - "steps": [ - { - "step_name": "Bench Restart" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.568610", - "name": "Archive Bench", - "request_method": "POST", - "request_path": "/benches/{bench}/archive", - "steps": [ - { - "step_name": "Bench Disable Production" - }, - { - "step_name": "Move Bench to Archived Directory" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.023648", - "name": "New Bench", - "request_method": "POST", - "request_path": "/benches", - "steps": [ - { - "step_name": "Initialize Bench" - }, - { - "step_name": "Update Bench Configuration" - }, - { - "step_name": "Deploy Bench" - }, - { - "step_name": "Bench Setup NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.845251", - "name": "Force Update Bench Limits", - "request_method": "POST", - "request_path": "benches/{bench}/limit", - "steps": [ - { - "step_name": "Stop Bench" - }, - { - "step_name": "Update Bench Memory Limits" - }, - { - "step_name": "Start Bench" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.822202", - "name": "Update Bench Configuration", - "request_method": "POST", - "request_path": "/benches/{bench}/config", - "steps": [ - { - "step_name": "Update Bench Configuration" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Generate Docker Compose File" - }, - { - "step_name": "Update Bench Memory Limits" - }, - { - "step_name": "Deploy Bench" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.803361", - "name": "Rebuild Bench Assets", - "request_method": "POST", - "request_path": "benches/{bench}/rebuild", - "steps": [ - { - "step_name": "Rebuild Bench Assets" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.861985", - "name": "Optimize Tables", - "request_method": "POST", - "request_path": "benches/{bench}/sites/{site}/optimize", - "steps": [ - { - "step_name": "Optimize Tables" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2024-02-22 20:01:05.606166", - "name": "Docker Image Build", - "request_method": "POST", - "request_path": "builder/build", - "steps": [ - { - "step_name": "Docker Image Build" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2024-02-27 13:51:17.142316", - "name": "Patch App", - "request_method": "POST", - "request_path": "/bench/{bench}/patch/{app}", - "steps": [ - { - "step_name": "Git Apply" - }, - { - "step_name": "Rebuild Bench Assets" - }, - { - "step_name": "Bench Restart" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2024-03-19 11:40:26.237476", - "name": "Call Bench Supervisorctl", - "request_method": "POST", - "request_path": "/benches/{bench}/supervisorctl", - "steps": [ - { - "step_name": "Run Supervisorctl Command" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2024-03-26 10:28:39.750285", - "name": "Run Remote Builder", - "request_method": "POST", - "request_path": "/builder/build", - "steps": [ - { - "step_name": "Build Image" - }, - { - "step_name": "Push Docker Image" - }, - { - "step_name": "Cleanup Context" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-07-11 12:04:37.550558", - "name": "Add Database Index", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/add-database-index", - "steps": [ - { - "step_name": "Add Database Index With Bench Command" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:19.470276", - "name": "Restore Site", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/restore", - "steps": [ - { - "step_name": "Download Backup Files" - }, - { - "step_name": "Restore Site" - }, - { - "step_name": "Checksum of Downloaded Backup Files" - }, - { - "step_name": "Delete Downloaded Backup Files" - }, - { - "step_name": "Uninstall Unavailable Apps" - }, - { - "step_name": "Migrate Site" - }, - { - "step_name": "Set Administrator Password" - }, - { - "step_name": "Enable Scheduler" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-07-18 17:49:54.294402", - "name": "Column Statistics", - "request_method": "POST", - "request_path": "/database/column-stats", - "steps": [ - { - "step_name": "Fetch Column Statistics" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-08-09 12:03:58.145567", - "name": "Complete Setup Wizard", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/complete-setup-wizard", - "steps": [ - { - "step_name": "Complete Setup Wizard" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-06-11 19:43:45.877056", - "name": "Create User", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/create-user", - "steps": [ - { - "step_name": "Create User" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2024-08-09 10:10:41.301700", - "name": "New Site", - "request_method": "POST", - "request_path": "/benches/{bench}/sites", - "steps": [ - { - "step_name": "New Site" - }, - { - "step_name": "Install Apps" - }, - { - "step_name": "Update Site Configuration" - }, - { - "step_name": "Enable Scheduler" - }, - { - "step_name": "Create User" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.663533", - "name": "Update Site Configuration", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/config", - "steps": [ - { - "step_name": "Update Site Configuration" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.510770", - "name": "Archive Site", - "request_method": null, - "request_path": null, - "steps": [ - { - "step_name": "Archive Site" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-09-10 12:11:38.844112", - "name": "Recover Update In Place", - "request_method": "POST", - "request_path": "/bench/{bench}/recover_update_inplace", - "steps": [ - { - "step_name": "Enable Maintenance Mode" - }, - { - "step_name": "Deploy Bench" - }, - { - "step_name": "Bench Setup NGINX" - }, - { - "step_name": "Recover Sites" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-08-20 12:51:05.293373", - "name": "Update Bench In Place", - "request_method": "POST", - "request_path": "/bench/{bench}/update_inplace", - "steps": [ - { - "step_name": "Pull App Changes" - }, - { - "step_name": "Migrate Sites" - }, - { - "step_name": "Rebuild Bench Assets" - }, - { - "step_name": "Commit Container Changes" - }, - { - "step_name": "Bench Restart" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-09-11 13:28:32.120581", - "name": "Ping Job", - "request_method": "POST", - "request_path": "ping_job", - "steps": [ - { - "step_name": "Ping Step" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 1, - "modified": "2024-10-28 14:49:19.894247", - "name": "Fetch Database Table Schema", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/database/schema", - "steps": [ - { - "step_name": "Fetch Database Table Schema" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 1, - "modified": "2024-11-04 14:49:18.592247", - "name": "Create Database User", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/database/users", - "steps": [ - { - "step_name": "Create Database User" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 1, - "modified": "2024-11-04 14:49:18.592247", - "name": "Remove Database User", - "request_method": "DELETE", - "request_path": "/benches/{bench}/sites/{site}/database/users/{username}", - "steps": [ - { - "step_name": "Remove Database User" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 1, - "modified": "2024-11-04 14:49:18.592247", - "name": "Modify Database User Permissions", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/database/users/{db_user}/permissions", - "steps": [ - { - "step_name": "Modify Database User Permissions" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 1, - "modified": "2024-10-28 14:49:19.894247", - "name": "Fetch Database Table Schema", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/database/schema", - "steps": [ - { - "step_name": "Fetch Database Table Schema" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-12-19 17:21:14.136650", - "name": "Analyze Slow Queries", - "request_method": "POST", - "request_path": "/benches/{bench}/sites/{site}/database/analyze-slow-queries", - "steps": [ - { - "step_name": "Analyze Slow Queries" - } - ] - }, - { - "disabled_auto_retry": 0, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 6, - "modified": "2023-11-06 07:28:18.587094", - "name": "Remove Site from Upstream", - "request_method": "DELETE", - "request_path": "/proxy/upstreams/{upstream}/sites/{site}", - "steps": [ - { - "parent": "Remove Site from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Remove Site File from Upstream Directory" - }, - { - "parent": "Remove Site from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Generate NGINX Configuration" - }, - { - "parent": "Remove Site from Upstream", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Reload NGINX" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-12-11 18:08:04.411669", - "name": "New Devbox", - "request_method": "POST", - "request_path": "/devboxes", - "steps": [ - { - "parent": "New Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Initialize Devbox" - }, - { - "parent": "New Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Create Devbox Database Volume" - }, - { - "parent": "New Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Create Devbox Home Volume" - }, - { - "parent": "New Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Run Devbox" - }, - { - "parent": "New Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Devbox Setup NGINX" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-12-17 16:27:51.442551", - "name": "Destroy Devbox", - "request_method": "POST", - "request_path": "/devboxes/{devbox.name}/destroy", - "steps": [ - { - "parent": "Destroy Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Stop Devbox" - }, - { - "parent": "Destroy Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Delete Devbox Directory" - }, - { - "parent": "Destroy Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Delete Devbox Database Volume" - }, - { - "parent": "Destroy Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Delete Devbox Home Volume" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-10-21 11:18:53.122319", - "name": "Start Devbox", - "request_method": "POST", - "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", - "steps": [ - { - "parent": "Start Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Run Devbox" - } - ] - }, - { - "disabled_auto_retry": 1, - "docstatus": 0, - "doctype": "Agent Job Type", - "max_retry_count": 3, - "modified": "2024-10-23 20:30:22.356484", - "name": "Stop Devbox", - "request_method": "POST", - "request_path": "devboxes/{devbox.name}/stop", - "steps": [ - { - "parent": "Stop Devbox", - "parentfield": "steps", - "parenttype": "Agent Job Type", - "step_name": "Stop Devbox" - } - ] - } -] \ No newline at end of file + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.228754", + "name": "Rename Upstream", + "request_method": "POST", + "request_path": "/proxy/upstreams/{ip}/rename", + "steps": [ + { + "parent": "Rename Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rename Upstream Directory" + }, + { + "parent": "Rename Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Rename Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2024-08-09 10:07:51.319214", + "name": "Rename Site", + "request_method": "POST", + "request_path": "benches/{site.bench}/sites/{site.name}/rename", + "steps": [ + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Maintenance Mode" + }, + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Wait for Enqueued Jobs" + }, + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Site Configuration" + }, + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rename Site" + }, + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + }, + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + }, + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Scheduler" + }, + { + "parent": "Rename Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create User" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.549528", + "name": "Recover Failed Site Migration", + "request_method": null, + "request_path": null, + "steps": [ + { + "parent": "Recover Failed Site Migration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Move Site" + }, + { + "parent": "Recover Failed Site Migration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Restore Touched Tables" + }, + { + "parent": "Recover Failed Site Migration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.927111", + "name": "Add Domain", + "request_method": "POST", + "request_path": "benches/{bench}/sites/{site}/domains", + "steps": [ + { + "parent": "Add Domain", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Site Configuration" + }, + { + "parent": "Add Domain", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Add Domain", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.946695", + "name": "Remove Domain", + "request_method": "DELETE", + "request_path": "benches/{bench}/sites/{site}/domains/{domain}", + "steps": [ + { + "parent": "Remove Domain", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Site Configuration" + }, + { + "parent": "Remove Domain", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Remove Domain", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.762138", + "name": "Update Site Pull", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/update/pull", + "steps": [ + { + "parent": "Update Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Maintenance Mode" + }, + { + "parent": "Update Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Wait for Enqueued Jobs" + }, + { + "parent": "Update Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Move Site" + }, + { + "parent": "Update Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Update Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX Target" + }, + { + "parent": "Update Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + }, + { + "parent": "Update Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.585210", + "name": "Update Site Migrate", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/update/migrate", + "steps": [ + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Maintenance Mode" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Wait for Enqueued Jobs" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Clear Backup Directory" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Backup Site Tables" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Move Site" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX Target" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run App Specific Scripts" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Migrate Site" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + }, + { + "parent": "Update Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Build Search Index" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.646447", + "name": "Add Host to Proxy", + "request_method": "POST", + "request_path": "/proxy/hosts", + "steps": [ + { + "parent": "Add Host to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Host to Proxy" + }, + { + "parent": "Add Host to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Add Host to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.671517", + "name": "Add Code Server to Upstream", + "request_method": "POST", + "request_path": "/proxy/upstreams/{upstream}/sites", + "steps": [ + { + "parent": "Add Code Server to Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Site File to Upstream Directory" + }, + { + "parent": "Add Code Server to Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Add Code Server to Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.651948", + "name": "Remove Code Server from Upstream", + "request_method": "POST", + "request_path": "/proxy/upstreams/{upstream}/sites", + "steps": [ + { + "parent": "Remove Code Server from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Site File from Upstream Directory" + }, + { + "parent": "Remove Code Server from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Remove Code Server from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.724970", + "name": "Setup Code Server", + "request_method": "POST", + "request_path": "benches/{bench}/codeserver", + "steps": [ + { + "parent": "Setup Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create Code Server Config" + }, + { + "parent": "Setup Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Start Code Server" + }, + { + "parent": "Setup Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Setup Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.707766", + "name": "Start Code Server", + "request_method": "POST", + "request_path": "benches/{bench}/codeserver/start", + "steps": [ + { + "parent": "Start Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Start Code Server" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.743617", + "name": "Stop Code Server", + "request_method": "POST", + "request_path": "benches/{bench}/codeserver/stop", + "steps": [ + { + "parent": "Stop Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Stop Code Server" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.690936", + "name": "Archive Code Server", + "request_method": "POST", + "request_path": "benches/{bench}/codeserver/archive", + "steps": [ + { + "parent": "Archive Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Code Server" + }, + { + "parent": "Archive Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Archive Code Server", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.607088", + "name": "Add Upstream to Proxy", + "request_method": "POST", + "request_path": "/proxy/upstreams", + "steps": [ + { + "parent": "Add Upstream to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Upstream Directory" + }, + { + "parent": "Add Upstream to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Add Upstream to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.677444", + "name": "Install App on Site", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/apps", + "steps": [ + { + "parent": "Install App on Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Install App on Site" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.839292", + "name": "New Site from Backup", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/restore", + "steps": [ + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Download Backup Files" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "New Site" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Site Configuration" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Restore Site" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Delete Downloaded Backup Files" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Uninstall Unavailable Apps" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Migrate Site" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Set Administrator Password" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Scheduler" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "New Site from Backup", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.690831", + "name": "Reinstall Site", + "request_method": "POST", + "request_path": "benches/{bench}/sites/{site}/reinstall", + "steps": [ + { + "parent": "Reinstall Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reinstall Site" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.706871", + "name": "Update Site Status", + "request_method": "POST", + "request_path": "/proxy/upstreams/{upstream}/sites/{site}/status", + "steps": [ + { + "parent": "Update Site Status", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Site File" + }, + { + "parent": "Update Site Status", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Update Site Status", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.740351", + "name": "Uninstall App from Site", + "request_method": "DELETE", + "request_path": "/benches/{bench}/sites/{site}/apps", + "steps": [ + { + "parent": "Uninstall App from Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Uninstall App from Site" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.805097", + "name": "Recover Failed Site Pull", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/update/pull/recover", + "steps": [ + { + "parent": "Recover Failed Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Move Site" + }, + { + "parent": "Recover Failed Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Recover Failed Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX Target" + }, + { + "parent": "Recover Failed Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + }, + { + "parent": "Recover Failed Site Pull", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.786058", + "name": "Recover Failed Site Update", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/update/recover", + "steps": [ + { + "parent": "Recover Failed Site Update", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.625189", + "name": "Recover Failed Site Migrate", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/update/migrate/recover", + "steps": [ + { + "parent": "Recover Failed Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Move Site" + }, + { + "parent": "Recover Failed Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Recover Failed Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX Target" + }, + { + "parent": "Recover Failed Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + }, + { + "parent": "Recover Failed Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Restore Touched Tables" + }, + { + "parent": "Recover Failed Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run App Specific Scripts" + }, + { + "parent": "Recover Failed Site Migrate", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.893005", + "name": "Remove Host from Proxy", + "request_method": "DELETE", + "request_path": "/proxy/hosts/{host}", + "steps": [ + { + "parent": "Remove Host from Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Host from Proxy" + }, + { + "parent": "Remove Host from Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Remove Host from Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.911153", + "name": "Migrate Site", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/migrate", + "steps": [ + { + "parent": "Migrate Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Migrate Site" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.963183", + "name": "Fetch Sites Info", + "request_method": "POST", + "request_path": "/benches/{bench}/info", + "steps": [ + { + "parent": "Fetch Sites Info", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Fetch Sites Info" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.000340", + "name": "Setup Redirects on Hosts", + "request_method": "POST", + "request_path": "/proxy/hosts/redirects", + "steps": [ + { + "parent": "Setup Redirects on Hosts", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Redirect on Host" + }, + { + "parent": "Setup Redirects on Hosts", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Setup Redirect on Host" + }, + { + "parent": "Setup Redirects on Hosts", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Setup Redirects on Hosts", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.979580", + "name": "Remove Redirects on Hosts", + "request_method": "DELETE", + "request_path": "/proxy/hosts/redirects", + "steps": [ + { + "parent": "Remove Redirects on Hosts", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Redirect on Host" + }, + { + "parent": "Remove Redirects on Hosts", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Remove Redirects on Hosts", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.100535", + "name": "Rename Site on Upstream", + "request_method": "POST", + "request_path": "/proxy/upstreams/{upstream}/sites/{site}/rename", + "steps": [ + { + "parent": "Rename Site on Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rename Site File in Upstream Directory" + }, + { + "parent": "Rename Site on Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rename Host Directory" + }, + { + "parent": "Rename Site on Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rename Site in Host Directory" + }, + { + "parent": "Rename Site on Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Rename Site on Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.131920", + "name": "Add Wildcard Hosts to Proxy", + "request_method": "POST", + "request_path": "/proxy/wildcards", + "steps": [ + { + "parent": "Add Wildcard Hosts to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Wildcard Hosts to Proxy" + }, + { + "parent": "Add Wildcard Hosts to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Add Wildcard Hosts to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.180358", + "name": "Setup ERPNext", + "request_method": "POST", + "request_path": "/benches/{site.bench}/sites/{site.name}/erpnext", + "steps": [ + { + "parent": "Setup ERPNext", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create User" + }, + { + "parent": "Setup ERPNext", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update ERPNext Configuration" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.157390", + "name": "Clear Cache", + "request_method": "DELETE", + "request_path": "/benches/{bench}/sites/{site}/cache", + "steps": [ + { + "parent": "Clear Cache", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Clear Cache" + }, + { + "parent": "Clear Cache", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Clear Website Cache" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.203468", + "name": "Restore Site Tables", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/update/migrate/restore", + "steps": [ + { + "parent": "Restore Site Tables", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Restore Site Tables" + }, + { + "parent": "Restore Site Tables", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.283667", + "name": "Add User to Proxy", + "request_method": "POST", + "request_path": "/ssh/users", + "steps": [ + { + "parent": "Add User to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add User to Proxy" + }, + { + "parent": "Add User to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Certificate to User" + }, + { + "parent": "Add User to Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Principal to User" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.308026", + "name": "Remove User from Proxy", + "request_method": "DELETE", + "request_path": "/ssh/users/{user}", + "steps": [ + { + "parent": "Remove User from Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove User from Proxy" + }, + { + "parent": "Remove User from Proxy", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Principal from User" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.327716", + "name": "Add User to ProxySQL", + "request_method": "POST", + "request_path": "/proxysql/users", + "steps": [ + { + "parent": "Add User to ProxySQL", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add User to ProxySQL" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.345276", + "name": "Remove User from ProxySQL", + "request_method": "DELETE", + "request_path": "/proxysql/users/{username}", + "steps": [ + { + "parent": "Remove User from ProxySQL", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove User from ProxySQL" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.362722", + "name": "Create Minio User", + "request_method": "POST", + "request_path": "/minio/create", + "steps": [ + { + "parent": "Create Minio User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create Minio User" + }, + { + "parent": "Create Minio User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create Minio Policy" + }, + { + "parent": "Create Minio User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Minio Policy" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.379874", + "name": "Remove Minio User", + "request_method": "POST", + "request_path": "/minio/remove", + "steps": [ + { + "parent": "Remove Minio User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Minio User" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.392780", + "name": "Enable Minio User", + "request_method": "POST", + "request_path": "/minio/update", + "steps": [ + { + "parent": "Enable Minio User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Minio User" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.405690", + "name": "Disable Minio User", + "request_method": "POST", + "request_path": "/minio/update", + "steps": [ + { + "parent": "Disable Minio User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Minio User" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.256524", + "name": "Cleanup Unused Files", + "request_method": "POST", + "request_path": "server/cleanup", + "steps": [ + { + "parent": "Cleanup Unused Files", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Archived Benches" + }, + { + "parent": "Cleanup Unused Files", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Temporary Files" + }, + { + "parent": "Cleanup Unused Files", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Unused Docker Artefacts" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.446023", + "name": "Add Backend to ProxySQL", + "request_method": "POST", + "request_path": "/proxysql/backends", + "steps": [ + { + "parent": "Add Backend to ProxySQL", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Backend to ProxySQL" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.419313", + "name": "Update Saas Plan", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/update/saas", + "steps": [ + { + "parent": "Update Saas Plan", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Saas Plan" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.502147", + "name": "Run After Migrate Steps", + "request_method": "POST", + "request_path": "benches/{bench}/sites/{site}/run_after_migrate_steps", + "steps": [ + { + "parent": "Run After Migrate Steps", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Set Administrator Password" + }, + { + "parent": "Run After Migrate Steps", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Run After Migrate Steps", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + }, + { + "parent": "Run After Migrate Steps", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + }, + { + "parent": "Run After Migrate Steps", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Scheduler" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.531987", + "name": "Move Site to Bench", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/move_to_bench", + "steps": [ + { + "parent": "Move Site to Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Maintenance Mode" + }, + { + "parent": "Move Site to Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Wait for Enqueued Jobs" + }, + { + "parent": "Move Site to Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Move Site" + }, + { + "parent": "Move Site to Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Move Site to Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX Target" + }, + { + "parent": "Move Site to Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + }, + { + "parent": "Move Site to Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Migrate Site" + }, + { + "parent": "Move Site to Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Disable Maintenance Mode" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.556954", + "name": "Reset Site Usage", + "request_method": "DELETE", + "request_path": "benches/{bench}/sites/{site}/usage", + "steps": [ + { + "parent": "Reset Site Usage", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reset Site Usage" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.759939", + "name": "Reload NGINX Job", + "request_method": "POST", + "request_path": "/proxy/reload", + "steps": [ + { + "parent": "Reload NGINX Job", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Reload NGINX Job", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.725087", + "name": "Backup Site", + "request_method": null, + "request_path": null, + "steps": [ + { + "parent": "Backup Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Backup Site" + }, + { + "parent": "Backup Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Upload Site Backup to S3" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.432717", + "name": "Bench Restart", + "request_method": "POST", + "request_path": "/benches/{bench}/restart", + "steps": [ + { + "parent": "Bench Restart", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Restart" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.568610", + "name": "Archive Bench", + "request_method": "POST", + "request_path": "/benches/{bench}/archive", + "steps": [ + { + "parent": "Archive Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Disable Production" + }, + { + "parent": "Archive Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Move Bench to Archived Directory" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.023648", + "name": "New Bench", + "request_method": "POST", + "request_path": "/benches", + "steps": [ + { + "parent": "New Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Initialize Bench" + }, + { + "parent": "New Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Bench Configuration" + }, + { + "parent": "New Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Deploy Bench" + }, + { + "parent": "New Bench", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.845251", + "name": "Force Update Bench Limits", + "request_method": "POST", + "request_path": "benches/{bench}/limit", + "steps": [ + { + "parent": "Force Update Bench Limits", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Stop Bench" + }, + { + "parent": "Force Update Bench Limits", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Bench Memory Limits" + }, + { + "parent": "Force Update Bench Limits", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Start Bench" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.822202", + "name": "Update Bench Configuration", + "request_method": "POST", + "request_path": "/benches/{bench}/config", + "steps": [ + { + "parent": "Update Bench Configuration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Bench Configuration" + }, + { + "parent": "Update Bench Configuration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Update Bench Configuration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate Docker Compose File" + }, + { + "parent": "Update Bench Configuration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Bench Memory Limits" + }, + { + "parent": "Update Bench Configuration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Deploy Bench" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.803361", + "name": "Rebuild Bench Assets", + "request_method": "POST", + "request_path": "benches/{bench}/rebuild", + "steps": [ + { + "parent": "Rebuild Bench Assets", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rebuild Bench Assets" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.861985", + "name": "Optimize Tables", + "request_method": "POST", + "request_path": "benches/{bench}/sites/{site}/optimize", + "steps": [ + { + "parent": "Optimize Tables", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Optimize Tables" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2024-02-22 20:01:05.606166", + "name": "Docker Image Build", + "request_method": "POST", + "request_path": "builder/build", + "steps": [ + { + "parent": "Docker Image Build", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Docker Image Build" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2024-02-27 13:51:17.142316", + "name": "Patch App", + "request_method": "POST", + "request_path": "/bench/{bench}/patch/{app}", + "steps": [ + { + "parent": "Patch App", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Git Apply" + }, + { + "parent": "Patch App", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rebuild Bench Assets" + }, + { + "parent": "Patch App", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Restart" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2024-03-19 11:40:26.237476", + "name": "Call Bench Supervisorctl", + "request_method": "POST", + "request_path": "/benches/{bench}/supervisorctl", + "steps": [ + { + "parent": "Call Bench Supervisorctl", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run Supervisorctl Command" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2024-03-26 10:28:39.750285", + "name": "Run Remote Builder", + "request_method": "POST", + "request_path": "/builder/build", + "steps": [ + { + "parent": "Run Remote Builder", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Build Image" + }, + { + "parent": "Run Remote Builder", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Push Docker Image" + }, + { + "parent": "Run Remote Builder", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Cleanup Context" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-07-11 12:04:37.550558", + "name": "Add Database Index", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/add-database-index", + "steps": [ + { + "parent": "Add Database Index", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Database Index With Bench Command" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:19.470276", + "name": "Restore Site", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/restore", + "steps": [ + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Download Backup Files" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Restore Site" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Checksum of Downloaded Backup Files" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Delete Downloaded Backup Files" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Uninstall Unavailable Apps" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Migrate Site" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Set Administrator Password" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Scheduler" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Restore Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-07-18 17:49:54.294402", + "name": "Column Statistics", + "request_method": "POST", + "request_path": "/database/column-stats", + "steps": [ + { + "parent": "Column Statistics", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Fetch Column Statistics" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-08-09 12:03:58.145567", + "name": "Complete Setup Wizard", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/complete-setup-wizard", + "steps": [ + { + "parent": "Complete Setup Wizard", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Complete Setup Wizard" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-06-11 19:43:45.877056", + "name": "Create User", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/create-user", + "steps": [ + { + "parent": "Create User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create User" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2024-08-09 10:10:41.301700", + "name": "New Site", + "request_method": "POST", + "request_path": "/benches/{bench}/sites", + "steps": [ + { + "parent": "New Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "New Site" + }, + { + "parent": "New Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Install Apps" + }, + { + "parent": "New Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Site Configuration" + }, + { + "parent": "New Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Scheduler" + }, + { + "parent": "New Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create User" + }, + { + "parent": "New Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "New Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.626647", + "name": "Add Site to Upstream", + "request_method": "POST", + "request_path": "/proxy/upstreams/{upstream}/sites", + "steps": [ + { + "parent": "Add Site to Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Add Site File to Upstream Directory" + }, + { + "parent": "Add Site to Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Add Site to Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.663533", + "name": "Update Site Configuration", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/config", + "steps": [ + { + "parent": "Update Site Configuration", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Update Site Configuration" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.587094", + "name": "Remove Site from Upstream", + "request_method": "DELETE", + "request_path": "/proxy/upstreams/{upstream}/sites/{site}", + "steps": [ + { + "parent": "Remove Site from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Site File from Upstream Directory" + }, + { + "parent": "Remove Site from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Generate NGINX Configuration" + }, + { + "parent": "Remove Site from Upstream", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 0, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 6, + "modified": "2023-11-06 07:28:18.510770", + "name": "Archive Site", + "request_method": null, + "request_path": null, + "steps": [ + { + "parent": "Archive Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Archive Site" + }, + { + "parent": "Archive Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Archive Site", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Reload NGINX" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-09-10 12:11:38.844112", + "name": "Recover Update In Place", + "request_method": "POST", + "request_path": "/bench/{bench}/recover_update_inplace", + "steps": [ + { + "parent": "Recover Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Enable Maintenance Mode" + }, + { + "parent": "Recover Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Deploy Bench" + }, + { + "parent": "Recover Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Setup NGINX" + }, + { + "parent": "Recover Update In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Recover Sites" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-09-11 13:28:32.120581", + "name": "Ping Job", + "request_method": "POST", + "request_path": "ping_job", + "steps": [ + { + "parent": "Ping Job", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Ping Step" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-08-20 12:51:05.293373", + "name": "Update Bench In Place", + "request_method": "POST", + "request_path": "/bench/{bench}/update_inplace", + "steps": [ + { + "parent": "Update Bench In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Pull App Changes" + }, + { + "parent": "Update Bench In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Migrate Sites" + }, + { + "parent": "Update Bench In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Rebuild Bench Assets" + }, + { + "parent": "Update Bench In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Commit Container Changes" + }, + { + "parent": "Update Bench In Place", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Bench Restart" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 1, + "modified": "2024-10-28 14:49:19.894247", + "name": "Fetch Database Table Schema", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/database/schema", + "steps": [ + { + "parent": "Fetch Database Table Schema", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Fetch Database Table Schema" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 1, + "modified": "2024-11-04 14:49:18.592247", + "name": "Create Database User", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/database/users", + "steps": [ + { + "parent": "Create Database User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create Database User" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 1, + "modified": "2024-11-04 14:49:18.592247", + "name": "Remove Database User", + "request_method": "DELETE", + "request_path": "/benches/{bench}/sites/{site}/database/users/{username}", + "steps": [ + { + "parent": "Remove Database User", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Remove Database User" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 1, + "modified": "2024-11-04 14:49:18.592247", + "name": "Modify Database User Permissions", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/database/users/{db_user}/permissions", + "steps": [ + { + "parent": "Modify Database User Permissions", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Modify Database User Permissions" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 1, + "modified": "2024-10-28 14:49:19.894247", + "name": "Fetch Database Table Schema", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/database/schema", + "steps": [ + { + "step_name": "Fetch Database Table Schema" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-12-19 17:21:14.136650", + "name": "Analyze Slow Queries", + "request_method": "POST", + "request_path": "/benches/{bench}/sites/{site}/database/analyze-slow-queries", + "steps": [ + { + "step_name": "Analyze Slow Queries" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-12-11 18:08:04.411669", + "name": "New Devbox", + "request_method": "POST", + "request_path": "/devboxes", + "steps": [ + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Initialize Devbox" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create Devbox Database Volume" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Create Devbox Home Volume" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run Devbox" + }, + { + "parent": "New Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Devbox Setup NGINX" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-12-17 16:27:51.442551", + "name": "Destroy Devbox", + "request_method": "POST", + "request_path": "/devboxes/{devbox.name}/destroy", + "steps": [ + { + "parent": "Destroy Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Stop Devbox" + }, + { + "parent": "Destroy Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Delete Devbox Directory" + }, + { + "parent": "Destroy Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Delete Devbox Database Volume" + }, + { + "parent": "Destroy Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Delete Devbox Home Volume" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-10-21 11:18:53.122319", + "name": "Start Devbox", + "request_method": "POST", + "request_path": "devboxes/{devbox.name}/{devbox.websockify_port}/start", + "steps": [ + { + "parent": "Start Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Run Devbox" + } + ] + }, + { + "disabled_auto_retry": 1, + "docstatus": 0, + "doctype": "Agent Job Type", + "max_retry_count": 3, + "modified": "2024-10-23 20:30:22.356484", + "name": "Stop Devbox", + "request_method": "POST", + "request_path": "devboxes/{devbox.name}/stop", + "steps": [ + { + "parent": "Stop Devbox", + "parentfield": "steps", + "parenttype": "Agent Job Type", + "step_name": "Stop Devbox" + } + ] + } + ] \ No newline at end of file diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 5f93370cd9..55294d7106 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -165,7 +165,8 @@ "fieldname": "docker_image", "fieldtype": "Link", "label": "Docker Image", - "options": "Devbox Image" + "options": "Devbox Image", + "reqd": 1 } ], "index_web_pages_for_search": 1, @@ -176,7 +177,7 @@ "link_fieldname": "devbox" } ], - "modified": "2025-01-01 14:33:54.040552", + "modified": "2025-01-01 20:27:02.458051", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index 210558054d..e6dbca1e93 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -32,7 +32,7 @@ class Devbox(Document): codeserver_port: DF.Int container_id: DF.Data | None database_volume_size: DF.Data | None - docker_image: DF.Link | None + docker_image: DF.Link domain: DF.Link | None home_volume_size: DF.Data | None initialized: DF.Check @@ -114,10 +114,12 @@ def initialize_devbox(self): ) devbox.save() server_agent = Agent(server_type="Server", server=devbox.server) + image_reference = frappe.db.get_value("Devbox Image", devbox.docker_image, "image_reference") server_agent.create_agent_job( "New Devbox", path="devboxes", data={ + "devbox_image_reference": image_reference, "devbox_name": devbox.name, "vnc_password": devbox.vnc_password, "codeserver_password": devbox.codeserver_password, @@ -141,10 +143,12 @@ def initialize_devbox(self): def start_devbox(self): devbox = self server_agent = Agent(server_type="Server", server=devbox.server) + image_reference = frappe.db.get_value("Devbox Image", devbox.docker_image, "image_reference") server_agent.create_agent_job( "Start Devbox", path=f"devboxes/{devbox.name}/start", data={ + "devbox_image_reference": image_reference, "vnc_password": devbox.vnc_password, "codeserver_password": devbox.codeserver_password, }, From a530d322474556ce476b140d33dbebfefe28e6be Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Thu, 2 Jan 2025 17:31:30 +0530 Subject: [PATCH 38/45] fix(devbox): Fetch all servers that are not devbox servers --- .cspell.json | 8 +++++++- press/hooks.py | 2 +- press/press/doctype/server/server.py | 14 ++++++++++---- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.cspell.json b/.cspell.json index 44f9b3625e..f6ed69a4d9 100644 --- a/.cspell.json +++ b/.cspell.json @@ -61,7 +61,13 @@ "uncollectible", "devbox", "devboxes", - "websockify" + "websockify", + "vcpu", + "sysrq", + "earlyoom", + "nvme", + "nofail" + ], "allowCompoundWords": true, "ignorePaths": [ diff --git a/press/hooks.py b/press/hooks.py index a59b1191c2..f2bd441ba3 100644 --- a/press/hooks.py +++ b/press/hooks.py @@ -266,12 +266,12 @@ "press.press.doctype.site_replication.site_replication.update_from_site", "press.press.doctype.virtual_disk_snapshot.virtual_disk_snapshot.sync_snapshots", "press.press.doctype.site.site.sync_sites_setup_wizard_complete_status", + "press.press.doctype.devbox.devbox_helper.sync_all_active_devboxes", ], "* * * * *": [ "press.press.doctype.deploy_candidate.deploy_candidate.run_scheduled_builds", "press.press.doctype.agent_request_failure.agent_request_failure.remove_old_failures", "press.saas.doctype.site_access_token.site_access_token.cleanup_expired_access_tokens", - "press.press.doctype.devbox.devbox_helper.sync_all_active_devboxes", ], "*/10 * * * *": [ "press.saas.doctype.product_trial.product_trial.replenish_standby_sites", diff --git a/press/press/doctype/server/server.py b/press/press/doctype/server/server.py index 3259d7c3ed..fc06783132 100644 --- a/press/press/doctype/server/server.py +++ b/press/press/doctype/server/server.py @@ -1662,17 +1662,23 @@ def _install_exporters(self): @classmethod def get_all_prod(cls, **kwargs) -> list[str]: """Active prod servers.""" - return frappe.get_all("Server", {"status": "Active"}, pluck="name", **kwargs) + return frappe.get_all( + "Server", {"status": "Active", "is_devbox_server": False}, pluck="name", **kwargs + ) @classmethod def get_all_primary_prod(cls) -> list[str]: """Active primary prod servers.""" - return frappe.get_all("Server", {"status": "Active", "is_primary": True}, pluck="name") + return frappe.get_all( + "Server", {"status": "Active", "is_primary": True, "is_devbox_server": False}, pluck="name" + ) @classmethod def get_all_staging(cls, **kwargs) -> list[str]: """Active staging servers.""" - return frappe.get_all("Server", {"status": "Active", "staging": True}, pluck="name", **kwargs) + return frappe.get_all( + "Server", {"status": "Active", "staging": True, "is_devbox_server": False}, pluck="name", **kwargs + ) @classmethod def get_one_staging(cls) -> str: @@ -1680,7 +1686,7 @@ def get_one_staging(cls) -> str: @classmethod def get_prod_for_new_bench(cls, extra_filters=None) -> str | None: - filters = {"status": "Active", "use_for_new_benches": True} + filters = {"status": "Active", "use_for_new_benches": True, "is_devbox_server": False} if extra_filters: filters.update(extra_filters) servers = frappe.get_all("Server", {**filters}, pluck="name", limit=1) From 11d8e87d9de97590b0b071bda541cc70b18c8d38 Mon Sep 17 00:00:00 2001 From: "Arun Mathai S.K." <61804369+arunmathaisk@users.noreply.github.com> Date: Thu, 2 Jan 2025 17:45:07 +0530 Subject: [PATCH 39/45] ci: Update .cspell.json --- .cspell.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.cspell.json b/.cspell.json index 0ab0586359..e0615fd7dc 100644 --- a/.cspell.json +++ b/.cspell.json @@ -65,8 +65,7 @@ "sysrq", "earlyoom", "nvme", - "nofail" - + "nofail", "hset", "serializability", "oom" From fedd305e713ab3d26bde5409fe249f7e04d7ce02 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Fri, 24 Jan 2025 19:50:39 +0530 Subject: [PATCH 40/45] fix(proxy): added flag for proxy being solely for devbox xluster --- press/playbooks/roles/agent/tasks/main.yml | 2 +- press/press/doctype/proxy_server/proxy_server.json | 9 ++++++++- press/press/doctype/proxy_server/proxy_server.py | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/press/playbooks/roles/agent/tasks/main.yml b/press/playbooks/roles/agent/tasks/main.yml index 3a5dcdb3da..62775110ad 100644 --- a/press/playbooks/roles/agent/tasks/main.yml +++ b/press/playbooks/roles/agent/tasks/main.yml @@ -19,7 +19,7 @@ - name: Generate Agent Configuration File become: yes become_user: frappe - command: '/home/frappe/agent/env/bin/agent setup config --name {{ server }} --workers {{ workers }} {% if proxy_ip is defined and proxy_ip is truthy %}--proxy-ip {{ proxy_ip }}{% endif %} {% if agent_sentry_dsn is defined and agent_sentry_dsn is truthy %}--sentry-dsn {{ agent_sentry_dsn }}{% endif %}' + command: '/home/frappe/agent/env/bin/agent setup config --name {{ server }} --workers {{ workers }} {% if proxy_ip is defined and proxy_ip is truthy %}--proxy-ip {{ proxy_ip }}{% endif %} {% if agent_sentry_dsn is defined and agent_sentry_dsn is truthy %}--sentry-dsn {{ agent_sentry_dsn }}{% endif %} {% if is_devbox_proxy is defined and is_devbox_proxy is truthy %}--is_devbox_proxy {{ is_devbox_proxy }}{% endif %}' args: chdir: /home/frappe/agent diff --git a/press/press/doctype/proxy_server/proxy_server.json b/press/press/doctype/proxy_server/proxy_server.json index c3e252da8c..4f9f7093c0 100644 --- a/press/press/doctype/proxy_server/proxy_server.json +++ b/press/press/doctype/proxy_server/proxy_server.json @@ -16,6 +16,7 @@ "virtual_machine", "is_server_setup", "is_self_hosted", + "is_devbox_proxy", "team", "public", "storage_section", @@ -421,10 +422,16 @@ "fieldtype": "Int", "label": "Auto Add Storage Max", "non_negative": 1 + }, + { + "default": "0", + "fieldname": "is_devbox_proxy", + "fieldtype": "Check", + "label": "Is Devbox Proxy" } ], "links": [], - "modified": "2024-12-26 13:20:05.120010", + "modified": "2025-01-23 10:47:34.384269", "modified_by": "Administrator", "module": "Press", "name": "Proxy Server", diff --git a/press/press/doctype/proxy_server/proxy_server.py b/press/press/doctype/proxy_server/proxy_server.py index 21cbab44ae..0c2397ea87 100644 --- a/press/press/doctype/proxy_server/proxy_server.py +++ b/press/press/doctype/proxy_server/proxy_server.py @@ -41,6 +41,7 @@ class ProxyServer(BaseServer): hostname: DF.Data hostname_abbreviation: DF.Data | None ip: DF.Data | None + is_devbox_proxy: DF.Check is_primary: DF.Check is_proxysql_setup: DF.Check is_replication_setup: DF.Check @@ -160,6 +161,7 @@ def _setup_server(self): "certificate_full_chain": certificate.full_chain, "certificate_intermediate_chain": certificate.intermediate_chain, "press_url": frappe.utils.get_url(), + "is_devbox_proxy": self.is_devbox_proxy, }, ) play = ansible.run() From 34888b43318d36b8c2e86a5d7648efa60ac45a92 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Fri, 24 Jan 2025 22:41:32 +0530 Subject: [PATCH 41/45] feat(devbox): add cluster field and create dns record --- press/press/doctype/cluster/cluster.json | 9 ++++++++- press/press/doctype/cluster/cluster.py | 1 + press/press/doctype/devbox/devbox.json | 12 +++++++++++- press/press/doctype/devbox/devbox.py | 3 +++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/press/press/doctype/cluster/cluster.json b/press/press/doctype/cluster/cluster.json index be5b4f4da7..df6d98065a 100644 --- a/press/press/doctype/cluster/cluster.json +++ b/press/press/doctype/cluster/cluster.json @@ -13,6 +13,7 @@ "public", "beta", "hybrid", + "devbox_cluster", "column_break_fsht", "monitoring_password", "image", @@ -283,6 +284,12 @@ "fieldtype": "Link", "label": "Team", "options": "Team" + }, + { + "default": "0", + "fieldname": "devbox_cluster", + "fieldtype": "Check", + "label": "Devbox Cluster" } ], "image_field": "image", @@ -319,7 +326,7 @@ "link_fieldname": "document_name" } ], - "modified": "2024-09-14 13:52:58.308402", + "modified": "2025-01-24 19:54:24.858992", "modified_by": "Administrator", "module": "Press", "name": "Cluster", diff --git a/press/press/doctype/cluster/cluster.py b/press/press/doctype/cluster/cluster.py index ca042e4d34..1230d22895 100644 --- a/press/press/doctype/cluster/cluster.py +++ b/press/press/doctype/cluster/cluster.py @@ -59,6 +59,7 @@ class Cluster(Document): cidr_block: DF.Data | None cloud_provider: DF.Literal["AWS EC2", "Generic", "OCI", "Hetzner"] description: DF.Data | None + devbox_cluster: DF.Check hybrid: DF.Check image: DF.AttachImage | None monitoring_password: DF.Password | None diff --git a/press/press/doctype/devbox/devbox.json b/press/press/doctype/devbox/devbox.json index 55294d7106..41bd644914 100644 --- a/press/press/doctype/devbox/devbox.json +++ b/press/press/doctype/devbox/devbox.json @@ -14,6 +14,7 @@ "is_destroyed", "column_break_ydvd", "server", + "cluster", "team", "docker_image", "ports_and_config_tab", @@ -167,6 +168,15 @@ "label": "Docker Image", "options": "Devbox Image", "reqd": 1 + }, + { + "fetch_from": "server.cluster", + "fieldname": "cluster", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Cluster", + "read_only": 1, + "reqd": 1 } ], "index_web_pages_for_search": 1, @@ -177,7 +187,7 @@ "link_fieldname": "devbox" } ], - "modified": "2025-01-01 20:27:02.458051", + "modified": "2025-01-24 22:30:17.047021", "modified_by": "Administrator", "module": "Press", "name": "Devbox", diff --git a/press/press/doctype/devbox/devbox.py b/press/press/doctype/devbox/devbox.py index e6dbca1e93..2651de32ee 100644 --- a/press/press/doctype/devbox/devbox.py +++ b/press/press/doctype/devbox/devbox.py @@ -12,6 +12,7 @@ from frappe.model.document import Document from press.agent import Agent +from press.utils.dns import create_dns_record if TYPE_CHECKING: from press.press.doctype.agent_job.agent_job import AgentJob @@ -28,6 +29,7 @@ class Devbox(Document): add_site_to_upstream: DF.Check browser_port: DF.Int + cluster: DF.Data codeserver_password: DF.Data | None codeserver_port: DF.Int container_id: DF.Data | None @@ -115,6 +117,7 @@ def initialize_devbox(self): devbox.save() server_agent = Agent(server_type="Server", server=devbox.server) image_reference = frappe.db.get_value("Devbox Image", devbox.docker_image, "image_reference") + create_dns_record(doc=self, record_name=self.name) server_agent.create_agent_job( "New Devbox", path="devboxes", From 1270d7dbcc10e2f66d603aa695ae439c9e5b0524 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Thu, 30 Jan 2025 06:15:36 +0000 Subject: [PATCH 42/45] fix(ruff): Reverting untouched files --- .cspell.json | 6 +- press/fixtures/bench_dependency.json | 690 ++++++++++++++++--------- press/fixtures/role.json | 104 ++-- press/press/doctype/server/server.json | 2 +- 4 files changed, 511 insertions(+), 291 deletions(-) diff --git a/.cspell.json b/.cspell.json index 56a4e63f68..28b421fe8b 100644 --- a/.cspell.json +++ b/.cspell.json @@ -447,9 +447,9 @@ "venv", "vetur", "Vetur", - "devbox", - "devboxes", - "websockify", + "devbox", + "devboxes", + "websockify", "Vevay", "vfat", "vimrc", diff --git a/press/fixtures/bench_dependency.json b/press/fixtures/bench_dependency.json index dfb55fd298..48ba296785 100644 --- a/press/fixtures/bench_dependency.json +++ b/press/fixtures/bench_dependency.json @@ -1,248 +1,444 @@ [ - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 0, - "modified": "2023-09-26 19:45:32.017532", - "name": "PYTHON_VERSION", - "supported_versions": [ - { - "supported_frappe_version": "Version 12", - "version": "3.7" - }, - { - "supported_frappe_version": "Version 13", - "version": "3.7" - }, - { - "supported_frappe_version": "Version 13", - "version": "3.8" - }, - { - "supported_frappe_version": "Nightly", - "version": "3.10" - }, - { - "supported_frappe_version": "Version 14", - "version": "3.10" - }, - { - "supported_frappe_version": "Version 15", - "version": "3.10" - }, - { - "supported_frappe_version": "Nightly", - "version": "3.11" - }, - { - "supported_frappe_version": "Version 14", - "version": "3.11" - }, - { - "supported_frappe_version": "Version 15", - "version": "3.11" - } - ], - "title": "Python Version" - }, - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 0, - "modified": "2023-10-06 15:45:18.593014", - "name": "NODE_VERSION", - "supported_versions": [ - { - "supported_frappe_version": "Nightly", - "version": "18.16.0" - }, - { - "supported_frappe_version": "Version 15", - "version": "18.16.0" - }, - { - "supported_frappe_version": "Version 14", - "version": "16.11.0" - }, - { - "supported_frappe_version": "Version 14", - "version": "16.16.0" - }, - { - "supported_frappe_version": "Version 13", - "version": "14.19.0" - }, - { - "supported_frappe_version": "Version 12", - "version": "12.19.0" - } - ], - "title": "Node Version" - }, - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 0, - "modified": "2023-09-27 09:37:02.358511", - "name": "WKHTMLTOPDF_VERSION", - "supported_versions": [ - { - "supported_frappe_version": "Nightly", - "version": "0.12.4" - }, - { - "supported_frappe_version": "Version 12", - "version": "0.12.4" - }, - { - "supported_frappe_version": "Version 13", - "version": "0.12.4" - }, - { - "supported_frappe_version": "Version 14", - "version": "0.12.4" - }, - { - "supported_frappe_version": "Version 15", - "version": "0.12.4" - }, - { - "supported_frappe_version": "Nightly", - "version": "0.12.5" - }, - { - "supported_frappe_version": "Version 12", - "version": "0.12.5" - }, - { - "supported_frappe_version": "Version 13", - "version": "0.12.5" - }, - { - "supported_frappe_version": "Version 14", - "version": "0.12.5" - }, - { - "supported_frappe_version": "Version 15", - "version": "0.12.5" - }, - { - "supported_frappe_version": "Nightly", - "version": "0.12.6" - }, - { - "supported_frappe_version": "Version 12", - "version": "0.12.6" - }, - { - "supported_frappe_version": "Version 13", - "version": "0.12.6" - }, - { - "supported_frappe_version": "Version 14", - "version": "0.12.6" - }, - { - "supported_frappe_version": "Version 15", - "version": "0.12.6" - } - ], - "title": "Wkhtmltopdf Version" - }, - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 0, - "modified": "2023-10-28 22:08:23.853052", - "name": "BENCH_VERSION", - "supported_versions": [ - { - "supported_frappe_version": "Version 14", - "version": "5.15.2" - }, - { - "supported_frappe_version": "Version 13", - "version": "5.15.2" - }, - { - "supported_frappe_version": "Version 12", - "version": "5.15.2" - }, - { - "supported_frappe_version": "Version 15", - "version": "5.16.0" - }, - { - "supported_frappe_version": "Nightly", - "version": "5.17.2" - }, - { - "supported_frappe_version": "Version 15", - "version": "5.17.2" - }, - { - "supported_frappe_version": "Version 14", - "version": "5.17.2" - }, - { - "supported_frappe_version": "Version 13", - "version": "5.17.2" - }, - { - "supported_frappe_version": "Version 12", - "version": "5.17.2" - }, - { - "supported_frappe_version": "Nightly", - "version": "5.18.0" - }, - { - "supported_frappe_version": "Version 15", - "version": "5.18.0" - }, - { - "supported_frappe_version": "Version 14", - "version": "5.18.0" - }, - { - "supported_frappe_version": "Version 13", - "version": "5.18.0" - }, - { - "supported_frappe_version": "Version 12", - "version": "5.18.0" - } - ], - "title": "Bench Version" - }, - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 1, - "modified": "2023-09-26 15:46:26.816012", - "name": "NVM_VERSION", - "supported_versions": [ - { - "supported_frappe_version": "Nightly", - "version": "0.39.1" - }, - { - "supported_frappe_version": "Version 12", - "version": "0.39.1" - }, - { - "supported_frappe_version": "Version 13", - "version": "0.39.1" - }, - { - "supported_frappe_version": "Version 14", - "version": "0.39.1" - }, - { - "supported_frappe_version": "Version 15", - "version": "0.39.1" - } - ], - "title": "NVM Version" - } -] \ No newline at end of file + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 0, + "modified": "2023-09-26 19:45:32.017532", + "name": "PYTHON_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "3.7" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "3.7" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "3.8" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "3.10" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "3.10" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "3.10" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "3.11" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "3.11" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "3.11" + } + ], + "title": "Python Version" + }, + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 0, + "modified": "2023-10-06 15:45:18.593014", + "name": "NODE_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "18.16.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "18.16.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "16.11.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "16.16.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "14.19.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "12.19.0" + } + ], + "title": "Node Version" + }, + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 0, + "modified": "2023-09-27 09:37:02.358511", + "name": "WKHTMLTOPDF_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "0.12.6" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "0.12.6" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "0.12.6" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "0.12.6" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "0.12.6" + } + ], + "title": "Wkhtmltopdf Version" + }, + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 0, + "modified": "2023-10-28 22:08:23.853052", + "name": "BENCH_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "5.15.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "5.15.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "5.15.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "5.16.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "5.18.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "5.18.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "5.18.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "5.18.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "5.18.0" + } + ], + "title": "Bench Version" + }, + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 1, + "modified": "2023-09-26 15:46:26.816012", + "name": "NVM_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "0.39.1" + }, + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "0.39.1" + }, + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "0.39.1" + }, + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "0.39.1" + }, + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "0.39.1" + } + ], + "title": "NVM Version" + } + ] \ No newline at end of file diff --git a/press/fixtures/role.json b/press/fixtures/role.json index ce89d14718..becaf209ad 100644 --- a/press/fixtures/role.json +++ b/press/fixtures/role.json @@ -1,41 +1,65 @@ [ - { - "desk_access": 0, - "disabled": 0, - "docstatus": 0, - "doctype": "Role", - "home_page": null, - "is_custom": 0, - "modified": "2024-05-27 11:14:43.545958", - "name": "Press Support Agent", - "restrict_to_domain": null, - "role_name": "Press Support Agent", - "two_factor_auth": 0 - }, - { - "desk_access": 0, - "disabled": 0, - "docstatus": 0, - "doctype": "Role", - "home_page": null, - "is_custom": 0, - "modified": "2020-04-06 22:48:03.538506", - "name": "Press Admin", - "restrict_to_domain": null, - "role_name": "Press Admin", - "two_factor_auth": 0 - }, - { - "desk_access": 0, - "disabled": 0, - "docstatus": 0, - "doctype": "Role", - "home_page": null, - "is_custom": 0, - "modified": "2020-04-06 22:48:33.006868", - "name": "Press Member", - "restrict_to_domain": null, - "role_name": "Press Member", - "two_factor_auth": 0 - } -] \ No newline at end of file + { + "bulk_actions": 0, + "dashboard": 0, + "desk_access": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Role", + "form_sidebar": 0, + "home_page": null, + "is_custom": 0, + "list_sidebar": 0, + "modified": "2024-05-27 11:14:43.545958", + "name": "Press Support Agent", + "notifications": 0, + "restrict_to_domain": null, + "role_name": "Press Support Agent", + "search_bar": 0, + "timeline": 0, + "two_factor_auth": 0, + "view_switcher": 0 + }, + { + "bulk_actions": 0, + "dashboard": 0, + "desk_access": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Role", + "form_sidebar": 0, + "home_page": null, + "is_custom": 0, + "list_sidebar": 0, + "modified": "2020-04-06 22:48:03.538506", + "name": "Press Admin", + "notifications": 0, + "restrict_to_domain": null, + "role_name": "Press Admin", + "search_bar": 0, + "timeline": 0, + "two_factor_auth": 0, + "view_switcher": 0 + }, + { + "bulk_actions": 0, + "dashboard": 0, + "desk_access": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Role", + "form_sidebar": 0, + "home_page": null, + "is_custom": 0, + "list_sidebar": 0, + "modified": "2020-04-06 22:48:33.006868", + "name": "Press Member", + "notifications": 0, + "restrict_to_domain": null, + "role_name": "Press Member", + "search_bar": 0, + "timeline": 0, + "two_factor_auth": 0, + "view_switcher": 0 + } + ] \ No newline at end of file diff --git a/press/press/doctype/server/server.json b/press/press/doctype/server/server.json index 1c6a82e9f4..73be7a7e95 100644 --- a/press/press/doctype/server/server.json +++ b/press/press/doctype/server/server.json @@ -317,7 +317,7 @@ "options": "Virtual Machine" }, { - "default": "0", + "default": "1", "fieldname": "new_worker_allocation", "fieldtype": "Check", "label": "New Worker Allocation" From 59d11b95b604a26e772f9daa87eb3fdab7f5ae7b Mon Sep 17 00:00:00 2001 From: "Arun Mathai S.K." <61804369+arunmathaisk@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:52:17 +0530 Subject: [PATCH 43/45] fix(ruff) Formatting bench_dependency --- press/fixtures/bench_dependency.json | 886 +++++++++++++-------------- 1 file changed, 443 insertions(+), 443 deletions(-) diff --git a/press/fixtures/bench_dependency.json b/press/fixtures/bench_dependency.json index 48ba296785..1819ef20be 100644 --- a/press/fixtures/bench_dependency.json +++ b/press/fixtures/bench_dependency.json @@ -1,444 +1,444 @@ [ - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 0, - "modified": "2023-09-26 19:45:32.017532", - "name": "PYTHON_VERSION", - "supported_versions": [ - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "3.7" - }, - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "3.7" - }, - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "3.8" - }, - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "3.10" - }, - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "3.10" - }, - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "3.10" - }, - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "3.11" - }, - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "3.11" - }, - { - "is_custom": 0, - "parent": "PYTHON_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "3.11" - } - ], - "title": "Python Version" - }, - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 0, - "modified": "2023-10-06 15:45:18.593014", - "name": "NODE_VERSION", - "supported_versions": [ - { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "18.16.0" - }, - { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "18.16.0" - }, - { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "16.11.0" - }, - { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "16.16.0" - }, - { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "14.19.0" - }, - { - "is_custom": 0, - "parent": "NODE_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "12.19.0" - } - ], - "title": "Node Version" - }, - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 0, - "modified": "2023-09-27 09:37:02.358511", - "name": "WKHTMLTOPDF_VERSION", - "supported_versions": [ - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "0.12.4" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "0.12.4" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "0.12.4" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "0.12.4" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "0.12.4" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "0.12.5" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "0.12.5" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "0.12.5" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "0.12.5" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "0.12.5" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "0.12.6" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "0.12.6" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "0.12.6" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "0.12.6" - }, - { - "is_custom": 0, - "parent": "WKHTMLTOPDF_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "0.12.6" - } - ], - "title": "Wkhtmltopdf Version" - }, - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 0, - "modified": "2023-10-28 22:08:23.853052", - "name": "BENCH_VERSION", - "supported_versions": [ - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "5.15.2" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "5.15.2" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "5.15.2" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "5.16.0" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "5.17.2" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "5.17.2" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "5.17.2" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "5.17.2" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "5.17.2" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "5.18.0" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "5.18.0" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "5.18.0" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "5.18.0" - }, - { - "is_custom": 0, - "parent": "BENCH_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "5.18.0" - } - ], - "title": "Bench Version" - }, - { - "docstatus": 0, - "doctype": "Bench Dependency", - "internal": 1, - "modified": "2023-09-26 15:46:26.816012", - "name": "NVM_VERSION", - "supported_versions": [ - { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Nightly", - "version": "0.39.1" - }, - { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 12", - "version": "0.39.1" - }, - { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 13", - "version": "0.39.1" - }, - { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 14", - "version": "0.39.1" - }, - { - "is_custom": 0, - "parent": "NVM_VERSION", - "parentfield": "supported_versions", - "parenttype": "Bench Dependency", - "supported_frappe_version": "Version 15", - "version": "0.39.1" - } - ], - "title": "NVM Version" - } - ] \ No newline at end of file + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 0, + "modified": "2023-09-26 19:45:32.017532", + "name": "PYTHON_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "3.7" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "3.7" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "3.8" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "3.10" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "3.10" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "3.10" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "3.11" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "3.11" + }, + { + "is_custom": 0, + "parent": "PYTHON_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "3.11" + } + ], + "title": "Python Version" + }, + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 0, + "modified": "2023-10-06 15:45:18.593014", + "name": "NODE_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "18.16.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "18.16.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "16.11.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "16.16.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "14.19.0" + }, + { + "is_custom": 0, + "parent": "NODE_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "12.19.0" + } + ], + "title": "Node Version" + }, + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 0, + "modified": "2023-09-27 09:37:02.358511", + "name": "WKHTMLTOPDF_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "0.12.4" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "0.12.5" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "0.12.6" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "0.12.6" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "0.12.6" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "0.12.6" + }, + { + "is_custom": 0, + "parent": "WKHTMLTOPDF_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "0.12.6" + } + ], + "title": "Wkhtmltopdf Version" + }, + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 0, + "modified": "2023-10-28 22:08:23.853052", + "name": "BENCH_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "5.15.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "5.15.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "5.15.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "5.16.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "5.17.2" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "5.18.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "5.18.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "5.18.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "5.18.0" + }, + { + "is_custom": 0, + "parent": "BENCH_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "5.18.0" + } + ], + "title": "Bench Version" + }, + { + "docstatus": 0, + "doctype": "Bench Dependency", + "internal": 1, + "modified": "2023-09-26 15:46:26.816012", + "name": "NVM_VERSION", + "supported_versions": [ + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Nightly", + "version": "0.39.1" + }, + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 12", + "version": "0.39.1" + }, + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 13", + "version": "0.39.1" + }, + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 14", + "version": "0.39.1" + }, + { + "is_custom": 0, + "parent": "NVM_VERSION", + "parentfield": "supported_versions", + "parenttype": "Bench Dependency", + "supported_frappe_version": "Version 15", + "version": "0.39.1" + } + ], + "title": "NVM Version" + } +] From eb8a8428914a8b8775b72079fee7c2d56f96c5a6 Mon Sep 17 00:00:00 2001 From: "Arun Mathai S.K." <61804369+arunmathaisk@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:53:31 +0530 Subject: [PATCH 44/45] fixUpdate role.json --- press/fixtures/role.json | 128 +++++++++++++++++++-------------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/press/fixtures/role.json b/press/fixtures/role.json index becaf209ad..da6b4fcaf0 100644 --- a/press/fixtures/role.json +++ b/press/fixtures/role.json @@ -1,65 +1,65 @@ [ - { - "bulk_actions": 0, - "dashboard": 0, - "desk_access": 0, - "disabled": 0, - "docstatus": 0, - "doctype": "Role", - "form_sidebar": 0, - "home_page": null, - "is_custom": 0, - "list_sidebar": 0, - "modified": "2024-05-27 11:14:43.545958", - "name": "Press Support Agent", - "notifications": 0, - "restrict_to_domain": null, - "role_name": "Press Support Agent", - "search_bar": 0, - "timeline": 0, - "two_factor_auth": 0, - "view_switcher": 0 - }, - { - "bulk_actions": 0, - "dashboard": 0, - "desk_access": 0, - "disabled": 0, - "docstatus": 0, - "doctype": "Role", - "form_sidebar": 0, - "home_page": null, - "is_custom": 0, - "list_sidebar": 0, - "modified": "2020-04-06 22:48:03.538506", - "name": "Press Admin", - "notifications": 0, - "restrict_to_domain": null, - "role_name": "Press Admin", - "search_bar": 0, - "timeline": 0, - "two_factor_auth": 0, - "view_switcher": 0 - }, - { - "bulk_actions": 0, - "dashboard": 0, - "desk_access": 0, - "disabled": 0, - "docstatus": 0, - "doctype": "Role", - "form_sidebar": 0, - "home_page": null, - "is_custom": 0, - "list_sidebar": 0, - "modified": "2020-04-06 22:48:33.006868", - "name": "Press Member", - "notifications": 0, - "restrict_to_domain": null, - "role_name": "Press Member", - "search_bar": 0, - "timeline": 0, - "two_factor_auth": 0, - "view_switcher": 0 - } - ] \ No newline at end of file + { + "bulk_actions": 0, + "dashboard": 0, + "desk_access": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Role", + "form_sidebar": 0, + "home_page": null, + "is_custom": 0, + "list_sidebar": 0, + "modified": "2024-05-27 11:14:43.545958", + "name": "Press Support Agent", + "notifications": 0, + "restrict_to_domain": null, + "role_name": "Press Support Agent", + "search_bar": 0, + "timeline": 0, + "two_factor_auth": 0, + "view_switcher": 0 + }, + { + "bulk_actions": 0, + "dashboard": 0, + "desk_access": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Role", + "form_sidebar": 0, + "home_page": null, + "is_custom": 0, + "list_sidebar": 0, + "modified": "2020-04-06 22:48:03.538506", + "name": "Press Admin", + "notifications": 0, + "restrict_to_domain": null, + "role_name": "Press Admin", + "search_bar": 0, + "timeline": 0, + "two_factor_auth": 0, + "view_switcher": 0 + }, + { + "bulk_actions": 0, + "dashboard": 0, + "desk_access": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Role", + "form_sidebar": 0, + "home_page": null, + "is_custom": 0, + "list_sidebar": 0, + "modified": "2020-04-06 22:48:33.006868", + "name": "Press Member", + "notifications": 0, + "restrict_to_domain": null, + "role_name": "Press Member", + "search_bar": 0, + "timeline": 0, + "two_factor_auth": 0, + "view_switcher": 0 + } +] From 118018c591fa79b90122650d6332b55728bccf98 Mon Sep 17 00:00:00 2001 From: Arun Mathai Date: Thu, 30 Jan 2025 06:38:18 +0000 Subject: [PATCH 45/45] fix(ruff): Reverting untouched files --- press/press/doctype/server/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/press/press/doctype/server/server.py b/press/press/doctype/server/server.py index efc5743998..8ef16ac987 100644 --- a/press/press/doctype/server/server.py +++ b/press/press/doctype/server/server.py @@ -1076,7 +1076,7 @@ def set_mount_properties(self): def get_device_from_volume_id(self, volume_id): stripped_id = volume_id.replace("-", "") - return f"/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_{ stripped_id }" + return f"/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_{stripped_id}" def get_mount_variables(self): return {