예제 #1
0
파일: test_ports.py 프로젝트: wxl98/neutron
    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)
예제 #2
0
 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)
         ])
예제 #3
0
파일: test_ports.py 프로젝트: thh/neutron
 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))
예제 #4
0
    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)