Exemplo n.º 1
0
    def define(self):
        name = underscored(
            deepgetattr(self, 'node.group.environment.name'),
            deepgetattr(self, 'node.name'),
            self.name,
        )

        backing_store_path = None
        backing_store_format = None
        if self.backing_store is not None:
            backing_store_path = self.backing_store.get_path()
            backing_store_format = self.backing_store.format

        if self.source_image is not None:
            capacity = get_file_size(self.source_image)
        else:
            capacity = int(self.capacity * 1024 ** 3)

        pool_name = self.driver.storage_pool_name
        pool = self.driver.conn.storagePoolLookupByName(pool_name)
        xml = LibvirtXMLBuilder.build_volume_xml(
            name=name,
            capacity=capacity,
            vol_format=self.format,
            backing_store_path=backing_store_path,
            backing_store_format=backing_store_format,
        )
        libvirt_volume = pool.createXML(xml, 0)
        self.uuid = libvirt_volume.key()
        super(LibvirtVolume, self).define()

        # Upload predefined image to the volume
        if self.source_image is not None:
            self.upload(self.source_image)
Exemplo n.º 2
0
    def define(self):
        name = underscored(
            deepgetattr(self, 'node.group.environment.name'),
            deepgetattr(self, 'node.name'),
            self.name,
        )

        backing_store_path = None
        backing_store_format = None
        if self.backing_store is not None:
            backing_store_path = self.backing_store.get_path()
            backing_store_format = self.backing_store.format

        if self.source_image is not None:
            capacity = get_file_size(self.source_image)
        else:
            capacity = int(self.capacity * 1024**3)

        pool_name = self.driver.storage_pool_name
        pool = self.driver.conn.storagePoolLookupByName(pool_name)
        xml = LibvirtXMLBuilder.build_volume_xml(
            name=name,
            capacity=capacity,
            vol_format=self.format,
            backing_store_path=backing_store_path,
            backing_store_format=backing_store_format,
        )
        libvirt_volume = pool.createXML(xml, 0)
        self.uuid = libvirt_volume.key()
        super(LibvirtVolume, self).define()

        # Upload predefined image to the volume
        if self.source_image is not None:
            self.upload(self.source_image)
Exemplo n.º 3
0
    def test_deepgetattr(self):
        # pylint: disable=attribute-defined-outside-init
        class Tst(object):
            one = 1

        tst = Tst()
        tst2 = Tst()
        tst2.two = Tst()
        # pylint: enable=attribute-defined-outside-init

        result = helpers.deepgetattr(tst, 'one')
        self.assertEqual(result, 1)
        result = helpers.deepgetattr(tst2, 'two.one')
        self.assertEqual(result, 1)
        result = helpers.deepgetattr(tst, 'two.one')
        self.assertIsNone(result)
        result = helpers.deepgetattr(tst, 'two.one', default=0)
        self.assertEqual(result, 0)
        result = helpers.deepgetattr(tst2, 'two_one', splitter='_')
        self.assertEqual(result, 1)
        self.assertRaises(
            AttributeError,
            helpers.deepgetattr,
            tst, 'two.one', do_raise=True
        )
Exemplo n.º 4
0
    def test_deepgetattr(self):
        # pylint: disable=attribute-defined-outside-init
        class Tst(object):
            one = 1

        tst = Tst()
        tst2 = Tst()
        tst2.two = Tst()
        # pylint: enable=attribute-defined-outside-init

        result = helpers.deepgetattr(tst, 'one')
        self.assertEqual(result, 1)
        result = helpers.deepgetattr(tst2, 'two.one')
        self.assertEqual(result, 1)
        result = helpers.deepgetattr(tst, 'two.one')
        self.assertIsNone(result)
        result = helpers.deepgetattr(tst, 'two.one', default=0)
        self.assertEqual(result, 0)
        result = helpers.deepgetattr(tst2, 'two_one', splitter='_')
        self.assertEqual(result, 1)
        self.assertRaises(AttributeError,
                          helpers.deepgetattr,
                          tst,
                          'two.one',
                          do_raise=True)
Exemplo n.º 5
0
    def network_name(self):
        """Get network name

        :rtype : String
        """
        return underscored(deepgetattr(self, 'group.environment.name'),
                           self.name)
