def bootstrap(self): with LogTask('Bootstrapping %s' % self.vm.name()): if self.vm._spec['disks'][0]['type'] != 'empty' and self.vm._spec[ 'disks'][0]['format'] != 'iso': sysprep_cmd = [ sysprep.set_hostname(self.vm.name()), sysprep.set_root_password(self.vm.root_password()), sysprep.add_ssh_key( self.vm.virt_env.prefix.paths.ssh_id_rsa_pub(), ), sysprep.set_iscsi_initiator_name(self.vm.iscsi_name()) ] if self.vm.distro() in ('fc24', 'fc25', 'debian', 'el7'): path = '/boot/grub2/grub.cfg' if self.vm.distro() == 'debian': path = '/boot/grub/grub.cfg' sysprep_cmd.append( sysprep.edit(path, 's/set timeout=5/set timeout=0/s')) # In fc25 NetworkManager configures the interfaces successfuly # on boot. if self.vm.distro() not in ('fc25', 'fc26'): ifaces = [('eth{0}'.format(idx), utils.ipv4_to_mac(nic['ip'])) for idx, nic in enumerate(self.vm.spec['nics'])] sysprep_cmd.extend( sysprep.config_net_ifaces_dhcp(self.vm.distro(), ifaces)) sysprep.sysprep(self.vm._spec['disks'][0]['path'], sysprep_cmd)
def bootstrap(self): with LogTask('Bootstrapping %s' % self.vm.name()): if self.vm._spec['disks'][0]['type'] != 'empty' and self.vm._spec[ 'disks'][0]['format'] != 'iso': root_disk = self.vm._spec['disks'][0]['path'] mappings = { 'eth{0}'.format(idx): utils.ipv4_to_mac(nic['ip']) for idx, nic in enumerate(self.vm.spec['nics']) } public_ssh_key = self.vm.virt_env.prefix.paths.ssh_id_rsa_pub() sysprep.sysprep( disk=root_disk, mappings=mappings, distro=self.vm.distro(), root_password=self.vm.root_password(), public_key=public_ssh_key, iscsi_name=self.vm.iscsi_name(), hostname=self.vm.name(), )
def bootstrap(self): with LogTask('Bootstrapping %s' % self.vm.name()): if self.vm._spec['disks'][0]['type'] != 'empty' and self.vm._spec[ 'disks' ][0]['format'] != 'iso': root_disk = self.vm._spec['disks'][0]['path'] mappings = { 'eth{0}'.format(idx): utils.ipv4_to_mac(nic['ip']) for idx, nic in enumerate(self.vm.spec['nics']) } public_ssh_key = self.vm.virt_env.prefix.paths.ssh_id_rsa_pub() sysprep.sysprep( disk=root_disk, mappings=mappings, distro=self.vm.distro(), root_password=self.vm.root_password(), public_key=public_ssh_key, iscsi_name=self.vm.iscsi_name(), hostname=self.vm.name(), )
def bootstrap(self): with LogTask('Bootstrapping %s' % self.vm.name()): if self.vm._spec['disks'][0]['type'] != 'empty' and self.vm._spec[ 'disks'][0]['format'] != 'iso': sysprep.sysprep( self.vm._spec['disks'][0]['path'], [ sysprep.set_hostname(self.vm.name()), sysprep.set_root_password(self.vm.root_password()), sysprep.add_ssh_key( self.vm.virt_env.prefix.paths.ssh_id_rsa_pub(), ), sysprep.set_iscsi_initiator_name(self.vm.iscsi_name()), sysprep.edit("/boot/grub2/grub.cfg", "s/set timeout=5/set timeout=0/g") if (self.vm.distro() == 'el7' or self.vm.distro() == 'fc24') else '', ] + [ sysprep.config_net_interface_dhcp( 'eth%d' % index, utils.ipv4_to_mac(nic['ip']), ) for index, nic in enumerate(self.vm._spec['nics']) if 'ip' in nic ], )
def _libvirt_xml(self): dom_xml = self._load_xml() cpu = self.cpu for child in cpu: dom_xml.append(child) devices = dom_xml.xpath('/domain/devices')[0] disk = devices.xpath('disk')[0] devices.remove(disk) scsi_con_exists = False for disk_order, dev_spec in enumerate(self.vm._spec['disks']): # we have to make some adjustments # we use iso to indicate cdrom # but libvirt wants it named raw # and we need to use cdrom device disk_device = 'disk' bus = 'virtio' if dev_spec['format'] == 'iso': disk_device = 'cdrom' dev_spec['format'] = 'raw' bus = 'ide' # names converted # support virtio-scsi - sdX devices if dev_spec['dev'].startswith('sd'): bus = 'scsi' if not scsi_con_exists: controller = ET.Element( 'controller', type='scsi', index='0', model='virtio-scsi', ) driver = ET.Element('driver', queues='{}'.format( self.vm._spec.get('vcpu', 2)), iothread='1') controller.append(driver) devices.append(controller) scsi_con_exists = True disk = ET.Element( 'disk', type='file', device=disk_device, ) if bus == 'virtio': disk.append( ET.Element( 'driver', name='qemu', type=dev_spec['format'], discard='unmap', cache='writeback', iothread='1', queues='1', ), ) elif bus == 'scsi': disk.append( ET.Element( 'driver', name='qemu', type=dev_spec['format'], discard='unmap', cache='writeback', ), ) else: disk.append( ET.Element( 'driver', name='qemu', type=dev_spec['format'], ), ) serial = ET.SubElement(disk, 'serial') serial.text = "{}".format(disk_order + 1) disk.append(serial) disk.append( ET.Element( 'source', file=os.path.expandvars(dev_spec['path']), ), ) disk.append(ET.Element( 'target', dev=dev_spec['dev'], bus=bus, ), ) devices.append(disk) for dev_spec in self.vm._spec['nics']: interface = ET.Element( 'interface', type='network', ) interface.append( ET.Element( 'source', network=self.vm.virt_env.prefixed_name(dev_spec['net'], max_length=15), ), ) interface.append(ET.Element( 'model', type='virtio', ), ) interface.append(ET.Element( 'driver', name='vhost', queues='2', ), ) if self.libvirt_ver > 3001001: mtu = dev_spec.get('mtu', '1500') if mtu != '1500': interface.append(ET.Element( 'mtu', size=str(mtu), )) if 'ip' in dev_spec: interface.append( ET.Element('mac', address=utils.ipv4_to_mac(dev_spec['ip'])), ) devices.append(interface) return ET.tostring(dom_xml, pretty_print=True)
def _libvirt_xml(self): net_raw_xml = libvirt_utils.get_template('net_nat_template.xml') subnet = self.gw().split('.')[2] ipv6_prefix = self._ipv6_prefix(subnet=subnet) mtu = self.mtu() replacements = { '@NAME@': self._libvirt_name(), '@BR_NAME@': ('%s-nic' % self._libvirt_name())[:12], '@GW_ADDR@': self.gw(), '@SUBNET@': subnet } for k, v in replacements.items(): net_raw_xml = net_raw_xml.replace(k, v, 1) parser = ET.XMLParser(remove_blank_text=True) net_xml = ET.fromstring(net_raw_xml, parser) if mtu != '1500': net_xml.append(ET.Element( 'mtu', size=str(mtu), )) if 'dhcp' in self._spec: ipv4 = net_xml.xpath('/network/ip')[0] ipv6 = net_xml.xpath('/network/ip')[1] def make_ipv4(last): return '.'.join(self.gw().split('.')[:-1] + [str(last)]) dhcp = ET.Element('dhcp') dhcpv6 = ET.Element('dhcp') ipv4.append(dhcp) ipv6.append(dhcpv6) dhcp.append( ET.Element( 'range', start=make_ipv4(self._spec['dhcp']['start']), end=make_ipv4(self._spec['dhcp']['end']), )) dhcpv6.append( ET.Element( 'range', start=ipv6_prefix + make_ipv4(self._spec['dhcp']['start']), end=ipv6_prefix + make_ipv4(self._spec['dhcp']['end']), )) for hostname, ip4 in self._spec['mapping'].items(): dhcp.append( ET.Element('host', mac=utils.ipv4_to_mac(ip4), ip=ip4, name=hostname)) dhcpv6.append( ET.Element('host', id='0:3:0:1:' + utils.ipv4_to_mac(ip4), ip=ipv6_prefix + ip4, name=hostname)) if utils.ver_cmp(self.compat, '0.36.11') >= 0: if self.is_management(): domain_xml = ET.Element('domain', name=self._spec['dns_domain_name'], localOnly='yes') net_xml.append(domain_xml) net_xml.append( self._generate_main_dns(self._spec['dns_records'], subnet)) else: if self.libvirt_con.getLibVersion() < 2002000: net_xml.append( self._generate_dns_forward(self._spec['dns_forward'])) else: net_xml.append(self._generate_dns_disable()) else: LOGGER.debug( 'Generating network XML with compatibility prior to %s', self.compat) # Prior to v0.37, DNS records were only the mappings of the # management network. if self.is_management(): if 'dns_domain_name' in self._spec: domain_xml = ET.Element('domain', name=self._spec['dns_domain_name'], localOnly='yes') net_xml.append(domain_xml) net_xml.append( self._generate_main_dns(self._spec['mapping'], subnet, forward_plain='yes')) else: dns = ET.Element('dns', forwardPlainNames='yes', enable='yes') net_xml.append(dns) LOGGER.debug('Generated Network XML\n {0}'.format( ET.tostring(net_xml, pretty_print=True))) return ET.tostring(net_xml)
def _libvirt_xml(self): dom_raw_xml = self._load_domain_xml() qemu_kvm_path = self._caps.findtext( "guest[os_type='hvm']/arch[@name='x86_64']/domain[@type='kvm']" "/emulator") if not qemu_kvm_path: LOGGER.warning("hardware acceleration not available") qemu_kvm_path = self._caps.findtext( "guest[os_type='hvm']/arch[@name='x86_64']" "/domain[@type='qemu']/../emulator") if not qemu_kvm_path: raise Exception('kvm executable not found') replacements = { '@NAME@': self._libvirt_name(), '@MEM_SIZE@': self.vm._spec.get('memory', 16 * 1024), '@QEMU_KVM@': qemu_kvm_path, } for key, val in replacements.items(): dom_raw_xml = dom_raw_xml.replace(key, str(val), 1) parser = ET.XMLParser(remove_blank_text=True) dom_xml = ET.fromstring(dom_raw_xml, parser) for child in self._cpu: dom_xml.append(child) devices = dom_xml.xpath('/domain/devices')[0] disk = devices.xpath('disk')[0] devices.remove(disk) scsi_con_exists = False for disk_order, dev_spec in enumerate(self.vm._spec['disks']): # we have to make some adjustments # we use iso to indicate cdrom # but libvirt wants it named raw # and we need to use cdrom device disk_device = 'disk' bus = 'virtio' if dev_spec['format'] == 'iso': disk_device = 'cdrom' dev_spec['format'] = 'raw' bus = 'ide' # names converted # support virtio-scsi - sdX devices if dev_spec['dev'].startswith('sd'): bus = 'scsi' if not scsi_con_exists: controller = ET.Element( 'controller', type='scsi', index='0', model='virtio-scsi', ) driver = ET.Element( 'driver', queues='{}'.format(self.vm._spec.get('vcpu', 2)), ) controller.append(driver) devices.append(controller) scsi_con_exists = True disk = ET.Element( 'disk', type='file', device=disk_device, ) disk.append( ET.Element( 'driver', name='qemu', type=dev_spec['format'], discard='unmap', ), ) serial = ET.SubElement(disk, 'serial') serial.text = "{}".format(disk_order + 1) disk.append(serial) disk.append(ET.Element('boot', order="{}".format(disk_order + 1)), ) disk.append( ET.Element( 'source', file=os.path.expandvars(dev_spec['path']), ), ) disk.append(ET.Element( 'target', dev=dev_spec['dev'], bus=bus, ), ) devices.append(disk) for dev_spec in self.vm._spec['nics']: interface = ET.Element( 'interface', type='network', ) interface.append( ET.Element( 'source', network=self.vm.virt_env.prefixed_name(dev_spec['net'], max_length=15), ), ) interface.append(ET.Element( 'model', type='virtio', ), ) if 'ip' in dev_spec: interface.append( ET.Element('mac', address=utils.ipv4_to_mac(dev_spec['ip'])), ) devices.append(interface) return ET.tostring(dom_xml, pretty_print=True)
def _libvirt_xml(self): dom_xml = self._load_xml() cpu = self.cpu for child in cpu: dom_xml.append(child) devices = dom_xml.xpath('/domain/devices')[0] disk = devices.xpath('disk')[0] devices.remove(disk) scsi_con_exists = False for disk_order, dev_spec in enumerate(self.vm._spec['disks']): # we have to make some adjustments # we use iso to indicate cdrom # but libvirt wants it named raw # and we need to use cdrom device disk_device = 'disk' bus = 'virtio' if dev_spec['format'] == 'iso': disk_device = 'cdrom' dev_spec['format'] = 'raw' bus = 'ide' # names converted # support virtio-scsi - sdX devices if dev_spec['dev'].startswith('sd'): bus = 'scsi' if not scsi_con_exists: controller = ET.Element( 'controller', type='scsi', index='0', model='virtio-scsi', ) driver = ET.Element( 'driver', queues='{}'.format(self.vm._spec.get('vcpu', 2)), iothread='1' ) controller.append(driver) devices.append(controller) scsi_con_exists = True disk = ET.Element( 'disk', type='file', device=disk_device, ) if bus == 'virtio': disk.append( ET.Element( 'driver', name='qemu', type=dev_spec['format'], discard='unmap', cache='writeback', iothread='1', queues='1', ), ) elif bus == 'scsi': disk.append( ET.Element( 'driver', name='qemu', type=dev_spec['format'], discard='unmap', cache='writeback', ), ) else: disk.append( ET.Element( 'driver', name='qemu', type=dev_spec['format'], ), ) serial = ET.SubElement(disk, 'serial') serial.text = "{}".format(disk_order + 1) disk.append(serial) disk.append( ET.Element( 'source', file=os.path.expandvars(dev_spec['path']), ), ) disk.append( ET.Element( 'target', dev=dev_spec['dev'], bus=bus, ), ) devices.append(disk) for dev_spec in self.vm._spec['nics']: interface = ET.Element( 'interface', type='network', ) interface.append( ET.Element( 'source', network=self.vm.virt_env.prefixed_name( dev_spec['net'], max_length=15 ), ), ) interface.append( ET.Element( 'model', type='virtio', ), ) interface.append( ET.Element( 'driver', name='vhost', queues='2', ), ) if self.libvirt_ver > 3001001: mtu = dev_spec.get('mtu', '1500') if mtu != '1500': interface.append(ET.Element( 'mtu', size=str(mtu), )) if 'ip' in dev_spec: interface.append( ET.Element( 'mac', address=utils.ipv4_to_mac(dev_spec['ip']) ), ) devices.append(interface) return ET.tostring(dom_xml, pretty_print=True)
def _libvirt_xml(self): net_raw_xml = libvirt_utils.get_template('net_nat_template.xml') subnet = self.gw().split('.')[2] replacements = { '@NAME@': self._libvirt_name(), '@BR_NAME@': ('%s-nic' % self._libvirt_name())[:12], '@GW_ADDR@': self.gw(), '@SUBNET@': subnet, '@ENABLE_DNS@': 'yes' if self._spec.get('enable_dns', True) else 'no', } for k, v in replacements.items(): net_raw_xml = net_raw_xml.replace(k, v, 1) net_xml = ET.fromstring(net_raw_xml) dns_domain_name = self._spec.get('dns_domain_name', None) if dns_domain_name is not None: domain_xml = ET.Element( 'domain', name=dns_domain_name, localOnly='yes', ) net_xml.append(domain_xml) if 'dhcp' in self._spec: IPV6_PREFIX = 'fd8f:1391:3a82:' + subnet + '::' ipv4 = net_xml.xpath('/network/ip')[0] ipv6 = net_xml.xpath('/network/ip')[1] dns = net_xml.xpath('/network/dns')[0] def make_ipv4(last): return '.'.join(self.gw().split('.')[:-1] + [str(last)]) dhcp = ET.Element('dhcp') dhcpv6 = ET.Element('dhcp') ipv4.append(dhcp) ipv6.append(dhcpv6) dhcp.append( ET.Element( 'range', start=make_ipv4(self._spec['dhcp']['start']), end=make_ipv4(self._spec['dhcp']['end']), )) dhcpv6.append( ET.Element( 'range', start=IPV6_PREFIX + make_ipv4(self._spec['dhcp']['start']), end=IPV6_PREFIX + make_ipv4(self._spec['dhcp']['end']), )) if self.is_management(): for hostname, ip4 in self._spec['mapping'].items(): dhcp.append( ET.Element('host', mac=utils.ipv4_to_mac(ip4), ip=ip4, name=hostname)) dhcpv6.append( ET.Element('host', id='0:3:0:1:' + utils.ipv4_to_mac(ip4), ip=IPV6_PREFIX + ip4, name=hostname)) dns_host = ET.SubElement(dns, 'host', ip=ip4) dns_name = ET.SubElement(dns_host, 'hostname') dns_name.text = hostname dns6_host = ET.SubElement(dns, 'host', ip=IPV6_PREFIX + ip4) dns6_name = ET.SubElement(dns6_host, 'hostname') dns6_name.text = hostname dns.append(dns_host) dns.append(dns6_host) return ET.tostring(net_xml)