Fix CI file serialization to not break newlines, add to admin utils 68/73068/2
authorSawyer Bergeron <sbergeron@iol.unh.edu>
Sat, 4 Dec 2021 19:24:07 +0000 (14:24 -0500)
committerSawyer Bergeron <sbergeron@iol.unh.edu>
Wed, 15 Dec 2021 20:27:06 +0000 (15:27 -0500)
Signed-off-by: Sawyer Bergeron <sbergeron@iol.unh.edu>
Change-Id: Ib7b223012687554a086f622e3edbe524b49dab6c
Signed-off-by: Sawyer Bergeron <sbergeron@iol.unh.edu>
src/api/views.py
src/dashboard/admin_utils.py
src/resource_inventory/models.py

index 3a82b96..1516374 100644 (file)
@@ -295,7 +295,7 @@ def resource_ci_userdata(request, lab_name="", job_id="", resource_id="", file_i
         "datasource_list": ["None"],
     }
 
-    return HttpResponse(yaml.dump(cloud_dict), status=200)
+    return HttpResponse(yaml.dump(cloud_dict, width=float("inf")), status=200)
 
 
 @csrf_exempt
@@ -310,9 +310,9 @@ def resource_ci_userdata_directory(request, lab_name="", job_id="", resource_id=
     files = resource.config.cloud_init_files
     files = [{"id": file.id, "priority": file.priority} for file in files.order_by("priority").all()]
 
-    d = {
-        'merge_failures': []
-    }
+    d = {}
+
+    merge_failures = []
 
     merger = Merger(
         [
@@ -335,9 +335,12 @@ def resource_ci_userdata_directory(request, lab_name="", job_id="", resource_id=
             print("Failed to merge file in, as it had invalid content:", f.id)
             print("File text was:")
             print(f.text)
-            d['merge_failures'].append({f.id: str(e)})
+            merge_failures.append({f.id: str(e)})
+
+    if len(merge_failures) > 0:
+        d['merge_failures'] = merge_failures
 
-    file = CloudInitFile.create(text=yaml.dump(d), priority=0)
+    file = CloudInitFile.create(text=yaml.dump(d, width=float("inf")), priority=0)
 
     return HttpResponse(json.dumps([{"id": file.id, "priority": file.priority}]), status=200)
 
index b105e96..045caeb 100644 (file)
@@ -22,7 +22,8 @@ from resource_inventory.models import (
     DiskProfile,
     CpuProfile,
     RamProfile,
-    Interface
+    Interface,
+    CloudInitFile,
 )
 
 import json
@@ -50,7 +51,7 @@ from booking.models import Booking
 from notifier.manager import NotificationHandler
 from api.models import JobFactory
 
-from api.models import JobStatus
+from api.models import JobStatus, Job, GeneratedCloudConfig
 
 
 def print_div():
@@ -528,6 +529,30 @@ def extend_booking(booking_id, days=0, hours=0, minutes=0, weeks=0):
     booking.save()
 
 
+def regenerate_cloud_configs(booking_id):
+    b = Booking.objects.get(id=booking_id)
+    for res in b.resource.get_resources():
+        res.config.cloud_init_files.set(res.config.cloud_init_files.filter(generated=False))  # careful!
+        res.config.save()
+        cif = GeneratedCloudConfig.objects.create(resource_id=res.labid, booking=b, rconfig=res.config)
+        cif.save()
+        cif = CloudInitFile.create(priority=0, text=cif.serialize())
+        cif.save()
+        res.config.cloud_init_files.add(cif)
+        res.config.save()
+
+
+def set_job_new(job_id):
+    j = Job.objects.get(id=job_id)
+    b = j.booking
+    regenerate_cloud_configs(b.id)
+    for task in j.get_tasklist():
+        task.status = JobStatus.NEW
+        task.save()
+    j.status = JobStatus.NEW
+    j.save()
+
+
 def docs(function=None, fulltext=False):
     """
     Print documentation for a given function in admin_utils.
index aefd5ce..5d87430 100644 (file)
@@ -157,6 +157,7 @@ class CloudInitFile(models.Model):
 
     # higher priority is applied later, so "on top" of existing files
     priority = models.IntegerField()
+    generated = models.BooleanField(default=False)
 
     @classmethod
     def merge_strategy(cls):