Exemplo n.º 6
0
    def define(self):
        network_name = underscored(
            deepgetattr(self, 'group.environment.name'),
            self.name,
        )

        bridge_name = 'virbr{0}'.format(self.id)

        # TODO(ddmitriev): check if 'vlan' package installed
        # Define tagged interfaces on the bridge
        for vlanid in self.vlan_ifaces:
            self.iface_define(name=bridge_name, vlanid=vlanid)

        # Define libvirt network
        ip_network_address = None
        ip_network_prefixlen = None
        dhcp_range_start = None
        dhcp_range_end = None
        addresses = []
        if self.address_pool is not None:
            # Reserved names 'l2_network_device' and 'dhcp'
            ip_network_address = self.address_pool.get_ip('l2_network_device')

            # Workaround for fuel-qa compatibility, if 'l2_network_device'
            # address was not reserved in the YAML template
            if not ip_network_address:
                ip_network_address = str(self.address_pool.ip_network[1])

            ip_network_prefixlen = str(self.address_pool.ip_network.prefixlen)
            dhcp_range_start = self.address_pool.ip_range_start('dhcp')
            dhcp_range_end = self.address_pool.ip_range_end('dhcp')

            for interface in self.interfaces:
                for address in interface.addresses:
                    ip_addr = netaddr.IPAddress(address.ip_address)
                    if ip_addr in self.address_pool.ip_network:
                        addresses.append(
                            dict(mac=str(interface.mac_address),
                                 ip=str(address.ip_address),
                                 name=interface.node.name))

        xml = LibvirtXMLBuilder.build_network_xml(
            network_name=network_name,
            bridge_name=bridge_name,
            addresses=addresses,
            forward=self.forward.mode,
            ip_network_address=ip_network_address,
            ip_network_prefixlen=ip_network_prefixlen,
            dhcp_range_start=dhcp_range_start,
            dhcp_range_end=dhcp_range_end,
            stp=self.driver.stp,
            has_pxe_server=self.has_pxe_server,
            has_dhcp_server=self.has_dhcp_server,
            tftp_root_dir=self.tftp_root_dir,
        )
        ret = self.driver.conn.networkDefineXML(xml)
        ret.setAutostart(True)
        self.uuid = ret.UUIDString()

        super(L2NetworkDevice, self).define()
Exemplo n.º 7
0
    def network_name(self):
        """Get network name

        :rtype : String
        """
        return underscored(
            deepgetattr(self, 'group.environment.name'),
            self.name)
Exemplo n.º 8
0
    def test_deepgetattr(self):
        class Tst(object):
            one = 1

        tst = Tst()
        tst2 = Tst()
        tst2.two = Tst()
        result = helpers.deepgetattr(tst, 'one')
        self.assertEqual(result, 1)
        result = helpers.deepgetattr(tst2, 'two.one')
        self.assertEqual(result, 1)
        result = helpers.deepgetattr(tst, 'two.one')
        self.assertIsNone(result)
        result = helpers.deepgetattr(tst, 'two.one', default=0)
        self.assertEqual(result, 0)
        result = helpers.deepgetattr(tst2, 'two_one', splitter='_')
        self.assertEqual(result, 1)
        self.assertRaises(AttributeError,
                          helpers.deepgetattr,
                          tst,
                          'two.one',
                          do_raise=True)
Exemplo n.º 9
0
    def filter(self, *args, **kwargs):
        super_filter = super(ParamedModelQuerySet, self).filter

        # split kwargs which django db are not aware of
        # to separate dict
        kwargs_for_params = {}
        db_kwargs = {}

        # Fix deprecated code usage from django
        field_names = self.__get_all_field_names()

        for param in kwargs:
            first_subparam = param.split('__')[0]
            if first_subparam not in field_names:
                kwargs_for_params[param] = kwargs[param]
            else:
                db_kwargs[param] = kwargs[param]

        # filter using db arguments
        queryset = super_filter(*args, **db_kwargs)

        if not kwargs_for_params:
            # return db queryset if there is no params
            return queryset

        # filter using params
        result_ids = []
        for item in queryset:
            for key, value in kwargs_for_params.items():
                # NOTE(astudenov): no support for 'gt', 'lt', 'in'
                # and other django's filter stuff

                if not isinstance(item, self.model):
                    # skip other classes
                    continue

                item_val = helpers.deepgetattr(item,
                                               key,
                                               splitter='__',
                                               do_raise=True)
                if item_val != value:
                    break
            else:
                result_ids.append(item.id)

        # convert result to new queryset using ids
        return super_filter(id__in=result_ids)
