summaryrefslogtreecommitdiffstats
path: root/nova/virt
diff options
context:
space:
mode:
authorSalvatore Orlando <salvatore.orlando@eu.citrix.com>2011-07-01 19:06:18 +0100
committerSalvatore Orlando <salvatore.orlando@eu.citrix.com>2011-07-01 19:06:18 +0100
commitf09ca2b453f40f992697015d555a779e9bbe4b7b (patch)
tree513bda35623dbf8edeecce02bc8a21ccdf88fa0a /nova/virt
parentf4753fbcc0f84bf1f6e117e5f983ccffd3a5f93e (diff)
parent6843421be9cdef1fc12d3480889bdcfd96821e1b (diff)
downloadnova-f09ca2b453f40f992697015d555a779e9bbe4b7b.tar.gz
nova-f09ca2b453f40f992697015d555a779e9bbe4b7b.tar.xz
nova-f09ca2b453f40f992697015d555a779e9bbe4b7b.zip
Merge trunk
Fixing docstrings
Diffstat (limited to 'nova/virt')
-rw-r--r--nova/virt/driver.py2
-rw-r--r--nova/virt/fake.py2
-rw-r--r--nova/virt/hyperv.py7
-rw-r--r--nova/virt/libvirt/connection.py25
-rw-r--r--nova/virt/libvirt/firewall.py8
-rw-r--r--nova/virt/libvirt/netutils.py21
-rw-r--r--nova/virt/vmwareapi/vm_util.py6
-rw-r--r--nova/virt/vmwareapi/vmops.py14
-rw-r--r--nova/virt/xenapi/vmops.py134
-rw-r--r--nova/virt/xenapi_conn.py12
10 files changed, 114 insertions, 117 deletions
diff --git a/nova/virt/driver.py b/nova/virt/driver.py
index 2c7c0cfcc..1c9797973 100644
--- a/nova/virt/driver.py
+++ b/nova/virt/driver.py
@@ -242,7 +242,7 @@ class ComputeDriver(object):
"""Update agent on the VM instance."""
raise NotImplementedError()
- def inject_network_info(self, instance):
+ def inject_network_info(self, instance, nw_info):
"""inject network info for specified instance"""
raise NotImplementedError()
diff --git a/nova/virt/fake.py b/nova/virt/fake.py
index f78c29bd0..5fe9d674f 100644
--- a/nova/virt/fake.py
+++ b/nova/virt/fake.py
@@ -129,7 +129,7 @@ class FakeConnection(driver.ComputeDriver):
info_list.append(self._map_to_instance_info(instance))
return info_list
- def spawn(self, instance, network_info=None, block_device_mapping=None):
+ def spawn(self, instance, network_info, block_device_mapping=None):
"""
Create a new instance/VM/domain on the virtualization platform.
diff --git a/nova/virt/hyperv.py b/nova/virt/hyperv.py
index 772e7eb59..f6783f3aa 100644
--- a/nova/virt/hyperv.py
+++ b/nova/virt/hyperv.py
@@ -157,7 +157,12 @@ class HyperVConnection(driver.ComputeDriver):
self._create_vm(instance)
self._create_disk(instance['name'], vhdfile)
- self._create_nic(instance['name'], instance['mac_address'])
+
+ mac_address = None
+ if instance['mac_addresses']:
+ mac_address = instance['mac_addresses'][0]['address']
+
+ self._create_nic(instance['name'], mac_address)
LOG.debug(_('Starting VM %s '), instance.name)
self._set_vm_state(instance['name'], 'Enabled')
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py
index b06bfb714..0c6eaab84 100644
--- a/nova/virt/libvirt/connection.py
+++ b/nova/virt/libvirt/connection.py
@@ -185,6 +185,7 @@ class LibvirtConnection(driver.ComputeDriver):
if state != power_state.RUNNING:
continue
+ self.firewall_driver.setup_basic_filtering(instance)
self.firewall_driver.prepare_instance_filter(instance)
self.firewall_driver.apply_instance_filter(instance)
@@ -770,8 +771,6 @@ class LibvirtConnection(driver.ComputeDriver):
def _create_image(self, inst, libvirt_xml, suffix='', disk_images=None,
network_info=None, block_device_mapping=None):
block_device_mapping = block_device_mapping or []
- if not network_info:
- network_info = netutils.get_network_info(inst)
if not suffix:
suffix = ''
@@ -880,18 +879,20 @@ class LibvirtConnection(driver.ComputeDriver):
have_injected_networks = True
address = mapping['ips'][0]['ip']
+ netmask = mapping['ips'][0]['netmask']
address_v6 = None
if FLAGS.use_ipv6:
address_v6 = mapping['ip6s'][0]['ip']
+ netmask_v6 = mapping['ip6s'][0]['netmask']
net_info = {'name': 'eth%d' % ifc_num,
'address': address,
- 'netmask': network_ref['netmask'],
- 'gateway': network_ref['gateway'],
- 'broadcast': network_ref['broadcast'],
- 'dns': network_ref['dns'],
+ 'netmask': netmask,
+ 'gateway': mapping['gateway'],
+ 'broadcast': mapping['broadcast'],
+ 'dns': mapping['dns'],
'address_v6': address_v6,
- 'gateway_v6': network_ref['gateway_v6'],
- 'netmask_v6': network_ref['netmask_v6']}
+ 'gateway6': mapping['gateway6'],
+ 'netmask_v6': netmask_v6}
nets.append(net_info)
if have_injected_networks:
@@ -927,8 +928,8 @@ class LibvirtConnection(driver.ComputeDriver):
def _get_nic_for_xml(self, network, mapping):
# Assume that the gateway also acts as the dhcp server.
- dhcp_server = network['gateway']
- gateway_v6 = network['gateway_v6']
+ dhcp_server = mapping['gateway']
+ gateway6 = mapping.get('gateway6')
mac_id = mapping['mac'].replace(':', '')
if FLAGS.allow_project_net_traffic:
@@ -954,8 +955,8 @@ class LibvirtConnection(driver.ComputeDriver):
'extra_params': extra_params,
}
- if gateway_v6:
- result['gateway_v6'] = gateway_v6 + "/128"
+ if gateway6:
+ result['gateway6'] = gateway6 + "/128"
return result
diff --git a/nova/virt/libvirt/firewall.py b/nova/virt/libvirt/firewall.py
index b99f2ffb0..379197398 100644
--- a/nova/virt/libvirt/firewall.py
+++ b/nova/virt/libvirt/firewall.py
@@ -620,7 +620,7 @@ class IptablesFirewallDriver(FirewallDriver):
ipv4_rules += ['-j $provider']
ipv6_rules += ['-j $provider']
- dhcp_servers = [network['gateway'] for (network, _m) in network_info]
+ dhcp_servers = [info['gateway'] for (_n, info) in network_info]
for dhcp_server in dhcp_servers:
ipv4_rules.append('-s %s -p udp --sport 67 --dport 68 '
@@ -637,7 +637,7 @@ class IptablesFirewallDriver(FirewallDriver):
# they're not worth the clutter.
if FLAGS.use_ipv6:
# Allow RA responses
- gateways_v6 = [network['gateway_v6'] for (network, _m) in
+ gateways_v6 = [mapping['gateway6'] for (_n, mapping) in
network_info]
for gateway_v6 in gateways_v6:
ipv6_rules.append(
@@ -645,8 +645,8 @@ class IptablesFirewallDriver(FirewallDriver):
#Allow project network traffic
if FLAGS.allow_project_net_traffic:
- cidrv6s = [network['cidr_v6'] for (network, _m)
- in network_info]
+ cidrv6s = [network['cidr_v6'] for (network, _m) in
+ network_info]
for cidrv6 in cidrv6s:
ipv6_rules.append('-s %s -j ACCEPT' % (cidrv6,))
diff --git a/nova/virt/libvirt/netutils.py b/nova/virt/libvirt/netutils.py
index 0bad84f7c..e5aaf7cec 100644
--- a/nova/virt/libvirt/netutils.py
+++ b/nova/virt/libvirt/netutils.py
@@ -49,31 +49,36 @@ def get_ip_version(cidr):
def get_network_info(instance):
+ # TODO(tr3buchet): this function needs to go away! network info
+ # MUST be passed down from compute
# TODO(adiantum) If we will keep this function
# we should cache network_info
admin_context = context.get_admin_context()
- ip_addresses = db.fixed_ip_get_all_by_instance(admin_context,
- instance['id'])
+ fixed_ips = db.fixed_ip_get_by_instance(admin_context, instance['id'])
+ vifs = db.virtual_interface_get_by_instance(admin_context, instance['id'])
networks = db.network_get_all_by_instance(admin_context,
instance['id'])
flavor = db.instance_type_get_by_id(admin_context,
instance['instance_type_id'])
network_info = []
- for network in networks:
- network_ips = [ip for ip in ip_addresses
- if ip['network_id'] == network['id']]
+ for vif in vifs:
+ network = vif['network']
+
+ # determine which of the instance's IPs belong to this network
+ network_ips = [fixed_ip['address'] for fixed_ip in fixed_ips if
+ fixed_ip['network_id'] == network['id']]
def ip_dict(ip):
return {
- 'ip': ip['address'],
+ 'ip': ip,
'netmask': network['netmask'],
'enabled': '1'}
def ip6_dict():
prefix = network['cidr_v6']
- mac = instance['mac_address']
+ mac = vif['address']
project_id = instance['project_id']
return {
'ip': ipv6.to_global(prefix, mac, project_id),
@@ -84,7 +89,7 @@ def get_network_info(instance):
'label': network['label'],
'gateway': network['gateway'],
'broadcast': network['broadcast'],
- 'mac': instance['mac_address'],
+ 'mac': vif['address'],
'rxtx_cap': flavor['rxtx_cap'],
'dns': [network['dns']],
'ips': [ip_dict(ip) for ip in network_ips]}
diff --git a/nova/virt/vmwareapi/vm_util.py b/nova/virt/vmwareapi/vm_util.py
index a2fa7600c..1638149f1 100644
--- a/nova/virt/vmwareapi/vm_util.py
+++ b/nova/virt/vmwareapi/vm_util.py
@@ -61,8 +61,12 @@ def get_vm_create_spec(client_factory, instance, data_store_name,
config_spec.numCPUs = int(instance.vcpus)
config_spec.memoryMB = int(instance.memory_mb)
+ mac_address = None
+ if instance['mac_addresses']:
+ mac_address = instance['mac_addresses'][0]['address']
+
nic_spec = create_network_spec(client_factory,
- network_name, instance.mac_address)
+ network_name, mac_address)
device_config_spec = [nic_spec]
diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py
index 5f76b0df5..94d9e6226 100644
--- a/nova/virt/vmwareapi/vmops.py
+++ b/nova/virt/vmwareapi/vmops.py
@@ -706,18 +706,24 @@ class VMWareVMOps(object):
Set the machine id of the VM for guest tools to pick up and change
the IP.
"""
+ admin_context = context.get_admin_context()
vm_ref = self._get_vm_ref_from_the_name(instance.name)
if vm_ref is None:
raise exception.InstanceNotFound(instance_id=instance.id)
network = db.network_get_by_instance(context.get_admin_context(),
instance['id'])
- mac_addr = instance.mac_address
+ mac_address = None
+ if instance['mac_addresses']:
+ mac_address = instance['mac_addresses'][0]['address']
+
net_mask = network["netmask"]
gateway = network["gateway"]
- ip_addr = db.instance_get_fixed_address(context.get_admin_context(),
- instance['id'])
+ addresses = db.instance_get_fixed_addresses(admin_context,
+ instance['id'])
+ ip_addr = addresses[0] if addresses else None
+
machine_id_chanfge_spec = \
- vm_util.get_machine_id_change_spec(client_factory, mac_addr,
+ vm_util.get_machine_id_change_spec(client_factory, mac_address,
ip_addr, net_mask, gateway)
LOG.debug(_("Reconfiguring VM instance %(name)s to set the machine id "
"with ip - %(ip_addr)s") %
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index 46d559fa0..24bd6bc94 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -26,6 +26,7 @@ import os
import pickle
import subprocess
import sys
+import time
import uuid
from nova import context
@@ -45,7 +46,11 @@ from nova.virt.xenapi.vm_utils import ImageType
XenAPI = None
LOG = logging.getLogger("nova.virt.xenapi.vmops")
+
FLAGS = flags.FLAGS
+flags.DEFINE_integer('windows_version_timeout', 300,
+ 'number of seconds to wait for windows agent to be '
+ 'fully operational')
def cmp_version(a, b):
@@ -104,11 +109,12 @@ class VMOps(object):
vm_ref = VMHelper.lookup(self._session, instance.name)
self._start(instance, vm_ref)
- def finish_resize(self, instance, disk_info):
+ def finish_resize(self, instance, disk_info, network_info):
vdi_uuid = self.link_disks(instance, disk_info['base_copy'],
disk_info['cow'])
vm_ref = self._create_vm(instance,
- [dict(vdi_type='os', vdi_uuid=vdi_uuid)])
+ [dict(vdi_type='os', vdi_uuid=vdi_uuid)],
+ network_info)
self.resize_instance(instance, vdi_uuid)
self._spawn(instance, vm_ref)
@@ -131,7 +137,7 @@ class VMOps(object):
disk_image_type)
return vdis
- def spawn(self, instance, network_info=None):
+ def spawn(self, instance, network_info):
vdis = None
try:
vdis = self._create_disks(instance)
@@ -149,7 +155,7 @@ class VMOps(object):
"""Spawn a rescue instance."""
self.spawn(instance)
- def _create_vm(self, instance, vdis, network_info=None):
+ def _create_vm(self, instance, vdis, network_info):
"""Create VM instance."""
instance_name = instance.name
vm_ref = VMHelper.lookup(self._session, instance_name)
@@ -243,11 +249,6 @@ class VMOps(object):
bootable=False)
userdevice += 1
- # TODO(tr3buchet) - check to make sure we have network info, otherwise
- # create it now. This goes away once nova-multi-nic hits.
- if network_info is None:
- network_info = self._get_network_info(instance)
-
# Alter the image before VM start for, e.g. network injection
if FLAGS.xenapi_inject_image:
VMHelper.preconfigure_instance(self._session, instance,
@@ -279,7 +280,15 @@ class VMOps(object):
'architecture': instance.architecture})
def _check_agent_version():
- version = self.get_agent_version(instance)
+ if instance.os_type == 'windows':
+ # Windows will generally perform a setup process on first boot
+ # that can take a couple of minutes and then reboot. So we
+ # need to be more patient than normal as well as watch for
+ # domid changes
+ version = self.get_agent_version(instance,
+ timeout=FLAGS.windows_version_timeout)
+ else:
+ version = self.get_agent_version(instance)
if not version:
LOG.info(_('No agent version returned by instance'))
return
@@ -575,18 +584,41 @@ class VMOps(object):
task = self._session.call_xenapi('Async.VM.clean_reboot', vm_ref)
self._session.wait_for_task(task, instance.id)
- def get_agent_version(self, instance):
+ def get_agent_version(self, instance, timeout=None):
"""Get the version of the agent running on the VM instance."""
- # Send the encrypted password
- transaction_id = str(uuid.uuid4())
- args = {'id': transaction_id}
- resp = self._make_agent_call('version', instance, '', args)
- if resp is None:
- # No response from the agent
- return
- resp_dict = json.loads(resp)
- return resp_dict['message']
+ def _call():
+ # Send the encrypted password
+ transaction_id = str(uuid.uuid4())
+ args = {'id': transaction_id}
+ resp = self._make_agent_call('version', instance, '', args)
+ if resp is None:
+ # No response from the agent
+ return
+ resp_dict = json.loads(resp)
+ return resp_dict['message']
+
+ if timeout:
+ vm_ref = self._get_vm_opaque_ref(instance)
+ vm_rec = self._session.get_xenapi().VM.get_record(vm_ref)
+
+ domid = vm_rec['domid']
+
+ expiration = time.time() + timeout
+ while time.time() < expiration:
+ ret = _call()
+ if ret:
+ return ret
+
+ vm_rec = self._session.get_xenapi().VM.get_record(vm_ref)
+ if vm_rec['domid'] != domid:
+ LOG.info(_('domid changed from %(olddomid)s to '
+ '%(newdomid)s') % {
+ 'olddomid': domid,
+ 'newdomid': vm_rec['domid']})
+ domid = vm_rec['domid']
+ else:
+ return _call()
def agent_update(self, instance, url, md5sum):
"""Update agent on the VM instance."""
@@ -977,76 +1009,19 @@ class VMOps(object):
# TODO: implement this!
return 'http://fakeajaxconsole/fake_url'
- # TODO(tr3buchet) - remove this function after nova multi-nic
- def _get_network_info(self, instance):
- """Creates network info list for instance."""
- admin_context = context.get_admin_context()
- ips = db.fixed_ip_get_all_by_instance(admin_context,
- instance['id'])
- networks = db.network_get_all_by_instance(admin_context,
- instance['id'])
-
- inst_type = db.instance_type_get_by_id(admin_context,
- instance['instance_type_id'])
-
- network_info = []
- for network in networks:
- network_ips = [ip for ip in ips if ip.network_id == network.id]
-
- def ip_dict(ip):
- return {
- "ip": ip.address,
- "netmask": network["netmask"],
- "enabled": "1"}
-
- def ip6_dict():
- return {
- "ip": ipv6.to_global(network['cidr_v6'],
- instance['mac_address'],
- instance['project_id']),
- "netmask": network['netmask_v6'],
- "enabled": "1"}
-
- info = {
- 'label': network['label'],
- 'gateway': network['gateway'],
- 'broadcast': network['broadcast'],
- 'mac': instance.mac_address,
- 'rxtx_cap': inst_type['rxtx_cap'],
- 'dns': [network['dns']],
- 'ips': [ip_dict(ip) for ip in network_ips]}
- if network['cidr_v6']:
- info['ip6s'] = [ip6_dict()]
- if network['gateway_v6']:
- info['gateway6'] = network['gateway_v6']
- network_info.append((network, info))
- return network_info
-
- #TODO{tr3buchet) remove this shim with nova-multi-nic
- def inject_network_info(self, instance, network_info=None, vm_ref=None):
- """
- shim in place which makes inject_network_info work without being
- passed network_info.
- shim goes away after nova-multi-nic
- """
- if not network_info:
- network_info = self._get_network_info(instance)
- self._inject_network_info(instance, network_info, vm_ref)
-
- def _inject_network_info(self, instance, network_info, vm_ref=None):
+ def inject_network_info(self, instance, network_info, vm_ref=None):
"""
Generate the network info and make calls to place it into the
xenstore and the xenstore param list.
vm_ref can be passed in because it will sometimes be different than
what VMHelper.lookup(session, instance.name) will find (ex: rescue)
"""
- logging.debug(_("injecting network info to xs for vm: |%s|"), vm_ref)
-
if vm_ref:
# this function raises if vm_ref is not a vm_opaque_ref
self._session.get_xenapi().VM.get_record(vm_ref)
else:
vm_ref = VMHelper.lookup(self._session, instance.name)
+ logging.debug(_("injecting network info to xs for vm: |%s|"), vm_ref)
for (network, info) in network_info:
location = 'vm-data/networking/%s' % info['mac'].replace(':', '')
@@ -1063,6 +1038,7 @@ class VMOps(object):
def create_vifs(self, vm_ref, network_info):
"""Creates vifs for an instance."""
+
logging.debug(_("creating vif(s) for vm: |%s|"), vm_ref)
# this function raises if vm_ref is not a vm_opaque_ref
diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py
index 5fcec1715..cd4dc1b60 100644
--- a/nova/virt/xenapi_conn.py
+++ b/nova/virt/xenapi_conn.py
@@ -194,17 +194,17 @@ class XenAPIConnection(driver.ComputeDriver):
def list_instances_detail(self):
return self._vmops.list_instances_detail()
- def spawn(self, instance, network_info=None, block_device_mapping=None):
+ def spawn(self, instance, network_info, block_device_mapping=None):
"""Create VM instance"""
- self._vmops.spawn(instance)
+ self._vmops.spawn(instance, network_info)
def revert_resize(self, instance):
"""Reverts a resize, powering back on the instance"""
self._vmops.revert_resize(instance)
- def finish_resize(self, instance, disk_info):
+ def finish_resize(self, instance, disk_info, network_info):
"""Completes a resize, turning on the migrated instance"""
- self._vmops.finish_resize(instance, disk_info)
+ self._vmops.finish_resize(instance, disk_info, network_info)
def snapshot(self, instance, image_id):
""" Create snapshot from a running VM instance """
@@ -265,9 +265,9 @@ class XenAPIConnection(driver.ComputeDriver):
"""reset networking for specified instance"""
self._vmops.reset_network(instance)
- def inject_network_info(self, instance):
+ def inject_network_info(self, instance, network_info):
"""inject network info for specified instance"""
- self._vmops.inject_network_info(instance)
+ self._vmops.inject_network_info(instance, network_info)
def get_info(self, instance_id):
"""Return data about VM instance"""