From 484a3711b42261f3a82e21bf5164a7021d52356f Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Wed, 31 Jul 2013 16:15:57 +0100 Subject: tools: drop 'sv' I'm not even sure what this thing is. Looks like some sort of Twisted Python based frontend to xend. Whatever it is I am perfectly sure no one can be using it. Apart from drive by build fixes caused by updates elsewhere it has seen no real development since 2005. I suspect it was never even finished/usable. Signed-off-by: Ian Campbell Acked-by: Ian Jackson --- tools/python/setup.py | 1 - tools/python/xen/sv/CreateDomain.py | 205 --------------------------- tools/python/xen/sv/DomInfo.py | 268 ----------------------------------- tools/python/xen/sv/GenTabbed.py | 147 ------------------- tools/python/xen/sv/HTMLBase.py | 53 ------- tools/python/xen/sv/Main.py | 82 ----------- tools/python/xen/sv/NodeInfo.py | 73 ---------- tools/python/xen/sv/RestoreDomain.py | 50 ------- tools/python/xen/sv/Wizard.py | 245 -------------------------------- tools/python/xen/sv/__init__.py | 1 - tools/python/xen/sv/util.py | 126 ---------------- 11 files changed, 1251 deletions(-) delete mode 100755 tools/python/xen/sv/CreateDomain.py delete mode 100755 tools/python/xen/sv/DomInfo.py delete mode 100755 tools/python/xen/sv/GenTabbed.py delete mode 100755 tools/python/xen/sv/HTMLBase.py delete mode 100755 tools/python/xen/sv/Main.py delete mode 100755 tools/python/xen/sv/NodeInfo.py delete mode 100755 tools/python/xen/sv/RestoreDomain.py delete mode 100755 tools/python/xen/sv/Wizard.py delete mode 100755 tools/python/xen/sv/__init__.py delete mode 100755 tools/python/xen/sv/util.py (limited to 'tools/python') diff --git a/tools/python/setup.py b/tools/python/setup.py index 8e584e6398..8127b21fdf 100644 --- a/tools/python/setup.py +++ b/tools/python/setup.py @@ -132,7 +132,6 @@ setup(name = 'xen', description = 'Xen', packages = ['xen', 'xen.lowlevel', - 'xen.sv', ] + xend_packages, ext_package = "xen.lowlevel", ext_modules = modules diff --git a/tools/python/xen/sv/CreateDomain.py b/tools/python/xen/sv/CreateDomain.py deleted file mode 100755 index 748d99bca2..0000000000 --- a/tools/python/xen/sv/CreateDomain.py +++ /dev/null @@ -1,205 +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 ) - - def op_finish( self, request ): - pass - -class CreatePage0( Sheet ): - - title = "General" - - 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" ) ) - self.addControl( InputControl( 'vcpus', '1', 'Virtual CPUs:', '[\\d]+', "You must enter a number in this feild") ) - -class CreatePage1( Sheet ): - - title = "Setup Kernel Image" - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Setup Kernel Image", 1 ) - self.addControl( ListControl( 'builder', [('linux', 'Linux'), ('netbsd', 'NetBSD')], 'Domain Builder:' ) ) - self.addControl( FileControl( 'kernel', '/boot/vmlinuz-2.6.12-xenU', 'Kernel Image:' ) ) - self.addControl( InputControl( 'extra', '', 'Kernel Command Line Parameters:' ) ) - self.addControl( ListControl( 'use-initrd', [('yes', 'Yes'), ('no', 'No')], 'Use an Initial Ram Disk?:' ) ) - self.addControl( FileControl( 'initrd', '/boot/initrd-2.6.12-xenU.img', 'Initial Ram Disk:' ) ) - - def validate( self, request ): - if not self.passback: self.parseForm( request ) - check = True - request.write( previous_values.get( '>>>>>use-initrd' ) ) - previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the map for quick reference - if DEBUG: print previous_values - for (feild, control) in self.feilds: - if feild == 'initrd' and previous_values.get( 'use-initrd' ) != 'no': - request.write( previous_values.get( '>>>>>use-initrd' ) ) - if control.validate( previous_values.get( feild ) ): - check = False - elif not control.validate( previous_values.get( feild ) ): - check = False - - if DEBUG: print "> %s = %s" % (feild, previous_values.get( feild )) - - return check - - -class CreatePage2( Sheet ): - - title = "Choose number of VBDS" - - 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 ): - - title = "Setup VBDS" - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Setup Virtual Block Device", 3 ) - - def write_BODY( self, request ): - 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 ) - -class CreatePage4( Sheet ): - - title = "Network Setting" - - 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', '192.168.1.1', 'VM IP Address:' ) ) - self.addControl( InputControl( 'ip_subnet', '255.255.255.0', 'VM Subnet Mask:' ) ) - self.addControl( InputControl( 'ip_gateway', '192.168.1.1', 'VM Gateway:' ) ) - self.addControl( InputControl( 'ip_nfs', '192.168.1.1', 'NFS Server:' ) ) - -class CreateFinish( Sheet ): - - title = "Finish" - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "All Done", 5 ) - - def write_BODY( self, request ): - - if not self.passback: self.parseForm( request ) - - xend_sxp = self.translate_sxp( string2sxp( self.passback ) ) - - request.write( "
%s
" % sxp2prettystring( xend_sxp ) ) - - try: - server.xend_domain_create( xend_sxp ) - request.write( "

You domain had been successfully created.

" ) - except Exception, e: - request.write( "

There was an error creating your domain.
The configuration used is as follows:\n

" ) - request.write( "
%s
" % sxp2prettystring( xend_sxp ) ) - request.write( "

The error was:

" ) - request.write( "
%s
" % str( e ) ) - - request.write( "

" % self.passback ) - request.write( "

" % 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.vcpus = get( 'vcpus' ) - - 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 ), None ) ) - - vals.disk = vbds - - #misc - - vals.pci = [] - - vals.blkif = None - vals.netif = None - vals.restart = None - vals.console = None - vals.ramdisk = None - vals.ssidref = -1 - vals.bootloader = None - vals.usb = [] - vals.acpi = [] - - #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) - - opts = None - - try: - return make_config( opts, vals ) - except Exception, e: - return [["There was an error creating the domain config SXP. This is typically due to an interface change in xm/create.py:make_config", e]] - diff --git a/tools/python/xen/sv/DomInfo.py b/tools/python/xen/sv/DomInfo.py deleted file mode 100755 index 89feca01a5..0000000000 --- a/tools/python/xen/sv/DomInfo.py +++ /dev/null @@ -1,268 +0,0 @@ -from xen.xend.XendClient import server -from xen.xend import PrettyPrint - -from xen.sv.HTMLBase import HTMLBase -from xen.sv.util import * -from xen.sv.GenTabbed import * -from xen.sv.Wizard import * - -DEBUG=1 - -class DomInfo( GenTabbed ): - - def __init__( self, urlWriter ): - - self.dom = 0; - - GenTabbed.__init__( self, "Domain Info", urlWriter, [ 'General', 'SXP', 'Devices', 'Migrate', 'Save' ], [ DomGeneralTab, DomSXPTab, DomDeviceTab, DomMigrateTab, DomSaveTab ] ) - - def write_BODY( self, request ): - try: - dom = int( getVar( 'dom', request ) ) - except: - request.write( "

Please Select a Domain

" ) - return None - - GenTabbed.write_BODY( self, request ) - - def write_MENU( self, request ): - domains = [] - - try: - domains = server.xend_domains() - domains.sort() - except: - pass - - request.write( "\n\n" ) - request.write( "" ) - request.write( "\n" ) - request.write( "\n" ) - request.write( "\n" ) - request.write( "\n" ) - request.write( "" ) - - odd = True - if not domains is None: - for domain in domains: - odd = not odd; - if odd: - request.write( "\n" ) - else: - request.write( "\n" ) - domInfo = getDomInfo( domain ) - request.write( "\n" % domInfo ) - url = self.urlWriter( "&dom=%(id)s" % domInfo ) - request.write( "\n" % ( url, domInfo['name'] ) ) - request.write( "\n" % domInfo ) - if domInfo[ 'id' ] != "0": - request.write( "" % domInfo ) - else: - request.write( "" ) - request.write( "\n" ) - else: - request.write( "

Error getting domain list
Perhaps XenD not running?

") - request.write( "
DomainNameState
%(id)s%s%(state)5s" ) - if domInfo[ 'state' ][ 2 ] == "-": - request.write( "" % domInfo ) - else: - request.write( "" % domInfo ) - request.write( " 
" ) - -class DomGeneralTab( CompositeTab ): - def __init__( self, urlWriter ): - CompositeTab.__init__( self, [ DomGenTab, DomActionTab ], urlWriter ) - -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( "

Please Select a Domain

" ) - return None - - self.dict = getDomInfo( 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( "

Please Select a Domain

" ) - 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", - "reboot" : "Reboot", - "pause" : "Pause", - "unpause" : "Unpause", - "destroy" : "Destroy" } - 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 ), "poweroff" ) - 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 )) - except: - pass - -class DomDeviceTab( CompositeTab ): - - def __init__( self, urlWriter ): - CompositeTab.__init__( self, [ DomDeviceListTab, DomDeviceOptionsTab, DomDeviceActionTab ], urlWriter ) - -class DomDeviceListTab( NullTab ): - - title = "Device List" - - def __init__( self, _ ): - pass - -class DomDeviceOptionsTab( NullTab ): - - title = "Device Options" - - def __init__( self, _ ): - pass - -class DomDeviceActionTab( ActionTab ): - - def __init__( self, _ ): - ActionTab.__init__( self, { "addvcpu" : "Add VCPU", "addvbd" : "Add VBD", "addvif" : "Add VIF" } ) - -class DomMigrateTab( CompositeTab ): - - def __init__( self, urlWriter ): - CompositeTab.__init__( self, [ DomMigrateExtraTab, DomMigrateActionTab ], urlWriter ) - -class DomMigrateExtraTab( Sheet ): - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Configure Migration", 0) - self.addControl( TickControl('live', 'True', 'Live migrate:') ) - self.addControl( InputControl('rate', '0', 'Rate limit:') ) - self.addControl( InputControl( 'dest', 'host.domain', 'Name or IP address:', ".*") ) - -class DomMigrateActionTab( ActionTab ): - - def __init__( self, _ ): - actions = { "migrate" : "Migrate" } - ActionTab.__init__( self, actions ) - - def op_migrate( self, request ): - try: - domid = int( getVar( 'dom', request ) ) - live = getVar( 'live', request ) - rate = getVar( 'rate', request ) - dest = getVar( 'dest', request ) - dom_sxp = server.xend_domain_migrate( domid, dest, live == 'True', rate ) - success = "Your domain was successfully Migrated.\n" - except Exception, e: - success = "There was an error migrating your domain\n" - dom_sxp = str(e) - -class DomSaveTab( CompositeTab ): - - def __init__( self, urlWriter ): - CompositeTab.__init__( self, [ DomSaveExtraTab, DomSaveActionTab ], urlWriter ) - -class DomSaveExtraTab( Sheet ): - - title = "Save location" - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Save Domain to file", 0 ) - self.addControl( InputControl( 'file', '', 'Suspend file name:', ".*") ) - -class DomSaveActionTab( ActionTab ): - - def __init__( self, _ ): - actions = { "save" : "Save" } - ActionTab.__init__( self, actions ) - - def op_save( self, request ): - - 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) - - try: - dom = int( getVar( 'dom', request ) ) - except: - pass diff --git a/tools/python/xen/sv/GenTabbed.py b/tools/python/xen/sv/GenTabbed.py deleted file mode 100755 index 6631663f15..0000000000 --- a/tools/python/xen/sv/GenTabbed.py +++ /dev/null @@ -1,147 +0,0 @@ -import types - -from xen.sv.HTMLBase import HTMLBase -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 ): - if not self.__dict__.has_key( "tab" ): - try: - self.tab = int( getVar( 'tab', request, 0 ) ) - except: - self.tab = 0 - - request.write( "\n
%s
" % self.title ) - - TabView( self.tab, self.tabStrings, self.urlWriter ).write_BODY( request ) - - try: - request.write( "\n
" ) - render_tab = self.tabObjects[ self.tab ] - render_tab( self.urlWriter ).write_BODY( request ) - request.write( "\n
" ) - except Exception, e: - request.write( "\n

Error Rendering Tab

" ) - request.write( "\n

%s

" % str( e ) ) - - request.write( "\n" % self.tab ) - - def perform( self, request ): - request.write( "Tab> perform" ) - request.write( "
op: " + str( getVar( 'op', request ) ) ) - request.write( "
args: " + str( getVar( 'args', request ) ) ) - request.write( "
tab: " + str( getVar( 'tab', request ) ) ) - - try: - action = getVar( 'op', request, 0 ) - if action == "tab": - self.tab = int( getVar( 'args', request ) ) - else: - this.tab = int( getVar( 'tab', request, 0 ) ) - self.tabObjects[ self.tab ]( self.urlWriter ).perform( request ) - except: - pass - -class PreTab( HTMLBase ): - - def __init__( self, source ): - HTMLBase.__init__( self ) - self.source = source - - def write_BODY( self, request ): - request.write( "\n
" )
-        request.write( self.source )
-        request.write( "\n
" ) - -class GeneralTab( HTMLBase ): - - def __init__( self, dict, titles ): - HTMLBase.__init__( self ) - self.dict = dict - self.titles = titles - - def write_BODY( self, request ): - - request.write( "\n" ) - - 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( "\n" % ( niceName, temp ) ) - - for niceName, attr in self.titles.items(): - writeAttr( niceName, attr ) - - request.write( "

%s:

%s

" ) - -class NullTab( HTMLBase ): - - def __init__( self, title="Null Tab" ): - HTMLBase.__init__( self ) - self.title = title - - def write_BODY( self, request ): - request.write( "\n

%s

" % self.title ) - -class ActionTab( HTMLBase ): - - def __init__( self, actions ): - self.actions = actions - HTMLBase.__init__( self ) - - def write_BODY( self, request ): - for item in self.actions.items(): - try: - ((op, attr), title) = item - except: - (op, title) = item - attr = "" - request.write( "\n
%s
" % (op, attr, title) ) - -class CompositeTab( HTMLBase ): - - def __init__( self, tabs, urlWriter ): - HTMLBase.__init__( self ) - self.tabs = tabs - self.urlWriter = urlWriter - - def write_BODY( self, request ): - for tab in self.tabs: - tab( self.urlWriter ).write_BODY( request ) - - def perform( self, request ): - for tab in self.tabs: - tab( self.urlWriter ).perform( request ) - -class TabView( HTMLBase ): - - # tab - int, id into tabs of selected tab - # tabs - list of strings, tab names - # urlWriter - - def __init__( self, tab, tabs, urlWriter ): - HTMLBase.__init__(self) - self.tab = tab - self.tabs = tabs - self.urlWriter = urlWriter - - def write_BODY( self, request ): - for i in range( len( self.tabs ) ): - if self.tab == i: - at = " id='activeTab'" - else: - at = "" - request.write( "\n%s" % ( at, i, self.tabs[ i ] ) ) diff --git a/tools/python/xen/sv/HTMLBase.py b/tools/python/xen/sv/HTMLBase.py deleted file mode 100755 index d0fca13a98..0000000000 --- a/tools/python/xen/sv/HTMLBase.py +++ /dev/null @@ -1,53 +0,0 @@ -from xen.sv.util import * - -class HTMLBase: - - isLeaf = True - - def __init__( self ): - pass - - def render_POST( self, request ): - self.perform( request ) - return self.render_GET( request ) - - def render_GET( self, request ): - pass - - def write_BODY( self, request ): - pass - - def write_TOP( self, request ): - pass - - def write_BOTTOM( self, request ): - pass - - 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 ) diff --git a/tools/python/xen/sv/Main.py b/tools/python/xen/sv/Main.py deleted file mode 100755 index ea62af11ea..0000000000 --- a/tools/python/xen/sv/Main.py +++ /dev/null @@ -1,82 +0,0 @@ - -from xen.sv.NodeInfo import NodeInfo -from xen.sv.DomInfo import DomInfo -from xen.sv.CreateDomain import CreateDomain -from xen.sv.RestoreDomain import RestoreDomain - -from xen.sv.util import getVar - -# adapter to make this all work with mod_python -# as opposed to Twisted -# (c) Tom Wilkie 2005 - -class Args: - def __init__( self, req ): - from mod_python.util import FieldStorage - self.fieldStorage = FieldStorage( req, True ) - - # return a list of values for the given key, - # or None if key not there - def get( self, var ): - retVar = self.fieldStorage.getlist( var ) - if len( retVar ) == 0: - return None - else: - return retVar - - # return a list of tuples, - # (key, value) where value is a list of values - def items( self ): - result = []; - for key in self.fieldStorage.keys(): - result.append( (key, self.fieldStorage.getlist( key ) ) ) - return result - -# This is the Main class -# It pieces together all the modules - -class Main: - def __init__( self ): - self.modules = { "node": NodeInfo, - "create": CreateDomain, - "restore" : RestoreDomain, - "info": DomInfo } - - self.init_done = False - - def init_modules( self, request ): - for moduleName, module in self.modules.iteritems(): - self.modules[ moduleName ] = module( self.urlWriter( moduleName, request.url ) ) - - def render_menu( self, request ): - if not self.init_done: - self.init_modules( request ) - self.init_done = True - - for _, module in self.modules.iteritems(): - module.write_MENU( request ) - request.write( "\n" ) - - def render_main( self, request ): - if not self.init_done: - self.init_modules( request ) - self.init_done = True - - moduleName = getVar('mod', request) - if moduleName not in self.modules: - request.write( '

Please select a module

' ) - else: - module = self.modules[ moduleName ] - module.write_BODY( request ) - - def do_POST( self, request ): - if not self.init_done: - self.init_modules( request ) - self.init_done = True - - moduleName = getVar( 'mod', request ) - if moduleName in self.modules: - self.modules[ moduleName ].perform( request ) - - def urlWriter( self, module, url ): - return lambda x: "%s?mod=%s%s" % ( url, module, x ) diff --git a/tools/python/xen/sv/NodeInfo.py b/tools/python/xen/sv/NodeInfo.py deleted file mode 100755 index f8b47b1d4f..0000000000 --- a/tools/python/xen/sv/NodeInfo.py +++ /dev/null @@ -1,73 +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', 'SXP' ], [ NodeGeneralTab, NodeDmesgTab, NodeSXPTab ] ) - - def write_MENU( self, request ): - request.write( "

Node details

" % self.urlWriter( '' ) ) - -class NodeGeneralTab( CompositeTab ): - def __init__( self, urlWriter ): - CompositeTab.__init__( self, [ NodeInfoTab, NodeActionTab ], urlWriter ) - -class NodeInfoTab( GeneralTab ): - - def __init__( self, urlWriter ): - - 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, urlWriter ): - 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, urlWriter ): - ActionTab.__init__( self, { "shutdown" : "shutdown", - "reboot" : "reboot" } ) - - def op_shutdown( self, request ): - if debug: print ">NodeShutDown" - server.xend_node_shutdown() - - def op_reboot( self, request ): - if debug: print ">NodeReboot" - server.xend_node_reboot() - -class NodeSXPTab( PreTab ): - - def __init__( self, urlWriter ): - try: - nodeSXP = sxp2string( server.xend_node() ) - except: - nodeSXP = 'Error getting node sxp' - - PreTab.__init__( self, nodeSXP ) diff --git a/tools/python/xen/sv/RestoreDomain.py b/tools/python/xen/sv/RestoreDomain.py deleted file mode 100755 index b836a43579..0000000000 --- a/tools/python/xen/sv/RestoreDomain.py +++ /dev/null @@ -1,50 +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 ): - title = "Configure Restore" - - def __init__( self, urlWriter ): - Sheet.__init__( self, urlWriter, "Configure Restore", 0) - - self.addControl( InputControl( 'file', '', - 'Suspend file name:', - ".*") ) - -class DoRestore( Sheet ): - title = "Restore Done" - - 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( "

" % self.passback ) - request.write( "

" % self.location ) diff --git a/tools/python/xen/sv/Wizard.py b/tools/python/xen/sv/Wizard.py deleted file mode 100755 index c4ac53b761..0000000000 --- a/tools/python/xen/sv/Wizard.py +++ /dev/null @@ -1,245 +0,0 @@ -from xen.sv.util import * -from xen.sv.HTMLBase import HTMLBase -from xen.sv.GenTabbed import GenTabbed, ActionTab -from xen.xend import sxp - -import re - -DEBUG = 0 - -class Wizard( GenTabbed ): - - def __init__( self, urlWriter, title, sheets ): - self.title = title - self.sheets = sheets - self.urlWriter = urlWriter - self.offset = 0 - GenTabbed.__init__( self, title, urlWriter, map( lambda x: x.title, sheets ), sheets ) - - def write_MENU( self, request ): - request.write( "

%s

" % (self.urlWriter( '' ), self.title) ) - - def write_BODY( self, request ): - GenTabbed.write_BODY( self, request ) - actionTab = ActionTab( { ("tab", str(self.tab-1)) : "< Prev", ("tab", str(self.tab+1)) : "Next >", "finish" : "Finish" } ) - actionTab.write_BODY( request ) - - def perform( self, request ): - try: - action = getVar( 'op', request, 0 ) - if action == "tab": - self.tab = int( getVar( 'args', request ) ) - oldtab = int( getVar( 'tab', request ) ) - if not self.tabObjects[ oldtab ]( self.urlWriter ).validate( request ): - self.tab = oldtab - else: - self.tab = int( getVar( 'tab', request, 0 ) ) - self.tabObjects[ self.tab ]( self.urlWriter ).perform( request ) - getattr( self, "op_" + getVar( "op", request ), None )( request ) - except: - pass - - def op_finish( self, request ): - pass - -class Sheet( HTMLBase ): - - def __init__( self, urlWriter, title, location ): - HTMLBase.__init__( self ) - self.urlWriter = urlWriter - self.fields = [] - self.title = title - self.location = location - self.passback = None - - def parseForm( self, request ): - do_not_parse = [ 'mod', 'op', '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 ): - - if not self.passback: self.parseForm( request ) - - request.write( "

%s

" % self.title ) - - previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the hash for quick reference - - request.write( "" ) - - for (field, control) in self.fields: - control.write_Control( request, previous_values.get( field ) ) - if previous_values.get( field ) is not None and not control.validate( previous_values.get( field ) ): - control.write_Help( request ) - - request.write( "
" ) - - request.write( "

" % self.passback ) - #request.write( "

" % self.location ) - - def addControl( self, control ): - self.fields.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 map for quick reference - if DEBUG: print previous_values - - for (field, control) in self.fields: - if not control.validate( previous_values.get( field ) ): - check = False - if DEBUG: print "> %s = %s" % (field, previous_values.get( field )) - - 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( "%s" % persistedValue ) - - def write_Help( self, request ): - request.write( "

Text must match pattern:" ) - request.write( " %s

" % 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 field." ): - 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( "

%s

" % (self.humanText, self.getName(), persistedValue) ) - - def write_Help( self, request ): - request.write( "

" ) - request.write( " %s

" % self.help_text ) - -class TextControl( SheetControl ): - - def __init__( self, text ): - SheetControl.__init__( self ) - self.text = text - - def write_Control( self, request, persistedValue ): - request.write( "

%s

" % self.text ) - -class SmallTextControl( SheetControl ): - - def __init__( self, text ): - SheetControl.__init__( self ) - self.text = text - - def write_Control( self, request, persistedValue ): - request.write( "

%s

" % 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( "

%s

" % self.humanText ) - request.write( "" ) - - 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 field." ): - 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( "

File does not exist: you must enter a valid, absolute file path.

" ) - -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( "

%s

" % self.humanText ) - - #request.write( str( persistedValue ) ) - - #TODO: Theres a problem with this: it doesn't persist an untick, because the browsers don't pass it back. Need a fix... - - if persistedValue == 'True': - request.write( "" % self.getName() ) - else: - request.write( "" % self.getName() ) - - request.write( "" ) - - diff --git a/tools/python/xen/sv/__init__.py b/tools/python/xen/sv/__init__.py deleted file mode 100755 index 8d1c8b69c3..0000000000 --- a/tools/python/xen/sv/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/python/xen/sv/util.py b/tools/python/xen/sv/util.py deleted file mode 100755 index cfed3976df..0000000000 --- a/tools/python/xen/sv/util.py +++ /dev/null @@ -1,126 +0,0 @@ -from xen.xend.XendClient import server -from xen.xend import sxp -from xen.xend import PrettyPrint - -import types - -def getDomInfo( 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 ): - try: - if int( threads ) > 1: - return "Yes" - else: - return "No" - except: - return "No" -- cgit v1.2.3