annotate newvm.py @ 6:25c14d1144a8

add xml generation and define
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 13 Nov 2012 10:36:15 +0900
parents 203445eb53a8
children bff4054ed58f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #!/usr/bin/python
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 # Used to create a vm from template
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 # By Curu Wong contact: prinbra(at)gmail(dot)com
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 import sys,os
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 from optparse import OptionParser
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 from virtinst.util import *
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 if sys.version_info < (2,5):
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 import lxml.etree as ET
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 else:
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 import xml.etree.ElementTree as ET
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
6
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
12 # vm_name should be
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
13 # students/e10/e105730/01
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
14 # teachers/kono/01
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
15 #
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
16 def ie_check_name(name):
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
17 m=re.match('^students/e(\d\d)/e(\d\d57)\d\d/0[1-4]$',name)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
18 if m is not None:
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
19 if m.group(1)==m.group(2):
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
20 return 1
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
21 else:
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
22 return 0
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
23 elif re.match('^teachers/[-a-z0-9]+/0[1-4]$',name):
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
24 return 0
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
25 else:
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
26 return 1
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
27
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
28 # make necessary sub directory
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
29 # /etc/libvirt/qemu/teachers
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
30 # /var/log/libvirt/qemu/teachers
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
31 # /var/run/libvirt/qemu/teachers
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
32
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
33 def ie_mkdir1(name):
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
34 if not os.path.exists(name):
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
35 os.makedirs(name);
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
36
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
37 def ie_mkdir(name):
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
38 m=re.match('^(students/e\d\d/e\d\d57\d\d)/0[1-4]$',name)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
39 if m is None:
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
40 m=re.match('^(teachers/[-a-z0-9]+/0[1-4]$',name)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
41 if m is not None:
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
42 dir=m.group(1)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
43 ie_mkdir1('/media/fcs/'+dir)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
44 ie_mkdir1('/etc/libvirt/qemu/'+dir)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
45 ie_mkdir1('/var/log/libvirt/qemu/'+dir)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
46 ie_mkdir1('/var/run/libvirt/qemu/'+dir)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
47 ie_mkdir1('/var/lib/libvirt/qemu/'+dir)
3
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 parser = OptionParser();
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 parser.add_option("-n", "--name", dest="name",
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 help="VM name");
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 parser.add_option("-c", "--config", dest="config",
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 help="Template VM XML config file");
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 (options, args) = parser.parse_args();
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 if not options.name or not options.config:
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 print "Usage %s -n name -c template_xml" % sys.argv[0]
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 sys.exit(1)
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 config = ET.parse(options.config)
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 vm_name = options.name
6
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
63 if ie_check_name(vm_name):
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
64 print "Bad vmname %s. Try students/e11/e115711/01 or teacher/kono/02" % vm_name
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
65 sys.exit(1)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
66 ie_mkdir(vm_name)
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
67
3
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 name = config.find('name')
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 name.text = vm_name
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 uuid = config.find('uuid')
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 uuid.text = uuidToString(randomUUID())
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 mac = config.find('devices/interface/mac')
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 mac.attrib['address'] = randomMAC(type='qemu')
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 disk = config.find('devices/disk/source')
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 disk_old = disk.attrib['file']
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 disk_path = os.path.dirname(disk_old)
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 disk_ext = os.path.splitext(disk_old)[1]
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 disk_image = disk_path + '/' + vm_name + disk_ext
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 disk.attrib['file'] = disk_image
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 if os.path.exists(vm_name + '.xml'):
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 print "File %s.xml exists, abort" % vm_name
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 sys.exit(1)
6
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
84 config.write('/etc/libvirt/qemu/' + vm_name + '.xml')
3
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 print "Created vm config file %s.xml" % vm_name
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 print "Use disk image %s, you must create it from the template disk: %s" % (disk_image, disk_old)
203445eb53a8 add xml generator.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 print "Done!"
6
25c14d1144a8 add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 3
diff changeset
88