aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xen/lib/xend/server/SrvDomainDir.py
blob: af4bc7a15c298b3dc1e5c2110196b6eccf623550 (plain)
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
131
132
133
134
135
136
137
138
139
140
141
142
143
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>')