aboutsummaryrefslogtreecommitdiffstats
path: root/tools/python/xen/xend/server/SrvDomainDir.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/python/xen/xend/server/SrvDomainDir.py')
-rw-r--r--tools/python/xen/xend/server/SrvDomainDir.py144
1 files changed, 144 insertions, 0 deletions
diff --git a/tools/python/xen/xend/server/SrvDomainDir.py b/tools/python/xen/xend/server/SrvDomainDir.py
new file mode 100644
index 0000000000..af4bc7a15c
--- /dev/null
+++ b/tools/python/xen/xend/server/SrvDomainDir.py
@@ -0,0 +1,144 @@
+# Copyright (C) 2004 Mike Wray <mike.wray@hp.com>
+
+from StringIO import StringIO
+
+from twisted.protocols import http
+from twisted.web import error
+
+from xen.xend import sxp
+from xen.xend import XendDomain
+from xen.xend.Args import FormFn
+
+from SrvDir import SrvDir
+from SrvDomain import SrvDomain
+
+class SrvDomainDir(SrvDir):
+ """Service that manages the domain directory.
+ """
+
+ def __init__(self):
+ SrvDir.__init__(self)
+ self.xd = XendDomain.instance()
+
+ def domain(self, x):
+ val = None
+ try:
+ dom = self.xd.domain_get(x)
+ val = SrvDomain(dom)
+ except KeyError, ex:
+ print 'SrvDomainDir>', ex
+ pass
+ return val
+
+ def get(self, x):
+ v = SrvDir.get(self, x)
+ if v is not None:
+ return v
+ v = self.domain(x)
+ return v
+
+ def op_create(self, op, req):
+ ok = 0
+ try:
+ configstring = req.args.get('config')[0]
+ print 'config:', configstring
+ pin = sxp.Parser()
+ pin.input(configstring)
+ pin.input_eof()
+ config = pin.get_val()
+ ok = 1
+ except Exception, ex:
+ print 'op_create>', ex
+ if not ok:
+ req.setResponseCode(http.BAD_REQUEST, "Invalid configuration")
+ return "Invalid configuration"
+ return error.ErrorPage(http.BAD_REQUEST,
+ "Invalid",
+ "Invalid configuration")
+ try:
+ deferred = self.xd.domain_create(config)
+ deferred.addCallback(self._cb_op_create, configstring, req)
+ return deferred
+ except Exception, ex:
+ raise
+ #return ['err', str(ex) ]
+ #req.setResponseCode(http.BAD_REQUEST, "Error creating domain")
+ #return str(ex)
+ #return error.ErrorPage(http.BAD_REQUEST,
+ # "Error creating domain",
+ # str(ex))
+
+
+ def _cb_op_create(self, dominfo, configstring, req):
+ """Callback to handle deferred domain creation.
+ """
+ dom = dominfo.id
+ domurl = "%s/%s" % (req.prePathURL(), dom)
+ req.setResponseCode(201, "created")
+ req.setHeader("Location", domurl)
+ if self.use_sxp(req):
+ return dominfo.sxpr()
+ else:
+ out = StringIO()
+ print >> out, ('<p> Created <a href="%s">Domain %s</a></p>'
+ % (domurl, dom))
+ print >> out, '<p><pre>'
+ print >> out, configstring
+ print >> out, '</pre></p>'
+ val = out.getvalue()
+ out.close()
+ return val
+
+ def op_restore(self, op, req):
+ fn = FormFn(self.xd.domain_restore,
+ [['file', 'str']])
+ val = fn(req.args)
+ return val
+
+ def render_POST(self, req):
+ return self.perform(req)
+
+ def render_GET(self, req):
+ if self.use_sxp(req):
+ req.setHeader("Content-Type", sxp.mime_type)
+ self.ls_domain(req, 1)
+ else:
+ req.write("<html><head></head><body>")
+ self.print_path(req)
+ self.ls(req)
+ self.ls_domain(req)
+ self.form(req)
+ req.write("</body></html>")
+ return ''
+
+ def ls_domain(self, req, use_sxp=0):
+ url = req.prePathURL()
+ if not url.endswith('/'):
+ url += '/'
+ if use_sxp:
+ domains = self.xd.domain_ls()
+ sxp.show(domains, out=req)
+ else:
+ domains = self.xd.domains()
+ domains.sort(lambda x, y: cmp(x.id, y.id))
+ req.write('<ul>')
+ for d in domains:
+ req.write('<li><a href="%s%s"> Domain %s</a>'
+ % (url, d.id, d.id))
+ req.write('name=%s' % d.name)
+ req.write('memory=%d'% d.memory)
+ req.write('</li>')
+ req.write('</ul>')
+
+ def form(self, req):
+ req.write('<form method="post" action="%s" enctype="multipart/form-data">'
+ % req.prePathURL())
+ req.write('<button type="submit" name="op" value="create">Create Domain</button>')
+ req.write('Config <input type="file" name="config"><br>')
+ req.write('</form>')
+ req.write('<form method="post" action="%s" enctype="multipart/form-data">'
+ % req.prePathURL())
+ req.write('<button type="submit" name="op" value="create">Restore Domain</button>')
+ req.write('State <input type="string" name="state"><br>')
+ req.write('</form>')
+