bitkeeper revision 1.1542.1.1 (42943a71LGhR_dI1LOX6lKtJ08zzTA)

setup.py, Makefile:
  Remove XenSV -- it's been broken since twisted was removed.
Many files:
  Delete: tools/misc/xensv
  Delete: tools/python/xen/sv/params.py
  Delete: tools/python/xen/sv/__init__.py
  Delete: tools/python/xen/sv/MigrateDomain.py
  Delete: tools/python/xen/sv/Daemon.py
  Delete: tools/python/xen/sv/util.py
  Delete: tools/python/xen/sv/Wizard.py
  Delete: tools/python/xen/sv/TabView.py
  Delete: tools/python/xen/sv/SaveDomain.py
  Delete: tools/python/xen/sv/RestoreDomain.py
  Delete: tools/python/xen/sv/NodeInfo.py
  Delete: tools/python/xen/sv/Main.py
  Delete: tools/python/xen/sv/HTMLBase.py
  Delete: tools/python/xen/sv/GenTabbed.py
  Delete: tools/python/xen/sv/DomList.py
  Delete: tools/python/xen/sv/DomInfo.py
  Delete: tools/python/xen/sv/CreateDomain.py
  Delete: tools/sv/images/unpause.png
  Delete: tools/sv/images/small-unpause.png
  Delete: tools/sv/images/small-pause.png
  Delete: tools/sv/images/small-destroy.png
  Delete: tools/sv/images/shutdown.png
  Delete: tools/sv/images/seperator.jpg
  Delete: tools/sv/images/right-end-highlight.jpg
  Delete: tools/sv/images/reboot.png
  Delete: tools/sv/images/previous.png
  Delete: tools/sv/images/pause.png
  Delete: tools/sv/images/orb_02.jpg
  Delete: tools/sv/images/next.png
  Delete: tools/sv/images/middle-no-highlight.jpg
  Delete: tools/sv/images/middle-highlight.jpg
  Delete: tools/sv/images/left-end-no-highlight.jpg
  Delete: tools/sv/images/left-end-highlight.jpg
  Delete: tools/sv/images/finish.png
  Delete: tools/sv/images/destroy.png
  Delete: tools/sv/inc/style.css
  Delete: tools/sv/images/seperator-right-highlight.jpg
  Delete: tools/sv/images/seperator-left-highlight.jpg
  Delete: tools/sv/inc/script.js
  Delete: tools/sv/images/right-end-no-highlight.jpg
  Delete: tools/sv/images/orb_01.jpg
  Delete: tools/sv/Makefile
  Delete: tools/sv/Main.rpy
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
This commit is contained in:
cl349@firebug.cl.cam.ac.uk committed 2005-05-25 08:42:25 +00:00
1 parent cc0943ffa0
commit 76105d8a76
47 files changed
+1 -1768

No files matched your search