Exemplo n.º 10
0
    def filter(self, *args, **kwargs):
        super_filter = super(ParamedModelQuerySet, self).filter

        # split kwargs which django db are not aware of
        # to separate dict
        kwargs_for_params = {}
        db_kwargs = {}

        # Fix deprecated code usage from django
        field_names = self.__get_all_field_names()

        for param in kwargs:
            first_subparam = param.split('__')[0]
            if first_subparam not in field_names:
                kwargs_for_params[param] = kwargs[param]
            else:
                db_kwargs[param] = kwargs[param]

        # filter using db arguments
        queryset = super_filter(*args, **db_kwargs)

        if not kwargs_for_params:
            # return db queryset if there is no params
            return queryset

        # filter using params
        result_ids = []
        for item in queryset:
            for key, value in kwargs_for_params.items():
                # NOTE(astudenov): no support for 'gt', 'lt', 'in'
                # and other django's filter stuff

                if not isinstance(item, self.model):
                    # skip other classes
                    continue

                item_val = helpers.deepgetattr(
                    item, key, splitter='__', do_raise=True)
                if item_val != value:
                    break
            else:
                result_ids.append(item.id)

        # convert result to new queryset using ids
        return super_filter(id__in=result_ids)
Exemplo n.º 11
0
    def define(self):
        """Define node

            :rtype : None
        """
        name = underscored(
            deepgetattr(self, 'group.environment.name'),
            self.name,
        )

        local_disk_devices = []
        for disk in self.disk_devices:
            local_disk_devices.append(dict(
                disk_type=disk.type,
                disk_device=disk.device,
                disk_volume_format=disk.volume.format,
                disk_volume_path=disk.volume.get_path(),
                disk_bus=disk.bus,
                disk_target_dev=disk.target_dev,
                disk_serial=uuid.uuid4().hex,
            ))

        local_interfaces = []
        for interface in self.interfaces:
            if interface.type != 'network':
                raise NotImplementedError(
                    message='Interface types different from network are not '
                            'implemented yet')

            l2_dev = interface.l2_network_device
            filter_name = underscored(
                deepgetattr(self, 'group.environment.name'),
                l2_dev.name,
                interface.mac_address
            )
            target_dev = self.driver.get_available_device_name('virnet')
            local_interfaces.append(dict(
                interface_type=interface.type,
                interface_mac_address=interface.mac_address,
                interface_network_name=l2_dev.network_name,
                interface_target_dev=target_dev,
                interface_model=interface.model,
                interface_filter=filter_name,
            ))

        emulator = self.driver.get_capabilities().find(
            'guest/arch[@name="{0:>s}"]/'
            'domain[@type="{1:>s}"]/emulator'.format(
                self.architecture, self.hypervisor)).text
        node_xml = LibvirtXMLBuilder.build_node_xml(
            name=name,
            hypervisor=self.hypervisor,
            use_host_cpu=self.driver.use_host_cpu,
            vcpu=self.vcpu,
            memory=self.memory,
            use_hugepages=self.driver.use_hugepages,
            hpet=self.driver.hpet,
            os_type=self.os_type,
            architecture=self.architecture,
            boot=self.boot,
            reboot_timeout=self.driver.reboot_timeout,
            bootmenu_timeout=self.bootmenu_timeout,
            emulator=emulator,
            has_vnc=self.has_vnc,
            vnc_password=self.driver.vnc_password,
            local_disk_devices=local_disk_devices,
            interfaces=local_interfaces,
            acpi=self.driver.enable_acpi,
            numa=self.numa,
        )
        logger.debug(node_xml)
        self.uuid = self.driver.conn.defineXML(node_xml).UUIDString()

        super(LibvirtNode, self).define()
