Mercurial > hg > Applications > virsh-wrapper
annotate newvm.py @ 45:7f6c5d7355bc
Fix typo in xml attribute
author | atton |
---|---|
date | Fri, 15 Jan 2016 15:22:10 +0900 |
parents | 546504699402 |
children | 6b1dddd65d7c |
rev | line source |
---|---|
3 | 1 #!/usr/bin/python |
2 # Used to create a vm from template | |
3 # By Curu Wong contact: prinbra(at)gmail(dot)com | |
32 | 4 import sys,os,string,re |
3 | 5 from optparse import OptionParser |
6 from virtinst.util import * | |
25
1c4fb56f3cd5
add extension .sh to libvirt
taiki <taiki@cr.ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
7 |
3 | 8 if sys.version_info < (2,5): |
22 | 9 import lxml.etree as ET |
3 | 10 else: |
22 | 11 import xml.etree.ElementTree as ET |
12 | |
35 | 13 mount_point = '/media/iscsi/' # root directory |
32 | 14 |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
15 # vm_name should be |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
16 # students/e10/e105730/01 |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
17 # teachers/kono/01 |
29 | 18 # managers/name/01 |
19 # guests/name/01 | |
10 | 20 # bad name returns 1 |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
21 def ie_check_name(name): |
32 | 22 m=re.match('^students/[ek](\d\d)/[ek](\d\d)[58]\d\d\d/0[1-4]$',name) |
22 | 23 if m is not None: |
24 if m.group(1)==m.group(2): | |
25 return 0 | |
26 else: | |
27 return 1 | |
28 elif re.match('^teachers/[-a-z0-9]+/0[1-4]$',name): | |
29 return 0 | |
29 | 30 elif re.match('^managers/[-a-z0-9]+/0[1-4]$',name): |
22 | 31 return 0 |
29 | 32 elif re.match('^guests/[-a-z0-9]+/0[1-4]$',name): |
23 | 33 return 0 |
22 | 34 else: |
35 return 1 | |
6
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 # make necessary sub directory |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
38 # /etc/libvirt/qemu/teachers |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
39 # /var/log/libvirt/qemu/teachers |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
40 # /var/run/libvirt/qemu/teachers |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
41 |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
42 def ie_mkdir1(name): |
22 | 43 if not os.path.exists(name): |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
44 os.makedirs(name); |
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
45 |
32 | 46 |
47 # sample : students/e14/k145740/01 | |
48 # : master students/k13/k138582/01 | |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
49 def ie_mkdir(name): |
32 | 50 m=re.match('^(students/[ek]\d\d/[ek]\d\d[58]\d\d\d)/0[1-4]$',name) |
22 | 51 if m is None: |
52 m=re.match('^(teachers/[-a-z0-9]+)/0[1-4]$',name) | |
53 if m is None: | |
29 | 54 m=re.match('^(managers/[-a-z0-9]+)/0[1-4]$',name) |
23 | 55 if m is None: |
29 | 56 m=re.match('^(guests/[-a-z0-9]+)/0[1-4]$',name) |
22 | 57 if m is not None: |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
58 dir=m.group(1) |
32 | 59 ie_mkdir1(mount_point+dir) |
29 | 60 # ie_mkdir1('/usr/local/etc/libvirt/qemu/'+dir) |
61 # ie_mkdir1('/usr/local/var/log/libvirt/qemu/'+dir) | |
62 # ie_mkdir1('/usr/local/var/run/libvirt/qemu/'+dir) | |
63 # ie_mkdir1('/usr/local/var/lib/libvirt/qemu/'+dir) | |
64 ie_mkdir1('/etc/libvirt/qemu/'+dir) | |
65 ie_mkdir1('/var/log/libvirt/qemu/'+dir) | |
66 ie_mkdir1('/var/run/libvirt/qemu/'+dir) | |
67 ie_mkdir1('/var/lib/libvirt/qemu/'+dir) | |
32 | 68 os.system("/bin/chown "+os.getlogin()+" "+ mount_point+dir) |
19 | 69 |
38 | 70 # virtinst.utils.randomMac is omitted from RHEL 7. |
71 import random | |
72 def randomMAC(): | |
73 mac = [ 0x52, 0x54, 0x00, | |
74 random.randint(0x00, 0xff), | |
75 random.randint(0x00, 0xff), | |
76 random.randint(0x00, 0xff) ] | |
77 return ':'.join(map(lambda x: "%02x" % x, mac)) | |
78 | |
43 | 79 def gen_debug_port(): |
80 return 10000 | |
81 | |
3 | 82 parser = OptionParser(); |
83 parser.add_option("-n", "--name", dest="name", | |
84 help="VM name"); | |
85 parser.add_option("-c", "--config", dest="config", | |
86 help="Template VM XML config file"); | |
25
1c4fb56f3cd5
add extension .sh to libvirt
taiki <taiki@cr.ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
87 parser.add_option("-i", "--iso", dest="iso", |
1c4fb56f3cd5
add extension .sh to libvirt
taiki <taiki@cr.ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
88 help="When boot VM from ISO"); |
42 | 89 parser.add_option("-d", "--debug", dest="debug", |
90 help="Kernel debug mode"); | |
25
1c4fb56f3cd5
add extension .sh to libvirt
taiki <taiki@cr.ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
91 |
3 | 92 (options, args) = parser.parse_args(); |
22 | 93 |
3 | 94 if not options.name or not options.config: |
42 | 95 print "Usage %s -n name -c template_xml [-d debug_port]" % sys.argv[0] |
22 | 96 sys.exit(1) |
97 | |
3 | 98 config = ET.parse(options.config) |
99 vm_name = options.name | |
19 | 100 print(options.config) |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
101 if ie_check_name(vm_name): |
32 | 102 print "Can't make new vm. Bad vmname %s. Try 01 - 04" % vm_name |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
103 sys.exit(1) |
25
1c4fb56f3cd5
add extension .sh to libvirt
taiki <taiki@cr.ie.u-ryukyu.ac.jp>
parents:
24
diff
changeset
|
104 |
6
25c14d1144a8
add xml generation and define
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
105 ie_mkdir(vm_name) |
3 | 106 name = config.find('name') |
29 | 107 |
108 new_name = vm_name.translate(string.maketrans('/','_')) | |
109 | |
110 name.text = new_name | |
3 | 111 uuid = config.find('uuid') |
38 | 112 uuid.text = randomUUID(0) |
3 | 113 mac = config.find('devices/interface/mac') |
38 | 114 mac.attrib['address'] = randomMAC() |
3 | 115 disk = config.find('devices/disk/source') |
116 disk_old = disk.attrib['file'] | |
117 disk_path = os.path.dirname(disk_old) | |
118 disk_ext = os.path.splitext(disk_old)[1] | |
119 disk_image = disk_path + '/' + vm_name + disk_ext | |
120 disk.attrib['file'] = disk_image | |
42 | 121 if (options.debug): |
43 | 122 # http://wiki.libvirt.org/page/QEMUSwitchToLibvirt |
44
546504699402
Generate xml which enabled kernel debug. but needs reload in virsh
atton
parents:
43
diff
changeset
|
123 domain = config.getroot() |
45 | 124 domain.attrib['xmlns:qemu'] = "http://libvirt.org/schemas/domain/qemu/1.0" |
44
546504699402
Generate xml which enabled kernel debug. but needs reload in virsh
atton
parents:
43
diff
changeset
|
125 qemu_elem = ET.Element('qemu:commandline') |
45 | 126 ET.SubElement(qemu_elem, 'qemu:arg', {'value' : '-S'}) |
127 ET.SubElement(qemu_elem, 'qemu:arg', {'value' : ('-s %d' % gen_debug_port())}) | |
44
546504699402
Generate xml which enabled kernel debug. but needs reload in virsh
atton
parents:
43
diff
changeset
|
128 domain.append(qemu_elem) |
22 | 129 |
3 | 130 if os.path.exists(vm_name + '.xml'): |
22 | 131 print "File %s.xml exists, abort" % vm_name |
132 sys.exit(1) | |
29 | 133 # config.write('/usr/local/etc/libvirt/qemu/' + vm_name + '.xml') |
32 | 134 print("VM_NAME:" + vm_name) |
29 | 135 config.write('/etc/libvirt/qemu/' + vm_name + '.xml') |
3 | 136 print "Created vm config file %s.xml" % vm_name |
39 | 137 print "Use disk image %s" % disk_image |
3 | 138 print "Done!" |