-1
View File
@@ -39,7 +39,6 @@ setup(name = 'xen',
'xen.util',
'xen.xend',
'xen.xend.server',
'xen.sv',
'xen.xm',
'xen.web',
],
-163
View File
@@ -1,163 +0,0 @@
from xen.sv.Wizard import *
from xen.sv.util import *
from xen.sv.GenTabbed import PreTab
from xen.xm.create import make_config, OptVals
from xen.xend.XendClient import server
class CreateDomain( Wizard ):
def __init__( self, urlWriter ):
sheets = [ CreatePage0,
CreatePage1,
CreatePage2,
CreatePage3,
CreatePage4,
CreateFinish ]
Wizard.__init__( self, urlWriter, "Create Domain", sheets )
class CreatePage0( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "General", 0 )
self.addControl( InputControl( 'name', 'VM Name', 'VM Name:', "[\\w|\\S]+", "You must enter a name in this field" ) )
self.addControl( InputControl( 'memory', '64', 'Memory (Mb):', "[\\d]+", "You must enter a number in this field" ) )
self.addControl( InputControl( 'cpu', '0', 'CPU:', "[\\d]+", "You must enter a number in this feild" ) )
self.addControl( InputControl( 'cpu_weight', '1', 'CPU Weight:', "[\\d]+", "You must enter a number in this feild" ) )
class CreatePage1( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "Setup Kernel Image", 1 )
# For now we don't need to select a builder...
# self.addControl( ListControl( 'builder', [('linux', 'Linux'), ('netbsd', 'NetBSD')], 'Kernel Type:' ) )
self.addControl( FileControl( 'kernel', '/boot/vmlinuz-2.6.9-xenU', 'Kernel Image:' ) )
self.addControl( InputControl( 'extra', '', 'Kernel Command Line Parameters:' ) )
class CreatePage2( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "Setup Virtual Block Device", 2 )
self.addControl( InputControl( 'num_vbds', '1', 'Number of VBDs:', '[\\d]+', "You must enter a number in this field" ) )
class CreatePage3( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "Setup Virtual Block Device", 3 )
def write_BODY( self, request, err ):
if not self.passback: self.parseForm( request )
previous_values = sxp2hash( string2sxp( self.passback ) ) #get the hash for quick reference
num_vbds = previous_values.get( 'num_vbds' )
for i in range( int( num_vbds ) ):
self.addControl( InputControl( 'vbd%s_dom0' % i, 'phy:sda%s' % str(i + 1), 'Device %s name:' % i ) )
self.addControl( InputControl( 'vbd%s_domU' % i, 'sda%s' % str(i + 1), 'Virtualized device %s:' % i ) )
self.addControl( ListControl( 'vbd%s_mode' % i, [('w', 'Read + Write'), ('r', 'Read Only')], 'Device %s mode:' % i ) )
self.addControl( InputControl( 'root', '/dev/sda1', 'Root device (in VM):' ) )
Sheet.write_BODY( self, request, err )
class CreatePage4( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "Network settings", 4 )
self.addControl( ListControl( 'dhcp', [('off', 'No'), ('dhcp', 'Yes')], 'Use DHCP:' ) )
self.addControl( InputControl( 'hostname', 'hostname', 'VM Hostname:' ) )
self.addControl( InputControl( 'ip_addr', '1.2.3.4', 'VM IP Address:' ) )
self.addControl( InputControl( 'ip_subnet', '255.255.255.0', 'VM Subnet Mask:' ) )
self.addControl( InputControl( 'ip_gateway', '1.2.3.4', 'VM Gateway:' ) )
self.addControl( InputControl( 'ip_nfs', '1.2.3.4', 'NFS Server:' ) )
class CreateFinish( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "All Done", 5 )
def write_BODY( self, request, err ):
if not self.passback: self.parseForm( request )
xend_sxp = self.translate_sxp( string2sxp( self.passback ) )
try:
dom_sxp = server.xend_domain_create( xend_sxp )
success = "Your domain was successfully created.\n"
except:
success = "There was an error creating your domain.\nThe configuration used is as follows:\n"
dom_sxp = xend_sxp
pt = PreTab( success + sxp2prettystring( dom_sxp ) )
pt.write_BODY( request )
request.write( "<input type='hidden' name='passback' value=\"%s\"></p>" % self.passback )
request.write( "<input type='hidden' name='sheet' value='%s'></p>" % self.location )
def translate_sxp( self, fin_sxp ):
fin_hash = ssxp2hash( fin_sxp )
def get( key ):
ret = fin_hash.get( key )
if ret:
return ret
else:
return ""
vals = OptVals()
vals.name = get( 'name' )
vals.memory = get( 'memory' )
vals.maxmem = get( 'maxmem' )
vals.cpu = get( 'cpu' )
vals.cpu_weight = get( 'cpu_weight' )
vals.builder = get( 'builder' )
vals.kernel = get( 'kernel' )
vals.root = get( 'root' )
vals.extra = get( 'extra' )
#setup vbds
vbds = []
for i in range( int( get( 'num_vbds' ) ) ):
vbds.append( ( get( 'vbd%s_dom0' % i ), get('vbd%s_domU' % i ), get( 'vbd%s_mode' % i ) ) )
vals.disk = vbds
#misc
vals.pci = []
vals.blkif = None
vals.netif = None
vals.restart = None
vals.console = None
vals.ramdisk = None
#setup vifs
vals.vif = []
vals.nics = 1
ip = get( 'ip_addr' )
nfs = get( 'ip_nfs' )
gate = get( 'ip_gateway' )
mask = get( 'ip_subnet' )
host = get( 'hostname' )
dhcp = get( 'dhcp' )
vals.cmdline_ip = "%s:%s:%s:%s:%s:eth0:%s" % (ip, nfs, gate, mask, host, dhcp)
try:
return make_config( vals )
except:
return [["Error creating domain config."]]
-108
View File
@@ -1,108 +0,0 @@
###########################################################
## XenSV Web Control Interface Daemon
## Copyright (C) 2004, K A Fraser (University of Cambridge)
## Copyright (C) 2004, Mike Wray <mike.wray@hp.com>
## Copyright (C) 2004, Tom Wilkie <tw275@cam.ac.uk>
###########################################################
import os
import os.path
import sys
import re
from xen.sv.params import *
from twisted.internet import reactor
from twisted.web import static, server, script
class Daemon:
"""The xend daemon.
"""
def __init__(self):
self.shutdown = 0
self.traceon = 0
def daemon_pids(self):
pids = []
pidex = '(?P<pid>\d+)'
pythonex = '(?P<python>\S*python\S*)'
cmdex = '(?P<cmd>.*)'
procre = re.compile('^\s*' + pidex + '\s*' + pythonex + '\s*' + cmdex + '$')
xendre = re.compile('^/usr/sbin/xend\s*(start|restart)\s*.*$')
procs = os.popen('ps -e -o pid,args 2>/dev/null')
for proc in procs:
pm = procre.match(proc)
if not pm: continue
xm = xendre.match(pm.group('cmd'))
if not xm: continue
#print 'pid=', pm.group('pid'), 'cmd=', pm.group('cmd')
pids.append(int(pm.group('pid')))
return pids
def new_cleanup(self, kill=0):
err = 0
pids = self.daemon_pids()
if kill:
for pid in pids:
print "Killing daemon pid=%d" % pid
os.kill(pid, signal.SIGHUP)
elif pids:
err = 1
print "Daemon already running: ", pids
return err
def cleanup(self, kill=False):
# No cleanup to do if PID_FILE is empty.
if not os.path.isfile(PID_FILE) or not os.path.getsize(PID_FILE):
return 0
# Read the pid of the previous invocation and search active process list.
pid = open(PID_FILE, 'r').read()
lines = os.popen('ps ' + pid + ' 2>/dev/null').readlines()
for line in lines:
if re.search('^ *' + pid + '.+xensv', line):
if not kill:
print "Daemon is already running (pid %d)" % int(pid)
return 1
# Old daemon is still active: terminate it.
os.kill(int(pid), 1)
# Delete the stale PID_FILE.
os.remove(PID_FILE)
return 0
def start(self, trace=0):
if self.cleanup(kill=False):
return 1
# Fork -- parent writes PID_FILE and exits.
pid = os.fork()
if pid:
# Parent
pidfile = open(PID_FILE, 'w')
pidfile.write(str(pid))
pidfile.close()
return 0
# Child
self.run()
return 0
def stop(self):
return self.cleanup(kill=True)
def run(self):
root = static.File( SV_ROOT )
root.indexNames = [ 'Main.rpy' ]
root.processors = { '.rpy': script.ResourceScript }
reactor.listenTCP( SV_PORT, server.Site( root ) )
reactor.run()
def exit(self):
reactor.disconnectAll()
sys.exit(0)
def instance():
global inst
try:
inst
except:
inst = Daemon()
return inst
-149
View File
@@ -1,149 +0,0 @@
from xen.xend.XendClient import getAsynchServer
server = getAsynchServer()
from xen.xend import PrettyPrint
from xen.sv.HTMLBase import HTMLBase
from xen.sv.util import *
from xen.sv.GenTabbed import *
DEBUG=1
class DomInfo( GenTabbed ):
def __init__( self, urlWriter ):
self.dom = 0;
def tabUrlWriter( tab ):
return urlWriter( "&dom=%s%s" % ( self.dom, tab ) )
GenTabbed.__init__( self, "Domain Info", tabUrlWriter, [ 'General', 'SXP', 'Devices' ], [ DomGeneralTab, DomSXPTab, NullTab ] )
def write_BODY( self, request ):
dom = request.args.get('dom')
if dom is None or len(dom) != 1:
request.write( "<p>Please Select a Domain</p>" )
return None
else:
self.dom = dom[0]
GenTabbed.write_BODY( self, request )
def write_MENU( self, request ):
pass
class DomGeneralTab( CompositeTab ):
def __init__( self ):
CompositeTab.__init__( self, [ DomGenTab, DomActionTab ] )
class DomGenTab( GeneralTab ):
def __init__( self ):
titles = {}
titles[ 'ID' ] = 'dom'
titles[ 'Name' ] = 'name'
titles[ 'CPU' ] = 'cpu'
titles[ 'Memory' ] = ( 'mem', memoryFormatter )
titles[ 'State' ] = ( 'state', stateFormatter )
titles[ 'Total CPU' ] = ( 'cpu_time', smallTimeFormatter )
titles[ 'Up Time' ] = ( 'up_time', bigTimeFormatter )
GeneralTab.__init__( self, {}, titles )
def write_BODY( self, request ):
self.dom = getVar('dom', request)
if self.dom is None:
request.write( "<p>Please Select a Domain</p>" )
return None
self.dict = getDomInfoHash( self.dom )
GeneralTab.write_BODY( self, request )
class DomSXPTab( PreTab ):
def __init__( self ):
self.dom = 0
PreTab.__init__( self, "" )
def write_BODY( self, request ):
self.dom = getVar('dom', request)
if self.dom is None:
request.write( "<p>Please Select a Domain</p>" )
return None
try:
domInfo = server.xend_domain( self.dom )
except:
domInfo = [["Error getting domain details."]]
self.source = sxp2prettystring( domInfo )
PreTab.write_BODY( self, request )
class DomActionTab( ActionTab ):
def __init__( self ):
actions = { "shutdown" : ( "Shutdown the Domain", "shutdown.png" ),
"reboot" : ( "Reboot the Domain", "reboot.png" ),
"pause" : ( "Pause the Domain", "pause.png" ),
"unpause" : ( "Unpause the Domain", "unpause.png" ),
"destroy" : ( "Destroy the Domain", "destroy.png" ) }
ActionTab.__init__( self, actions )
def op_shutdown( self, request ):
dom = getVar( 'dom', request )
if not dom is None and dom != '0':
if DEBUG: print ">DomShutDown %s" % dom
try:
server.xend_domain_shutdown( int( dom ), "halt" )
except:
pass
def op_reboot( self, request ):
dom = getVar( 'dom', request )
if not dom is None and dom != '0':
if DEBUG: print ">DomReboot %s" % dom
try:
server.xend_domain_shutdown( int( dom ), "reboot" )
except:
pass
def op_pause( self, request ):
dom = getVar( 'dom', request )
if not dom is None and dom != '0':
if DEBUG: print ">DomPause %s" % dom
try:
server.xend_domain_pause( int( dom ) )
except:
pass
def op_unpause( self, request ):
dom = getVar( 'dom', request )
if not dom is None and dom != '0':
if DEBUG: print ">DomUnpause %s" % dom
try:
server.xend_domain_unpause( int( dom ) )
except:
pass
def op_destroy( self, request ):
dom = getVar( 'dom', request )
if not dom is None and dom != '0':
if DEBUG: print ">DomDestroy %s" % dom
try:
server.xend_domain_destroy( int( dom ), "halt" )
except:
pass
-81
View File
@@ -1,81 +0,0 @@
from xen.xend.XendClient import server
from xen.xend import sxp
from xen.sv.HTMLBase import HTMLBase
from xen.sv.util import *
class DomList( HTMLBase ):
isLeaf = True
def __init__( self, urlWriter ):
HTMLBase.__init__(self)
self.urlWriter = urlWriter
def write_MENU( self, request ):
return self.write_BODY( request, head=True, long=False )
def write_BODY( self, request, head=True, long=True ):
domains = None
try:
domains = server.xend_domains()
domains.sort()
except:
pass
request.write( "\n<table style='border:0px solid white' cellspacing='0' cellpadding='0' border='0' width='100%'>\n" )
if head:
request.write( "<tr class='domainInfoHead'>" )
self.write_DOMAIN_HEAD( request, long )
request.write( "</tr>" )
odd = True
if not domains is None:
for domain in domains:
if odd:
request.write( "<tr class='domainInfoOdd'>\n" )
odd = False
else:
request.write( "<tr class='domainInfoEven'>\n" )
odd = True
self.write_DOMAIN( request, getDomInfoHash( domain ), long )
request.write( "</tr>\n" )
else:
request.write( "<tr colspan='10'><p class='small'>Error getting domain list<br/>Perhaps XenD not running?</p></tr>")
request.write( "</table>\n" )
def write_DOMAIN( self, request, domInfoHash, long=True ):
request.write( "<td class='domainInfo' align='center'>%(id)s</td>\n" % domInfoHash )
url = self.urlWriter( "&mod=info&dom=%(id)s" % domInfoHash )
request.write( "<td class='domainInfo' align='center'><a href='%s'>%s</a></td>\n" % ( url, domInfoHash['name'] ) )
if long:
request.write( "<td class='domainInfo' align='center'>%(memory)5s</td>\n" % domInfoHash )
request.write( "<td class='domainInfo' align='center'>%(cpu)2s</td>\n" % domInfoHash )
request.write( "<td class='domainInfo' align='center'>%(state)5s</td>\n" % domInfoHash )
if domInfoHash[ 'id' ] != "0":
request.write( "<td class='domainInfo' align='center'>" )
if domInfoHash[ 'state' ][ 2 ] == "-":
request.write( "<img src='images/small-pause.png' onclick='doOp2( \"pause\", \"%(dom)-4s\" )'>" % domInfoHash )
else:
request.write( "<img src='images/small-unpause.png' onclick='doOp2( \"unpause\", \"%(dom)-4s\" )'>" % domInfoHash )
request.write( "<img src='images/small-destroy.png' onclick='doOp2( \"destroy\", \"%(dom)-4s\" )'></td>" % domInfoHash)
else:
request.write( "<td>&nbsp;</td>" )
def write_DOMAIN_HEAD( self, request, long=True ):
request.write( "<td class='domainInfoHead' align='center'>Domain</td>\n" )
request.write( "<td class='domainInfoHead' align='center'>Name</td>\n" )
if long:
request.write( "<td class='domainInfoHead' align='center'>Memory / Mb</td>\n" )
request.write( "<td class='domainInfoHead' align='center'>CPU</td>\n" )
request.write( "<td class='domainInfoHead' align='center'>State</td>\n" )
request.write( "<td class='domainInfoHead' align='center'></td>\n" )
-131
View File
@@ -1,131 +0,0 @@
import types
from xen.sv.HTMLBase import HTMLBase
from xen.sv.TabView import TabView
from xen.sv.util import getVar
class GenTabbed( HTMLBase ):
def __init__( self, title, urlWriter, tabStrings, tabObjects ):
HTMLBase.__init__(self)
self.tabStrings = tabStrings
self.tabObjects = tabObjects
self.urlWriter = urlWriter
self.title = title
def write_BODY( self, request, urlWriter = None ):
tab = int( getVar( 'tab', request, 0 ) )
request.write( "<table style='' width='100%' border='0' cellspacing='0' cellpadding='0'>" )
request.write( "<tr><td>" )
request.write( "<p align='center'><u>%s</u></p>" % self.title )
TabView( tab, self.tabStrings, self.urlWriter ).write_BODY( request )
request.write( "</td></tr><tr><td>" )
render_tab = self.tabObjects[ tab ]
if render_tab is None:
request.write( "<p>Bad Tab</p>" )
self.finish_BODY( request )
else:
render_tab().write_BODY( request )
request.write( "</td></tr></table>" )
def perform( self, request ):
tab = int( getVar( 'tab', request, 0 ) )
op_tab = self.tabObjects[ tab ]
if op_tab:
op_tab().perform( request )
class PreTab( HTMLBase ):
def __init__( self, source ):
HTMLBase.__init__( self )
self.source = source
def write_BODY( self, request ):
request.write( "<div style='display: block; overflow: auto; border: 0px solid black; width: 540px; padding: 5px; z-index:0; align: center'><pre>" )
request.write( self.source )
request.write( "</pre></div>" )
class GeneralTab( HTMLBase ):
def __init__( self, dict, titles ):
HTMLBase.__init__( self )
self.dict = dict
self.titles = titles
def write_BODY( self, request ):
request.write( "<table width='100%' cellspacing='0' cellpadding='0' border='0'>" )
def writeAttr( niceName, attr, formatter=None ):
if type( attr ) is types.TupleType:
( attr, formatter ) = attr
if attr in self.dict:
if formatter:
temp = formatter( self.dict[ attr ] )
else:
temp = str( self.dict[ attr ] )
request.write( "<tr><td width='50%%'><p>%s:</p></td><td width='50%%'><p>%s</p></td></tr>" % ( niceName, temp ) )
for niceName, attr in self.titles.items():
writeAttr( niceName, attr )
request.write( "</table>" )
class NullTab( HTMLBase ):
def __init__( self ):
HTMLBase.__init__( self )
self.title = "Null Tab"
def write_BODY( self, request ):
request.write( "<p>%s</p>" % self.title )
class ActionTab( HTMLBase ):
def __init__( self, actions ):
self.actions = actions
HTMLBase.__init__( self )
def write_BODY( self, request ):
request.write("<p align='center'>")
for ( command, ( text, image ) ) in self.actions.items():
request.write("<img src='images/%s' width='54' height='54' onclick='doOp( \"%s\" )' onmouseover='update( \"button_desc\", \"%s\" )' " % ( image, command, text ) )
request.write("onmouseout='update( \"button_desc\", \"&nbsp;\" )' style='button'>")
request.write("&nbsp;&nbsp;")
request.write("<p align='center'><span id='button_desc'>&nbsp;</span></p>")
request.write("</p>")
class CompositeTab( HTMLBase ):
def __init__( self, tabs ):
HTMLBase.__init__( self )
self.tabs = tabs
def write_BODY( self, request ):
for tab in self.tabs:
request.write( "<br/>" )
tab().write_BODY( request )
def perform( self, request ):
for tab in self.tabs:
tab().perform( request )
-63
View File
@@ -1,63 +0,0 @@
from twisted.web.resource import Resource
from xen.sv.util import *
class HTMLBase( Resource ):
isLeaf = True
def __init__( self ):
Resource.__init__(self)
def render_POST( self, request ):
self.perform( request )
return self.render_GET( request )
def render_GET( self, request ):
self.write_TOP( request )
self.write_BODY( request )
self.write_BOTTOM( request )
return ''
def write_BODY( self, request ):
request.write( "BODY" )
def write_TOP( self, request ):
request.write( '<html><head><title>Xen</title><link rel="stylesheet" type="text/css" href="inc/style.css" />' )
request.write( '<script src="inc/script.js"></script>' )
request.write( '</head><body>' )
request.write('<form method="post" action="%s">' % request.uri)
def write_BOTTOM( self, request ):
request.write('<input type="hidden" name="op" value="">')
request.write('<input type="hidden" name="args" value="">')
request.write('</form>')
request.write( "</body></html>" )
def get_op_method(self, op):
"""Get the method for an operation.
For operation 'foo' looks for 'op_foo'.
op operation name
returns method or None
"""
op_method_name = 'op_' + op
return getattr(self, op_method_name, None)
def perform(self, req):
"""General operation handler for posted operations.
For operation 'foo' looks for a method op_foo and calls
it with op_foo(req). Replies with code 500 if op_foo
is not found.
The method must return a list when req.use_sxp is true
and an HTML string otherwise (or list).
Methods may also return a Deferred (for incomplete processing).
req request
"""
op = req.args.get('op')
if not op is None and len(op) == 1:
op = op[0]
op_method = self.get_op_method(op)
if op_method:
op_method( req )
-113
View File
@@ -1,113 +0,0 @@
from xen.sv.HTMLBase import HTMLBase
from xen.sv.DomList import DomList
from xen.sv.NodeInfo import NodeInfo
from xen.sv.DomInfo import DomInfo
from xen.sv.CreateDomain import CreateDomain
from xen.sv.MigrateDomain import MigrateDomain
from xen.sv.SaveDomain import SaveDomain
from xen.sv.RestoreDomain import RestoreDomain
from xen.xend.XendClient import server
from xen.sv.util import getVar
class Main( HTMLBase ):
isLeaf = True
def __init__( self, urlWriter = None ):
self.modules = { "node": NodeInfo,
"list": DomList,
"info": DomInfo,
"create": CreateDomain,
"migrate" : MigrateDomain,
"save" : SaveDomain,
"restore" : RestoreDomain }
# ordered list of module menus to display
self.module_menus = [ "node", "create", "migrate", "save",
"restore", "list" ]
HTMLBase.__init__(self)
def render_POST( self, request ):
#decide what module post'd the action
args = getVar( 'args', request )
mod = getVar( 'mod', request )
if not mod is None and args is None:
module = self.modules[ mod ]
#check module exists
if module:
module( self.mainUrlWriter ).perform( request )
else:
self.perform( request )
return self.render_GET( request )
def mainUrlWriter( self, module ):
def fun( f ):
return "Main.rpy?mod=%s%s" % ( module, f )
return fun
def write_BODY( self, request ):
request.write( "\n<table style='border:0px solid black; background: url(images/orb_01.jpg) no-repeat' cellspacing='0' cellpadding='0' border='0' width='780px' height='536px'>\n" )
request.write( "<tr>\n" )
request.write( " <td width='15px'>&nbsp;</td>" )
request.write( " <td width='175px' align='center' valign'center'>" )
request.write( " <table cellspacing='0' cellpadding='0' border='0' width='100%' height='100%'>" )
request.write( " <tr><td height='140px' align='center' valign='bottom'><a href='http://www.cl.cam.ac.uk/Research/SRG/netos/xen/'>" )
request.write( " <img src='images/xen.png' width='150' height='75' border='0'/></a><br/></td></tr>" )
request.write( " <tr><td height='60px' align='center'><p class='small'>SV Web Interface<br/>(C) <a href='mailto:tw275@cam.ac.uk'>Tom Wilkie</a> 2004</p></td></tr>")
request.write( " <tr><td align='center' valign='top'>" )
for modName in self.module_menus:
self.modules[modName]( self.mainUrlWriter( modName ) ).write_MENU( request )
request.write( " </td></tr>" )
request.write( " </table>" )
request.write( " &nbsp;" )
request.write( " </td>\n" )
request.write( " <td width='15px'>&nbsp;</td>" )
request.write( " <td width='558px' align='left' valign='top'>" )
request.write( " <table cellspacing='0' cellpadding='0' border='0' width='100%' height='100%'>" )
request.write( " <tr><td height='20px'></td></tr>" )
request.write( " <tr><td align='center' valign='top'>" )
modName = getVar('mod', request)
if modName is None:
request.write( '<p>Please select a module</p>' )
else:
module = self.modules[ modName ]
if module:
module( self.mainUrlWriter( modName ) ).write_BODY( request )
else:
request.write( '<p>Invalid module. Please select another</p>' )
request.write( " </td></tr>" )
request.write( " </table>" )
request.write( " </td>\n" )
request.write( " <td width='17px'>&nbsp;</td>" )
request.write( "</tr>\n" )
request.write( "</table>\n" )
def op_destroy( self, request ):
dom = getVar( 'dom', request )
if not dom is None and dom != "0":
server.xend_domain_destroy( int( dom ), "halt" )
def op_pause( self, request ):
dom = getVar( 'dom', request )
if not dom is None and dom != "0":
server.xend_domain_pause( int( dom ) )
def op_unpause( self, request ):
dom = getVar( 'dom', request )
if not dom is None and dom != "0":
server.xend_domain_unpause( int( dom ) )
-72
View File
@@ -1,72 +0,0 @@
from xen.sv.Wizard import *
from xen.sv.util import *
from xen.sv.GenTabbed import PreTab
from xen.xm.create import make_config, OptVals
from xen.xend.XendClient import server
class MigrateDomain( Wizard ):
def __init__( self, urlWriter ):
sheets = [ ChooseMigrateDomain,
DoMigrate ]
Wizard.__init__( self, urlWriter, "Migrate Domain", sheets )
class ChooseMigrateDomain( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "Configure Migration", 0)
try:
domains = server.xend_domains()
domains.sort()
except:
pass
domnames = []
for i in domains:
if i != 'Domain-0': domnames.append((i,i))
self.addControl( ListControl('domid',
domnames,
'Domain ID:') )
self.addControl( TickControl('live',
'True',
'Live migrate:') )
self.addControl( InputControl('rate',
'0',
'Rate limit:') )
self.addControl( InputControl( 'dest', 'myhost.mydomain',
'Name or IP address:',
".*") )
class DoMigrate( Sheet ):
def __init__(self, urlWriter ):
Sheet.__init__(self, urlWriter, "Migration Done", 1)
def write_BODY( self, request, err ):
if not self.passback: self.parseForm( request )
# print string2sxp(self.passback)
config = ssxp2hash ( string2sxp( self.passback ) )
try:
print config
print config['domid'], config['dest']
dom_sxp = server.xend_domain_migrate( config['domid'],
config['dest'],
config.get('live') == 'True',
config['rate'] )
success = "Your domain was successfully Migrated.\n"
except Exception, e:
success = "There was an error migrating your domain\n"
dom_sxp = str(e)
pt = PreTab( success + dom_sxp ) # sxp2prettystring( dom_sxp ) )
pt.write_BODY( request )
request.write( "<input type='hidden' name='passback' value=\"%s\"></p>" % self.passback )
request.write( "<input type='hidden' name='sheet' value='%s'></p>" % self.location )
-64
View File
@@ -1,64 +0,0 @@
from xen.xend.XendClient import server
from xen.sv.util import *
from xen.sv.GenTabbed import *
class NodeInfo( GenTabbed ):
def __init__( self, urlWriter ):
GenTabbed.__init__( self, "Node Details", urlWriter, [ 'General', 'Dmesg', ], [ NodeGeneralTab, NodeDmesgTab ] )
def write_MENU( self, request ):
request.write( "<p class='small'><a href='%s'>Node details</a></p>" % self.urlWriter( '' ) )
class NodeGeneralTab( CompositeTab ):
def __init__( self ):
CompositeTab.__init__( self, [ NodeInfoTab, NodeActionTab ] )
class NodeInfoTab( GeneralTab ):
def __init__( self ):
nodeInfo = {}
try:
nodeInfo = sxp2hash( server.xend_node() )
except:
nodeInfo[ 'system' ] = 'Error getting node info'
dictTitles = {}
dictTitles[ 'System' ] = 'system'
dictTitles[ 'Hostname' ] = 'host'
dictTitles[ 'Release' ] = 'release'
dictTitles[ 'Version' ] ='version'
dictTitles[ 'Machine' ] = 'machine'
dictTitles[ 'Cores' ] = 'cores'
dictTitles[ 'Hyperthreading' ] = ( 'hyperthreads_per_core', hyperthreadFormatter )
dictTitles[ 'CPU Speed' ] = ( 'cpu_mhz', cpuFormatter )
dictTitles[ 'Memory' ] = ( 'memory', memoryFormatter )
dictTitles[ 'Free Memory' ] = ( 'free_memory', memoryFormatter )
GeneralTab.__init__( self, dict=nodeInfo, titles=dictTitles )
class NodeDmesgTab( PreTab ):
def __init__( self ):
try:
dmesg = server.xend_node_get_dmesg()
except:
dmesg = "Error getting node information: XenD not running?"
PreTab.__init__( self, dmesg )
class NodeActionTab( ActionTab ):
def __init__( self ):
ActionTab.__init__( self, { "shutdown" : ( "Shutdown the Node", "shutdown.png" ),
"reboot" : ( "Reboot the Node", "reboot.png" ) } )
def op_shutdown( self, request ):
print ">NodeShutDown"
server.xend_node_shutdown()
def op_reboot( self, request ):
print ">NodeReboot"
server.xend_node_reboot()
-46
View File
@@ -1,46 +0,0 @@
from xen.sv.Wizard import *
from xen.sv.util import *
from xen.sv.GenTabbed import PreTab
from xen.xm.create import make_config, OptVals
from xen.xend.XendClient import server
class RestoreDomain( Wizard ):
def __init__( self, urlWriter ):
sheets = [ ChooseRestoreDomain,
DoRestore ]
Wizard.__init__( self, urlWriter, "Restore Domain", sheets )
class ChooseRestoreDomain( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "Configure Restore", 0)
self.addControl( InputControl( 'file', '',
'Suspend file name:',
".*") )
class DoRestore( Sheet ):
def __init__(self, urlWriter ):
Sheet.__init__(self, urlWriter, "Restore Done", 1)
def write_BODY( self, request, err ):
if not self.passback: self.parseForm( request )
config = ssxp2hash ( string2sxp( self.passback ) )
try:
dom_sxp = server.xend_domain_restore( config['file'] )
success = "Your domain was successfully restored.\n"
except Exception, e:
success = "There was an error restoring your domain\n"
dom_sxp = str(e)
pt = PreTab( success + sxp2prettystring( dom_sxp ) )
pt.write_BODY( request )
request.write( "<input type='hidden' name='passback' value=\"%s\"></p>" % self.passback )
request.write( "<input type='hidden' name='sheet' value='%s'></p>" % self.location )
-59
View File
@@ -1,59 +0,0 @@
from xen.sv.Wizard import *
from xen.sv.util import *
from xen.sv.GenTabbed import PreTab
from xen.xm.create import make_config, OptVals
from xen.xend.XendClient import server
class SaveDomain( Wizard ):
def __init__( self, urlWriter ):
sheets = [ ChooseSaveDomain,
DoSave ]
Wizard.__init__( self, urlWriter, "Save Domain", sheets )
class ChooseSaveDomain( Sheet ):
def __init__( self, urlWriter ):
Sheet.__init__( self, urlWriter, "Configure Save", 0)
try:
domains = server.xend_domains()
domains.sort()
except:
pass
domnames = []
for i in domains:
if i != 'Domain-0': domnames.append((i,i))
self.addControl( ListControl('domid',
domnames,
'Domain ID:') )
self.addControl( InputControl( 'file', '',
'Suspend file name:',
".*") )
class DoSave( Sheet ):
def __init__(self, urlWriter ):
Sheet.__init__(self, urlWriter, "Save Done", 1)
def write_BODY( self, request, err ):
if not self.passback: self.parseForm( request )
config = ssxp2hash ( string2sxp( self.passback ) )
try:
dom_sxp = server.xend_domain_save( config['domid'],
config['file'] )
success = "Your domain was successfully saved.\n"
except Exception, e:
success = "There was an error saving your domain\n"
dom_sxp = str(e)
pt = PreTab( success + dom_sxp ) # sxp2prettystring( dom_sxp ) )
pt.write_BODY( request )
request.write( "<input type='hidden' name='passback' value=\"%s\"></p>" % self.passback )
request.write( "<input type='hidden' name='sheet' value='%s'></p>" % self.location )
-49
View File
@@ -1,49 +0,0 @@
from xen.sv.HTMLBase import HTMLBase
class TabView( HTMLBase ):
def __init__( self, tab, tabs, urlWriter ):
HTMLBase.__init__(self)
self.tab = tab # interger - tab id
self.tabs = tabs
self.urlWriter = urlWriter
def write_BODY( self, request ):
request.write( "<table style='' border='0' cellspacing='0' cellpadding='0' align='center'>" )
request.write( "<tr height='22'>" )
if self.tab == 0:
image = "left-end-highlight.jpg"
else:
image = "left-end-no-highlight.jpg"
request.write( "<td height='22' width='14'><image src='images/%s' width='14' height='22'></td>" % image )
count = len( self.tabs )
for i in range( count ):
if i == self.tab:
image = "middle-highlight.jpg"
else:
image = "middle-no-highlight.jpg"
request.write( "<td style='background: url(images/%s)'><p align='center'><a href='%s'>%s</a></p></td>" % ( image, self.urlWriter( "&tab=%s" % i ), self.tabs[ i ] ) )
if i < count-1:
if i == self.tab:
image = "seperator-left-highlight.jpg"
elif self.tab == i+1:
image = "seperator-right-highlight.jpg"
else:
image = "seperator.jpg"
request.write( "<td height='22' width='23'><image src='images/%s' width='23' height='22'></td>" % image )
if self.tab == count - 1:
image = "right-end-highlight.jpg"
else:
image = "right-end-no-highlight.jpg"
request.write( "<td height='22' width='14'><image src='images/%s' width='14' height='22'></td>" % image )
request.write( "</tr></table>" )
-269
View File
@@ -1,269 +0,0 @@
from xen.sv.util import *
from xen.sv.HTMLBase import HTMLBase
from xen.xend import sxp
import re
DEBUG = 0
class Wizard( HTMLBase ):
def __init__( self, urlWriter, title, sheets ):
HTMLBase.__init__( self )
self.title = title
self.sheets = sheets
self.urlWriter = urlWriter
def write_MENU( self, request ):
request.write( "<p class='small'><a href='%s'>%s</a></p>" % (self.urlWriter( '' ), self.title) )
def write_BODY( self, request ):
request.write( "<table width='100%' border='0' cellspacing='0' cellpadding='0'><tr><td>" )
request.write( "<p align='center'><u>%s</u></p></td></tr><tr><td>" % self.title )
currSheet = getVar( 'sheet', request )
if not currSheet is None:
currSheet = int( currSheet )
else:
currSheet = 0
sheet = self.sheets[ currSheet ]( self.urlWriter )
err = not sheet.validate( request )
if not err:
op = getVar( 'op', request )
if op == 'next':
currSheet += 1
elif op == 'prev':
currSheet -= 1
sheet = self.sheets[ currSheet ]( self.urlWriter )
if getVar( 'visited-sheet%s' % currSheet, request ):
sheet.write_BODY( request, err )
else:
sheet.write_BODY( request, False )
request.write( "</td></tr><tr><td><table width='100%' border='0' cellspacing='0' cellpadding='0'><tr>" )
request.write( "<td width='80%'></td><td width='20%' align='center'><p align='center'>" )
if currSheet > 0:
request.write( "<img src='images/previous.png' onclick='doOp( \"prev\" )' onmouseover='update( \"wizText\", \"Previous\" )' onmouseout='update( \"wizText\", \"&nbsp;\" )'>&nbsp;" )
if currSheet < ( len( self.sheets ) - 2 ):
request.write( "<img src='images/next.png' onclick='doOp( \"next\" )' onmouseover='update( \"wizText\", \"Next\" )' onmouseout='update( \"wizText\", \"&nbsp;\" )'>" )
elif currSheet == ( len( self.sheets ) - 2 ):
request.write( "<img src='images/finish.png' onclick='doOp( \"next\" )' onmouseover='update( \"wizText\", \"Finish\" )' onmouseout='update( \"wizText\", \"&nbsp;\" )'>" )
request.write( "</p><p align='center'><span id='wizText'></span></p></td></tr></table>" )
request.write( "</td></tr></table>" )
def op_next( self, request ):
pass
def op_prev( self, request ):
pass
def op_finish( self, request ):
pass
class Sheet( HTMLBase ):
def __init__( self, urlWriter, title, location ):
HTMLBase.__init__( self )
self.urlWriter = urlWriter
self.feilds = []
self.title = title
self.location = location
self.passback = None
def parseForm( self, request ):
do_not_parse = [ 'mod', 'op', 'sheet', 'passback' ]
passed_back = request.args
temp_passback = passed_back.get( "passback" )
if temp_passback is not None and len( temp_passback ) > 0:
temp_passback = temp_passback[ len( temp_passback )-1 ]
else:
temp_passback = "( )"
last_passback = ssxp2hash( string2sxp( temp_passback ) ) #use special function - will work with no head on sxp
if DEBUG: print last_passback
for (key, value) in passed_back.items():
if key not in do_not_parse:
last_passback[ key ] = value[ len( value ) - 1 ]
self.passback = sxp2string( hash2sxp( last_passback ) ) #store the sxp
if DEBUG: print self.passback
def write_BODY( self, request, err ):
if not self.passback: self.parseForm( request )
request.write( "<p>%s</p>" % self.title )
previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the hash for quick reference
request.write( "<table width='100%' cellpadding='0' cellspacing='1' border='0'>" )
for (feild, control) in self.feilds:
control.write_Control( request, previous_values.get( feild ) )
if err and not control.validate( previous_values.get( feild ) ):
control.write_Help( request )
request.write( "</table>" )
request.write( "<input type='hidden' name='passback' value=\"%s\"></p>" % self.passback )
request.write( "<input type='hidden' name='sheet' value='%s'></p>" % self.location )
request.write( "<input type='hidden' name='visited-sheet%s' value='True'></p>" % self.location )
def addControl( self, control ):
self.feilds.append( [ control.getName(), control ] )
def validate( self, request ):
if not self.passback: self.parseForm( request )
check = True
previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the hash for quick reference
if DEBUG: print previous_values
for (feild, control) in self.feilds:
if not control.validate( previous_values.get( feild ) ):
check = False
if DEBUG: print "> %s = %s" % (feild, previous_values.get( feild ))
return check
class SheetControl( HTMLBase ):
def __init__( self, reg_exp = ".*" ):
HTMLBase.__init__( self )
self.name = ""
self.reg_exp = reg_exp
def write_Control( self, request, persistedValue ):
request.write( "<tr colspan='2'><td>%s</td></tr>" % persistedValue )
def write_Help( self, request ):
request.write( "<tr><td align='right' colspan='2'><p class='small'>Text must match pattern:" )
request.write( " %s</p></td></tr>" % self.reg_exp )
def validate( self, persistedValue ):
if persistedValue is None:
persistedValue = ""
return not re.compile( self.reg_exp ).match( persistedValue ) is None
def getName( self ):
return self.name
def setName( self, name ):
self.name = name
class InputControl( SheetControl ):
def __init__( self, name, defaultValue, humanText, reg_exp = ".*", help_text = "You must enter the appropriate details in this feild." ):
SheetControl.__init__( self, reg_exp )
self.setName( name )
self.defaultValue = defaultValue
self.humanText = humanText
self.help_text = help_text
def write_Control( self, request, persistedValue ):
if persistedValue is None:
persistedValue = self.defaultValue
request.write( "<tr><td width='50%%'><p>%s</p></td><td width='50%%'><input size='40'type='text' name='%s' value=\"%s\"></td></tr>" % (self.humanText, self.getName(), persistedValue) )
def write_Help( self, request ):
request.write( "<tr><td align='right' colspan='2'><p class='small'>" )
request.write( " %s</p></td></tr>" % self.help_text )
class TextControl( SheetControl ):
def __init__( self, text ):
SheetControl.__init__( self )
self.text = text
def write_Control( self, request, persistedValue ):
request.write( "<tr><td colspan='2'><p>%s</p></td></tr>" % self.text )
class SmallTextControl( SheetControl ):
def __init__( self, text ):
SheetControl.__init__( self )
self.text = text
def write_Control( self, request, persistedValue ):
request.write( "<tr><td colspan='2'><p class='small'>%s</p></tr></td>" % self.text )
class ListControl( SheetControl ):
def __init__( self, name, options, humanText ):
SheetControl.__init__( self )
self.setName( name )
self.options = options
self.humanText = humanText
def write_Control( self, request, persistedValue ):
request.write( "<tr><td width='50%%'><p>%s</p></td><td width='50%%'>" % self.humanText )
request.write( "<select name='%s'>" % self.getName() )
for (value, text) in self.options:
if value == persistedValue:
request.write( "<option value='%s' selected>%s\n" % (value, text) )
else:
request.write( "<option value='%s'>%s\n" % (value, text) )
request.write( "</select></td></tr>" )
def validate( self, persistedValue ):
for (value, text) in self.options:
if value == persistedValue:
return True
return False
class FileControl( InputControl ):
def __init__( self, name, defaultValue, humanText, reg_exp = ".*", help_text = "You must enter the appropriate details in this feild." ):
InputControl.__init__( self, name, defaultValue, humanText )
def validate( self, persistedValue ):
if persistedValue is None: return False
try:
open( persistedValue )
return True
except IOError, TypeError:
return False
def write_Help( self, request ):
request.write( "<tr><td colspan='2' align='right'><p class='small'>File does not exist: you must enter a valid, absolute file path.</p></td></tr>" )
class TickControl( SheetControl ):
def __init__( self, name, defaultValue, humanText ):
SheetControl.__init__( self )
self.setName( name )
self.defaultValue = defaultValue
self.humanText = humanText
def write_Control( self, request, persistedValue ):
request.write( "<tr><td width='50%%'><p>%s</p></td><td width='50%%'>" % self.humanText )
if persistedValue == 'True':
request.write( "<input type='checkbox' name='%s' value='True' checked>" % self.getName() )
else:
request.write( "<input type='checkbox' name='%s' value='True'>" % self.getName() )
request.write( "</select></td></tr>" )
-1
View File
@@ -1 +0,0 @@
-3
View File
@@ -1,3 +0,0 @@
SV_PORT = 8080
SV_ROOT = "/var/lib/xen/sv/"
PID_FILE = "/var/run/xen-sv.pid"
-123
View File
@@ -1,123 +0,0 @@
from xen.xend.XendClient import server
from xen.xend import sxp
from xen.xend import PrettyPrint
import types
def getDomInfoHash( domain ):
domInfoHash = {}
try:
domInfoHash = sxp2hash( server.xend_domain( domain ) )
domInfoHash['dom'] = domain
except:
domInfoHash['name'] = "Error getting domain details"
return domInfoHash
def sxp2hash( s ):
sxphash = {}
for child in sxp.children( s ):
if isinstance( child, types.ListType ) and len( child ) > 1:
if isinstance( child[1], types.ListType ) and len( child ) > 1:
sxphash[ child[0] ] = sxp2hash( child[1] )
else:
sxphash[ child[0] ] = child[1]
return sxphash
def ssxp2hash( s ):
sxphash = {}
for i in s:
if isinstance( i, types.ListType ) and len( i ) > 1:
sxphash[ i[0] ] = i[1]
return sxphash
def hash2sxp( h ):
hashsxp = []
for (key, item) in h.items():
hashsxp.append( [key, item] )
return hashsxp
def string2sxp( string ):
pin = sxp.Parser()
pin.input( string )
return pin.get_val()
def sxp2string( sexp ):
return sxp.to_string( sexp )
def sxp2prettystring( sxp ):
class tmp:
def __init__( self ):
self.str = ""
def write( self, str ):
self.str = self.str + str
temp = tmp()
PrettyPrint.prettyprint( sxp, out=temp )
return temp.str
def getVar( var, request, default=None ):
arg = request.args.get( var )
if arg is None:
return default
else:
return arg[ len( arg )-1 ]
def bigTimeFormatter( time ):
time = float( time )
weeks = time // 604800
remainder = time % 604800
days = remainder // 86400
remainder = remainder % 86400
hms = smallTimeFormatter( remainder )
return "%d weeks, %d days, %s" % ( weeks, days, hms )
def smallTimeFormatter( time ):
time = float( time )
hours = time // 3600
remainder = time % 3600
mins = remainder // 60
secs = time % 60
return "%02d:%02d:%04.1f (hh:mm:ss.s)" % ( hours, mins, secs )
def stateFormatter( state ):
states = [ 'Running', 'Blocked', 'Paused', 'Shutdown', 'Crashed' ]
stateStr = ""
for i in range( len( state ) ):
if state[i] != "-":
stateStr += "%s, " % states[ i ]
return stateStr + " (%s)" % state
def memoryFormatter( mem ):
mem = int( mem )
if mem >= 1024:
mem = float( mem ) / 1024
return "%3.2fGb" % mem
else:
return "%7dMb" % mem
def cpuFormatter( mhz ):
mhz = int( mhz )
if mhz > 1000:
ghz = float( mhz ) / 1000.0
return "%4.2fGHz" % ghz
else:
return "%4dMHz" % mhz
def hyperthreadFormatter( threads ):
if int( threads ) > 1:
return "Yes (%d)" % threads
else:
return "No"
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.