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 | |
| parent | f27ed550fae070c8cfeaf638b2a00a9b80f188c1 (diff) | |
| parent | 97602419375622006a20f81d0f83fd005c6816ac (diff) | |
merge from trunk
| -rw-r--r-- | Authors | 1 | ||||
| -rwxr-xr-x | bin/nova-manage | 13 | ||||
| -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 |
6 files changed, 95 insertions, 34 deletions
@@ -12,6 +12,7 @@ Armando Migliaccio <Armando.Migliaccio@eu.citrix.com> Arvind Somya <asomya@cisco.com> Bilal Akhtar <bilalakhtar@ubuntu.com> Brad Hall <brad@nicira.com> +Brad McConnell <bmcconne@rackspace.com> Brian Lamar <brian.lamar@rackspace.com> Brian Schott <bschott@isi.edu> Brian Waldon <brian.waldon@rackspace.com> diff --git a/bin/nova-manage b/bin/nova-manage index 4e9307273..1f4aa8a78 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -738,7 +738,7 @@ class NetworkCommands(object): help='Multi host') @args('--dns1', dest="dns1", metavar="<DNS Address>", help='First DNS') @args('--dns2', dest="dns2", metavar="<DNS Address>", help='Second DNS') - @args('--uuid', dest="net_uuid", metavar="<network uuid>", + @args('--uuid', dest="uuid", metavar="<network uuid>", help='Network UUID') @args('--project_id', dest="project_id", metavar="<project id>", help='Project id') @@ -763,16 +763,7 @@ class NetworkCommands(object): bridge_required = ['nova.network.manager.FlatManager', 'nova.network.manager.FlatDHCPManager'] if FLAGS.network_manager in bridge_required: - # TODO(tr3buchet) - swap print statement and following line for - # raise statement in diablo 4 - print _('--bridge parameter required or FLAG ' - 'flat_network_bridge must be set to create networks\n' - 'WARNING! ACHTUNG! Setting the bridge to br100 ' - 'automatically is deprecated and will be removed in ' - 'Diablo milestone 4. Prepare yourself accordingly.') - time.sleep(10) - bridge = 'br100' - #raise exception.NetworkNotCreated(req='--bridge') + raise exception.NetworkNotCreated(req='--bridge') bridge_interface = bridge_interface or FLAGS.flat_interface or \ FLAGS.vlan_interface 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) |
