1 | from xen.sv.Wizard import * |
---|
2 | from xen.sv.util import * |
---|
3 | from xen.sv.GenTabbed import PreTab |
---|
4 | |
---|
5 | from xen.xm.create import make_config, OptVals |
---|
6 | |
---|
7 | from xen.xend.XendClient import server |
---|
8 | |
---|
9 | class CreateDomain( Wizard ): |
---|
10 | def __init__( self, urlWriter ): |
---|
11 | |
---|
12 | sheets = [ CreatePage0, |
---|
13 | CreatePage1, |
---|
14 | CreatePage2, |
---|
15 | CreatePage3, |
---|
16 | CreatePage4, |
---|
17 | CreateFinish ] |
---|
18 | |
---|
19 | Wizard.__init__( self, urlWriter, "Create Domain", sheets ) |
---|
20 | |
---|
21 | def op_finish( self, request ): |
---|
22 | pass |
---|
23 | |
---|
24 | class CreatePage0( Sheet ): |
---|
25 | |
---|
26 | title = "General" |
---|
27 | |
---|
28 | def __init__( self, urlWriter ): |
---|
29 | Sheet.__init__( self, urlWriter, "General", 0 ) |
---|
30 | self.addControl( InputControl( 'name', 'VM Name', 'VM Name:', "[\\w|\\S]+", "You must enter a name in this field" ) ) |
---|
31 | self.addControl( InputControl( 'memory', '64', 'Memory (Mb):', "[\\d]+", "You must enter a number in this field" ) ) |
---|
32 | self.addControl( InputControl( 'cpu', '0', 'CPU:', "[\\d]+", "You must enter a number in this feild" ) ) |
---|
33 | self.addControl( InputControl( 'cpu_weight', '1', 'CPU Weight:', "[\\d]+", "You must enter a number in this feild" ) ) |
---|
34 | self.addControl( InputControl( 'vcpus', '1', 'Virtual CPUs:', '[\\d]+', "You must enter a number in this feild") ) |
---|
35 | |
---|
36 | class CreatePage1( Sheet ): |
---|
37 | |
---|
38 | title = "Setup Kernel Image" |
---|
39 | |
---|
40 | def __init__( self, urlWriter ): |
---|
41 | Sheet.__init__( self, urlWriter, "Setup Kernel Image", 1 ) |
---|
42 | self.addControl( ListControl( 'builder', [('linux', 'Linux'), ('netbsd', 'NetBSD')], 'Domain Builder:' ) ) |
---|
43 | self.addControl( FileControl( 'kernel', '/boot/vmlinuz-2.6.12-xenU', 'Kernel Image:' ) ) |
---|
44 | self.addControl( InputControl( 'extra', '', 'Kernel Command Line Parameters:' ) ) |
---|
45 | self.addControl( ListControl( 'use-initrd', [('yes', 'Yes'), ('no', 'No')], 'Use an Initial Ram Disk?:' ) ) |
---|
46 | self.addControl( FileControl( 'initrd', '/boot/initrd-2.6.12-xenU.img', 'Initial Ram Disk:' ) ) |
---|
47 | |
---|
48 | def validate( self, request ): |
---|
49 | if not self.passback: self.parseForm( request ) |
---|
50 | check = True |
---|
51 | request.write( previous_values.get( '>>>>>use-initrd' ) ) |
---|
52 | previous_values = ssxp2hash( string2sxp( self.passback ) ) #get the map for quick reference |
---|
53 | if DEBUG: print previous_values |
---|
54 | for (feild, control) in self.feilds: |
---|
55 | if feild == 'initrd' and previous_values.get( 'use-initrd' ) != 'no': |
---|
56 | request.write( previous_values.get( '>>>>>use-initrd' ) ) |
---|
57 | if control.validate( previous_values.get( feild ) ): |
---|
58 | check = False |
---|
59 | elif not control.validate( previous_values.get( feild ) ): |
---|
60 | check = False |
---|
61 | |
---|
62 | if DEBUG: print "> %s = %s" % (feild, previous_values.get( feild )) |
---|
63 | |
---|
64 | return check |
---|
65 | |
---|
66 | |
---|
67 | class CreatePage2( Sheet ): |
---|
68 | |
---|
69 | title = "Choose number of VBDS" |
---|
70 | |
---|
71 | def __init__( self, urlWriter ): |
---|
72 | Sheet.__init__( self, urlWriter, "Setup Virtual Block Device", 2 ) |
---|
73 | self.addControl( InputControl( 'num_vbds', '1', 'Number of VBDs:', '[\\d]+', "You must enter a number in this field" ) ) |
---|
74 | |
---|
75 | class CreatePage3( Sheet ): |
---|
76 | |
---|
77 | title = "Setup VBDS" |
---|
78 | |
---|
79 | def __init__( self, urlWriter ): |
---|
80 | Sheet.__init__( self, urlWriter, "Setup Virtual Block Device", 3 ) |
---|
81 | |
---|
82 | def write_BODY( self, request ): |
---|
83 | if not self.passback: self.parseForm( request ) |
---|
84 | |
---|
85 | previous_values = sxp2hash( string2sxp( self.passback ) ) #get the hash for quick reference |
---|
86 | |
---|
87 | num_vbds = previous_values.get( 'num_vbds' ) |
---|
88 | |
---|
89 | for i in range( int( num_vbds ) ): |
---|
90 | self.addControl( InputControl( 'vbd%s_dom0' % i, 'phy:sda%s' % str(i + 1), 'Device %s name:' % i ) ) |
---|
91 | self.addControl( InputControl( 'vbd%s_domU' % i, 'sda%s' % str(i + 1), 'Virtualized device %s:' % i ) ) |
---|
92 | self.addControl( ListControl( 'vbd%s_mode' % i, [('w', 'Read + Write'), ('r', 'Read Only')], 'Device %s mode:' % i ) ) |
---|
93 | |
---|
94 | self.addControl( InputControl( 'root', '/dev/sda1', 'Root device (in VM):' ) ) |
---|
95 | |
---|
96 | Sheet.write_BODY( self, request ) |
---|
97 | |
---|
98 | class CreatePage4( Sheet ): |
---|
99 | |
---|
100 | title = "Network Setting" |
---|
101 | |
---|
102 | def __init__( self, urlWriter ): |
---|
103 | Sheet.__init__( self, urlWriter, "Network settings", 4 ) |
---|
104 | self.addControl( ListControl( 'dhcp', [('off', 'No'), ('dhcp', 'Yes')], 'Use DHCP:' ) ) |
---|
105 | self.addControl( InputControl( 'hostname', 'hostname', 'VM Hostname:' ) ) |
---|
106 | self.addControl( InputControl( 'ip_addr', '1.2.3.4', 'VM IP Address:' ) ) |
---|
107 | self.addControl( InputControl( 'ip_subnet', '255.255.255.0', 'VM Subnet Mask:' ) ) |
---|
108 | self.addControl( InputControl( 'ip_gateway', '1.2.3.4', 'VM Gateway:' ) ) |
---|
109 | self.addControl( InputControl( 'ip_nfs', '1.2.3.4', 'NFS Server:' ) ) |
---|
110 | |
---|
111 | class CreateFinish( Sheet ): |
---|
112 | |
---|
113 | title = "Finish" |
---|
114 | |
---|
115 | def __init__( self, urlWriter ): |
---|
116 | Sheet.__init__( self, urlWriter, "All Done", 5 ) |
---|
117 | |
---|
118 | def write_BODY( self, request ): |
---|
119 | |
---|
120 | if not self.passback: self.parseForm( request ) |
---|
121 | |
---|
122 | xend_sxp = self.translate_sxp( string2sxp( self.passback ) ) |
---|
123 | |
---|
124 | request.write( "<pre>%s</pre>" % sxp2prettystring( xend_sxp ) ) |
---|
125 | |
---|
126 | try: |
---|
127 | server.xend_domain_create( xend_sxp ) |
---|
128 | request.write( "<p>You domain had been successfully created.</p>" ) |
---|
129 | except Exception, e: |
---|
130 | request.write( "<p>There was an error creating your domain.<br/>The configuration used is as follows:\n</p>" ) |
---|
131 | request.write( "<pre>%s</pre>" % sxp2prettystring( xend_sxp ) ) |
---|
132 | request.write( "<p>The error was:</p>" ) |
---|
133 | request.write( "<pre>%s</pre>" % str( e ) ) |
---|
134 | |
---|
135 | request.write( "<input type='hidden' name='passback' value=\"%s\"></p>" % self.passback ) |
---|
136 | request.write( "<input type='hidden' name='sheet' value='%s'></p>" % self.location ) |
---|
137 | |
---|
138 | def translate_sxp( self, fin_sxp ): |
---|
139 | fin_hash = ssxp2hash( fin_sxp ) |
---|
140 | |
---|
141 | def get( key ): |
---|
142 | ret = fin_hash.get( key ) |
---|
143 | if ret: |
---|
144 | return ret |
---|
145 | else: |
---|
146 | return "" |
---|
147 | |
---|
148 | vals = OptVals() |
---|
149 | |
---|
150 | vals.name = get( 'name' ) |
---|
151 | vals.memory = get( 'memory' ) |
---|
152 | vals.maxmem = get( 'maxmem' ) |
---|
153 | vals.cpu = get( 'cpu' ) |
---|
154 | vals.cpu_weight = get( 'cpu_weight' ) |
---|
155 | vals.vcpus = get( 'vcpus' ) |
---|
156 | |
---|
157 | vals.builder = get( 'builder' ) |
---|
158 | vals.kernel = get( 'kernel' ) |
---|
159 | vals.root = get( 'root' ) |
---|
160 | vals.extra = get( 'extra' ) |
---|
161 | |
---|
162 | #setup vbds |
---|
163 | |
---|
164 | vbds = [] |
---|
165 | |
---|
166 | for i in range( int( get( 'num_vbds' ) ) ): |
---|
167 | vbds.append( ( get( 'vbd%s_dom0' % i ), get('vbd%s_domU' % i ), get( 'vbd%s_mode' % i ), None ) ) |
---|
168 | |
---|
169 | vals.disk = vbds |
---|
170 | |
---|
171 | #misc |
---|
172 | |
---|
173 | vals.pci = [] |
---|
174 | |
---|
175 | vals.blkif = None |
---|
176 | vals.netif = None |
---|
177 | vals.restart = None |
---|
178 | vals.console = None |
---|
179 | vals.ramdisk = None |
---|
180 | vals.ssidref = -1 |
---|
181 | vals.bootloader = None |
---|
182 | vals.usb = [] |
---|
183 | vals.acpi = [] |
---|
184 | |
---|
185 | #setup vifs |
---|
186 | |
---|
187 | vals.vif = [] |
---|
188 | vals.nics = 1 |
---|
189 | |
---|
190 | ip = get( 'ip_addr' ) |
---|
191 | nfs = get( 'ip_nfs' ) |
---|
192 | gate = get( 'ip_gateway' ) |
---|
193 | mask = get( 'ip_subnet' ) |
---|
194 | host = get( 'hostname' ) |
---|
195 | dhcp = get( 'dhcp' ) |
---|
196 | |
---|
197 | vals.cmdline_ip = "%s:%s:%s:%s:%s:eth0:%s" % (ip, nfs, gate, mask, host, dhcp) |
---|
198 | |
---|
199 | opts = None |
---|
200 | |
---|
201 | try: |
---|
202 | return make_config( opts, vals ) |
---|
203 | except Exception, e: |
---|
204 | return [["There was an error creating the domain config SXP. This is typically due to an interface change in xm/create.py:make_config", e]] |
---|
205 | |
---|