Add support for
[invirt/packages/invirt-web.git] / templates / main.py
index c6006f4..e5dae26 100755 (executable)
@@ -13,6 +13,7 @@ import sha
 import hmac
 import datetime
 import StringIO
+import getafsgroups
 
 sys.stderr = StringIO.StringIO()
 sys.path.append('/home/ecprice/.local/lib/python2.5/site-packages')
@@ -117,7 +118,7 @@ def haveAccess(user, machine):
     """Return whether a user has access to a machine"""
     if user.username == 'moo':
         return True
-    return machine.owner == user.username
+    return getafsgroups.checkLockerOwner(user.username,machine.owner)
 
 def error(op, user, fields, err, emsg):
     """Print an error page when a CodeError occurs"""
@@ -510,7 +511,10 @@ def getDiskInfo(data_dict, machine):
 
 def deleteVM(machine):
     """Delete a VM."""
-    remctl('destroy', machine.name)
+    try:
+        remctl('destroy', machine.name)
+    except:
+        pass
     transaction = ctx.current.create_transaction()
     delete_disk_pairs = [(machine.name, d.guest_device_name) for d in machine.disks]
     try:
@@ -564,7 +568,7 @@ def command(user, fields):
     return Template(file="command.tmpl", searchList=[d, global_dict])
 
 def testOwner(user, owner, machine=None):
-    if owner != user.username:
+    if not getafsgroups.checkLockerOwner(user.username, owner):
         raise InvalidInput('owner', owner,
                            "Invalid")
     return owner
@@ -575,10 +579,19 @@ def testContact(user, contact, machine=None):
                            "Invalid")
     return contact
 
+def testDisk(user, disksize, machine=None):
+    return disksize
+
+def testName(user, name, machine=None):
+    return name
+
 def testHostname(user, hostname, machine):
     for nic in machine.nics:
         if hostname == nic.hostname:
             return hostname
+    # check if doesn't already exist
+    if NIC.select_by(hostname=hostname) == []:
+        return hostname
     raise InvalidInput('hostname', hostname,
                        "Different from before")
 
@@ -586,19 +599,59 @@ def testHostname(user, hostname, machine):
 def modify(user, fields):
     """Handler for modifying attributes of a machine."""
     #XXX not written yet
-    machine = testMachineId(user, fields.getfirst('machine_id'))
-    owner = testOwner(user, fields.getfirst('owner'), machine)
-    contact = testContact(user, fields.getfirst('contact'))
-    hostname = testHostname(user, fields.getfirst('hostname'),
+
+    transaction = ctx.current.create_transaction()
+    try:
+        machine = testMachineId(user, fields.getfirst('machine_id'))
+        owner = testOwner(user, fields.getfirst('owner'), machine)
+        contact = testContact(user, fields.getfirst('contact'))
+        hostname = testHostname(owner, fields.getfirst('hostname'),
                             machine)
-    ram = fields.getfirst('memory')
-    if ram is not None:
-        ram = validMemory(user, ram, machine)
-    disk = testDisk(user, fields.getfirst('disk'))
-    if disk is not None:
-        disk = validDisk(user, disk, machine)
+        name = testName(user, fields.getfirst('name'))
+        oldname = machine.name
+        olddisk = {}
+
+        memory = fields.getfirst('memory')
+        if memory is not None:
+            memory = validMemory(user, memory, machine)
+        if memory != machine.memory:
+            machine.memory = memory
+
+        disksize = testDisk(user, fields.getfirst('disk'))
+        if disksize is not None:
+            disksize = validDisk(user, disksize, machine)
+        
+        for disk in machine.disks:
+            disk.size = disksize
+            olddisk[disk.guest_device_name] = disk.size
+            ctx.current.save(disk)
+        
+        # XXX all NICs get same hostname on change?  Interface doesn't support more.
+        for nic in machine.nics:
+            nic.hostname = hostname
+            ctx.current.save(nic)
+
+        if owner != machine.owner:
+            machine.owner = owner
+        if name != machine.name:
+            machine.name = name
+            
+        ctx.current.save(machine)
+        transaction.commit()
+    except:
+        transaction.rollback()
+    remctl("web", "moveregister", oldname, name)
+    for disk in machine.disks:
+        # XXX all disks get the same size on change?  Interface doesn't support more.
+        if disk.size != olddisk[disk.guest_device_name]:
+            remctl("web", "lvresize", oldname, disk.guest_device_name, str(disk.size))
+        if oldname != name:
+            remctl("web", "lvrename", oldname, disk.guest_device_name, name)
+    d = dict(user=user,
+             command="modify",
+             machine=machine)
+    return Template(file="command.tmpl", searchList=[d, global_dict])    
 
-    
 
 def help(user, fields):
     """Handler for help messages."""