def test_v1_2_to_v1_1_drops_segment_id_in_binding_levels(self): port_new = self._create_test_port() segment = network.NetworkSegment( self.context, # TODO(ihrachys) we should be able to create a segment object # without explicitly specifying id, but it's currently not working id=uuidutils.generate_uuid(), network_id=port_new.network_id, network_type='vxlan') segment.create() # TODO(ihrachys) we should be able to create / update level objects via # Port object, but it's currently not working binding = ports.PortBindingLevel(self.context, port_id=port_new.id, host='host1', level=0, segment_id=segment.id) binding.create() port_new = ports.Port.get_object(self.context, id=port_new.id) port_v1_1 = port_new.obj_to_primitive(target_version='1.1') lvl = port_v1_1['versioned_object.data']['binding_levels'][0] self.assertNotIn('segment_id', lvl['versioned_object.data']) # check that we also downgraded level object version self.assertEqual('1.0', lvl['versioned_object.version']) # finally, prove that binding primitive is now identical to direct # downgrade of the binding object binding_v1_0 = binding.obj_to_primitive(target_version='1.0') self.assertEqual(binding_v1_0, lvl)
def setUp(self): super(TestCacheBackedPluginApi, self).setUp() self._api = rpc.CacheBackedPluginApi(lib_topics.PLUGIN) self._api._legacy_interface = mock.Mock() self._api.remote_resource_cache = mock.Mock() self._network_id = uuidutils.generate_uuid() self._segment_id = uuidutils.generate_uuid() self._segment = network.NetworkSegment( id=self._segment_id, network_id=self._network_id, network_type=constants.TYPE_FLAT) self._port_id = uuidutils.generate_uuid() self._network = network.Network(id=self._network_id, segments=[self._segment]) self._port = ports.Port( id=self._port_id, network_id=self._network_id, mac_address=netaddr.EUI('fa:16:3e:ec:c7:d9'), admin_state_up=True, security_group_ids=set([uuidutils.generate_uuid()]), fixed_ips=[], allowed_address_pairs=[], device_owner=constants.DEVICE_OWNER_COMPUTE_PREFIX, bindings=[ ports.PortBinding(port_id=self._port_id, host='host1', status=constants.ACTIVE, profile={}) ], binding_levels=[ ports.PortBindingLevel(port_id=self._port_id, host='host1', level=0, segment=self._segment) ])
def _test_get_auto_deletable_ports(self, device_owner): network_id = self._create_test_network_id() segment_id = self._create_test_segment_id(network_id) port = self._create_test_port(device_owner=device_owner) binding = ports.PortBindingLevel( self.context, port_id=port.id, host='host1', level=0, segment_id=segment_id) binding.create() return ( ports.Port. get_auto_deletable_port_ids_and_proper_port_count_by_segment( self.context, segment_id))
def _bind_port_level(self, context, level, segments_to_bind): binding = context._binding port_id = context.current['id'] LOG.debug( "Attempting to bind port %(port)s on host %(host)s " "at level %(level)s using segments %(segments)s", { 'port': port_id, 'host': context.host, 'level': level, 'segments': segments_to_bind }) if level == MAX_BINDING_LEVELS: LOG.error( "Exceeded maximum binding levels attempting to bind " "port %(port)s on host %(host)s", { 'port': context.current['id'], 'host': context.host }) return False for driver in self.ordered_mech_drivers: if not self._check_driver_to_bind(driver, segments_to_bind, context._binding_levels): continue try: context._prepare_to_bind(segments_to_bind) driver.obj.bind_port(context) segment = context._new_bound_segment if segment: pbl_obj = ports.PortBindingLevel(context._plugin_context, port_id=port_id, host=context.host, level=level, driver=driver.name, segment_id=segment) context._push_binding_level(pbl_obj) next_segments = context._next_segments_to_bind if next_segments: # Continue binding another level. if self._bind_port_level(context, level + 1, next_segments): return True else: LOG.warning( "Failed to bind port %(port)s on " "host %(host)s at level %(lvl)s", { 'port': context.current['id'], 'host': context.host, 'lvl': level + 1 }) context._pop_binding_level() else: # Binding complete. LOG.debug( "Bound port: %(port)s, " "host: %(host)s, " "vif_type: %(vif_type)s, " "vif_details: %(vif_details)s, " "binding_levels: %(binding_levels)s", { 'port': port_id, 'host': context.host, 'vif_type': binding.vif_type, 'vif_details': binding.vif_details, 'binding_levels': context.binding_levels }) return True except Exception: LOG.exception("Mechanism driver %s failed in " "bind_port", driver.name)