Change VM creation auth failure message
[invirt/packages/invirt-web.git] / code / main.py
index 797f33b..b4e659e 100755 (executable)
@@ -156,11 +156,6 @@ ParaVM machines do not support local console access over VNC.  To
 access the serial console of these machines, you can SSH with Kerberos
 to %s, using the name of the machine as your
 username.""" % config.console.hostname,
-            'Network Device': """
-While we recommend you use the Intel e1000 NIC, we've provided you the
-option of using the AMD PCnet NIC if you are using an old enough OS
-that doesn't have support for the e1000 NIC.
-""",
             'HVM/ParaVM': """
 HVM machines use the virtualization features of the processor, while
 ParaVM machines rely on a modified kernel to communicate directly with
@@ -217,7 +212,7 @@ console will suffer artifacts.
 
     def parseCreate(self, fields):
         kws = dict([(kw, fields[kw]) for kw in
-         'name description owner memory disksize vmtype cdrom nictype autoinstall'.split()
+         'name description owner memory disksize vmtype cdrom autoinstall'.split()
                     if fields[kw]])
         validate = validation.Validate(cherrypy.request.login,
                                        cherrypy.request.state,
@@ -226,7 +221,6 @@ console will suffer artifacts.
                     description=validate.description, memory=validate.memory,
                     disksize=validate.disksize, owner=validate.owner,
                     machine_type=getattr(validate, 'vmtype', Defaults.type),
-                    nic_type=getattr(validate, 'nictype', Defaults.nic),
                     cdrom=getattr(validate, 'cdrom', None),
                     autoinstall=getattr(validate, 'autoinstall', None))
 
@@ -285,12 +279,14 @@ console will suffer artifacts.
 
         @cherrypy.expose
         @cherrypy.tools.mako(filename="/info.mako")
-        def info(self, machine_id):
+        def info(self, machine_id, result=None):
             """Handler for info on a single VM."""
             machine = validation.Validate(cherrypy.request.login,
                                           cherrypy.request.state,
                                           machine_id=machine_id).machine
             d = infoDict(cherrypy.request.login, cherrypy.request.state, machine)
+            if result:
+                d['result'] = result
             return d
         index = info
 
@@ -324,7 +320,18 @@ console will suffer artifacts.
         @cherrypy.expose
         @cherrypy.tools.mako(filename="/vnc.mako")
         def vnc(self, machine_id):
-            """VNC applet page.
+            """VNC applet page"""
+            return self._vnc(machine_id)
+
+        @cherrypy.expose
+        @cherrypy.tools.response_headers(headers=[('Content-Disposition', 'attachment; filename=vnc.jnlp')])
+        @cherrypy.tools.mako(filename="/vnc_jnlp.mako", content_type="application/x-java-jnlp-file")
+        def vnc_jnlp(self, machine_id):
+            """VNC applet exposed as a Java Web Start app (JNLP file)"""
+            return self._vnc(machine_id)
+
+        def _vnc(self, machine_id):
+            """VNC applet page functionality.
 
             Note that due to same-domain restrictions, the applet connects to
             the webserver, which needs to forward those requests to the xen
@@ -383,6 +390,8 @@ console will suffer artifacts.
                 result = str(err)
             else:
                 result = 'Success!'
+                if 'result' in d:
+                    result = d['result']
                 if not back:
                     return d
             if back == 'list':
@@ -390,8 +399,10 @@ console will suffer artifacts.
                 raise cherrypy.InternalRedirect('/list?result=%s'
                                                 % urllib.quote(result))
             elif back == 'info':
-                raise cherrypy.HTTPRedirect(cherrypy.request.base
-                                            + '/machine/%d/' % machine_id,
+                url = cherrypy.request.base + '/machine/%d/' % machine_id
+                if result:
+                    url += '?result='+urllib.quote(result)
+                raise cherrypy.HTTPRedirect(url,
                                             status=303)
             else:
                 raise InvalidInput('back', back, 'Not a known back page.')
@@ -409,7 +420,6 @@ class Defaults:
     description = ''
     administrator = ''
     type = 'linux-hvm'
-    nic = 'e1000'
 
     def __init__(self, max_memory=None, max_disk=None, **kws):
         if max_memory is not None:
@@ -495,7 +505,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_type', 'NIC %s Type'),
+                           ('nic%s_netmask', 'NIC %s Netmask'),
+                           ('nic%s_gateway', 'NIC %s Gateway'),
                            ]
     nic_fields = []
     for i in range(len(machine.nics)):
@@ -503,7 +514,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_type' % i] = machine.nics[i].nic_type
+        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)"
+            elif other_action == 'remove':
+                other += " (will be removed at next cold boot or DHCP lease renewal)"
+            else:
+                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
@@ -543,10 +570,6 @@ def modifyDict(username, state, machine_id, fields):
         if hasattr(validate, 'memory'):
             machine.memory = validate.memory
 
-        if hasattr(validate, 'nictype'):
-            for i in range(len(machine.nics)):
-                machine.nics[i] = validate.nictype
-
         if hasattr(validate, 'vmtype'):
             machine.type = validate.vmtype
 
@@ -607,7 +630,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,
@@ -658,6 +685,11 @@ def infoDict(username, state, machine):
     display_fields = (display_fields[:disk_point] + disk_fields +
                       display_fields[disk_point+1:])
 
+    renumber = False
+    for n in machine.nics:
+        if n.other_action == 'renumber_dhcp':
+            renumber = True
+
     main_status['memory'] += ' MiB'
     for field, disp in display_fields:
         if field in ('uptime', 'cputime') and locals()[field] is not None:
@@ -676,11 +708,11 @@ def infoDict(username, state, machine):
     for name in 'machine_id name description administrator owner memory contact'.split():
         if getattr(machine, name):
             setattr(defaults, name, getattr(machine, name))
-    defaults.nic = machine.nics[0].nic_type
     defaults.type = machine.type.type_id
     defaults.disk = "%0.2f" % (machine.disks[0].size/1024.)
     d = dict(user=username,
              on=status is not None,
+             renumber=renumber,
              machine=machine,
              defaults=defaults,
              has_vnc=has_vnc,