Fix Reimaging Hosts 95/66595/1
authorParker Berberian <pberberian@iol.unh.edu>
Wed, 23 Jan 2019 18:47:56 +0000 (13:47 -0500)
committerParker Berberian <pberberian@iol.unh.edu>
Wed, 23 Jan 2019 18:47:56 +0000 (13:47 -0500)
When a User wants to reimage a host, the dashboard needs to also refresh the
network and ssh configurations. Otherwise a host is reimaged and becomes
unreachable.

Change-Id: I534f200498c9217bda81190861021c482e052a81
Signed-off-by: Parker Berberian <pberberian@iol.unh.edu>
dashboard/src/api/models.py
dashboard/src/booking/views.py

index e4016aa..b14ea2f 100644 (file)
@@ -604,7 +604,7 @@ class SnapshotConfig(TaskConfig):
 
 
 def get_task(task_id):
-    for taskclass in [AccessRelation, SoftwareRelation, HostHardwareRelation, HostNetworkRelation]:
+    for taskclass in [AccessRelation, SoftwareRelation, HostHardwareRelation, HostNetworkRelation, SnapshotRelation]:
         try:
             ret = taskclass.objects.get(task_id=task_id)
             return ret
@@ -703,6 +703,33 @@ class SnapshotRelation(TaskRelation):
 
 class JobFactory(object):
 
+    @classmethod
+    def reimageHost(cls, new_image, booking, host):
+        """
+        This method will make all necessary changes to make a lab
+        reimage a host.
+        """
+        job = Job.objects.get(booking=booking)
+        # make hardware task new
+        hardware_relation = HostHardwareRelation.objects.get(host=host, job=job)
+        hardware_relation.config.set_image(new_image.lab_id)
+        hardware_relation.config.save()
+        hardware_relation.status = JobStatus.NEW
+
+        # re-apply networking after host is reset
+        net_relation = HostNetworkRelation.objects.get(host=host, job=job)
+        net_relation.status = JobStatus.NEW
+
+        # re-apply ssh access after host is reset
+        ssh_relation = AccessRelation.objects.get(job=job, config__access_type="ssh")
+        ssh_relation.status = JobStatus.NEW
+
+        # save them all at once to reduce the chance
+        # of a lab polling and only seeing partial change
+        hardware_relation.save()
+        net_relation.save()
+        ssh_relation.save()
+
     @classmethod
     def makeSnapshotTask(cls, image, booking, host):
         relation = SnapshotRelation()
index 3be9c7b..1e14b8e 100644 (file)
@@ -23,7 +23,7 @@ from account.models import Lab
 from booking.models import Booking
 from booking.stats import StatisticsManager
 from booking.forms import HostReImageForm
-from api.models import HostHardwareRelation, JobStatus
+from api.models import JobFactory
 from workflow.views import login
 from booking.forms import QuickBookingForm
 from booking.quick_deployer import create_from_form, drop_filter
@@ -179,12 +179,9 @@ def booking_modify_image(request, booking_id):
             return HttpResponse("unauthorized")
         new_image = Image.objects.get(id=form.cleaned_data['image_id'])
         host = Host.objects.get(id=form.cleaned_data['host_id'])
-        relation = HostHardwareRelation.objects.get(host=host, job__booking=booking)
-        config = relation.config
-        config.set_image(new_image.lab_id)
-        config.save()
-        relation.status = JobStatus.NEW
-        relation.save()
+        host.config.image = new_image
+        host.config.save()
+        JobFactory.reimageHost(new_image, booking, host)
         return HttpResponse(new_image.name)
     return HttpResponse("error")