Exemplo n.º 12
0
    def snapshot(self, name=None, force=False, description=None,
                 disk_only=False, external=False):

        # Erase existing snapshot or raise an error if already exists
        if self.has_snapshot(name):
            if force:
                self.erase_snapshot(name)
            else:
                raise DevopsError("Snapshot with name {0} already exists"
                                  .format(name))

        # Check that existing snapshot has the same type
        self._assert_snapshot_type(external=external)

        local_disk_devices = []
        if external:
            # EXTERNAL SNAPSHOTS
            if self.driver.get_libvirt_version() < 1002012:
                raise DevopsError(
                    "For external snapshots we need libvirtd >= 1.2.12")

            # Check whether we have directory for snapshots, if not
            # create it
            if not os.path.exists(settings.SNAPSHOTS_EXTERNAL_DIR):
                os.makedirs(settings.SNAPSHOTS_EXTERNAL_DIR)

            # create new volume which will be used as
            # disk for snapshot changes
            self.snapshot_create_child_volumes(name)

            base_memory_file = '{0}/snapshot-memory-{1}_{2}.{3}'.format(
                settings.SNAPSHOTS_EXTERNAL_DIR,
                deepgetattr(self, 'group.environment.name'),
                self.name,
                name)
            file_count = 0
            memory_file = base_memory_file
            while os.path.exists(memory_file):
                memory_file = base_memory_file + '-' + str(file_count)
                file_count += 1

            for disk in self.disk_devices:
                if disk.device == 'disk':
                    local_disk_devices.append(dict(
                        disk_volume_path=disk.volume.get_path(),
                        disk_target_dev=disk.target_dev,
                    ))

            if self.is_active() and not disk_only:
                create_xml_flag = libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT
            else:
                create_xml_flag = (
                    libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY |
                    libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT
                )

        else:
            # ORIGINAL SNAPSHOTS
            memory_file = ''
            create_xml_flag = 0

        xml = LibvirtXMLBuilder.build_snapshot_xml(
            name=name,
            description=description,
            external=external,
            disk_only=disk_only,
            memory_file=memory_file,
            domain_isactive=self.is_active(),
            local_disk_devices=local_disk_devices
        )

        domain = self._libvirt_node
        logger.debug(xml)
        logger.debug(domain.state(0))

        domain.snapshotCreateXML(xml, create_xml_flag)

        if external:
            self.set_snapshot_current(name)

        logger.debug(domain.state(0))
Exemplo n.º 13
0
    def define(self):
        """Define node

            :rtype : None
        """
        name = underscored(
            deepgetattr(self, 'group.environment.name'),
            self.name,
        )

        local_disk_devices = []
        for disk in self.disk_devices:
            local_disk_devices.append(
                dict(
                    disk_type=disk.type,
                    disk_device=disk.device,
                    disk_volume_format=disk.volume.format,
                    disk_volume_path=disk.volume.get_path(),
                    disk_bus=disk.bus,
                    disk_target_dev=disk.target_dev,
                    disk_serial=uuid.uuid4().hex,
                ))

        local_interfaces = []
        for interface in self.interfaces:
            if interface.type != 'network':
                raise NotImplementedError(
                    message='Interface types different from network are not '
                    'implemented yet')

            l2_dev = interface.l2_network_device
            filter_name = underscored(
                deepgetattr(self, 'group.environment.name'), l2_dev.name,
                interface.mac_address)
            target_dev = self.driver.get_available_device_name('virnet')
            local_interfaces.append(
                dict(
                    interface_type=interface.type,
                    interface_mac_address=interface.mac_address,
                    interface_network_name=l2_dev.network_name,
                    interface_target_dev=target_dev,
                    interface_model=interface.model,
                    interface_filter=filter_name,
                ))

        emulator = self.driver.get_capabilities().find(
            'guest/arch[@name="{0:>s}"]/'
            'domain[@type="{1:>s}"]/emulator'.format(self.architecture,
                                                     self.hypervisor)).text
        node_xml = LibvirtXMLBuilder.build_node_xml(
            name=name,
            hypervisor=self.hypervisor,
            use_host_cpu=self.driver.use_host_cpu,
            vcpu=self.vcpu,
            memory=self.memory,
            use_hugepages=self.driver.use_hugepages,
            hpet=self.driver.hpet,
            os_type=self.os_type,
            architecture=self.architecture,
            boot=self.boot,
            reboot_timeout=self.driver.reboot_timeout,
            bootmenu_timeout=self.bootmenu_timeout,
            emulator=emulator,
            has_vnc=self.has_vnc,
            vnc_password=self.driver.vnc_password,
            local_disk_devices=local_disk_devices,
            interfaces=local_interfaces,
            acpi=self.driver.enable_acpi,
            numa=self.numa,
        )
        logger.debug(node_xml)
        self.uuid = self.driver.conn.defineXML(node_xml).UUIDString()

        super(LibvirtNode, self).define()
