示例#1
0
class BGPVPNPortAssociation(base.NeutronDbObject):
    # Version 1.0: Initial version
    VERSION = '1.0'

    new_facade = True
    db_model = bgpvpn_db.BGPVPNPortAssociation

    fields = {
        'id': common_types.UUIDField(),
        'project_id': obj_fields.StringField(),
        'bgpvpn_id': obj_fields.StringField(),
        'bgpvpn': obj_fields.ObjectField('BGPVPN'),
        'port_id': obj_fields.StringField(),
        'subnets': common_types.ListOfDictOfMiscValuesField(nullable=True),
        'routes': obj_fields.ListOfObjectsField('BGPVPNPortAssociationRoute'),
        'advertise_fixed_ips': obj_fields.BooleanField(default=True)
    }

    fields_no_update = ['id', 'project_id', 'bgpvpn_id', 'port_id']

    synthetic_fields = ['bgpvpn', 'subnets', 'routes']

    def __init__(self, context=None, **kwargs):
        super(BGPVPNPortAssociation, self).__init__(context, **kwargs)

    def create(self):
        with self.db_context_writer(self.obj_context):
            super(BGPVPNPortAssociation, self).create()
            self.obj_load_attr('subnets')

    def obj_load_attr(self, attrname):
        if attrname == 'subnets':
            self._load_subnets()
        else:
            super(BGPVPNPortAssociation, self).obj_load_attr(attrname)

    def _load_subnets(self, db_obj=None):
        # pylint: disable=no-member
        port = Port.get_object(self.obj_context, id=self.port_id)
        subnets_info = _get_subnets_info(self.obj_context, port.network_id)
        setattr(self, 'subnets', subnets_info)
        self.obj_reset_changes(['subnets'])

    def from_db_object(self, obj):
        super(BGPVPNPortAssociation, self).from_db_object(obj)
        self._load_subnets(obj)

    def all_subnets(self, network_id):
        # pylint: disable=no-member
        return self.subnets
示例#2
0
class QosRuleTypeDriver(base.NeutronObject):
    # Version 1.0: Initial version
    VERSION = '1.0'

    fields = {
        'name': obj_fields.StringField(),
        'supported_parameters': common_types.ListOfDictOfMiscValuesField()
    }

    def to_dict(self):
        return {
            'name': self.name,
            'supported_parameters': self.supported_parameters}

    @classmethod
    def get_objects(cls, context, **kwargs):
        raise NotImplementedError()
示例#3
0
class BGPVPNRouterAssociation(base.NeutronDbObject):
    # Version 1.0: Initial version
    VERSION = '1.0'

    new_facade = True
    db_model = bgpvpn_db.BGPVPNRouterAssociation

    fields = {
        'id':
        common_types.UUIDField(),
        'project_id':
        obj_fields.StringField(),
        'bgpvpn_id':
        obj_fields.StringField(),
        'bgpvpn':
        obj_fields.ObjectField('BGPVPN'),
        'router_id':
        obj_fields.StringField(),
        'connected_networks':
        common_types.ListOfDictOfMiscValuesField(nullable=True)
    }

    fields_no_update = ['id', 'project_id', 'bgpvpn_id', 'router_id']

    synthetic_fields = ['bgpvpn', 'connected_networks']

    def __init__(self, context=None, **kwargs):
        super(BGPVPNRouterAssociation, self).__init__(context, **kwargs)

    def create(self):
        with self.db_context_writer(self.obj_context):
            super(BGPVPNRouterAssociation, self).create()
            self.obj_load_attr('connected_networks')

    def update(self):
        with self.db_context_writer(self.obj_context):
            if 'connected_networks' in self.obj_what_changed():
                self.obj_load_attr('connected_networks')
            super(BGPVPNRouterAssociation, self).update()

    def obj_load_attr(self, attrname):
        if attrname == 'connected_networks':
            return self._load_connected_networks()
        super(BGPVPNRouterAssociation, self).obj_load_attr(attrname)

    @classmethod
    def get_objects(cls,
                    context,
                    _pager=None,
                    validate_filters=True,
                    **kwargs):
        if 'network_id' in kwargs and 'router_id' not in kwargs:
            ports = Port.get_objects(
                context,
                network_id=kwargs.pop('network_id'),
                device_owner=constants.DEVICE_OWNER_ROUTER_INTF)

            router_assocs = []
            for port in ports:
                router_assocs.extend(
                    super(BGPVPNRouterAssociation,
                          cls).get_objects(context,
                                           _pager=_pager,
                                           validate_filters=validate_filters,
                                           router_id=RouterPort.get_object(
                                               context,
                                               port_id=port.id).router_id,
                                           **kwargs))
            return router_assocs

        return super(BGPVPNRouterAssociation,
                     cls).get_objects(context,
                                      _pager=_pager,
                                      validate_filters=validate_filters,
                                      **kwargs)

    def _load_connected_networks(self, db_obj=None):
        # NOTE(tmorin): can be improved by directly looking up
        # Ports with device_id=self.router_id
        router_ports = RouterPort.get_objects(self.obj_context,
                                              router_id=self.router_id)  # pylint: disable=no-member
        connected_networks = []
        for router_port in router_ports:
            port = Port.get_object(self.obj_context, id=router_port.port_id)
            if port:
                # router gateway networks are not considered as requiring
                # to be bound to BGPVPNs
                if port.device_owner == constants.DEVICE_OWNER_ROUTER_GW:
                    LOG.debug("skipping port %s, because router gateway",
                              port.id)
                    continue
                connected_networks.append({
                    'network_id':
                    port.network_id,
                    'subnets':
                    _get_subnets_info(self.obj_context, port.network_id)
                })
            else:
                LOG.warning(
                    "Couldn't find Port for RouterPort (router:%s,"
                    "port:%s)", router_port.router_id, router_port.port_id)
        setattr(self, 'connected_networks', connected_networks)
        self.obj_reset_changes(['connected_networks'])

    def from_db_object(self, obj):
        super(BGPVPNRouterAssociation, self).from_db_object(obj)
        self._load_connected_networks(obj)

    def all_subnets(self, network_id):
        # pylint: disable=no-member
        for connected_net in self.connected_networks:
            if connected_net['network_id'] == network_id:
                return connected_net['subnets']
        return []