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)
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)
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 )
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)
def network_name(self): """Get network name :rtype : String """ return underscored(deepgetattr(self, 'group.environment.name'), self.name)
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()
def network_name(self): """Get network name :rtype : String """ return underscored( deepgetattr(self, 'group.environment.name'), self.name)
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)
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)
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)
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()
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))
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()
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))
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()