from django.contrib.auth.models import User
 from django.db import models
 from django.core.exceptions import PermissionDenied
+from django.shortcuts import get_object_or_404
 
 import json
 import uuid
     HostProfile,
     Host,
     Image,
-    Interface
+    Interface,
+    RemoteInfo
 )
 
 
     def __init__(self, lab):
         self.lab = lab
 
+    def update_host_remote_info(self, data, host_id):
+        host = get_object_or_404(Host, labid=host_id, lab=self.lab)
+        info = {}
+        try:
+            info['address'] = data['address']
+            info['mac_address'] = data['mac_address']
+            info['password'] = data['password']
+            info['user'] = data['user']
+            info['type'] = data['type']
+            info['versions'] = json.dumps(data['versions'])
+        except Exception as e:
+            return {"error": "invalid arguement: " + str(e)}
+        remote_info = host.remote_management
+        if "default" in remote_info.mac_address:
+            remote_info = RemoteInfo()
+        remote_info.address = info['address']
+        remote_info.mac_address = info['mac_address']
+        remote_info.password = info['password']
+        remote_info.user = info['user']
+        remote_info.type = info['type']
+        remote_info.versions = info['versions']
+        remote_info.save()
+        host.remote_management = remote_info
+        host.save()
+        return {"status": "success"}
+
     def get_profile(self):
         prof = {}
         prof['name'] = self.lab.name
 
     new_jobs,
     current_jobs,
     done_jobs,
+    update_host_bmc,
     GenerateTokenView
 )
 
     path('labs/<slug:lab_name>/profile', lab_profile),
     path('labs/<slug:lab_name>/status', lab_status),
     path('labs/<slug:lab_name>/inventory', lab_inventory),
+    path('labs/<slug:lab_name>/hosts/<slug:host_id>/bmc', update_host_bmc),
     path('labs/<slug:lab_name>/jobs/<int:job_id>', specific_job),
     path('labs/<slug:lab_name>/jobs/<int:job_id>/<slug:task_id>', specific_task),
     path('labs/<slug:lab_name>/jobs/new', new_jobs),
 
     return JsonResponse(lab_manager.get_status(), safe=False)
 
 
+def update_host_bmc(request, lab_name="", host_id=""):
+    lab_token = request.META.get('HTTP_AUTH_TOKEN')
+    lab_manager = LabManagerTracker.get(lab_name, lab_token)
+    if request.method == "POST":
+        # update / create RemoteInfo for host
+        return JsonResponse(
+            lab_manager.update_host_remote_info(request.POST, host_id),
+            safe=False
+        )
+
+
 def lab_profile(request, lab_name=""):
     lab_token = request.META.get('HTTP_AUTH_TOKEN')
     lab_manager = LabManagerTracker.get(lab_name, lab_token)
 
         return "config with " + str(self.host) + " and image " + str(self.image)
 
 
+class RemoteInfo(models.Model):
+    address = models.CharField(max_length=15)
+    mac_address = models.CharField(max_length=17)
+    password = models.CharField(max_length=100)
+    user = models.CharField(max_length=100)
+    management_type = models.CharField(max_length=50, default="ipmi")
+    versions = models.CharField(max_length=100)  # json serialized list of floats
+
+
+def get_default_remote_info():
+    RemoteInfo.objects.get_or_create(
+        address="default",
+        mac_address="default",
+        password="default",
+        user="default",
+        management_type="default",
+        versions="[default]"
+    )
+
+
 # Concrete host, actual machine in a lab
 class Host(models.Model):
     id = models.AutoField(primary_key=True)
     working = models.BooleanField(default=True)
     vendor = models.CharField(max_length=100, default="unknown")
     model = models.CharField(max_length=150, default="unknown")
+    remote_management = models.ForeignKey(RemoteInfo, default=get_default_remote_info, on_delete=models.SET(get_default_remote_info))
 
     def __str__(self):
         return self.name