bitkeeper revision 1.1108.12.1 (4100e788EN1VntqfvMe4jTLeq56uIQ)

Merge
This commit is contained in:
xenbk@gandalf.hpl.hp.com committed 2004-07-23 10:25:12 +00:00
commit 6af68fa734
47 files changed
+543 -976

No files matched your search

+1 -1
View File
@@ -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 )
+62
View File
@@ -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'>&nbsp;</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( " &nbsp;" )
@@ -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 ):
File renamed without changes.
@@ -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"
+64 -22
View File
@@ -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)
-101
View File
@@ -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" )
-3
View File
@@ -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()
Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 507 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

-30
View File
@@ -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;
}
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.