1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# Copyright (C) 2004 Mike Wray <mike.wray@hp.com>
from StringIO import StringIO
from twisted.protocols import http
from twisted.web import error
from xenmgr import sxp
from xenmgr import XendDomain
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:
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 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 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>')
|