Revision 397b7844 lib/hypervisor/hv_xen.py
b/lib/hypervisor/hv_xen.py | ||
---|---|---|
24 | 24 |
""" |
25 | 25 |
|
26 | 26 |
import logging |
27 |
import errno |
|
27 | 28 |
import string # pylint: disable=W0402 |
29 |
import shutil |
|
28 | 30 |
from cStringIO import StringIO |
29 | 31 |
|
30 | 32 |
from ganeti import constants |
... | ... | |
313 | 315 |
CAN_MIGRATE = True |
314 | 316 |
REBOOT_RETRY_COUNT = 60 |
315 | 317 |
REBOOT_RETRY_INTERVAL = 10 |
318 |
_ROOT_DIR = pathutils.RUN_DIR + "/xen-hypervisor" |
|
319 |
_NICS_DIR = _ROOT_DIR + "/nic" # contains NICs' info |
|
320 |
_DIRS = [_ROOT_DIR, _NICS_DIR] |
|
316 | 321 |
|
317 | 322 |
ANCILLARY_FILES = [ |
318 | 323 |
XEND_CONFIG_FILE, |
... | ... | |
383 | 388 |
return utils.PathJoin(self._cfgdir, instance_name) |
384 | 389 |
|
385 | 390 |
@classmethod |
391 |
def _WriteNICInfoFile(cls, instance_name, idx, nic): |
|
392 |
"""Write the Xen config file for the instance. |
|
393 |
|
|
394 |
This version of the function just writes the config file from static data. |
|
395 |
|
|
396 |
""" |
|
397 |
dirs = [(dname, constants.RUN_DIRS_MODE) |
|
398 |
for dname in cls._DIRS + [cls._InstanceNICDir(instance_name)]] |
|
399 |
utils.EnsureDirs(dirs) |
|
400 |
|
|
401 |
cfg_file = cls._InstanceNICFile(instance_name, idx) |
|
402 |
data = StringIO() |
|
403 |
|
|
404 |
if nic.netinfo: |
|
405 |
netinfo = objects.Network.FromDict(nic.netinfo) |
|
406 |
data.write("NETWORK_NAME=%s\n" % netinfo.name) |
|
407 |
if netinfo.network: |
|
408 |
data.write("NETWORK_SUBNET=%s\n" % netinfo.network) |
|
409 |
if netinfo.gateway: |
|
410 |
data.write("NETWORK_GATEWAY=%s\n" % netinfo.gateway) |
|
411 |
if netinfo.network6: |
|
412 |
data.write("NETWORK_SUBNET6=%s\n" % netinfo.network6) |
|
413 |
if netinfo.gateway6: |
|
414 |
data.write("NETWORK_GATEWAY6=%s\n" % netinfo.gateway6) |
|
415 |
if netinfo.mac_prefix: |
|
416 |
data.write("NETWORK_MAC_PREFIX=%s\n" % netinfo.mac_prefix) |
|
417 |
if netinfo.tags: |
|
418 |
data.write("NETWORK_TAGS=%s\n" % "\ ".join(netinfo.tags)) |
|
419 |
|
|
420 |
data.write("MAC=%s\n" % nic.mac) |
|
421 |
data.write("IP=%s\n" % nic.ip) |
|
422 |
data.write("MODE=%s\n" % nic.nicparams[constants.NIC_MODE]) |
|
423 |
data.write("LINK=%s\n" % nic.nicparams[constants.NIC_LINK]) |
|
424 |
|
|
425 |
try: |
|
426 |
utils.WriteFile(cfg_file, data=data.getvalue()) |
|
427 |
except EnvironmentError, err: |
|
428 |
raise errors.HypervisorError("Cannot write Xen instance configuration" |
|
429 |
" file %s: %s" % (cfg_file, err)) |
|
430 |
|
|
431 |
@classmethod |
|
432 |
def _InstanceNICDir(cls, instance_name): |
|
433 |
"""Returns the directory holding the tap device files for a given instance. |
|
434 |
|
|
435 |
""" |
|
436 |
return utils.PathJoin(cls._NICS_DIR, instance_name) |
|
437 |
|
|
438 |
@classmethod |
|
439 |
def _InstanceNICFile(cls, instance_name, seq): |
|
440 |
"""Returns the name of the file containing the tap device for a given NIC |
|
441 |
|
|
442 |
""" |
|
443 |
return utils.PathJoin(cls._InstanceNICDir(instance_name), str(seq)) |
|
444 |
|
|
445 |
@classmethod |
|
386 | 446 |
def _GetConfig(cls, instance, startup_memory, block_devices): |
387 | 447 |
"""Build Xen configuration for an instance. |
388 | 448 |
|
... | ... | |
423 | 483 |
|
424 | 484 |
""" |
425 | 485 |
utils.RemoveFile(self._ConfigFileName(instance_name)) |
486 |
try: |
|
487 |
shutil.rmtree(self._InstanceNICDir(instance_name)) |
|
488 |
except OSError, err: |
|
489 |
if err.errno != errno.ENOENT: |
|
490 |
raise |
|
426 | 491 |
|
427 | 492 |
def _StashConfigFile(self, instance_name): |
428 | 493 |
"""Move the Xen config file to the log directory and return its new path. |
... | ... | |
892 | 957 |
constants.HV_CPU_CAP: hv_base.OPT_NONNEGATIVE_INT_CHECK, |
893 | 958 |
constants.HV_CPU_WEIGHT: |
894 | 959 |
(False, lambda x: 0 < x < 65536, "invalid weight", None, None), |
960 |
constants.HV_VIF_SCRIPT: hv_base.OPT_FILE_CHECK, |
|
895 | 961 |
constants.HV_XEN_CMD: |
896 | 962 |
hv_base.ParamInSet(True, constants.KNOWN_XEN_COMMANDS), |
897 | 963 |
} |
... | ... | |
945 | 1011 |
config.write("name = '%s'\n" % instance.name) |
946 | 1012 |
|
947 | 1013 |
vif_data = [] |
948 |
for nic in instance.nics:
|
|
1014 |
for idx, nic in enumerate(instance.nics):
|
|
949 | 1015 |
nic_str = "mac=%s" % (nic.mac) |
950 | 1016 |
ip = getattr(nic, "ip", None) |
951 | 1017 |
if ip is not None: |
952 | 1018 |
nic_str += ", ip=%s" % ip |
953 | 1019 |
if nic.nicparams[constants.NIC_MODE] == constants.NIC_MODE_BRIDGED: |
954 | 1020 |
nic_str += ", bridge=%s" % nic.nicparams[constants.NIC_LINK] |
1021 |
if hvp[constants.HV_VIF_SCRIPT]: |
|
1022 |
nic_str += ", script=%s" % hvp[constants.HV_VIF_SCRIPT] |
|
955 | 1023 |
vif_data.append("'%s'" % nic_str) |
1024 |
self._WriteNICInfoFile(instance.name, idx, nic) |
|
956 | 1025 |
|
957 | 1026 |
disk_data = \ |
958 | 1027 |
_GetConfigFileDiskData(block_devices, hvp[constants.HV_BLOCKDEV_PREFIX]) |
... | ... | |
1016 | 1085 |
(False, lambda x: 0 < x < 65535, "invalid weight", None, None), |
1017 | 1086 |
constants.HV_VIF_TYPE: |
1018 | 1087 |
hv_base.ParamInSet(False, constants.HT_HVM_VALID_VIF_TYPES), |
1088 |
constants.HV_VIF_SCRIPT: hv_base.OPT_FILE_CHECK, |
|
1019 | 1089 |
constants.HV_XEN_CMD: |
1020 | 1090 |
hv_base.ParamInSet(True, constants.KNOWN_XEN_COMMANDS), |
1021 | 1091 |
} |
... | ... | |
1106 | 1176 |
# parameter 'model' is only valid with type 'ioemu' |
1107 | 1177 |
nic_type_str = ", model=%s, type=%s" % \ |
1108 | 1178 |
(nic_type, constants.HT_HVM_VIF_IOEMU) |
1109 |
for nic in instance.nics:
|
|
1179 |
for idx, nic in enumerate(instance.nics):
|
|
1110 | 1180 |
nic_str = "mac=%s%s" % (nic.mac, nic_type_str) |
1111 | 1181 |
ip = getattr(nic, "ip", None) |
1112 | 1182 |
if ip is not None: |
1113 | 1183 |
nic_str += ", ip=%s" % ip |
1114 | 1184 |
if nic.nicparams[constants.NIC_MODE] == constants.NIC_MODE_BRIDGED: |
1115 | 1185 |
nic_str += ", bridge=%s" % nic.nicparams[constants.NIC_LINK] |
1186 |
if hvp[constants.HV_VIF_SCRIPT]: |
|
1187 |
nic_str += ", script=%s" % hvp[constants.HV_VIF_SCRIPT] |
|
1116 | 1188 |
vif_data.append("'%s'" % nic_str) |
1189 |
self._WriteNICInfoFile(instance.name, idx, nic) |
|
1117 | 1190 |
|
1118 | 1191 |
config.write("vif = [%s]\n" % ",".join(vif_data)) |
1119 | 1192 |
|
Also available in: Unified diff