# Pastebin L3Y68sS2 diff --git a/nova/conductor/tasks/live_migrate.py b/nova/conductor/tasks/live_migrate.py index a5b1ddfde9..772384566f 100644 --- a/nova/conductor/tasks/live_migrate.py +++ b/nova/conductor/tasks/live_migrate.py @@ -19,6 +19,7 @@ from nova.conductor.tasks import base import nova.conf from nova import exception from nova.i18n import _ +from nova.network.neutronv2 import api as neutronapi from nova import objects from nova.scheduler import utils as scheduler_utils from nova import utils @@ -224,6 +225,30 @@ class LiveMigrationTask(base.TaskBase): reason=(_('Unable to determine in which cell ' 'destination host %s lives.') % self.destination)) + def _get_segment_ids_for_vif(self, vif): + segments = [] + neutron_api = neutronapi.get_client(self.context) + results = neutron_api.show_port(vif) + port = results.get('port') + for fixed_ip in port.get('fixed_ips', []): + subnet_id = fixed_ip.get('subnet_id') + if subnet_id: + results = neutron_api.show_subnet(subnet_id) + segment = results.get('subnet', {}).get('segment_id') + if segment: + segments.append(segment) + return segments + + def _check_routed_networks(self): + segment_ids = [] + nw_info = self.instance.get_network_info() + for vif in nw_info: + seg_id = self._get_segment_ids_for_vif(vif['id']) + if seg_id: + segment_ids.extend(seg_id) + if segment_ids: + self.request_spec.scheduler_hints['routed_segments'] = segment_ids + def _find_destination(self): # TODO(johngarbutt) this retry loop should be shared attempted_hosts = [self.source] @@ -262,6 +287,7 @@ class LiveMigrationTask(base.TaskBase): request_spec.requested_destination = objects.Destination( cell=cell_mapping) + self._check_routed_networks() request_spec.ensure_project_id(self.instance) host = None while host is None: