WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit fc2c8e5

Browse files
authored
Merge pull request #4044 from frappe/mergify/bp/master/pr-4031
2 parents 288dfd9 + 89ecff8 commit fc2c8e5

File tree

8 files changed

+112
-23
lines changed

8 files changed

+112
-23
lines changed

press/agent.py

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def restore_site(self, site: "Site", skip_failing_patches=False):
191191
)
192192

193193
def rename_site(self, site, new_name: str, create_user: dict | None = None, config: dict | None = None):
194-
data = {"new_name": new_name}
194+
data: dict[str, Any] = {"new_name": new_name}
195195
if create_user:
196196
data["create_user"] = create_user
197197
if config:
@@ -1034,7 +1034,7 @@ def create_agent_job(
10341034
self,
10351035
job_type,
10361036
path,
1037-
data=None,
1037+
data: dict | None = None,
10381038
files=None,
10391039
method="POST",
10401040
bench=None,
@@ -1055,12 +1055,12 @@ def create_agent_job(
10551055
)
10561056

10571057
if not disable_agent_job_deduplication:
1058-
job = self.get_similar_in_execution_job(
1058+
existing_job = self.get_similar_in_execution_job(
10591059
job_type, path, bench, site, code_server, upstream, host, method
10601060
)
10611061

1062-
if job:
1063-
return job
1062+
if existing_job:
1063+
return existing_job
10641064

10651065
job: "AgentJob" = frappe.get_doc(
10661066
{
@@ -1392,6 +1392,23 @@ def kill_database_process(self, site, id):
13921392
},
13931393
)
13941394

1395+
def update_database_schema_sizes(self):
1396+
if self.server_type != "Database Server":
1397+
return NotImplementedError("This method is only supported for Database Server")
1398+
1399+
return self.create_agent_job(
1400+
"Update Database Schema Sizes",
1401+
"database/update-schema-sizes",
1402+
data={
1403+
"private_ip": frappe.get_value("Database Server", self.server, "private_ip"),
1404+
"mariadb_root_password": get_decrypted_password(
1405+
"Database Server", self.server, "mariadb_root_password"
1406+
),
1407+
},
1408+
reference_doctype=self.server_type,
1409+
reference_name=self.server,
1410+
)
1411+
13951412
def fetch_database_variables(self):
13961413
if self.server_type != "Database Server":
13971414
return NotImplementedError("Only Database Server supports this method")
@@ -1629,14 +1646,14 @@ def backup_site_database_from_snapshot(
16291646
):
16301647
from press.press.doctype.site_backup.site_backup import get_backup_bucket
16311648

1632-
database_server: DatabaseServer = frappe.get_doc("Database Server", database_server)
1649+
database_server_doc: DatabaseServer = frappe.get_doc("Database Server", database_server) # type: ignore
16331650
data = {
16341651
"site": site,
16351652
"database_name": database_name,
16361653
"database_ip": frappe.get_value(
1637-
"Virtual Machine", database_server.virtual_machine, "private_ip_address"
1654+
"Virtual Machine", database_server_doc.virtual_machine, "private_ip_address"
16381655
),
1639-
"mariadb_root_password": database_server.get_password("mariadb_root_password"),
1656+
"mariadb_root_password": database_server_doc.get_password("mariadb_root_password"),
16401657
}
16411658

16421659
# offsite config
@@ -1672,7 +1689,7 @@ def backup_site_files_from_snapshot(
16721689
):
16731690
from press.press.doctype.site_backup.site_backup import get_backup_bucket
16741691

1675-
data = {
1692+
data: dict[str, Any] = {
16761693
"site": site,
16771694
"bench": bench,
16781695
}

press/hooks.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,9 @@
262262
"*/2 * * * *": [
263263
"press.press.doctype.incident.incident.resolve_incidents",
264264
],
265+
"45 * * * *": [
266+
"press.press.doctype.database_server.database_server.update_database_schema_sizes",
267+
],
265268
"0 4 * * *": [
266269
"press.press.doctype.site.backups.cleanup_offsite",
267270
"press.press.doctype.site.backups.expire_physical",
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
- name: Provide frappe user du permission
3+
hosts: all
4+
become: yes
5+
become_user: root
6+
gather_facts: yes
7+
8+
roles:
9+
- provide_frappe_user_du_permission
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
- name: Allow frappe user to run du
2+
lineinfile:
3+
path: /etc/sudoers.d/frappe
4+
line: 'frappe ALL = (root) NOPASSWD: /usr/bin/du'
5+
create: yes
6+
state: present
7+
validate: 'visudo -cf %s'
8+
mode: '0440'
9+
owner: root
10+
group: root

press/playbooks/roles/user/files/sudoers

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ frappe ALL = (root) NOPASSWD: /bin/systemctl * alertmanager
66
frappe ALL = (root) NOPASSWD: /usr/bin/supervisorctl
77
frappe ALL = (root) NOPASSWD: /usr/sbin/nginx
88
frappe ALL = (root) NOPASSWD: /usr/local/bin/bench
9-
9+
frappe ALL = (root) NOPASSWD: /usr/bin/du

press/press/doctype/database_server/database_server.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,12 @@ frappe.ui.form.on('Database Server', {
186186
true,
187187
frm.doc.is_server_setup,
188188
],
189+
[
190+
'Provide Frappe User DU Permission',
191+
'provide_frappe_user_du_permission',
192+
true,
193+
frm.doc.is_server_setup,
194+
],
189195
].forEach(([label, method, confirm, condition]) => {
190196
if (typeof condition === 'undefined' || condition) {
191197
frm.add_custom_button(

press/press/doctype/database_server/database_server.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,6 +1260,7 @@ def _capture_process_list(self) -> str | None:
12601260
return task.output
12611261
except Exception:
12621262
log_error("Process List Capture Exception", server=self.as_dict())
1263+
return None
12631264

12641265
@frappe.whitelist()
12651266
def setup_pt_stalk(self):
@@ -1311,6 +1312,24 @@ def _setup_logrotate(self):
13111312
except Exception:
13121313
log_error("Logrotate Setup Exception", server=self.as_dict())
13131314

1315+
@frappe.whitelist()
1316+
def provide_frappe_user_du_permission(self):
1317+
frappe.enqueue_doc(
1318+
self.doctype, self.name, "_provide_frappe_user_du_permission", queue="long", timeout=1200
1319+
)
1320+
1321+
def _provide_frappe_user_du_permission(self):
1322+
try:
1323+
ansible = Ansible(
1324+
playbook="provide_frappe_user_du_permission.yml",
1325+
server=self,
1326+
user=self._ssh_user(),
1327+
port=self._ssh_port(),
1328+
)
1329+
ansible.run()
1330+
except Exception:
1331+
log_error("MariaDB Provide Frappe User DU Permission Exception", server=self.as_dict())
1332+
13141333
@frappe.whitelist()
13151334
def setup_mariadb_debug_symbols(self):
13161335
frappe.enqueue_doc(
@@ -2013,8 +2032,8 @@ def remove_binlogs_from_indexer(self):
20132032
# Generate series of binlog
20142033
unindexable_binlogs = []
20152034
for binlog_no in range(first_binlog_no, last_binlog_no + 1):
2016-
binlog_no = str(binlog_no).zfill(no_of_digits)
2017-
unindexable_binlogs.append(f"mysql-bin.{binlog_no}")
2035+
binlog_no_z_filled = str(binlog_no).zfill(no_of_digits)
2036+
unindexable_binlogs.append(f"mysql-bin.{binlog_no_z_filled}")
20182037

20192038
self.agent.remove_binlogs_from_indexer(unindexable_binlogs)
20202039

@@ -2192,6 +2211,9 @@ def _set_mariadb_mount_dependency(self):
21922211
except Exception:
21932212
log_error("Set MariaDB Mount Dependency Exception", server=self.as_dict())
21942213

2214+
def update_database_schema_sizes(self):
2215+
self.agent.update_database_schema_sizes()
2216+
21952217

21962218
get_permission_query_conditions = get_permission_query_conditions_for_doctype("Database Server")
21972219

@@ -2420,3 +2442,26 @@ def auto_purge_binlogs_by_size_limit():
24202442
return
24212443
except Exception:
24222444
frappe.db.rollback()
2445+
2446+
2447+
def update_database_schema_sizes():
2448+
databases = frappe.db.get_all(
2449+
"Database Server",
2450+
filters={
2451+
"status": "Active",
2452+
},
2453+
pluck="name",
2454+
)
2455+
2456+
for database in databases:
2457+
if has_job_timeout_exceeded():
2458+
return
2459+
try:
2460+
server: DatabaseServer = frappe.get_doc("Database Server", database)
2461+
server.update_database_schema_sizes()
2462+
frappe.db.commit()
2463+
except rq.timeouts.JobTimeoutException:
2464+
frappe.db.rollback()
2465+
return
2466+
except Exception:
2467+
frappe.db.rollback()

press/press/doctype/server/server.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class BenchInfoType(TypedDict):
6565

6666

6767
class ARMDockerImageType(TypedDict):
68-
build: str
68+
build: str | None
6969
status: Literal["Pending", "Preparing", "Running", "Failure", "Success"]
7070
bench: str
7171

@@ -1856,12 +1856,12 @@ def size_to_increase_by_for_20_percent_available(self, mountpoint: str): # min
18561856

18571857
return int(max(self.auto_add_storage_min, min(projected_growth_gb, self.auto_add_storage_max)))
18581858

1859-
def recommend_disk_increase(self, mountpoint: str | None = None):
1859+
def recommend_disk_increase(self, mountpoint: str):
18601860
"""
18611861
Send disk expansion email to users with disabled auto addon storage at 80% capacity
18621862
Calculate the disk usage over a 30 hour period and take 25 percent of that
18631863
"""
1864-
server: Server | DatabaseServer = frappe.get_doc(self.doctype, self.name)
1864+
server: Server | DatabaseServer = frappe.get_doc(self.doctype, self.name) # type: ignore
18651865
if server.auto_increase_storage:
18661866
return
18671867

@@ -1875,26 +1875,26 @@ def recommend_disk_increase(self, mountpoint: str | None = None):
18751875
/ 1024
18761876
)
18771877

1878-
current_disk_usage = current_disk_usage / 1024 / 1024 / 1024
1879-
disk_capacity = disk_capacity / 1024 / 1024 / 1024
1878+
current_disk_usage_flt = round(current_disk_usage / 1024 / 1024 / 1024, 2)
1879+
disk_capacity_flt = round(disk_capacity / 1024 / 1024 / 1024, 2)
18801880

18811881
frappe.sendmail(
18821882
recipients=get_communication_info("Email", "Incident", self.doctype, self.name),
18831883
subject=f"Important: Server {server.name} has used 80% of the available space",
18841884
template="disabled_auto_disk_expansion",
18851885
args={
18861886
"server": server.name,
1887-
"current_disk_usage": f"{current_disk_usage} Gib",
1888-
"available_disk_space": f"{disk_capacity} GiB",
1887+
"current_disk_usage": f"{current_disk_usage_flt} Gib",
1888+
"available_disk_space": f"{disk_capacity_flt} GiB",
18891889
"used_storage_percentage": "80%",
18901890
"increase_by": f"{recommended_increase} GiB",
18911891
},
18921892
)
18931893

18941894
def calculated_increase_disk_size(
18951895
self,
1896+
mountpoint: str,
18961897
additional: int = 0,
1897-
mountpoint: str | None = None,
18981898
):
18991899
"""
19001900
Calculate required disk increase for servers and handle notifications accordingly.
@@ -1913,10 +1913,8 @@ def calculated_increase_disk_size(
19131913
buffer = self.size_to_increase_by_for_20_percent_available(mountpoint)
19141914
server: Server | DatabaseServer = frappe.get_doc(self.doctype, self.name)
19151915
disk_capacity = self.disk_capacity(mountpoint)
1916-
current_disk_usage = disk_capacity - self.free_space(mountpoint)
19171916

1918-
current_disk_usage = round(current_disk_usage / 1024 / 1024 / 1024, 2)
1919-
disk_capacity = round(disk_capacity / 1024 / 1024 / 1024, 2)
1917+
current_disk_usage = round((disk_capacity - self.free_space(mountpoint)) / 1024 / 1024 / 1024, 2)
19201918

19211919
if not server.auto_increase_storage and (not server.has_data_volume or mountpoint != "/"):
19221920
TelegramMessage.enqueue(
@@ -2087,6 +2085,7 @@ def set_additional_config(self): # noqa: C901
20872085

20882086
if self.doctype == "Database Server":
20892087
self.adjust_memory_config()
2088+
self.provide_frappe_user_du_permission()
20902089
self.setup_logrotate()
20912090
self.setup_user_lingering()
20922091

0 commit comments

Comments
 (0)