示例#1
0
    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)
示例#2
0
文件: vm.py 项目: bellle/lago
    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(),
                )
示例#3
0
文件: vm.py 项目: nirs/lago
    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(),
                )
示例#4
0
文件: vm.py 项目: gbenhaim/lago
 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
                 ],
             )
示例#5
0
文件: vm.py 项目: bellle/lago
    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)
示例#6
0
文件: network.py 项目: Kryndex/lago
    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)
示例#7
0
    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)
示例#8
0
文件: vm.py 项目: nirs/lago
    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)
示例#9
0
    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)