1398
1380
LOG.debug(_("block_device_list %s"), block_device_list)
1399
1381
return block_device.strip_dev(mount_device) in block_device_list
1401
def _prepare_xml_info(self, instance, network_info, image_meta, rescue,
1402
block_device_info=None):
1383
def _get_config_drive_info(self, instance):
1384
config_drive = instance.get('config_drive')
1385
config_drive_id = instance.get('config_drive_id')
1386
if FLAGS.force_config_drive:
1387
if not config_drive_id:
1389
return config_drive, config_drive_id
1391
def _has_config_drive(self, instance):
1392
config_drive, config_drive_id = self._get_config_drive_info(instance)
1393
return any((config_drive, config_drive_id))
1395
def get_guest_config(self, instance, network_info, image_meta, rescue,
1396
block_device_info=None):
1403
1397
block_device_mapping = driver.block_device_info_get_mapping(
1404
1398
block_device_info)
1407
for (network, mapping) in network_info:
1408
nics.append(self.vif_driver.plug(instance, network, mapping))
1409
1402
# FIXME(vish): stick this in db
1410
1403
inst_type_id = instance['instance_type_id']
1411
1404
inst_type = instance_types.get_instance_type(inst_type_id)
1413
if FLAGS.use_cow_images:
1414
driver_type = 'qcow2'
1418
if image_meta and image_meta.get('disk_format') == 'iso':
1419
root_device_type = 'cdrom'
1421
root_device_type = 'disk'
1424
for vol in block_device_mapping:
1425
connection_info = vol['connection_info']
1426
mountpoint = vol['mount_device']
1427
xml = self.volume_driver_method('connect_volume',
1432
ebs_root = self._volume_in_mapping(self.default_root_device,
1435
ephemeral_device = False
1436
if not (self._volume_in_mapping(self.default_second_device,
1437
block_device_info) or
1438
0 in [eph['num'] for eph in
1439
driver.block_device_info_get_ephemerals(
1440
block_device_info)]):
1441
if instance['ephemeral_gb'] > 0:
1442
ephemeral_device = self.default_second_device
1445
for eph in driver.block_device_info_get_ephemerals(block_device_info):
1446
ephemerals.append({'device_path': _get_eph_disk(eph),
1447
'device': block_device.strip_dev(
1448
eph['device_name'])})
1450
xml_info = {'type': FLAGS.libvirt_type,
1451
'name': instance['name'],
1452
'uuid': instance['uuid'],
1453
'cachemode': self.disk_cachemode,
1454
'basepath': os.path.join(FLAGS.instances_path,
1456
'memory_kb': inst_type['memory_mb'] * 1024,
1457
'vcpus': inst_type['vcpus'],
1459
'disk_prefix': self._disk_prefix,
1460
'driver_type': driver_type,
1461
'root_device_type': root_device_type,
1462
'vif_type': FLAGS.libvirt_vif_type,
1464
'ebs_root': ebs_root,
1465
'ephemeral_device': ephemeral_device,
1467
'use_virtio_for_bridges':
1468
FLAGS.libvirt_use_virtio_for_bridges,
1469
'ephemerals': ephemerals}
1406
guest = config.LibvirtConfigGuest()
1407
guest.virt_type = FLAGS.libvirt_type
1408
guest.name = instance['name']
1409
guest.uuid = instance['uuid']
1410
guest.memory = inst_type['memory_mb'] * 1024
1411
guest.vcpus = inst_type['vcpus']
1471
1413
root_device_name = driver.block_device_info_get_root(block_device_info)
1472
1414
if root_device_name:
1473
xml_info['root_device'] = block_device.strip_dev(root_device_name)
1474
xml_info['root_device_name'] = root_device_name
1415
root_device = block_device.strip_dev(root_device_name)
1476
1417
# NOTE(yamahata):
1477
1418
# for nova.api.ec2.cloud.CloudController.get_metadata()
1478
xml_info['root_device'] = self.default_root_device
1419
root_device = self.default_root_device
1479
1420
db.instance_update(
1480
1421
nova_context.get_admin_context(), instance['id'],
1481
1422
{'root_device_name': '/dev/' + self.default_root_device})
1483
if ephemeral_device:
1484
swap_device = self.default_third_device
1486
nova_context.get_admin_context(), instance['id'],
1487
{'default_ephemeral_device':
1488
'/dev/' + self.default_second_device})
1490
swap_device = self.default_second_device
1492
swap = driver.block_device_info_get_swap(block_device_info)
1493
if driver.swap_is_usable(swap):
1494
xml_info['swap_device'] = block_device.strip_dev(
1495
swap['device_name'])
1496
elif (inst_type['swap'] > 0 and
1497
not self._volume_in_mapping(swap_device,
1498
block_device_info)):
1499
xml_info['swap_device'] = swap_device
1501
nova_context.get_admin_context(), instance['id'],
1502
{'default_swap_device': '/dev/' + swap_device})
1504
if instance.get('config_drive') or instance.get('config_drive_id'):
1505
xml_info['config_drive'] = xml_info['basepath'] + "/disk.config"
1424
if FLAGS.libvirt_type == "lxc":
1425
guest.os_type = "exe"
1426
guest.os_init_path = "/sbin/init"
1427
guest.os_cmdline = "console=ttyS0"
1428
elif FLAGS.libvirt_type == "uml":
1429
guest.os_type = "uml"
1430
guest.os_kernel = "/usr/bin/linux"
1431
guest.os_root = root_device_name or "/dev/ubda"
1433
if FLAGS.libvirt_type == "xen":
1434
guest.os_type = "linux"
1435
guest.os_root = root_device_name or "/dev/xvda"
1437
guest.os_type = "hvm"
1440
guest.os_kernel = os.path.join(FLAGS.instances_path,
1443
guest.os_initrd = os.path.join(FLAGS.instances_path,
1446
elif instance['kernel_id']:
1447
guest.os_kernel = os.path.join(FLAGS.instances_path,
1450
if FLAGS.libvirt_type == "xen":
1451
guest.os_cmdline = "ro"
1453
guest.os_cmdline = "root=%s console=ttyS0" % (
1454
root_device_name or "/dev/vda",)
1455
if instance['ramdisk_id']:
1456
guest.os_initrd = os.path.join(FLAGS.instances_path,
1460
guest.os_boot_dev = "hd"
1462
if FLAGS.libvirt_type != "lxc" and FLAGS.libvirt_type != "uml":
1465
if FLAGS.libvirt_type == "lxc":
1466
fs = config.LibvirtConfigGuestFilesys()
1468
fs.source_dir = os.path.join(FLAGS.instances_path,
1471
guest.add_device(fs)
1473
if FLAGS.use_cow_images:
1474
driver_type = 'qcow2'
1478
if image_meta and image_meta.get('disk_format') == 'iso':
1479
root_device_type = 'cdrom'
1481
root_device_type = 'disk'
1483
if FLAGS.libvirt_type == "uml":
1484
ephemeral_disk_bus = "uml"
1485
elif FLAGS.libvirt_type == "xen":
1486
ephemeral_disk_bus = "xen"
1488
ephemeral_disk_bus = "virtio"
1491
diskrescue = config.LibvirtConfigGuestDisk()
1492
diskrescue.source_type = "file"
1493
diskrescue.source_path = os.path.join(FLAGS.instances_path,
1496
diskrescue.driver_format = driver_type
1497
diskrescue.driver_cache = self.disk_cachemode
1498
diskrescue.target_dev = self.default_root_device
1499
diskrescue.target_bus = ephemeral_disk_bus
1500
guest.add_device(diskrescue)
1502
diskos = config.LibvirtConfigGuestDisk()
1503
diskos.source_type = "file"
1504
diskos.source_path = os.path.join(FLAGS.instances_path,
1507
diskos.driver_format = driver_type
1508
diskos.driver_cache = self.disk_cachemode
1509
diskos.target_dev = self.default_second_device
1510
diskos.target_bus = ephemeral_disk_bus
1511
guest.add_device(diskos)
1513
ebs_root = self._volume_in_mapping(self.default_root_device,
1517
diskos = config.LibvirtConfigGuestDisk()
1518
diskos.source_type = "file"
1519
diskos.source_device = root_device_type
1520
diskos.driver_format = driver_type
1521
diskos.driver_cache = self.disk_cachemode
1522
diskos.source_path = os.path.join(FLAGS.instances_path,
1525
diskos.target_dev = root_device
1526
if root_device_type == "cdrom":
1527
diskos.target_bus = "ide"
1529
diskos.target_bus = "virtio"
1530
guest.add_device(diskos)
1532
ephemeral_device = None
1533
if not (self._volume_in_mapping(self.default_second_device,
1534
block_device_info) or
1535
0 in [eph['num'] for eph in
1536
driver.block_device_info_get_ephemerals(
1537
block_device_info)]):
1538
if instance['ephemeral_gb'] > 0:
1539
ephemeral_device = self.default_second_device
1541
if ephemeral_device is not None:
1542
disklocal = config.LibvirtConfigGuestDisk()
1543
disklocal.source_type = "file"
1544
disklocal.source_device = root_device_type
1545
disklocal.driver_format = driver_type
1546
disklocal.driver_cache = self.disk_cachemode
1547
disklocal.source_path = os.path.join(FLAGS.instances_path,
1550
disklocal.target_dev = ephemeral_device
1551
disklocal.target_bus = ephemeral_disk_bus
1552
guest.add_device(disklocal)
1554
if ephemeral_device is not None:
1555
swap_device = self.default_third_device
1557
nova_context.get_admin_context(), instance['id'],
1558
{'default_ephemeral_device':
1559
'/dev/' + self.default_second_device})
1561
swap_device = self.default_second_device
1563
for eph in driver.block_device_info_get_ephemerals(
1565
diskeph = config.LibvirtConfigGuestDisk()
1566
diskeph.source_type = "block"
1567
diskeph.source_device = root_device_type
1568
diskeph.driver_format = driver_type
1569
diskeph.driver_cache = self.disk_cachemode
1570
diskeph.source_path = os.path.join(FLAGS.instances_path,
1573
diskeph.target_dev = block_device.strip_dev(
1575
diskeph.target_bus = ephemeral_disk_bus
1576
guest.add_device(diskeph)
1578
swap = driver.block_device_info_get_swap(block_device_info)
1579
if driver.swap_is_usable(swap):
1580
diskswap = config.LibvirtConfigGuestDisk()
1581
diskswap.disk_type = "file"
1582
diskswap.driver_format = driver_type
1583
diskswap.driver_cache = self.disk_cachemode
1584
diskswap.source_path = os.path.join(FLAGS.instances_path,
1587
diskswap.target_dev = block_device.strip_dev(
1588
swap['device_name'])
1589
diskswap.target_bus = ephemeral_disk_bus
1590
guest.add_device(diskswap)
1591
elif (inst_type['swap'] > 0 and
1592
not self._volume_in_mapping(swap_device,
1593
block_device_info)):
1594
diskswap = config.LibvirtConfigGuestDisk()
1595
diskswap.disk_type = "file"
1596
diskswap.driver_format = driver_type
1597
diskswap.driver_cache = self.disk_cachemode
1598
diskswap.source_path = os.path.join(FLAGS.instances_path,
1601
diskswap.target_dev = swap_device
1602
diskswap.target_bus = ephemeral_disk_bus
1603
guest.add_device(diskswap)
1605
nova_context.get_admin_context(), instance['id'],
1606
{'default_swap_device': '/dev/' + swap_device})
1608
for vol in block_device_mapping:
1609
connection_info = vol['connection_info']
1610
mountpoint = vol['mount_device']
1611
cfg = self.volume_driver_method('connect_volume',
1614
guest.add_device(cfg)
1616
if self._has_config_drive(instance):
1617
diskconfig = config.LibvirtConfigGuestDisk()
1618
diskconfig.source_type = "file"
1619
diskconfig.driver_format = "raw"
1620
diskconfig.driver_cache = self.disk_cachemode
1621
diskconfig.source_path = os.path.join(FLAGS.instances_path,
1624
diskconfig.target_dev = self.default_last_device
1625
diskconfig.target_bus = ephemeral_disk_bus
1626
guest.add_device(diskconfig)
1628
for (network, mapping) in network_info:
1629
cfg = self.vif_driver.plug(instance, network, mapping)
1630
guest.add_device(cfg)
1632
if FLAGS.libvirt_type == "qemu" or FLAGS.libvirt_type == "kvm":
1633
# The QEMU 'pty' driver throws away any data if no
1634
# client app is connected. Thus we can't get away
1635
# with a single type=pty console. Instead we have
1636
# to configure two separate consoles.
1637
consolelog = config.LibvirtConfigGuestSerial()
1638
consolelog.type = "file"
1639
consolelog.source_path = os.path.join(FLAGS.instances_path,
1642
guest.add_device(consolelog)
1644
consolepty = config.LibvirtConfigGuestSerial()
1645
consolepty.type = "pty"
1646
guest.add_device(consolepty)
1648
consolepty = config.LibvirtConfigGuestConsole()
1649
consolepty.type = "pty"
1650
guest.add_device(consolepty)
1507
1652
if FLAGS.vnc_enabled and FLAGS.libvirt_type not in ('lxc', 'uml'):
1508
xml_info['vncserver_listen'] = FLAGS.vncserver_listen
1509
xml_info['vnc_keymap'] = FLAGS.vnc_keymap
1511
if instance['kernel_id']:
1512
xml_info['kernel'] = xml_info['basepath'] + "/kernel"
1514
if instance['ramdisk_id']:
1515
xml_info['ramdisk'] = xml_info['basepath'] + "/ramdisk"
1517
xml_info['disk'] = xml_info['basepath'] + "/disk"
1653
if FLAGS.use_usb_tablet:
1654
tablet = config.LibvirtConfigGuestInput()
1655
tablet.type = "tablet"
1657
guest.add_device(tablet)
1659
graphics = config.LibvirtConfigGuestGraphics()
1660
graphics.type = "vnc"
1661
graphics.keymap = FLAGS.vnc_keymap
1662
graphics.listen = FLAGS.vncserver_listen
1663
guest.add_device(graphics)
1520
1667
def to_xml(self, instance, network_info, image_meta=None, rescue=False,
1521
1668
block_device_info=None):
1522
# TODO(termie): cache?
1523
1669
LOG.debug(_('Starting toXML method'), instance=instance)
1524
xml_info = self._prepare_xml_info(instance, network_info, image_meta,
1525
rescue, block_device_info)
1526
xml = str(Template(self.libvirt_xml, searchList=[xml_info]))
1670
conf = self.get_guest_config(instance, network_info, image_meta,
1671
rescue, block_device_info)
1527
1673
LOG.debug(_('Finished toXML method'), instance=instance)