bitkeeper revision 1.1108.12.1 (4100e788EN1VntqfvMe4jTLeq56uIQ)
Merge
No files matched your search
@@ -42,7 +42,7 @@ setup(name = 'xen',
|
||||
'xen.util',
|
||||
'xen.xend',
|
||||
'xen.xend.server',
|
||||
'xen.xend.sv',
|
||||
'xen.sv',
|
||||
'xen.xm',
|
||||
],
|
||||
ext_package = "xen.lowlevel",
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
from HTMLBase import HTMLBase
|
||||
from XendClientDeferred import server
|
||||
from xen.xend.XendClient import aserver as server
|
||||
from xen.xend import PrettyPrint
|
||||
|
||||
from xen.xend.sv.util import *
|
||||
from xen.xend.sv.GenTabbed import *
|
||||
from xen.sv.HTMLBase import HTMLBase
|
||||
from xen.sv.util import *
|
||||
from xen.sv.GenTabbed import *
|
||||
|
||||
class DomInfo( GenTabbed ):
|
||||
|
||||
def __init__( self, urlWriter, callback ):
|
||||
def __init__( self, urlWriter ):
|
||||
|
||||
self.dom = 0;
|
||||
|
||||
def tabUrlWriter( tab ):
|
||||
return urlWriter( "mod=info&dom=%s%s" % ( self.dom, tab ) )
|
||||
|
||||
GenTabbed.__init__( self, tabUrlWriter, [ 'General', 'SXP', 'Devices' ], [ DomGenTab, DomSXPTab, NullTab ], callback )
|
||||
GenTabbed.__init__( self, tabUrlWriter, [ 'General', 'SXP', 'Devices' ], [ DomGenTab, DomSXPTab, NullTab ] )
|
||||
|
||||
def write_BODY( self, request ):
|
||||
dom = request.args.get('dom')
|
||||
@@ -43,7 +43,8 @@ class DomGenTab( GeneralTab ):
|
||||
|
||||
GeneralTab.__init__( self, "General Domain Info", {}, titles )
|
||||
|
||||
def write_BODY( self, request, callback ):
|
||||
def write_BODY( self, request ):
|
||||
|
||||
dom = request.args.get('dom')
|
||||
|
||||
if dom is None or len(dom) != 1:
|
||||
@@ -52,14 +53,9 @@ class DomGenTab( GeneralTab ):
|
||||
else:
|
||||
self.dom = dom[0]
|
||||
|
||||
deferred = getDomInfoHash( self.dom )
|
||||
deferred.addCallback( self.continue_BODY, request, callback )
|
||||
|
||||
def continue_BODY( self, dict, request, callback ):
|
||||
|
||||
self.dict = dict
|
||||
self.dict = getDomInfoHash( self.dom )
|
||||
|
||||
GeneralTab.write_BODY( self, request, callback )
|
||||
GeneralTab.write_BODY( self, request )
|
||||
|
||||
class DomSXPTab( PreTab ):
|
||||
|
||||
@@ -67,21 +63,8 @@ class DomSXPTab( PreTab ):
|
||||
self.dom = 0
|
||||
PreTab.__init__( self, "" )
|
||||
|
||||
def fn( self, x, request ):
|
||||
class tmp:
|
||||
def __init__( self ):
|
||||
self.str = ""
|
||||
def write( self, str ):
|
||||
self.str = self.str + str
|
||||
temp = tmp()
|
||||
PrettyPrint.prettyprint( x, out=temp )
|
||||
self.source = temp.str
|
||||
return request
|
||||
|
||||
def fn2( self, request, callback ):
|
||||
PreTab.write_BODY( self, request, callback )
|
||||
|
||||
def write_BODY( self, request, callback ):
|
||||
|
||||
def write_BODY( self, request ):
|
||||
dom = request.args.get('dom')
|
||||
|
||||
if dom is None or len(dom) != 1:
|
||||
@@ -90,10 +73,10 @@ class DomSXPTab( PreTab ):
|
||||
else:
|
||||
self.dom = dom[0]
|
||||
|
||||
deferred = server.xend_domain( self.dom )
|
||||
domInfo = server.xend_domain( self.dom )
|
||||
|
||||
deferred.addCallback( self.fn, request )
|
||||
deferred.addCallback( self.fn2, callback )
|
||||
def errback( x ):
|
||||
print ">err ", x
|
||||
deferred.addErrback( errback )
|
||||
self.source = sxp2string( domInfo )
|
||||
|
||||
PreTab.write_BODY( self, request )
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
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_BODY( self, request, head=True, long=True ):
|
||||
|
||||
domains = server.xend_domains()
|
||||
|
||||
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
|
||||
|
||||
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" )
|
||||
|
||||
request.write( "</table>\n" )
|
||||
|
||||
def write_DOMAIN( self, request, domInfoHash, long=True ):
|
||||
request.write( "<td class='domainInfo' align='center'>%(dom)-4d</td>\n" % domInfoHash )
|
||||
|
||||
url = self.urlWriter( "mod=info&dom=%(dom)-4d" % 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'>%(mem)7d</td>\n" % domInfoHash )
|
||||
request.write( "<td class='domainInfo' align='center'>%(cpu)3d</td>\n" % domInfoHash )
|
||||
request.write( "<td class='domainInfo' align='center'>%(state)5s</td>\n" % domInfoHash )
|
||||
if long:
|
||||
request.write( "<td class='domainInfo' align='center'>%(cpu_time)7.1f</td>\n" % domInfoHash )
|
||||
|
||||
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" )
|
||||
if long:
|
||||
request.write( "<td class='domainInfoHead' align='center'>CPU time / s</td>\n" )
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
import types
|
||||
|
||||
from HTMLBase import HTMLBase
|
||||
from TabView import TabView
|
||||
from xen.sv.HTMLBase import HTMLBase
|
||||
from xen.sv.TabView import TabView
|
||||
|
||||
class GenTabbed( HTMLBase ):
|
||||
|
||||
def __init__( self, urlWriter, tabStrings, tabObjects, callback ):
|
||||
def __init__( self, urlWriter, tabStrings, tabObjects ):
|
||||
HTMLBase.__init__(self)
|
||||
self.tab = 0;
|
||||
self.tabStrings = tabStrings
|
||||
self.tabObjects = tabObjects
|
||||
self.urlWriter = urlWriter
|
||||
self.callback = callback
|
||||
|
||||
def write_BODY( self, request, urlWriter = None ):
|
||||
tab = request.args.get('tab')
|
||||
@@ -34,29 +33,23 @@ class GenTabbed( HTMLBase ):
|
||||
request.write( "<p>Bad Tab</p>" )
|
||||
self.finish_BODY( request )
|
||||
else:
|
||||
render_tab.write_BODY( request, self.finish_BODY )
|
||||
render_tab.write_BODY( request )
|
||||
|
||||
def finish_BODY( self, request ):
|
||||
|
||||
request.write( "</td></tr></table>" )
|
||||
|
||||
self.callback( request )
|
||||
|
||||
class PreTab( HTMLBase ):
|
||||
|
||||
def __init__( self, source ):
|
||||
HTMLBase.__init__( self )
|
||||
self.source = source
|
||||
|
||||
def write_BODY( self, request, callback ):
|
||||
def write_BODY( self, request ):
|
||||
|
||||
request.write( "<div style='display: block; overflow: auto; border: 0px solid black; height: 400px; width: 540px; padding: 5px; z-index:0; align: center'><pre>" )
|
||||
|
||||
request.write( self.source )
|
||||
|
||||
request.write( "</pre></div>" )
|
||||
|
||||
callback( request )
|
||||
|
||||
class GeneralTab( HTMLBase ):
|
||||
|
||||
@@ -66,7 +59,7 @@ class GeneralTab( HTMLBase ):
|
||||
self.dict = dict
|
||||
self.titles = titles
|
||||
|
||||
def write_BODY( self, request, callback ):
|
||||
def write_BODY( self, request ):
|
||||
|
||||
request.write( "<p><u>%s</u></p>" % self.title )
|
||||
|
||||
@@ -87,17 +80,14 @@ class GeneralTab( HTMLBase ):
|
||||
writeAttr( niceName, attr )
|
||||
|
||||
request.write( "</table>" )
|
||||
|
||||
callback( request )
|
||||
|
||||
|
||||
class NullTab( HTMLBase ):
|
||||
|
||||
def __init__( self ):
|
||||
HTMLBase.__init__( self )
|
||||
self.title = "Null Tab"
|
||||
|
||||
def write_BODY( self, request, callback ):
|
||||
def write_BODY( self, request ):
|
||||
request.write( "<p>%s</p>" % self.title )
|
||||
callback( request )
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,27 +1,25 @@
|
||||
from twisted.web import server, resource
|
||||
from twisted.internet import reactor
|
||||
from twisted.web.resource import Resource
|
||||
|
||||
class HTMLBase( Resource ):
|
||||
|
||||
class HTMLBase( resource.Resource ):
|
||||
|
||||
isLeaf = True
|
||||
|
||||
|
||||
def __init__( self ):
|
||||
resource.Resource.__init__(self)
|
||||
|
||||
Resource.__init__(self)
|
||||
|
||||
def render_GET( self, request ):
|
||||
self.write_TOP( request )
|
||||
return self.write_BODY( request, self.finish_render_GET )
|
||||
|
||||
def finish_render_GET( self, request ):
|
||||
self.write_BODY( request )
|
||||
self.write_BOTTOM( request )
|
||||
request.finish()
|
||||
return ''
|
||||
|
||||
def write_BODY( self, request ):
|
||||
request.write( "BODY" )
|
||||
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( '</head><body>' )
|
||||
|
||||
def write_BOTTOM( self, request ):
|
||||
request.write( "</body></html>" )
|
||||
request.write( "</body></html>" )
|
||||
@@ -1,12 +1,5 @@
|
||||
from twisted.web import resource
|
||||
from twisted.web.server import NOT_DONE_YET
|
||||
|
||||
from xen.xend.XendClient import server as XendServer
|
||||
from xen.xend import sxp
|
||||
|
||||
from HTMLBase import HTMLBase
|
||||
|
||||
from xen.xend.sv import DomList, NodeInfo, DomInfo
|
||||
from xen.sv.HTMLBase import HTMLBase
|
||||
from xen.sv import DomList, NodeInfo, DomInfo
|
||||
|
||||
class Main( HTMLBase ):
|
||||
|
||||
@@ -21,10 +14,8 @@ class Main( HTMLBase ):
|
||||
def mainUrlWriter( self, s ):
|
||||
return "Main.rpy?%s" % s
|
||||
|
||||
def write_BODY( self, request, callback ):
|
||||
def write_BODY( self, request ):
|
||||
|
||||
self.callback = callback
|
||||
|
||||
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'> </td>" )
|
||||
@@ -37,11 +28,8 @@ class Main( HTMLBase ):
|
||||
request.write( " <p class='small'><a href='Main.rpy?mod=node'>Node details</a></p>" )
|
||||
request.write( " <p class='small'><a href='Main.rpy?mod=list'>Domains summary</a></p>" )
|
||||
|
||||
DomList.DomList( self.mainUrlWriter, self.continue_BODY ).write_BODY( request, True, False )
|
||||
DomList.DomList( self.mainUrlWriter ).write_BODY( request, True, False )
|
||||
|
||||
return NOT_DONE_YET
|
||||
|
||||
def continue_BODY( self, request ):
|
||||
request.write( " </td></tr>" )
|
||||
request.write( " </table>" )
|
||||
request.write( " " )
|
||||
@@ -56,18 +44,14 @@ class Main( HTMLBase ):
|
||||
|
||||
if mod is None or len(mod) != 1:
|
||||
request.write( '<p>Please select a module</p>' )
|
||||
self.finish_BODY( request )
|
||||
elif mod[0] == 'info':
|
||||
DomInfo.DomInfo( self.mainUrlWriter, self.finish_BODY ).write_BODY( request )
|
||||
DomInfo.DomInfo( self.mainUrlWriter ).write_BODY( request )
|
||||
elif mod[0] == 'list':
|
||||
DomList.DomList( self.mainUrlWriter, self.finish_BODY ).write_BODY( request )
|
||||
DomList.DomList( self.mainUrlWriter ).write_BODY( request )
|
||||
elif mod[0] == 'node':
|
||||
NodeInfo.NodeInfo( self.mainUrlWriter, self.finish_BODY ).write_BODY( request )
|
||||
NodeInfo.NodeInfo( self.mainUrlWriter ).write_BODY( request )
|
||||
else:
|
||||
request.write( '<p>Invalid module. Please select another</p>' )
|
||||
self.finish_BODY( request )
|
||||
|
||||
def finish_BODY( self, request ):
|
||||
|
||||
request.write( " </td></tr>" )
|
||||
request.write( " </table>" )
|
||||
@@ -77,5 +61,3 @@ class Main( HTMLBase ):
|
||||
|
||||
request.write( "</table>\n" )
|
||||
|
||||
self.callback( request )
|
||||
|
||||
@@ -1,24 +1,27 @@
|
||||
from xen.xend import XendDmesg
|
||||
from xen.xend import XendNode
|
||||
from xen.xend.XendClient import server
|
||||
|
||||
from xen.xend.sv.util import *
|
||||
from xen.xend.sv.GenTabbed import *
|
||||
from xen.xend.sv.HTMLBase import HTMLBase
|
||||
from xen.sv.util import *
|
||||
from xen.sv.GenTabbed import *
|
||||
|
||||
class NodeInfo( GenTabbed ):
|
||||
|
||||
def __init__( self, urlWriter, callback ):
|
||||
def __init__( self, urlWriter ):
|
||||
|
||||
def newUrlWriter( url ):
|
||||
return urlWriter( "mod=node%s" % url )
|
||||
|
||||
GenTabbed.__init__( self, newUrlWriter, [ 'General', 'Dmesg' ], [ NodeGeneralTab, NodeDmesgTab ], callback )
|
||||
GenTabbed.__init__( self, newUrlWriter, [ 'General', 'Dmesg' ], [ NodeGenTab, NodeDmesgTab ] )
|
||||
|
||||
class NodeGenTab( PreTab ):
|
||||
def __init__( self ):
|
||||
text = sxp2string( server.xend_node() )
|
||||
PreTab.__init__( self, text )
|
||||
|
||||
class NodeGeneralTab( GeneralTab ):
|
||||
|
||||
def __init__( self ):
|
||||
|
||||
nodeInfo = XendNode.instance().info()
|
||||
nodeInfo = server.xend_node()
|
||||
|
||||
dictNodeInfo = {}
|
||||
|
||||
@@ -42,6 +45,6 @@ class NodeGeneralTab( GeneralTab ):
|
||||
class NodeDmesgTab( PreTab ):
|
||||
|
||||
def __init__( self ):
|
||||
self.xd = XendDmesg.instance()
|
||||
PreTab.__init__( self, self.xd.info()[0] )
|
||||
|
||||
dmesg = server.xend_node_dmesg()
|
||||
PreTab.__init__( self, dmesg[ 1 ] )
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from xen.xend.sv.HTMLBase import HTMLBase
|
||||
from xen.sv.HTMLBase import HTMLBase
|
||||
|
||||
class TabView( HTMLBase ):
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
from xen.xend.sv.XendClientDeferred import server
|
||||
from xen.xend.XendClient import server
|
||||
from xen.xend import sxp
|
||||
from xen.xend import PrettyPrint
|
||||
|
||||
def getDomInfoHash( domain ):
|
||||
deferred = server.xend_domain( int( domain ) )
|
||||
deferred.addCallback( procDomInfo, domain )
|
||||
return deferred
|
||||
|
||||
def procDomInfo( domInfo, domain ):
|
||||
domInfo = server.xend_domain( int( domain ) )
|
||||
d = {}
|
||||
d['dom'] = int( domain )
|
||||
d['name'] = sxp.child_value( domInfo, 'name' )
|
||||
@@ -19,7 +16,20 @@ def procDomInfo( domInfo, domain ):
|
||||
if( sxp.child_value( domInfo, 'start_time' ) ):
|
||||
d['start_time'] = float( sxp.child_value( domInfo, 'start_time' ) )
|
||||
return d
|
||||
|
||||
def sxp2hash( sxp ):
|
||||
pass
|
||||
|
||||
def sxp2string( 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 bigTimeFormatter( time ):
|
||||
weeks = time // 604800
|
||||
remainder = time % 604800
|
||||
@@ -61,4 +71,4 @@ def hyperthreadFormatter( threads ):
|
||||
if int( threads ) > 1:
|
||||
return "Yes (%d)" % threads
|
||||
else:
|
||||
return "No"
|
||||
return "No"
|
||||
@@ -121,12 +121,12 @@ class XendRequest:
|
||||
data = None
|
||||
if method == "POST" and url.path.endswith('/'):
|
||||
url.path = url.path[:-1]
|
||||
|
||||
|
||||
self.headers = hdr
|
||||
self.data = data
|
||||
self.url = url
|
||||
self.method = method
|
||||
|
||||
|
||||
class XendClientProtocol:
|
||||
"""Abstract class for xend clients.
|
||||
"""
|
||||
@@ -134,18 +134,18 @@ class XendClientProtocol:
|
||||
def xendRequest(self, url, method, args=None):
|
||||
"""Make a request to xend.
|
||||
Implement in a subclass.
|
||||
|
||||
|
||||
@param url: xend request url
|
||||
@param method: http method: POST or GET
|
||||
@param args: request arguments (dict)
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def xendGet(self, url, args=None):
|
||||
"""Make a xend request using HTTP GET.
|
||||
Requests using GET are usually 'safe' and may be repeated without
|
||||
nasty side-effects.
|
||||
|
||||
|
||||
@param url: xend request url
|
||||
@param data: request arguments (dict)
|
||||
"""
|
||||
@@ -156,7 +156,7 @@ class XendClientProtocol:
|
||||
Requests using POST potentially cause side-effects, and should
|
||||
not be repeated unless you really want to repeat the side
|
||||
effect.
|
||||
|
||||
|
||||
@param url: xend request url
|
||||
@param args: request arguments (dict)
|
||||
"""
|
||||
@@ -198,7 +198,7 @@ class SynchXendClientProtocol(XendClientProtocol):
|
||||
"""A synchronous xend client. This will make a request, wait for
|
||||
the reply and return the result.
|
||||
"""
|
||||
|
||||
|
||||
def xendRequest(self, url, method, args=None):
|
||||
"""Make a request to xend.
|
||||
|
||||
@@ -244,10 +244,10 @@ class AsynchXendClient(http.HTTPClient):
|
||||
|
||||
def handleStatus(self, version, status, message):
|
||||
return self.protocol.handleStatus(version, status, message)
|
||||
|
||||
|
||||
def handleResponse(self, data):
|
||||
return self.protocol.handleResponse(data)
|
||||
|
||||
|
||||
class AsynchXendClientProtocol(XendClientProtocol):
|
||||
"""An asynchronous xend client. Uses twisted to connect to xend
|
||||
and make the request. It does not block waiting for the result,
|
||||
@@ -255,6 +255,46 @@ class AsynchXendClientProtocol(XendClientProtocol):
|
||||
|
||||
Uses AsynchXendClient to manage the connection.
|
||||
"""
|
||||
def __init__(self):
|
||||
self.err = None
|
||||
|
||||
def xendRequest(self, url, method, args=None):
|
||||
"""Make a request to xend. The returned deferred is called when
|
||||
the result is available.
|
||||
|
||||
@param url: xend request url
|
||||
@param method: http method: POST or GET
|
||||
@param args: request arguments (dict)
|
||||
@return: deferred
|
||||
"""
|
||||
request = XendRequest(url, method, args)
|
||||
self.deferred = Deferred()
|
||||
clientCreator = ClientCreator(reactor, AsynchXendClient, self, request)
|
||||
clientCreator.connectTCP(url.host, url.port)
|
||||
return self.deferred
|
||||
|
||||
def callErrback(self, err):
|
||||
if not self.deferred.called:
|
||||
self.err = err
|
||||
self.deferred.errback(err)
|
||||
return err
|
||||
|
||||
def callCallback(self, val):
|
||||
if not self.deferred.called:
|
||||
self.deferred.callback(val)
|
||||
return val
|
||||
|
||||
def handleException(self, err):
|
||||
return self.callErrback(err)
|
||||
|
||||
def handleResponse(self, data):
|
||||
if self.err: return self.err
|
||||
val = XendClientProtocol.handleResponse(self, data)
|
||||
if isinstance(val, Exception):
|
||||
self.callErrback(val)
|
||||
else:
|
||||
self.callCallback(val)
|
||||
return val
|
||||
|
||||
def __init__(self):
|
||||
self.err = None
|
||||
@@ -365,17 +405,20 @@ class Xend:
|
||||
|
||||
def xend_node(self):
|
||||
return self.xendGet(self.nodeurl())
|
||||
|
||||
def xend_node_dmesg(self):
|
||||
return self.xendGet(self.dmesgurl())
|
||||
|
||||
def xend_node_cpu_rrobin_slice_set(self, slice):
|
||||
return self.xendPost(self.nodeurl(),
|
||||
{'op' : 'cpu_rrobin_slice_set',
|
||||
'slice' : slice })
|
||||
|
||||
|
||||
def xend_node_cpu_bvt_slice_set(self, ctx_allow):
|
||||
return self.xendPost(self.nodeurl(),
|
||||
{'op' : 'cpu_bvt_slice_set',
|
||||
'ctx_allow' : ctx_allow })
|
||||
|
||||
|
||||
def xend_node_cpu_fbvt_slice_set(self, ctx_allow):
|
||||
return self.xendPost(self.nodeurl(),
|
||||
{'op' : 'cpu_fbvt_slice_set',
|
||||
@@ -442,7 +485,7 @@ class Xend:
|
||||
'warp' : warp,
|
||||
'warpl' : warpl,
|
||||
'warpu' : warpu })
|
||||
|
||||
|
||||
def xend_domain_cpu_fbvt_set(self, id, mcuadv, warp, warpl, warpu):
|
||||
return self.xendPost(self.domainurl(id),
|
||||
{'op' : 'cpu_fbvt_set',
|
||||
@@ -450,7 +493,6 @@ class Xend:
|
||||
'warp' : warp,
|
||||
'warpl' : warpl,
|
||||
'warpu' : warpu })
|
||||
|
||||
|
||||
def xend_domain_cpu_atropos_set(self, id, period, slice, latency, xtratime):
|
||||
return self.xendPost(self.domainurl(id),
|
||||
@@ -459,20 +501,20 @@ class Xend:
|
||||
'slice' : slice,
|
||||
'latency' : latency,
|
||||
'xtratime': xtratime })
|
||||
|
||||
|
||||
def xend_domain_vifs(self, id):
|
||||
return self.xendGet(self.domainurl(id),
|
||||
{ 'op' : 'vifs' })
|
||||
|
||||
|
||||
def xend_domain_vif(self, id, vif):
|
||||
return self.xendGet(self.domainurl(id),
|
||||
{ 'op' : 'vif',
|
||||
'vif' : vif })
|
||||
|
||||
|
||||
def xend_domain_vbds(self, id):
|
||||
return self.xendGet(self.domainurl(id),
|
||||
{'op' : 'vbds'})
|
||||
|
||||
|
||||
def xend_domain_vbd(self, id, vbd):
|
||||
return self.xendGet(self.domainurl(id),
|
||||
{'op' : 'vbd',
|
||||
@@ -488,7 +530,7 @@ class Xend:
|
||||
{'op' : 'device_destroy',
|
||||
'type' : type,
|
||||
'index' : idx })
|
||||
|
||||
|
||||
def xend_consoles(self):
|
||||
return self.xendGet(self.consoleurl())
|
||||
|
||||
@@ -517,7 +559,6 @@ class Xend:
|
||||
|
||||
def xend_dmesg(self):
|
||||
return self.xendGet(self.dmesgurl())
|
||||
|
||||
|
||||
def xendmain(srv, asynch, fn, args):
|
||||
if asynch:
|
||||
@@ -549,15 +590,15 @@ def xendmain(srv, asynch, fn, args):
|
||||
|
||||
def main(argv):
|
||||
"""Call an API function:
|
||||
|
||||
|
||||
python XendClient.py fn args...
|
||||
|
||||
The leading 'xend_' on the function can be omitted.
|
||||
Example:
|
||||
|
||||
> python XendClient.py domains
|
||||
python XendClient.py domains
|
||||
(0 8)
|
||||
> python XendClient.py domain 0
|
||||
python XendClient.py domain 0
|
||||
(domain (id 0) (name Domain-0) (memory 128))
|
||||
"""
|
||||
global DEBUG
|
||||
@@ -588,3 +629,4 @@ if __name__ == "__main__":
|
||||
main(sys.argv)
|
||||
else:
|
||||
server = Xend()
|
||||
aserver = Xend( AsynchXendClientProtocol() )
|
||||
@@ -44,12 +44,8 @@ def create(port=None, interface=None, bridge=0):
|
||||
if bridge or xroot.rebooted:
|
||||
Vifctl.network('start')
|
||||
root = resource.Resource()
|
||||
sv = static.File( "/usr/lib/python2.2/site-packages/xen/xend/sv/" )
|
||||
sv.indexNames=['Main.rpy']
|
||||
sv.processors={'.rpy':script.ResourceScript}
|
||||
xend = SrvRoot()
|
||||
root.putChild('xend', xend)
|
||||
root.putChild('sv', sv)
|
||||
site = server.Site(root)
|
||||
reactor.listenTCP(port, site, interface=interface)
|
||||
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
from twisted.web import resource
|
||||
from twisted.web.server import NOT_DONE_YET
|
||||
|
||||
from XendClientDeferred import server as XendServer
|
||||
from xen.xend import sxp
|
||||
|
||||
from xen.xend.sv.HTMLBase import HTMLBase
|
||||
from xen.xend.sv.util import *
|
||||
|
||||
from twisted.internet import reactor
|
||||
|
||||
class DomList( HTMLBase ):
|
||||
|
||||
isLeaf = True
|
||||
|
||||
def __init__( self, urlWriter, callback ):
|
||||
HTMLBase.__init__(self)
|
||||
self.urlWriter = urlWriter
|
||||
self.head = None
|
||||
self.long = None
|
||||
self.rendered_domains = {}
|
||||
self.domCount = 0
|
||||
self.callback = callback
|
||||
|
||||
def write_BODY( self, request, head=True, long=True ):
|
||||
deferred = XendServer.xend_domains()
|
||||
deferred.addCallback( self.get_domain_info, request )
|
||||
deferred.addErrback( self.errback )
|
||||
|
||||
self.head = head
|
||||
self.long = long
|
||||
|
||||
def errback( self, err ):
|
||||
print 'errback>', err
|
||||
|
||||
def get_domain_info( self, domains, request ):
|
||||
|
||||
self.domCount = len( domains )
|
||||
|
||||
for domain in domains:
|
||||
deferred = getDomInfoHash( domain )
|
||||
deferred.addCallback( self.render_domain, request )
|
||||
deferred.addErrback( self.errback )
|
||||
|
||||
def render_domain( self, domInfoHash, request ):
|
||||
|
||||
domStr = "<td class='domainInfo' align='center'>%(dom)-4d</td>\n" % domInfoHash
|
||||
|
||||
url = self.urlWriter( "mod=info&dom=%(dom)-4d" % domInfoHash )
|
||||
|
||||
domStr += "<td class='domainInfo' align='center'><a href='%s'>%s</a></td>\n" % ( url, domInfoHash['name'] )
|
||||
|
||||
if self.long:
|
||||
domStr += "<td class='domainInfo' align='center'>%(mem)7d</td>\n" % domInfoHash
|
||||
domStr += "<td class='domainInfo' align='center'>%(cpu)3d</td>\n" % domInfoHash
|
||||
|
||||
domStr += "<td class='domainInfo' align='center'>%(state)5s</td>\n" % domInfoHash
|
||||
|
||||
if self.long:
|
||||
domStr += "<td class='domainInfo' align='center'>%(cpu_time)7.1f</td>\n" % domInfoHash
|
||||
|
||||
self.rendered_domains[ domInfoHash[ 'dom' ] ] = domStr
|
||||
self.domCount -= 1
|
||||
|
||||
if self.domCount == 0:
|
||||
self.finish_write_BODY( request )
|
||||
|
||||
def finish_write_BODY( self, request ):
|
||||
|
||||
request.write( "\n<table style='border:0px solid white' cellspacing='0' cellpadding='0' border='0' width='100%'>\n" )
|
||||
|
||||
if self.head:
|
||||
request.write( "<tr class='domainInfoHead'>" )
|
||||
self.write_DOMAIN_HEAD( request, self.long )
|
||||
request.write( "</tr>" )
|
||||
|
||||
odd = True
|
||||
for domain in self.rendered_domains.values():
|
||||
if odd:
|
||||
request.write( "<tr class='domainInfoOdd'>\n" )
|
||||
odd = False
|
||||
else:
|
||||
request.write( "<tr class='domainInfoEven'>\n" )
|
||||
odd = True
|
||||
request.write( domain )
|
||||
request.write( "</tr>\n" )
|
||||
|
||||
request.write( "</table>\n" )
|
||||
|
||||
self.callback( request )
|
||||
|
||||
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" )
|
||||
if long:
|
||||
request.write( "<td class='domainInfoHead' align='center'>CPU time / s</td>\n" )
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
from xen.xend.sv.Main import *
|
||||
|
||||
resource = Main()
|
||||
@@ -1,363 +0,0 @@
|
||||
# Copyright (C) 2004 Tom Wilkie <tw275@cam.ac.uk>
|
||||
# Copyright (C) 2004 Mike Wray
|
||||
"""Client API for the HTTP interface on xend.
|
||||
Callable as a script - see main().
|
||||
|
||||
This API is the 'control-plane' for xend.
|
||||
The 'data-plane' is done separately. For example, consoles
|
||||
are accessed via sockets on xend, but the list of consoles
|
||||
is accessible via this API.
|
||||
|
||||
This one is similar to mikes, but works in an async fashion
|
||||
"""
|
||||
import sys
|
||||
import httplib
|
||||
import types
|
||||
from StringIO import StringIO
|
||||
import urlparse
|
||||
|
||||
from xen.xend.encode import *
|
||||
from xen.xend.sxp import *
|
||||
from xen.xend.PrettyPrint import prettyprint
|
||||
|
||||
from twisted.protocols.http import HTTPClient
|
||||
from twisted.internet.protocol import ClientCreator
|
||||
from twisted.internet.defer import Deferred
|
||||
from twisted.internet import reactor
|
||||
|
||||
DEBUG = 0
|
||||
|
||||
class XendRequest( HTTPClient ):
|
||||
def __init__(self, deferred, urls):
|
||||
self.urls = urls
|
||||
self.deferred = deferred
|
||||
|
||||
def connectionMade(self):
|
||||
self.sendCommand('GET', self.urls[2])
|
||||
self.sendHeader('Host', '%s:%d' % (self.urls[0], self.urls[1]) )
|
||||
self.endHeaders()
|
||||
|
||||
def handleResponse(self, data):
|
||||
self.deferred.callback( data )
|
||||
|
||||
def process_SXP( sexp ):
|
||||
pin = Parser()
|
||||
pin.input(sexp)
|
||||
pin.input_eof()
|
||||
return pin.get_val()
|
||||
|
||||
def xend_request(url, method, data=None):
|
||||
"""Make a request to xend.
|
||||
|
||||
url xend request url
|
||||
method http method: POST or GET
|
||||
data request argument data (dict)
|
||||
"""
|
||||
urlinfo = urlparse.urlparse(url)
|
||||
(uproto, ulocation, upath, uparam, uquery, ufrag) = urlinfo
|
||||
(hdr, args) = encode_data(data)
|
||||
if data and method == 'GET':
|
||||
upath += '?' + args
|
||||
args = None
|
||||
if method == "POST" and upath.endswith('/'):
|
||||
upath = upath[:-1]
|
||||
|
||||
deferred = Deferred()
|
||||
|
||||
clientCreator = ClientCreator( reactor, XendRequest, deferred, (ulocation, 8000, upath) )
|
||||
clientCreator.connectTCP( ulocation, 8000 )
|
||||
|
||||
deferred.addCallback( process_SXP )
|
||||
|
||||
return deferred
|
||||
|
||||
class XendError(RuntimeError):
|
||||
pass
|
||||
|
||||
class Foo(httplib.HTTPResponse):
|
||||
|
||||
def begin(self):
|
||||
fin = self.fp
|
||||
while(1):
|
||||
buf = fin.readline()
|
||||
print "***", buf
|
||||
if buf == '':
|
||||
print
|
||||
sys.exit()
|
||||
|
||||
|
||||
def sxprio(sxpr):
|
||||
"""Convert an sxpr to a string.
|
||||
"""
|
||||
io = StringIO()
|
||||
sxp.show(sxpr, out=io)
|
||||
print >> io
|
||||
io.seek(0)
|
||||
return io
|
||||
|
||||
def fileof(val):
|
||||
"""Converter for passing configs.
|
||||
Handles lists, files directly.
|
||||
Assumes a string is a file name and passes its contents.
|
||||
"""
|
||||
if isinstance(val, types.ListType):
|
||||
return sxprio(val)
|
||||
if isinstance(val, types.StringType):
|
||||
return file(val)
|
||||
if hasattr(val, 'readlines'):
|
||||
return val
|
||||
|
||||
# todo: need to sort of what urls/paths are using for objects.
|
||||
# e.g. for domains at the moment return '0'.
|
||||
# should probably return abs path w.r.t. server, e.g. /xend/domain/0.
|
||||
# As an arg, assume abs path is obj uri, otherwise just id.
|
||||
|
||||
# Function to convert to full url: Xend.uri(path), e.g.
|
||||
# maps /xend/domain/0 to http://wray-m-3.hpl.hp.com:8000/xend/domain/0
|
||||
# And should accept urls for ids?
|
||||
|
||||
def urljoin(location, root, prefix='', rest=''):
|
||||
prefix = str(prefix)
|
||||
rest = str(rest)
|
||||
base = 'http://' + location + root + prefix
|
||||
url = urlparse.urljoin(base, rest)
|
||||
return url
|
||||
|
||||
def nodeurl(location, root, id=''):
|
||||
return urljoin(location, root, 'node/', id)
|
||||
|
||||
def domainurl(location, root, id=''):
|
||||
return urljoin(location, root, 'domain/', id)
|
||||
|
||||
def consoleurl(location, root, id=''):
|
||||
return urljoin(location, root, 'console/', id)
|
||||
|
||||
def deviceurl(location, root, id=''):
|
||||
return urljoin(location, root, 'device/', id)
|
||||
|
||||
def vneturl(location, root, id=''):
|
||||
return urljoin(location, root, 'vnet/', id)
|
||||
|
||||
def eventurl(location, root, id=''):
|
||||
return urljoin(location, root, 'event/', id)
|
||||
|
||||
def xend_get(url, args=None):
|
||||
"""Make a xend request using GET.
|
||||
Requests using GET are 'safe' and may be repeated without
|
||||
nasty side-effects.
|
||||
"""
|
||||
return xend_request(url, "GET", args)
|
||||
|
||||
def xend_call(url, data):
|
||||
"""Make xend request using POST.
|
||||
Requests using POST potentially cause side-effects and should
|
||||
not be repeated unless it really is wanted to do the side
|
||||
effect again.
|
||||
"""
|
||||
return xend_request(url, "POST", data)
|
||||
|
||||
class Xend:
|
||||
|
||||
"""Default location of the xend server."""
|
||||
SRV_DEFAULT = "localhost"
|
||||
|
||||
"""Default path to the xend root on the server."""
|
||||
ROOT_DEFAULT = "/xend/"
|
||||
|
||||
def __init__(self, srv=None, root=None):
|
||||
self.bind(srv, root)
|
||||
|
||||
def bind(self, srv=None, root=None):
|
||||
"""Bind to a given server.
|
||||
|
||||
srv server location (host:port)
|
||||
root server xend root path
|
||||
"""
|
||||
if srv is None: srv = self.SRV_DEFAULT
|
||||
if root is None: root = self.ROOT_DEFAULT
|
||||
if not root.endswith('/'): root += '/'
|
||||
self.location = srv
|
||||
self.root = root
|
||||
|
||||
def nodeurl(self, id=''):
|
||||
return nodeurl(self.location, self.root, id)
|
||||
|
||||
def domainurl(self, id=''):
|
||||
return domainurl(self.location, self.root, id)
|
||||
|
||||
def consoleurl(self, id=''):
|
||||
return consoleurl(self.location, self.root, id)
|
||||
|
||||
def deviceurl(self, id=''):
|
||||
return deviceurl(self.location, self.root, id)
|
||||
|
||||
def vneturl(self, id=''):
|
||||
return vneturl(self.location, self.root, id)
|
||||
|
||||
def eventurl(self, id=''):
|
||||
return eventurl(self.location, self.root, id)
|
||||
|
||||
def xend(self):
|
||||
return xend_get(urljoin(self.location, self.root))
|
||||
|
||||
def xend_node(self):
|
||||
return xend_get(self.nodeurl())
|
||||
|
||||
def xend_node_cpu_rrobin_slice_set(self, slice):
|
||||
return xend_call(self.nodeurl(),
|
||||
{'op' : 'cpu_rrobin_slice_set',
|
||||
'slice' : slice })
|
||||
|
||||
def xend_node_cpu_bvt_slice_set(self, ctx_allow):
|
||||
return xend_call(self.nodeurl(),
|
||||
{'op' : 'cpu_bvt_slice_set',
|
||||
'ctx_allow' : ctx_allow })
|
||||
|
||||
def xend_node_cpu_fbvt_slice_set(self, ctx_allow):
|
||||
return xend_call(self.nodeurl(),
|
||||
{'op' : 'cpu_fbvt_slice_set',
|
||||
'ctx_allow' : ctx_allow })
|
||||
|
||||
def xend_domains(self):
|
||||
return xend_get(self.domainurl())
|
||||
|
||||
def xend_domain_create(self, conf):
|
||||
return xend_call(self.domainurl(),
|
||||
{'op' : 'create',
|
||||
'config' : fileof(conf) })
|
||||
|
||||
def xend_domain(self, id):
|
||||
return xend_get(self.domainurl(id))
|
||||
|
||||
def xend_domain_unpause(self, id):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'unpause'})
|
||||
|
||||
def xend_domain_pause(self, id):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'pause'})
|
||||
|
||||
def xend_domain_shutdown(self, id, reason):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'shutdown',
|
||||
'reason' : reason })
|
||||
|
||||
def xend_domain_destroy(self, id):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'destroy'})
|
||||
|
||||
def xend_domain_save(self, id, filename):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'save',
|
||||
'file' : filename})
|
||||
|
||||
def xend_domain_restore(self, id, filename):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'restore',
|
||||
'file' : filename })
|
||||
|
||||
def xend_domain_migrate(self, id, dst):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'migrate',
|
||||
'destination': dst})
|
||||
|
||||
def xend_domain_pincpu(self, id, cpu):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'pincpu',
|
||||
'cpu' : cpu})
|
||||
|
||||
def xend_domain_cpu_bvt_set(self, id, mcuadv, warp, warpl, warpu):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'cpu_bvt_set',
|
||||
'mcuadv' : mcuadv,
|
||||
'warp' : warp,
|
||||
'warpl' : warpl,
|
||||
'warpu' : warpu })
|
||||
|
||||
def xend_domain_cpu_fbvt_set(self, id, mcuadv, warp, warpl, warpu):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'cpu_fbvt_set',
|
||||
'mcuadv' : mcuadv,
|
||||
'warp' : warp,
|
||||
'warpl' : warpl,
|
||||
'warpu' : warpu })
|
||||
|
||||
|
||||
def xend_domain_cpu_atropos_set(self, id, period, slice, latency, xtratime):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'cpu_atropos_set',
|
||||
'period' : period,
|
||||
'slice' : slice,
|
||||
'latency' : latency,
|
||||
'xtratime': xtratime })
|
||||
|
||||
def xend_domain_vifs(self, id):
|
||||
return xend_get(self.domainurl(id),
|
||||
{ 'op' : 'vifs' })
|
||||
|
||||
def xend_domain_vif_ip_add(self, id, vif, ipaddr):
|
||||
return xend_call(self.domainurl(id),
|
||||
{'op' : 'vif_ip_add',
|
||||
'vif' : vif,
|
||||
'ip' : ipaddr })
|
||||
|
||||
def xend_domain_vbds(self, id):
|
||||
return xend_get(self.domainurl(id),
|
||||
{'op' : 'vbds'})
|
||||
|
||||
def xend_domain_vbd(self, id, vbd):
|
||||
return xend_get(self.domainurl(id),
|
||||
{'op' : 'vbd',
|
||||
'vbd' : vbd})
|
||||
|
||||
def xend_consoles(self):
|
||||
return xend_get(self.consoleurl())
|
||||
|
||||
def xend_console(self, id):
|
||||
return xend_get(self.consoleurl(id))
|
||||
|
||||
def xend_vnets(self):
|
||||
return xend_get(self.vneturl())
|
||||
|
||||
def xend_vnet_create(self, conf):
|
||||
return xend_call(self.vneturl(),
|
||||
{'op': 'create', 'config': fileof(conf) })
|
||||
|
||||
def xend_vnet(self, id):
|
||||
return xend_get(self.vneturl(id))
|
||||
|
||||
def xend_vnet_delete(self, id):
|
||||
return xend_call(self.vneturl(id),
|
||||
{'op': 'delete'})
|
||||
|
||||
def xend_event_inject(self, sxpr):
|
||||
val = xend_call(self.eventurl(),
|
||||
{'op': 'inject', 'event': fileof(sxpr) })
|
||||
|
||||
def main(argv):
|
||||
"""Call an API function:
|
||||
|
||||
python XendClient.py fn args...
|
||||
|
||||
The leading 'xend_' on the function can be omitted.
|
||||
Example:
|
||||
|
||||
> python XendClient.py domains
|
||||
(domain 0 8)
|
||||
> python XendClient.py domain 0
|
||||
(domain (id 0) (name Domain-0) (memory 128))
|
||||
"""
|
||||
server = Xend()
|
||||
fn = argv[1]
|
||||
if not fn.startswith('xend'):
|
||||
fn = 'xend_' + fn
|
||||
args = argv[2:]
|
||||
deferred = getattr(server, fn)(*args)
|
||||
deferred.addCallback( prettyprint )
|
||||
reactor.run()
|
||||
print
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
||||
else:
|
||||
server = Xend()
|
||||
|
Before Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 535 B |
|
Before Width: | Height: | Size: 440 B |
|
Before Width: | Height: | Size: 376 B |
|
Before Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 507 B |
|
Before Width: | Height: | Size: 535 B |
|
Before Width: | Height: | Size: 447 B |
|
Before Width: | Height: | Size: 552 B |
|
Before Width: | Height: | Size: 560 B |
|
Before Width: | Height: | Size: 443 B |
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,30 +0,0 @@
|
||||
|
||||
P {font-family: verdana, arial; font-size: 12px; color: black}
|
||||
.small {font-size: 10px}
|
||||
|
||||
TD.domainInfo {font-family: verdana, arial; font-size: 10px; color: black}
|
||||
TD.domainInfoHead {font-family: verdana, arial; font-size: 10px; color: white; font-face: bold}
|
||||
|
||||
TD.domainInfoHead {background-color: black}
|
||||
TR.domainInfoOdd {background-color: white}
|
||||
TR.domainInfoEven {background-color: lightgrey}
|
||||
|
||||
body {
|
||||
width: 670px;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
background-color: #fff;
|
||||
background-image: url(../images/orb_02.jpg);
|
||||
background-repeat: repeat-y;
|
||||
background-position: left top;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-weight: bold;
|
||||
color: #333333;
|
||||
letter-spacing: 0px;
|
||||
scrollbar-base-color: #333333;
|
||||
scrollbar-track-color: #666666;
|
||||
scrollbar-face-color: #fff;
|
||||
|
||||
|
||||
}
|
||||
|
||||