diff options
| author | danwent <danwent@dan-xs3-cs> | 2011-07-20 00:41:26 -0700 |
|---|---|---|
| committer | danwent <danwent@dan-xs3-cs> | 2011-07-20 00:41:26 -0700 |
| commit | 979282fba8b9dc20bc6345a3b3c017d6339662fa (patch) | |
| tree | 7ad3c286d50834f85ad187df672b2018bdad09ab | |
| parent | f8a562edf819085820c1d6b4639f2331330cc454 (diff) | |
first cut of xenserver vif-plugging, some minor tweaks to libvirt plugging
| -rw-r--r-- | nova/virt/libvirt/connection.py | 8 | ||||
| -rw-r--r-- | nova/virt/libvirt/vif.py | 5 | ||||
| -rw-r--r-- | nova/virt/xenapi/vm_utils.py | 22 | ||||
| -rw-r--r-- | nova/virt/xenapi/vmops.py | 34 | ||||
| -rw-r--r-- | nova/virt/xenapi_conn.py | 3 |
5 files changed, 33 insertions, 39 deletions
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 936e1b171..1fa6e5c2f 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -261,11 +261,9 @@ class LibvirtConnection(driver.ComputeDriver): def setup_vif_network(self, ctxt, instance_id): """Set up VIF networking on the host.""" - # FIXME: this is dying because DB has no networks for instances - #networks = db.network_get_all_by_instance(ctxt, instance_id) - #for network in networks: - # self.vif_driver.plug(network) - pass + networks = db.network_get_all_by_instance(ctxt, instance_id) + for network in networks: + self.vif_driver.plug(network) def destroy(self, instance, network_info, cleanup=True): instance_name = instance['name'] diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index 4f7bb0b4d..2188251f0 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -28,6 +28,8 @@ FLAGS = flags.FLAGS flags.DEFINE_bool('allow_project_net_traffic', True, 'Whether to allow in project network traffic') +flags.DEFINE_string('libvirt_ovs_integration_bridge', 'br-int', + 'Name of Integration Bridge used by Open vSwitch') class LibvirtVIF(object): @@ -110,7 +112,7 @@ class LibvirtOpenVswitchDriver(VIFDriver): utils.execute('sudo', 'ip', 'tuntap', 'add', dev, 'mode', 'tap') utils.execute('sudo', 'ip', 'link', 'set', dev, 'up') utils.execute('sudo', 'ovs-vsctl', '--', '--may-exist', 'add-port', - FLAGS.flat_network_bridge, dev, + FLAGS.libvirt_ovs_integration_bridge, dev, '--', 'set', 'Interface', dev, "external-ids:iface-id=%s" % vif_id, '--', 'set', 'Interface', dev, "external-ids:iface-status=active", '--', 'set', 'Interface', dev, "external-ids:attached-mac=%s" % \ @@ -120,7 +122,6 @@ class LibvirtOpenVswitchDriver(VIFDriver): 'script': '', 'name': dev, 'mac_address': mapping['mac']} - print "using result = %s" % str(result) return result def plug(self, network): diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index 71107aff4..e63582b54 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -282,27 +282,6 @@ class VMHelper(HelperBase): LOG.exception(exc) raise StorageError(_('Unable to destroy VDI %s') % vdi_ref) - @classmethod - def create_vif(cls, session, vm_ref, network_ref, mac_address, - dev, rxtx_cap=0): - """Create a VIF record. Returns a Deferred that gives the new - VIF reference.""" - vif_rec = {} - vif_rec['device'] = str(dev) - vif_rec['network'] = network_ref - vif_rec['VM'] = vm_ref - vif_rec['MAC'] = mac_address - vif_rec['MTU'] = '1500' - vif_rec['other_config'] = {} - vif_rec['qos_algorithm_type'] = "ratelimit" if rxtx_cap else '' - vif_rec['qos_algorithm_params'] = \ - {"kbps": str(rxtx_cap * 1024)} if rxtx_cap else {} - LOG.debug(_('Creating VIF for VM %(vm_ref)s,' - ' network %(network_ref)s.') % locals()) - vif_ref = session.call_xenapi('VIF.create', vif_rec) - LOG.debug(_('Created VIF %(vif_ref)s for VM %(vm_ref)s,' - ' network %(network_ref)s.') % locals()) - return vif_ref @classmethod def create_vdi(cls, session, sr_ref, name_label, virtual_size, read_only): @@ -1116,7 +1095,6 @@ def _stream_disk(dev, image_type, virtual_size, image_file): for chunk in image_file: f.write(chunk) - def _write_partition(virtual_size, dev): dest = '/dev/%s' % dev primary_first = MBR_SIZE_SECTORS diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index c332c27b0..26f90fedd 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -52,6 +52,9 @@ FLAGS = flags.FLAGS flags.DEFINE_integer('windows_version_timeout', 300, 'number of seconds to wait for windows agent to be ' 'fully operational') +flags.DEFINE_string('xenapi_vif_driver', + 'nova.virt.xenapi.vif.XenAPIBridgeDriver', + 'The XenAPI VIF driver using XenServer Network APIs.') def cmp_version(a, b): @@ -78,6 +81,7 @@ class VMOps(object): self._session = session self.poll_rescue_last_ran = None VMHelper.XenAPI = self.XenAPI + self.vif_driver = utils.import_object(FLAGS.xenapi_vif_driver) def list_instances(self): """List VM instances.""" @@ -255,7 +259,7 @@ class VMOps(object): VMHelper.preconfigure_instance(self._session, instance, first_vdi_ref, network_info) - self.create_vifs(vm_ref, network_info) + self.create_vifs(vm_ref, instance, network_info) self.inject_network_info(instance, network_info, vm_ref) return vm_ref @@ -873,6 +877,11 @@ class VMOps(object): self._destroy_kernel_ramdisk(instance, vm_ref) self._destroy_vm(instance, vm_ref) + networks = db.network_get_all_by_instance(ctxt, instance['id']) + for network in networks: + self.vif_driver.unplug(network) + + def _wait_with_callback(self, instance_id, task, callback): ret = None try: @@ -1068,7 +1077,7 @@ class VMOps(object): # catch KeyError for domid if instance isn't running pass - def create_vifs(self, vm_ref, network_info): + def create_vifs(self, vm_ref, instance, network_info): """Creates vifs for an instance.""" logging.debug(_("creating vif(s) for vm: |%s|"), vm_ref) @@ -1077,14 +1086,19 @@ class VMOps(object): self._session.get_xenapi().VM.get_record(vm_ref) for device, (network, info) in enumerate(network_info): - mac_address = info['mac'] - bridge = network['bridge'] - rxtx_cap = info.pop('rxtx_cap') - network_ref = \ - NetworkHelper.find_network_with_bridge(self._session, - bridge) - VMHelper.create_vif(self._session, vm_ref, network_ref, - mac_address, device, rxtx_cap) + vif_rec = self.vif_driver.get_vif_rec(self._session, + vm_ref, instance, device, network, info) + LOG.debug(_('Creating VIF for VM %(vm_ref)s,' \ + ' network %(network_ref)s.') % locals()) + vif_ref = session.call_xenapi('VIF.create', vif_rec) + LOG.debug(_('Created VIF %(vif_ref)s for VM %(vm_ref)s,' + ' network %(network_ref)s.') % locals()) + + def setup_vif_network(self, ctxt, instance_id): + """Set up VIF networking on the host.""" + networks = db.network_get_all_by_instance(ctxt, instance_id) + for network in networks: + self.vif_driver.plug(network) def reset_network(self, instance, vm_ref=None): """Creates uuid arg to pass to make_agent_call and calls it.""" diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py index 032ab7345..ae39ecab4 100644 --- a/nova/virt/xenapi_conn.py +++ b/nova/virt/xenapi_conn.py @@ -269,6 +269,9 @@ class XenAPIConnection(driver.ComputeDriver): """inject network info for specified instance""" self._vmops.inject_network_info(instance, network_info) + def setup_vif_network(self, ctxt, instance_id): + self._vmops.setup_vif_network(ctxt, instance_id) + def get_info(self, instance_id): """Return data about VM instance""" return self._vmops.get_info(instance_id) |
