def remove_router_interface(self, context, router_id, interface_info): # make sure router exists router = self._get_router(context, router_id) try: policy.enforce(context, "extension:router:remove_router_interface", self._make_router_dict(router)) except q_exc.PolicyNotAuthorized: raise l3.RouterNotFound(router_id=router_id) if not interface_info: msg = _("Either subnet_id or port_id must be specified") raise q_exc.BadRequest(resource="router", msg=msg) if "port_id" in interface_info: port_id = interface_info["port_id"] port_db = self._get_port(context, port_id) if not (port_db["device_owner"] == DEVICE_OWNER_ROUTER_INTF and port_db["device_id"] == router_id): raise l3.RouterInterfaceNotFound(router_id=router_id, port_id=port_id) if "subnet_id" in interface_info: port_subnet_id = port_db["fixed_ips"][0]["subnet_id"] if port_subnet_id != interface_info["subnet_id"]: raise q_exc.SubnetMismatchForPort(port_id=port_id, subnet_id=interface_info["subnet_id"]) subnet_id = port_db["fixed_ips"][0]["subnet_id"] self._confirm_router_interface_not_in_use(context, router_id, subnet_id) _network_id = port_db["network_id"] self.delete_port(context, port_db["id"], l3_port_check=False) elif "subnet_id" in interface_info: subnet_id = interface_info["subnet_id"] self._confirm_router_interface_not_in_use(context, router_id, subnet_id) subnet = self._get_subnet(context, subnet_id) found = False try: rport_qry = context.session.query(models_v2.Port) ports = rport_qry.filter_by( device_id=router_id, device_owner=DEVICE_OWNER_ROUTER_INTF, network_id=subnet["network_id"] ).all() for p in ports: if p["fixed_ips"][0]["subnet_id"] == subnet_id: port_id = p["id"] _network_id = p["network_id"] self.delete_port(context, p["id"], l3_port_check=False) found = True break except exc.NoResultFound: pass if not found: raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, subnet_id=subnet_id) routers = self.get_sync_data(context.elevated(), [router_id]) l3_rpc_agent_api.L3AgentNotify.routers_updated( context, routers, "remove_router_interface", {"network_id": _network_id, "subnet_id": subnet_id} ) notifier_api.notify( context, notifier_api.publisher_id("network"), "router.interface.delete", notifier_api.CONF.default_notification_level, {"router.interface": {"port_id": port_id, "subnet_id": subnet_id}}, )
def __init__(self, plugin, collection, resource, attr_info, allow_bulk=False, member_actions=None, parent=None): if member_actions is None: member_actions = [] self._plugin = plugin self._collection = collection.replace('-', '_') self._resource = resource self._attr_info = attr_info self._allow_bulk = allow_bulk self._native_bulk = self._is_native_bulk_supported() self._policy_attrs = [name for (name, info) in self._attr_info.items() if info.get('required_by_policy')] self._publisher_id = notifier_api.publisher_id('network') self._member_actions = member_actions if parent: self._parent_id_name = '%s_id' % parent['member_name'] parent_part = '_%s' % parent['member_name'] else: self._parent_id_name = None parent_part = '' self._plugin_handlers = { self.LIST: 'get%s_%s' % (parent_part, self._collection), self.SHOW: 'get%s_%s' % (parent_part, self._resource) } for action in [self.CREATE, self.UPDATE, self.DELETE]: self._plugin_handlers[action] = '%s%s_%s' % (action, parent_part, self._resource)
def __init__(self, plugin, collection, resource, attr_info): self._plugin = plugin self._collection = collection self._resource = resource self._attr_info = attr_info self._policy_attrs = [name for (name, info) in self._attr_info.items() if 'required_by_policy' in info and info['required_by_policy']] self._publisher_id = notifier_api.publisher_id('network')
def __init__(self, plugin, collection, resource, attr_info, allow_bulk=False, member_actions=None, parent=None, allow_pagination=False, allow_sorting=False): if member_actions is None: member_actions = [] self._plugin = plugin self._collection = collection.replace('-', '_') self._resource = resource.replace('-', '_') self._attr_info = attr_info self._allow_bulk = allow_bulk self._allow_pagination = allow_pagination self._allow_sorting = allow_sorting self._native_bulk = self._is_native_bulk_supported() self._native_pagination = self._is_native_pagination_supported() self._native_sorting = self._is_native_sorting_supported() self._policy_attrs = [ name for (name, info) in self._attr_info.items() if info.get('required_by_policy') ] self._publisher_id = notifier_api.publisher_id('network') self._dhcp_agent_notifier = dhcp_rpc_agent_api.DhcpAgentNotifyAPI() self._member_actions = member_actions self._primary_key = self._get_primary_key() if self._allow_pagination and self._native_pagination: # Native pagination need native sorting support if not self._native_sorting: raise Exception( _("Native pagination depend on native " "sorting")) if not self._allow_sorting: LOG.info( _("Allow sorting is enabled because native " "pagination requires native sorting")) self._allow_sorting = True if parent: self._parent_id_name = '%s_id' % parent['member_name'] parent_part = '_%s' % parent['member_name'] else: self._parent_id_name = None parent_part = '' self._plugin_handlers = { self.LIST: 'get%s_%s' % (parent_part, self._collection), self.SHOW: 'get%s_%s' % (parent_part, self._resource) } for action in [self.CREATE, self.UPDATE, self.DELETE]: self._plugin_handlers[action] = '%s%s_%s' % (action, parent_part, self._resource)
def __init__(self, plugin, collection, resource, attr_info, allow_bulk=False): self._plugin = plugin self._collection = collection self._resource = resource self._attr_info = attr_info self._allow_bulk = allow_bulk self._native_bulk = self._is_native_bulk_supported() self._policy_attrs = [name for (name, info) in self._attr_info.items() if info.get('required_by_policy')] self._publisher_id = notifier_api.publisher_id('network')
def __init__(self, plugin, collection, resource, attr_info, allow_bulk=False, member_actions=None): if member_actions is None: member_actions = [] self._plugin = plugin self._collection = collection self._resource = resource self._attr_info = attr_info self._allow_bulk = allow_bulk self._native_bulk = self._is_native_bulk_supported() self._policy_attrs = [name for (name, info) in self._attr_info.items() if info.get("required_by_policy")] self._publisher_id = notifier_api.publisher_id("network") self._member_actions = member_actions
def __init__(self, plugin, collection, resource, attr_info, allow_bulk=False, member_actions=None): if member_actions is None: member_actions = [] self._plugin = plugin self._collection = collection.replace('-', '_') self._resource = resource self._attr_info = attr_info self._allow_bulk = allow_bulk self._native_bulk = self._is_native_bulk_supported() self._policy_attrs = [name for (name, info) in self._attr_info.items() if info.get('required_by_policy')] self._publisher_id = notifier_api.publisher_id('network') self._member_actions = member_actions
def __init__( self, plugin, collection, resource, attr_info, allow_bulk=False, member_actions=None, parent=None, allow_pagination=False, allow_sorting=False, ): if member_actions is None: member_actions = [] self._plugin = plugin self._collection = collection.replace("-", "_") self._resource = resource.replace("-", "_") self._attr_info = attr_info self._allow_bulk = allow_bulk self._allow_pagination = allow_pagination self._allow_sorting = allow_sorting self._native_bulk = self._is_native_bulk_supported() self._native_pagination = self._is_native_pagination_supported() self._native_sorting = self._is_native_sorting_supported() self._policy_attrs = [name for (name, info) in self._attr_info.items() if info.get("required_by_policy")] self._publisher_id = notifier_api.publisher_id("network") self._dhcp_agent_notifier = dhcp_rpc_agent_api.DhcpAgentNotifyAPI() self._member_actions = member_actions self._primary_key = self._get_primary_key() if self._allow_pagination and self._native_pagination: # Native pagination need native sorting support if not self._native_sorting: raise Exception(_("Native pagination depend on native " "sorting")) if not self._allow_sorting: LOG.info(_("Allow sorting is enabled because native " "pagination requires native sorting")) self._allow_sorting = True if parent: self._parent_id_name = "%s_id" % parent["member_name"] parent_part = "_%s" % parent["member_name"] else: self._parent_id_name = None parent_part = "" self._plugin_handlers = { self.LIST: "get%s_%s" % (parent_part, self._collection), self.SHOW: "get%s_%s" % (parent_part, self._resource), } for action in [self.CREATE, self.UPDATE, self.DELETE]: self._plugin_handlers[action] = "%s%s_%s" % (action, parent_part, self._resource)
def _create_metadata_access_network(self, context, router_id): # This will still ensure atomicity on Quantum DB # context.elevated() creates a deep-copy context ctx_elevated = context.elevated() with ctx_elevated.session.begin(subtransactions=True): # Add network # Network name is likely to be truncated on NVP net_data = {'name': ('meta-%s' % router_id)[:40], 'tenant_id': '', # intentionally not set 'admin_state_up': True, 'port_security_enabled': False, 'shared': False, 'status': constants.NET_STATUS_ACTIVE} meta_net = self.create_network(ctx_elevated, {'network': net_data}) # Add subnet subnet_data = {'network_id': meta_net['id'], 'tenant_id': '', # intentionally not set 'name': 'meta-%s' % router_id, 'ip_version': 4, 'shared': False, 'cidr': METADATA_SUBNET_CIDR, 'enable_dhcp': True, # Ensure default allocation pool is generated 'allocation_pools': attributes.ATTR_NOT_SPECIFIED, 'gateway_ip': METADATA_GATEWAY_IP, 'dns_nameservers': [], 'host_routes': []} meta_sub = self.create_subnet(ctx_elevated, {'subnet': subnet_data}) self.add_router_interface(ctx_elevated, router_id, {'subnet_id': meta_sub['id']}) # We need to send a notification to the dhcp agent in order # to start the metadata agent proxy # Note: the publisher id is the same used in the api module notifier_api.notify(context, notifier_api.publisher_id('network'), 'network.create.end', notifier_api.CONF.default_notification_level, {'network': meta_net})
def _destroy_metadata_access_network(self, context, router_id, ports): # context.elevated() creates a deep-copy context ctx_elevated = context.elevated() # This will still ensure atomicity on Quantum DB with ctx_elevated.session.begin(subtransactions=True): if ports: meta_port = self._find_metadata_port(ctx_elevated, ports) if not meta_port: return meta_net_id = meta_port['network_id'] self.remove_router_interface( ctx_elevated, router_id, {'port_id': meta_port['id']}) # Remove network (this will remove the subnet too) self.delete_network(ctx_elevated, meta_net_id) # We need to send a notification to the dhcp agent in order # to stop the metadata agent proxy # Note: the publisher id is the same used in the api module notifier_api.notify( context, notifier_api.publisher_id('network'), 'network.delete.end', notifier_api.CONF.default_notification_level, {'network_id': meta_net_id})
def remove_router_interface(self, context, router_id, interface_info): if not interface_info: msg = _("Either subnet_id or port_id must be specified") raise q_exc.BadRequest(resource='router', msg=msg) if 'port_id' in interface_info: port_id = interface_info['port_id'] port_db = self._get_port(context, port_id) if not (port_db['device_owner'] == DEVICE_OWNER_ROUTER_INTF and port_db['device_id'] == router_id): raise l3.RouterInterfaceNotFound(router_id=router_id, port_id=port_id) if 'subnet_id' in interface_info: port_subnet_id = port_db['fixed_ips'][0]['subnet_id'] if port_subnet_id != interface_info['subnet_id']: raise q_exc.SubnetMismatchForPort( port_id=port_id, subnet_id=interface_info['subnet_id']) subnet_id = port_db['fixed_ips'][0]['subnet_id'] subnet = self._get_subnet(context, subnet_id) self._confirm_router_interface_not_in_use(context, router_id, subnet_id) _network_id = port_db['network_id'] self.delete_port(context, port_db['id'], l3_port_check=False) elif 'subnet_id' in interface_info: subnet_id = interface_info['subnet_id'] self._confirm_router_interface_not_in_use(context, router_id, subnet_id) subnet = self._get_subnet(context, subnet_id) found = False try: rport_qry = context.session.query(models_v2.Port) ports = rport_qry.filter_by( device_id=router_id, device_owner=DEVICE_OWNER_ROUTER_INTF, network_id=subnet['network_id']) for p in ports: if p['fixed_ips'][0]['subnet_id'] == subnet_id: port_id = p['id'] _network_id = p['network_id'] self.delete_port(context, p['id'], l3_port_check=False) found = True break except exc.NoResultFound: pass if not found: raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, subnet_id=subnet_id) routers = self.get_sync_data(context.elevated(), [router_id]) l3_rpc_agent_api.L3AgentNotify.routers_updated( context, routers, 'remove_router_interface', { 'network_id': _network_id, 'subnet_id': subnet_id }) info = { 'id': router_id, 'tenant_id': subnet['tenant_id'], 'port_id': port_id, 'subnet_id': subnet_id } notifier_api.notify(context, notifier_api.publisher_id('network'), 'router.interface.delete', notifier_api.CONF.default_notification_level, {'router.interface': info}) return info
def add_router_interface(self, context, router_id, interface_info): if not interface_info: msg = _("Either subnet_id or port_id must be specified") raise q_exc.BadRequest(resource='router', msg=msg) if 'port_id' in interface_info: if 'subnet_id' in interface_info: msg = _("Cannot specify both subnet-id and port-id") raise q_exc.BadRequest(resource='router', msg=msg) port = self._get_port(context, interface_info['port_id']) if port['device_id']: raise q_exc.PortInUse(net_id=port['network_id'], port_id=port['id'], device_id=port['device_id']) fixed_ips = [ip for ip in port['fixed_ips']] if len(fixed_ips) != 1: msg = _('Router port must have exactly one fixed IP') raise q_exc.BadRequest(resource='router', msg=msg) subnet_id = fixed_ips[0]['subnet_id'] subnet = self._get_subnet(context, subnet_id) self._check_for_dup_router_subnet(context, router_id, port['network_id'], subnet['id'], subnet['cidr']) port.update({ 'device_id': router_id, 'device_owner': DEVICE_OWNER_ROUTER_INTF }) elif 'subnet_id' in interface_info: subnet_id = interface_info['subnet_id'] subnet = self._get_subnet(context, subnet_id) # Ensure the subnet has a gateway if not subnet['gateway_ip']: msg = _('Subnet for router interface must have a gateway IP') raise q_exc.BadRequest(resource='router', msg=msg) self._check_for_dup_router_subnet(context, router_id, subnet['network_id'], subnet_id, subnet['cidr']) fixed_ip = { 'ip_address': subnet['gateway_ip'], 'subnet_id': subnet['id'] } port = self.create_port( context, { 'port': { 'tenant_id': subnet['tenant_id'], 'network_id': subnet['network_id'], 'fixed_ips': [fixed_ip], 'mac_address': attributes.ATTR_NOT_SPECIFIED, 'admin_state_up': True, 'device_id': router_id, 'device_owner': DEVICE_OWNER_ROUTER_INTF, 'name': '' } }) routers = self.get_sync_data(context.elevated(), [router_id]) l3_rpc_agent_api.L3AgentNotify.routers_updated( context, routers, 'add_router_interface', { 'network_id': port['network_id'], 'subnet_id': subnet_id }) info = { 'id': router_id, 'tenant_id': subnet['tenant_id'], 'port_id': port['id'], 'subnet_id': port['fixed_ips'][0]['subnet_id'] } notifier_api.notify(context, notifier_api.publisher_id('network'), 'router.interface.create', notifier_api.CONF.default_notification_level, {'router.interface': info}) return info
def remove_router_interface(self, context, router_id, interface_info): if not interface_info: msg = _("Either subnet_id or port_id must be specified") raise q_exc.BadRequest(resource='router', msg=msg) if 'port_id' in interface_info: port_id = interface_info['port_id'] port_db = self._get_port(context, port_id) if not (port_db['device_owner'] == DEVICE_OWNER_ROUTER_INTF and port_db['device_id'] == router_id): raise l3.RouterInterfaceNotFound(router_id=router_id, port_id=port_id) if 'subnet_id' in interface_info: port_subnet_id = port_db['fixed_ips'][0]['subnet_id'] if port_subnet_id != interface_info['subnet_id']: raise q_exc.SubnetMismatchForPort( port_id=port_id, subnet_id=interface_info['subnet_id']) subnet_id = port_db['fixed_ips'][0]['subnet_id'] subnet = self._get_subnet(context, subnet_id) self._confirm_router_interface_not_in_use( context, router_id, subnet_id) _network_id = port_db['network_id'] self.delete_port(context, port_db['id'], l3_port_check=False) elif 'subnet_id' in interface_info: subnet_id = interface_info['subnet_id'] self._confirm_router_interface_not_in_use(context, router_id, subnet_id) subnet = self._get_subnet(context, subnet_id) found = False try: rport_qry = context.session.query(models_v2.Port) ports = rport_qry.filter_by( device_id=router_id, device_owner=DEVICE_OWNER_ROUTER_INTF, network_id=subnet['network_id']).all() for p in ports: if p['fixed_ips'][0]['subnet_id'] == subnet_id: port_id = p['id'] _network_id = p['network_id'] self.delete_port(context, p['id'], l3_port_check=False) found = True break except exc.NoResultFound: pass if not found: raise l3.RouterInterfaceNotFoundForSubnet(router_id=router_id, subnet_id=subnet_id) routers = self.get_sync_data(context.elevated(), [router_id]) l3_rpc_agent_api.L3AgentNotify.routers_updated( context, routers, 'remove_router_interface', {'network_id': _network_id, 'subnet_id': subnet_id}) info = {'id': router_id, 'tenant_id': subnet['tenant_id'], 'port_id': port_id, 'subnet_id': subnet_id} notifier_api.notify(context, notifier_api.publisher_id('network'), 'router.interface.delete', notifier_api.CONF.default_notification_level, {'router.interface': info})
def add_router_interface(self, context, router_id, interface_info): if not interface_info: msg = _("Either subnet_id or port_id must be specified") raise q_exc.BadRequest(resource='router', msg=msg) if 'port_id' in interface_info: if 'subnet_id' in interface_info: msg = _("Cannot specify both subnet-id and port-id") raise q_exc.BadRequest(resource='router', msg=msg) port = self._get_port(context, interface_info['port_id']) if port['device_id']: raise q_exc.PortInUse(net_id=port['network_id'], port_id=port['id'], device_id=port['device_id']) fixed_ips = [ip for ip in port['fixed_ips']] if len(fixed_ips) != 1: msg = _('Router port must have exactly one fixed IP') raise q_exc.BadRequest(resource='router', msg=msg) subnet_id = fixed_ips[0]['subnet_id'] subnet = self._get_subnet(context, subnet_id) self._check_for_dup_router_subnet(context, router_id, port['network_id'], subnet['id'], subnet['cidr']) port.update({'device_id': router_id, 'device_owner': DEVICE_OWNER_ROUTER_INTF}) elif 'subnet_id' in interface_info: subnet_id = interface_info['subnet_id'] subnet = self._get_subnet(context, subnet_id) # Ensure the subnet has a gateway if not subnet['gateway_ip']: msg = _('Subnet for router interface must have a gateway IP') raise q_exc.BadRequest(resource='router', msg=msg) self._check_for_dup_router_subnet(context, router_id, subnet['network_id'], subnet_id, subnet['cidr']) fixed_ip = {'ip_address': subnet['gateway_ip'], 'subnet_id': subnet['id']} port = self.create_port(context, { 'port': {'tenant_id': subnet['tenant_id'], 'network_id': subnet['network_id'], 'fixed_ips': [fixed_ip], 'mac_address': attributes.ATTR_NOT_SPECIFIED, 'admin_state_up': True, 'device_id': router_id, 'device_owner': DEVICE_OWNER_ROUTER_INTF, 'name': ''}}) routers = self.get_sync_data(context.elevated(), [router_id]) l3_rpc_agent_api.L3AgentNotify.routers_updated( context, routers, 'add_router_interface', {'network_id': port['network_id'], 'subnet_id': subnet_id}) info = {'id': router_id, 'tenant_id': subnet['tenant_id'], 'port_id': port['id'], 'subnet_id': port['fixed_ips'][0]['subnet_id']} notifier_api.notify(context, notifier_api.publisher_id('network'), 'router.interface.create', notifier_api.CONF.default_notification_level, {'router.interface': info}) return info
def add_router_interface(self, context, router_id, interface_info): # make sure router exists router = self._get_router(context, router_id) if not interface_info: msg = _("Either subnet_id or port_id must be specified") raise q_exc.BadRequest(resource="router", msg=msg) try: policy.enforce(context, "extension:router:add_router_interface", self._make_router_dict(router)) except q_exc.PolicyNotAuthorized: raise l3.RouterNotFound(router_id=router_id) if "port_id" in interface_info: if "subnet_id" in interface_info: msg = _("Cannot specify both subnet-id and port-id") raise q_exc.BadRequest(resource="router", msg=msg) port = self._get_port(context, interface_info["port_id"]) if port["device_id"]: raise q_exc.PortInUse(net_id=port["network_id"], port_id=port["id"], device_id=port["device_id"]) fixed_ips = [ip for ip in port["fixed_ips"]] if len(fixed_ips) != 1: msg = _("Router port must have exactly one fixed IP") raise q_exc.BadRequest(resource="router", msg=msg) subnet_id = fixed_ips[0]["subnet_id"] subnet = self._get_subnet(context, subnet_id) self._check_for_dup_router_subnet(context, router_id, port["network_id"], subnet["id"], subnet["cidr"]) port.update({"device_id": router_id, "device_owner": DEVICE_OWNER_ROUTER_INTF}) elif "subnet_id" in interface_info: subnet_id = interface_info["subnet_id"] subnet = self._get_subnet(context, subnet_id) # Ensure the subnet has a gateway if not subnet["gateway_ip"]: msg = _("Subnet for router interface must have a gateway IP") raise q_exc.BadRequest(resource="router", msg=msg) self._check_for_dup_router_subnet(context, router_id, subnet["network_id"], subnet_id, subnet["cidr"]) fixed_ip = {"ip_address": subnet["gateway_ip"], "subnet_id": subnet["id"]} port = self.create_port( context, { "port": { "tenant_id": subnet["tenant_id"], "network_id": subnet["network_id"], "fixed_ips": [fixed_ip], "mac_address": attributes.ATTR_NOT_SPECIFIED, "admin_state_up": True, "device_id": router_id, "device_owner": DEVICE_OWNER_ROUTER_INTF, "name": "", } }, ) routers = self.get_sync_data(context.elevated(), [router_id]) l3_rpc_agent_api.L3AgentNotify.routers_updated( context, routers, "add_router_interface", {"network_id": port["network_id"], "subnet_id": subnet_id} ) info = {"port_id": port["id"], "subnet_id": port["fixed_ips"][0]["subnet_id"]} notifier_api.notify( context, notifier_api.publisher_id("network"), "router.interface.create", notifier_api.CONF.default_notification_level, {"router.interface": info}, ) return info