Exemplo n.º 14
0
    def snapshot(self,
                 name=None,
                 force=False,
                 description=None,
                 disk_only=False,
                 external=False):

        # Erase existing snapshot or raise an error if already exists
        if self.has_snapshot(name):
            if force:
                self.erase_snapshot(name)
            else:
                raise DevopsError(
                    "Snapshot with name {0} already exists".format(name))

        # Check that existing snapshot has the same type
        self._assert_snapshot_type(external=external)

        local_disk_devices = []
        if external:
            # EXTERNAL SNAPSHOTS
            if self.driver.get_libvirt_version() < 1002012:
                raise DevopsError(
                    "For external snapshots we need libvirtd >= 1.2.12")

            # Check whether we have directory for snapshots, if not
            # create it
            if not os.path.exists(settings.SNAPSHOTS_EXTERNAL_DIR):
                os.makedirs(settings.SNAPSHOTS_EXTERNAL_DIR)

            # create new volume which will be used as
            # disk for snapshot changes
            self.snapshot_create_child_volumes(name)

            base_memory_file = '{0}/snapshot-memory-{1}_{2}.{3}'.format(
                settings.SNAPSHOTS_EXTERNAL_DIR,
                deepgetattr(self, 'group.environment.name'), self.name, name)
            file_count = 0
            memory_file = base_memory_file
            while os.path.exists(memory_file):
                memory_file = base_memory_file + '-' + str(file_count)
                file_count += 1

            for disk in self.disk_devices:
                if disk.device == 'disk':
                    local_disk_devices.append(
                        dict(
                            disk_volume_path=disk.volume.get_path(),
                            disk_target_dev=disk.target_dev,
                        ))

            if self.is_active() and not disk_only:
                create_xml_flag = libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT
            else:
                create_xml_flag = (
                    libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY
                    | libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT)

        else:
            # ORIGINAL SNAPSHOTS
            memory_file = ''
            create_xml_flag = 0

        xml = LibvirtXMLBuilder.build_snapshot_xml(
            name=name,
            description=description,
            external=external,
            disk_only=disk_only,
            memory_file=memory_file,
            domain_isactive=self.is_active(),
            local_disk_devices=local_disk_devices)

        domain = self._libvirt_node
        logger.debug(xml)
        logger.debug(domain.state(0))

        domain.snapshotCreateXML(xml, create_xml_flag)

        if external:
            self.set_snapshot_current(name)

        logger.debug(domain.state(0))
Exemplo n.º 15
0
    def define(self):
        network_name = underscored(
            deepgetattr(self, 'group.environment.name'),
            self.name,
        )

        bridge_name = 'virbr{0}'.format(self.id)

        # TODO(ddmitriev): check if 'vlan' package installed
        # Define tagged interfaces on the bridge
        for vlanid in self.vlan_ifaces:
            self.iface_define(name=bridge_name, vlanid=vlanid)

        # Define libvirt network
        ip_network_address = None
        ip_network_prefixlen = None
        dhcp_range_start = None
        dhcp_range_end = None
        addresses = []
        if self.address_pool is not None:
            # Reserved names 'l2_network_device' and 'dhcp'
            ip_network_address = self.address_pool.get_ip('l2_network_device')

            # Workaround for fuel-qa compatibility, if 'l2_network_device'
            # address was not reserved in the YAML template
            if not ip_network_address:
                ip_network_address = str(self.address_pool.ip_network[1])

            ip_network_prefixlen = str(self.address_pool.ip_network.prefixlen)
            dhcp_range_start = self.address_pool.ip_range_start('dhcp')
            dhcp_range_end = self.address_pool.ip_range_end('dhcp')

            for interface in self.interfaces:
                for address in interface.addresses:
                    ip_addr = netaddr.IPAddress(address.ip_address)
                    if ip_addr in self.address_pool.ip_network:
                        addresses.append(dict(
                            mac=str(interface.mac_address),
                            ip=str(address.ip_address),
                            name=interface.node.name
                        ))

        xml = LibvirtXMLBuilder.build_network_xml(
            network_name=network_name,
            bridge_name=bridge_name,
            addresses=addresses,
            forward=self.forward.mode,
            ip_network_address=ip_network_address,
            ip_network_prefixlen=ip_network_prefixlen,
            dhcp_range_start=dhcp_range_start,
            dhcp_range_end=dhcp_range_end,
            stp=self.driver.stp,
            has_pxe_server=self.has_pxe_server,
            has_dhcp_server=self.has_dhcp_server,
            tftp_root_dir=self.tftp_root_dir,
        )
        ret = self.driver.conn.networkDefineXML(xml)
        ret.setAutostart(True)
        self.uuid = ret.UUIDString()

        super(L2NetworkDevice, self).define()