summaryrefslogtreecommitdiffstats
path: root/ogcp/views.py
diff options
context:
space:
mode:
authorAlejandro Sirgo Rica <asirgo@soleta.eu>2024-08-22 10:04:55 +0200
committerAlejandro Sirgo Rica <asirgo@soleta.eu>2024-08-22 10:04:55 +0200
commitbcd18241c7bf0363d00b2203c294d443b22d7807 (patch)
tree4a9da83ba813e7035323231ef4af106b9ef24b45 /ogcp/views.py
parentaab70b0222c90d5a852c1d465be35f9591d4a48c (diff)
ogcp: add disk restrictions in partition and format
Use common disk space across all the selected clients. Show dynamic disk partition graph in the partition view. Limit partition sizes dynamically in the form. Move js code to handle the addition and removal of partitions into the html file to debloat ogcp.js and keep the functions local to the only file they manipulate.
Diffstat (limited to 'ogcp/views.py')
-rw-r--r--ogcp/views.py45
1 files changed, 29 insertions, 16 deletions
diff --git a/ogcp/views.py b/ogcp/views.py
index 8b544eb..007ca91 100644
--- a/ogcp/views.py
+++ b/ogcp/views.py
@@ -682,6 +682,7 @@ def action_setup_select():
@login_required
def action_setup_show():
args = request.args.copy()
+ disk_size = None
default_disk = 1
selected_disk = int(args.pop('disk', default_disk))
@@ -694,35 +695,47 @@ def action_setup_show():
ips = set(args['ips'].split(' '))
base_client = args['selected_client']
- try:
- db_partitions = get_client_setup(base_client)
- except ServerError:
- return ogserver_down('commands')
- except ServerErrorCode:
- return ogserver_error('commands')
- if not db_partitions:
+ for ip in ips:
+ try:
+ setup_data = get_client_setup(ip)
+ except ServerError:
+ return ogserver_down('commands')
+ except ServerErrorCode:
+ return ogserver_error('commands')
+
+ filtered_partitions = [p for p in setup_data
+ if p.get('disk') == selected_disk]
+ if not filtered_partitions:
+ continue
+
+ if ip == base_client:
+ target_partitions = filtered_partitions
+
+ client_disk_size = filtered_partitions[0]['size'] // 1024
+ if disk_size:
+ disk_size = min(disk_size, client_disk_size)
+ else:
+ disk_size = client_disk_size
+
+ if not target_partitions:
flash(_('Partition information is not available. Boot client in ogLive mode to obtain it'), category='error')
return redirect(url_for('commands'))
- filtered_partitions = [p for p in db_partitions
- if p.get('disk') == selected_disk]
disk_partition = 0
- disks = [d.get('disk') for d in db_partitions
+ disks = [d.get('disk') for d in target_partitions
if d.get('partition') == disk_partition]
form = SetupForm()
form.ips.data = ips_str
form.disk.data = selected_disk
# If partition table is empty, set MSDOS
- form.disk_type.data = filtered_partitions[0]['code'] or 1
-
- disk_size = filtered_partitions[0]['size'] // 1024
+ form.disk_type.data = target_partitions[0]['code'] or 1
- # Make form.partition length equal to (filtered_partitions - 1) length
- diff = len(filtered_partitions) - 1 - len(form.partitions)
+ # Make form.partition length equal to (target_partitions - 1) length
+ diff = len(target_partitions) - 1 - len(form.partitions)
[form.partitions.append_entry() for unused in range(diff)]
- for partition, db_part in zip(form.partitions, filtered_partitions[1:]):
+ for partition, db_part in zip(form.partitions, target_partitions[1:]):
partition.partition.data = str(db_part['partition'])
partition.part_type.data = db_part['code']
partition.fs.data = db_part['filesystem']