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
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()
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 []