Tweak wording
[invirt/packages/invirt-web.git] / code / main.py
index f2ee6d1..5e37889 100755 (executable)
@@ -171,8 +171,6 @@ wiki</a>, including steps to prepare an HVM guest to boot as a ParaVM
 
 <p>We recommend using a ParaVM when possible and an HVM when necessary.
 """,
-            'CPU Weight': """
-Don't ask us!  We're as mystified as you are.""",
             'Owner': """
 The owner field is used to determine <a
 href="help?subject=Quotas">quotas</a>.  It must be the name of a
@@ -196,6 +194,7 @@ your machine will run just fine, but the applet's display of the
 console will suffer artifacts.
 """,
             'Windows': """
+<strong>Windows 7:</strong> The Windows 7 image is licensed for all MIT students and will automatically activate off the network; see <a href="/static/msca-7.txt">the licensing agreement</a> for details. The installer requires 512 MiB RAM and at least 15 GiB disk space (20 GiB or more recommended).<br>
 <strong>Windows Vista:</strong> The Vista image is licensed for all MIT students and will automatically activate off the network; see <a href="/static/msca-email.txt">the licensing confirmation e-mail</a> for details. The installer requires 512 MiB RAM and at least 7.5 GiB disk space (15 GiB or more recommended).<br>
 <strong>Windows XP:</strong> This is the volume license CD image. You will need your own volume license key to complete the install. We do not have these available for the general MIT community; ask your department if they have one, or visit <a href="http://msca.mit.edu/">http://msca.mit.edu/</a> if you are staff/faculty to request one.
 """
@@ -459,7 +458,8 @@ def getListDict(username, state):
              defaults=defaults,
              machines=machines,
              has_vnc=has_vnc,
-             installing=installing)
+             installing=installing,
+             disable_creation=False)
     return d
 
 def getHostname(nic):
@@ -488,6 +488,8 @@ def getNicInfo(data_dict, machine):
     nic_fields_template = [('nic%s_hostname', 'NIC %s Hostname'),
                            ('nic%s_mac', 'NIC %s MAC Addr'),
                            ('nic%s_ip', 'NIC %s IP'),
+                           ('nic%s_netmask', 'NIC %s Netmask'),
+                           ('nic%s_gateway', 'NIC %s Gateway'),
                            ]
     nic_fields = []
     for i in range(len(machine.nics)):
@@ -495,6 +497,23 @@ def getNicInfo(data_dict, machine):
         data_dict['nic%s_hostname' % i] = getHostname(machine.nics[i])
         data_dict['nic%s_mac' % i] = machine.nics[i].mac_addr
         data_dict['nic%s_ip' % i] = machine.nics[i].ip
+        data_dict['nic%s_netmask' % i] = machine.nics[i].netmask
+        data_dict['nic%s_gateway' % i] = machine.nics[i].gateway
+        if machine.nics[i].other_ip:
+            nic_fields.append(('nic%s_other' % i, 'NIC %s Other Address' % i))
+            other = '%s/%s via %s' % (machine.nics[i].other_ip, machine.nics[i].other_netmask, machine.nics[i].other_gateway)
+            other_action = machine.nics[i].other_action
+            if other_action == 'dnat':
+                other += " (NAT to primary IP)"
+            elif other_action == 'renumber':
+                other += " (cold boot or renew DHCP lease to swap)"
+            elif other_action == 'renumber_dhcp':
+                other += " (renew DHCP lease to swap)"
+            else:
+                # No message for renumber_dhcp since we don't know if
+                # they're using DHCP.
+                other += " (pending assignment)"
+            data_dict['nic%s_other' % i] = other
     if len(machine.nics) == 1:
         nic_fields = [(x, y.replace('NIC 0 ', '')) for x, y in nic_fields]
     return nic_fields
@@ -549,7 +568,7 @@ def modifyDict(username, state, machine_id, fields):
         if hasattr(validate, 'contact'):
             machine.contact = validate.contact
 
-        session.save_or_update(machine)
+        session.add(machine)
         session.commit()
     except:
         session.rollback()
@@ -563,10 +582,10 @@ def modifyDict(username, state, machine_id, fields):
             if disk.size != disksize:
                 olddisk[disk.guest_device_name] = disksize
                 disk.size = disksize
-                session.save_or_update(disk)
+                session.add(disk)
         for diskname in olddisk:
             controls.resizeDisk(oldname, diskname, str(olddisk[diskname]))
-        session.save_or_update(machine)
+        session.add(machine)
         session.commit()
     except:
         session.rollback()
@@ -581,7 +600,7 @@ def modifyDict(username, state, machine_id, fields):
                     n.hostname = validate.name
         if hasattr(validate, 'name'):
             controls.renameMachine(machine, oldname, validate.name)
-        session.save_or_update(machine)
+        session.add(machine)
         session.commit()
     except:
         session.rollback()
@@ -594,7 +613,11 @@ def modifyDict(username, state, machine_id, fields):
 
 def infoDict(username, state, machine):
     """Get the variables used by info.tmpl."""
-    status = controls.statusInfo(machine)
+    try:
+        status = controls.statusInfo(machine)
+    except CodeError, e:
+        # machine was shut down in between the call to listInfoDict and this
+        status = None
     has_vnc = hasVnc(status)
     if status is None:
         main_status = dict(name=machine.name,
@@ -604,8 +627,12 @@ def infoDict(username, state, machine):
     else:
         main_status = dict(status[1:])
         main_status['host'] = controls.listHost(machine)
-        start_time = float(main_status.get('start_time', 0))
-        uptime = datetime.timedelta(seconds=int(time.time()-start_time))
+        start_time = main_status.get('start_time')
+        if start_time is None:
+            uptime = "Still booting?"
+        else:
+            start_time = float(start_time)
+            uptime = datetime.timedelta(seconds=int(time.time()-start_time))
         cpu_time_float = float(main_status.get('cpu_time', 0))
         cputime = datetime.timedelta(seconds=int(cpu_time_float))
     display_fields = [('name', 'Name'),