diff options
| author | William Wolf <throughnothing@gmail.com> | 2011-09-20 09:22:25 -0400 |
|---|---|---|
| committer | William Wolf <throughnothing@gmail.com> | 2011-09-20 09:22:25 -0400 |
| commit | 4ee5cab427a95d451a3f33e90d0d5f9d3879c12d (patch) | |
| tree | 39506b9e74d7bdc9d1d50d94465e4c498e5e0a15 /nova | |
| parent | f27ed550fae070c8cfeaf638b2a00a9b80f188c1 (diff) | |
| parent | 97602419375622006a20f81d0f83fd005c6816ac (diff) | |
merge from trunk
Diffstat (limited to 'nova')
| -rw-r--r-- | nova/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py | 32 | ||||
| -rwxr-xr-x | nova/network/linux_net.py | 14 | ||||
| -rw-r--r-- | nova/virt/images.py | 59 | ||||
| -rw-r--r-- | nova/virt/libvirt/connection.py | 10 |
4 files changed, 92 insertions, 23 deletions
diff --git a/nova/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py b/nova/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py index ae9486e58..dadcefc39 100644 --- a/nova/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py +++ b/nova/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py @@ -17,21 +17,9 @@ from migrate import ForeignKeyConstraint from nova import log as logging - meta = MetaData() -instances = Table('instances', meta, - Column('id', Integer(), primary_key=True, nullable=False), - ) - - -vifs = Table('virtual_interfaces', meta, - Column('id', Integer(), primary_key=True, nullable=False), - Column('instance_id', Integer()), - ) - - def upgrade(migrate_engine): # Upgrade operations go here. Don't create your own engine; # bind migrate_engine to your metadata @@ -40,17 +28,18 @@ def upgrade(migrate_engine): if dialect.startswith('sqlite'): return + instances = Table('instances', meta, autoload=True) + vifs = Table('virtual_interfaces', meta, autoload=True) + try: + fkey_name = vifs.c.instance_id.foreign_keys[0].constraint.name ForeignKeyConstraint(columns=[vifs.c.instance_id], - refcolumns=[instances.c.id]).drop() + refcolumns=[instances.c.id], + name=fkey_name).drop() + except Exception: - try: - migrate_engine.execute("ALTER TABLE virtual_interfaces DROP " \ - "FOREIGN KEY " \ - "`virtual_interfaces_ibfk_2`;") - except Exception: - logging.error(_("foreign key constraint couldn't be removed")) - raise + logging.error(_("foreign key constraint couldn't be removed")) + raise def downgrade(migrate_engine): @@ -60,6 +49,9 @@ def downgrade(migrate_engine): if dialect.startswith('sqlite'): return + instances = Table('instances', meta, autoload=True) + vifs = Table('virtual_interfaces', meta, autoload=True) + try: ForeignKeyConstraint(columns=[vifs.c.instance_id], refcolumns=[instances.c.id]).create() diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index 9bf98fc27..ad7c5776b 100755 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -524,6 +524,18 @@ def get_dhcp_hosts(context, network_ref): return '\n'.join(hosts) +def _add_dnsmasq_accept_rules(dev): + """Allow DHCP and DNS traffic through to dnsmasq.""" + table = iptables_manager.ipv4['filter'] + for port in [67, 53]: + for proto in ['udp', 'tcp']: + args = {'dev': dev, 'port': port, 'proto': proto} + table.add_rule('INPUT', + '-i %(dev)s -p %(proto)s -m %(proto)s ' + '--dport %(port)s -j ACCEPT' % args) + iptables_manager.apply() + + def get_dhcp_opts(context, network_ref): """Get network's hosts config in dhcp-opts format.""" hosts = [] @@ -616,6 +628,8 @@ def update_dhcp(context, dev, network_ref): _execute(*cmd, run_as_root=True) + _add_dnsmasq_accept_rules(dev) + @utils.synchronized('radvd_start') def update_ra(context, dev, network_ref): diff --git a/nova/virt/images.py b/nova/virt/images.py index 810b359d9..968fe1692 100644 --- a/nova/virt/images.py +++ b/nova/virt/images.py @@ -21,6 +21,9 @@ Handling of VM disk images. """ +import os + +from nova import exception from nova import flags from nova.image import glance as glance_image_service import nova.image @@ -42,3 +45,59 @@ def fetch(context, image_href, path, _user_id, _project_id): with open(path, "wb") as image_file: metadata = image_service.get(context, image_id, image_file) return metadata + + +def fetch_to_raw(context, image_href, path, user_id, project_id): + path_tmp = "%s.part" % path + metadata = fetch(context, image_href, path_tmp, user_id, project_id) + + def _qemu_img_info(path): + + out, err = utils.execute('env', 'LC_ALL=C', 'LANG=C', + 'qemu-img', 'info', path) + + # output of qemu-img is 'field: value' + # the fields of interest are 'file format' and 'backing file' + data = {} + for line in out.splitlines(): + (field, val) = line.split(':', 1) + if val[0] == " ": + val = val[1:] + data[field] = val + + return(data) + + data = _qemu_img_info(path_tmp) + + fmt = data.get("file format", None) + if fmt == None: + os.unlink(path_tmp) + raise exception.ImageUnacceptable( + reason=_("'qemu-img info' parsing failed."), image_id=image_href) + + if fmt != "raw": + staged = "%s.converted" % path + if "backing file" in data: + backing_file = data['backing file'] + os.unlink(path_tmp) + raise exception.ImageUnacceptable(image_id=image_href, + reason=_("fmt=%(fmt)s backed by: %(backing_file)s") % locals()) + + LOG.debug("%s was %s, converting to raw" % (image_href, fmt)) + out, err = utils.execute('qemu-img', 'convert', '-O', 'raw', + path_tmp, staged) + os.unlink(path_tmp) + + data = _qemu_img_info(staged) + if data.get('file format', None) != "raw": + os.unlink(staged) + raise exception.ImageUnacceptable(image_id=image_href, + reason=_("Converted to raw, but format is now %s") % + data.get('file format', None)) + + os.rename(staged, path) + + else: + os.rename(path_tmp, path) + + return metadata diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index b3c8ebf6e..064c2688f 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -773,7 +773,7 @@ class LibvirtConnection(driver.ComputeDriver): def _fetch_image(self, context, target, image_id, user_id, project_id, size=None): """Grab image and optionally attempt to resize it""" - images.fetch(context, image_id, target, user_id, project_id) + images.fetch_to_raw(context, image_id, target, user_id, project_id) if size: disk.extend(target, size) @@ -874,9 +874,13 @@ class LibvirtConnection(driver.ComputeDriver): local_gb = inst['local_gb'] if local_gb and not self._volume_in_mapping( self.default_local_device, block_device_info): - self._cache_image(fn=self._create_local, + fn = functools.partial(self._create_ephemeral, + fs_label='ephemeral0', + os_type=inst.os_type) + self._cache_image(fn=fn, target=basepath('disk.local'), - fname="local_%s" % local_gb, + fname="ephemeral_%s_%s_%s" % + ("0", local_gb, inst.os_type), cow=FLAGS.use_cow_images, local_size=local_gb) |
