summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorWilliam Wolf <throughnothing@gmail.com>2011-09-20 09:22:25 -0400
committerWilliam Wolf <throughnothing@gmail.com>2011-09-20 09:22:25 -0400
commit4ee5cab427a95d451a3f33e90d0d5f9d3879c12d (patch)
tree39506b9e74d7bdc9d1d50d94465e4c498e5e0a15 /nova
parentf27ed550fae070c8cfeaf638b2a00a9b80f188c1 (diff)
parent97602419375622006a20f81d0f83fd005c6816ac (diff)
merge from trunk
Diffstat (limited to 'nova')
-rw-r--r--nova/db/sqlalchemy/migrate_repo/versions/047_remove_instances_fk_from_vif.py32
-rwxr-xr-xnova/network/linux_net.py14
-rw-r--r--nova/virt/images.py59
-rw-r--r--nova/virt/libvirt/connection.py10
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)