From 40783cee5e520173a4cc37c23dd97be2d37b65fd Mon Sep 17 00:00:00 2001 From: Angus Lees Date: Mon, 2 Mar 2015 17:06:54 +1100 Subject: [PATCH 001/161] Ensure tests run under python2.7 tox uses whatever python version that tox ran with as the default python version for environments (py27,py3x, etc are given a more specific default). Debian's python-tox (for example) uses python3, but we require python2.7 - and a naive `apt-get install python-tox; tox -epep8` fails with py3-related errors on Debian. This change explicitly sets `basepython = python2.7` in several testing environments that would otherwise have used the default basepython. Change-Id: I377ac6d72dec5b85c105d8a1a74f6974efb84dcf --- tox.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tox.ini b/tox.ini index 54d91612310..e09a4042260 100644 --- a/tox.ini +++ b/tox.ini @@ -26,9 +26,11 @@ commands = setenv = VIRTUAL_ENV={envdir} [testenv:api] +basepython = python2.7 setenv = OS_TEST_PATH=./neutron/tests/api [testenv:functional] +basepython = python2.7 setenv = OS_TEST_PATH=./neutron/tests/functional OS_TEST_TIMEOUT=90 deps = @@ -36,6 +38,7 @@ deps = -r{toxinidir}/neutron/tests/functional/requirements.txt [testenv:dsvm-functional] +basepython = python2.7 setenv = OS_TEST_PATH=./neutron/tests/functional OS_SUDO_TESTING=1 OS_ROOTWRAP_CMD=sudo {envbindir}/neutron-rootwrap {envdir}/etc/neutron/rootwrap.conf @@ -50,6 +53,7 @@ sitepackages = True downloadcache = ~/cache/pip [testenv:pep8] +basepython = python2.7 deps = {[testenv]deps} pylint @@ -62,6 +66,7 @@ commands= whitelist_externals = sh [testenv:cover] +basepython = python2.7 commands = python setup.py testr --coverage --testr-args='{posargs}' From 55536a4ecb6c71e5451b8a9664d87e32146f071d Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Fri, 10 Apr 2015 15:07:33 +0200 Subject: [PATCH 002/161] Removed ml2_conf_odl.ini config file The file is already packaged into decomposed networking-odl repo [1]. [1]: https://git.openstack.org/cgit/stackforge/networking-odl/tree/etc/neutron/plugins/ml2/ml2_conf_odl.ini Closes-Bug: #1442615 Change-Id: Ic280454190aab4e3b881cde15a882808b652861e (cherry picked from commit b3334eca0ae9f9c64ccd646035e69081f669e3e4) --- etc/neutron/plugins/ml2/ml2_conf_odl.ini | 30 ------------------------ setup.cfg | 1 - 2 files changed, 31 deletions(-) delete mode 100644 etc/neutron/plugins/ml2/ml2_conf_odl.ini diff --git a/etc/neutron/plugins/ml2/ml2_conf_odl.ini b/etc/neutron/plugins/ml2/ml2_conf_odl.ini deleted file mode 100644 index 9e88c1bbfa5..00000000000 --- a/etc/neutron/plugins/ml2/ml2_conf_odl.ini +++ /dev/null @@ -1,30 +0,0 @@ -# Configuration for the OpenDaylight MechanismDriver - -[ml2_odl] -# (StrOpt) OpenDaylight REST URL -# If this is not set then no HTTP requests will be made. -# -# url = -# Example: url = http://192.168.56.1:8080/controller/nb/v2/neutron - -# (StrOpt) Username for HTTP basic authentication to ODL. -# -# username = -# Example: username = admin - -# (StrOpt) Password for HTTP basic authentication to ODL. -# -# password = -# Example: password = admin - -# (IntOpt) Timeout in seconds to wait for ODL HTTP request completion. -# This is an optional parameter, default value is 10 seconds. -# -# timeout = 10 -# Example: timeout = 15 - -# (IntOpt) Timeout in minutes to wait for a Tomcat session timeout. -# This is an optional parameter, default value is 30 minutes. -# -# session_timeout = 30 -# Example: session_timeout = 60 diff --git a/setup.cfg b/setup.cfg index e689f10e2d0..6fe838f178e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -69,7 +69,6 @@ data_files = etc/neutron/plugins/ml2/ml2_conf_cisco.ini etc/neutron/plugins/ml2/ml2_conf_mlnx.ini etc/neutron/plugins/ml2/ml2_conf_ncs.ini - etc/neutron/plugins/ml2/ml2_conf_odl.ini etc/neutron/plugins/ml2/ml2_conf_ofa.ini etc/neutron/plugins/ml2/ml2_conf_fslsdn.ini etc/neutron/plugins/ml2/ml2_conf_sriov.ini From 1dc98e414f200a78a6b1dc78f222c588646e6935 Mon Sep 17 00:00:00 2001 From: Dane LeBlanc Date: Thu, 9 Apr 2015 10:32:33 -0400 Subject: [PATCH 003/161] IPv6 SLAAC subnet create should update ports on net If ports are first created on a network, and then an IPv6 SLAAC or DHCPv6-stateless subnet is created on that network, then the ports created prior to the subnet create are not getting automatically updated (associated) with addresses for the SLAAC/DHCPv6-stateless subnet, as required. Change-Id: I88d04a13ce5b8ed4c88eac734e589e8a90e986a0 Closes-Bug: 1427474 Closes-Bug: 1441382 Closes-Bug: 1440183 (cherry picked from commit bd1044ba0e9d7d0f4752c891ac340b115f0019c4) --- neutron/db/db_base_plugin_v2.py | 68 ++++++++++++++---- .../tests/unit/db/test_db_base_plugin_v2.py | 69 +++++++++++++++++++ 2 files changed, 125 insertions(+), 12 deletions(-) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index f7bcf8db538..dcf7adc6f6f 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -472,9 +472,9 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, # from subnet else: if is_auto_addr: - prefix = subnet['cidr'] - ip_address = ipv6_utils.get_ipv6_addr_by_EUI64( - prefix, mac_address) + ip_address = self._calculate_ipv6_eui64_addr(context, + subnet, + mac_address) ips.append({'ip_address': ip_address.format(), 'subnet_id': subnet['id']}) else: @@ -531,6 +531,17 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, ips = self._allocate_fixed_ips(context, to_add, mac_address) return ips, prev_ips + def _calculate_ipv6_eui64_addr(self, context, subnet, mac_addr): + prefix = subnet['cidr'] + network_id = subnet['network_id'] + ip_address = ipv6_utils.get_ipv6_addr_by_EUI64( + prefix, mac_addr).format() + if not self._check_unique_ip(context, network_id, + subnet['id'], ip_address): + raise n_exc.IpAddressInUse(net_id=network_id, + ip_address=ip_address) + return ip_address + def _allocate_ips_for_port(self, context, port): """Allocate IP addresses for the port. @@ -585,13 +596,8 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, for subnet in v6_stateless: # IP addresses for IPv6 SLAAC and DHCPv6-stateless subnets # are implicitly included. - prefix = subnet['cidr'] - ip_address = ipv6_utils.get_ipv6_addr_by_EUI64(prefix, - p['mac_address']) - if not self._check_unique_ip(context, p['network_id'], - subnet['id'], ip_address.format()): - raise n_exc.IpAddressInUse(net_id=p['network_id'], - ip_address=ip_address.format()) + ip_address = self._calculate_ipv6_eui64_addr(context, subnet, + p['mac_address']) ips.append({'ip_address': ip_address.format(), 'subnet_id': subnet['id']}) @@ -1343,8 +1349,46 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, 'subnet pool') raise n_exc.BadRequest(resource='subnets', msg=msg) # Create subnet from the implicit(AKA null) pool - return self._create_subnet_from_implicit_pool(context, subnet) - return self._create_subnet_from_pool(context, subnet, subnetpool_id) + created_subnet = self._create_subnet_from_implicit_pool(context, + subnet) + else: + created_subnet = self._create_subnet_from_pool(context, subnet, + subnetpool_id) + + # If this subnet supports auto-addressing, then update any + # internal ports on the network with addresses for this subnet. + if ipv6_utils.is_auto_address_subnet(created_subnet): + self._add_auto_addrs_on_network_ports(context, created_subnet) + + return created_subnet + + def _add_auto_addrs_on_network_ports(self, context, subnet): + """For an auto-address subnet, add addrs for ports on the net.""" + with context.session.begin(subtransactions=True): + network_id = subnet['network_id'] + port_qry = context.session.query(models_v2.Port) + for port in port_qry.filter( + and_(models_v2.Port.network_id == network_id, + models_v2.Port.device_owner != + constants.DEVICE_OWNER_ROUTER_SNAT, + ~models_v2.Port.device_owner.in_( + constants.ROUTER_INTERFACE_OWNERS))): + ip_address = self._calculate_ipv6_eui64_addr( + context, subnet, port['mac_address']) + allocated = models_v2.IPAllocation(network_id=network_id, + port_id=port['id'], + ip_address=ip_address, + subnet_id=subnet['id']) + try: + # Do the insertion of each IP allocation entry within + # the context of a nested transaction, so that the entry + # is rolled back independently of other entries whenever + # the corresponding port has been deleted. + with context.session.begin_nested(): + context.session.add(allocated) + except db_exc.DBReferenceError: + LOG.debug("Port %s was deleted while updating it with an " + "IPv6 auto-address. Ignoring.", port['id']) def _update_subnet_dns_nameservers(self, context, id, s): old_dns_list = self._get_dns_by_subnet(context, id) diff --git a/neutron/tests/unit/db/test_db_base_plugin_v2.py b/neutron/tests/unit/db/test_db_base_plugin_v2.py index 0dc18001dd4..e8ef97e8fdb 100644 --- a/neutron/tests/unit/db/test_db_base_plugin_v2.py +++ b/neutron/tests/unit/db/test_db_base_plugin_v2.py @@ -20,7 +20,9 @@ import itertools import mock import netaddr from oslo_config import cfg +from oslo_db import exception as db_exc from oslo_utils import importutils +from sqlalchemy import orm from testtools import matchers import webob.exc @@ -3811,6 +3813,71 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): self.assertEqual(ctx_manager.exception.code, webob.exc.HTTPClientError.code) + def _test_create_subnet_ipv6_auto_addr_with_port_on_network( + self, addr_mode, device_owner=DEVICE_OWNER_COMPUTE, + insert_db_reference_error=False): + # Create a network with one IPv4 subnet and one port + with self.network() as network,\ + self.subnet(network=network) as v4_subnet,\ + self.port(subnet=v4_subnet, device_owner=device_owner) as port: + if insert_db_reference_error: + def db_ref_err_for_ipalloc(instance): + if instance.__class__.__name__ == 'IPAllocation': + raise db_exc.DBReferenceError( + 'dummy_table', 'dummy_constraint', + 'dummy_key', 'dummy_key_table') + mock.patch.object(orm.Session, 'add', + side_effect=db_ref_err_for_ipalloc).start() + # Add an IPv6 auto-address subnet to the network + v6_subnet = self._make_subnet(self.fmt, network, 'fe80::1', + 'fe80::/64', ip_version=6, + ipv6_ra_mode=addr_mode, + ipv6_address_mode=addr_mode) + if (insert_db_reference_error + or device_owner == constants.DEVICE_OWNER_ROUTER_SNAT + or device_owner in constants.ROUTER_INTERFACE_OWNERS): + # DVR SNAT and router interfaces should not have been + # updated with addresses from the new auto-address subnet + self.assertEqual(1, len(port['port']['fixed_ips'])) + else: + # Confirm that the port has been updated with an address + # from the new auto-address subnet + req = self.new_show_request('ports', port['port']['id'], + self.fmt) + sport = self.deserialize(self.fmt, req.get_response(self.api)) + fixed_ips = sport['port']['fixed_ips'] + self.assertEqual(2, len(fixed_ips)) + self.assertIn(v6_subnet['subnet']['id'], + [fixed_ip['subnet_id'] for fixed_ip + in fixed_ips]) + + def test_create_subnet_ipv6_slaac_with_port_on_network(self): + self._test_create_subnet_ipv6_auto_addr_with_port_on_network( + constants.IPV6_SLAAC) + + def test_create_subnet_dhcpv6_stateless_with_port_on_network(self): + self._test_create_subnet_ipv6_auto_addr_with_port_on_network( + constants.DHCPV6_STATELESS) + + def test_create_subnet_ipv6_slaac_with_dhcp_port_on_network(self): + self._test_create_subnet_ipv6_auto_addr_with_port_on_network( + constants.IPV6_SLAAC, + device_owner=constants.DEVICE_OWNER_DHCP) + + def test_create_subnet_ipv6_slaac_with_router_intf_on_network(self): + self._test_create_subnet_ipv6_auto_addr_with_port_on_network( + constants.IPV6_SLAAC, + device_owner=constants.DEVICE_OWNER_ROUTER_INTF) + + def test_create_subnet_ipv6_slaac_with_snat_intf_on_network(self): + self._test_create_subnet_ipv6_auto_addr_with_port_on_network( + constants.IPV6_SLAAC, + device_owner=constants.DEVICE_OWNER_ROUTER_SNAT) + + def test_create_subnet_ipv6_slaac_with_db_reference_error(self): + self._test_create_subnet_ipv6_auto_addr_with_port_on_network( + constants.IPV6_SLAAC, insert_db_reference_error=True) + def test_update_subnet_no_gateway(self): with self.subnet() as subnet: data = {'subnet': {'gateway_ip': '10.0.0.1'}} @@ -5330,6 +5397,7 @@ class TestNeutronDbPluginV2(base.BaseTestCase): 'enable_dhcp': True, 'gateway_ip': u'2001:100::1', 'id': u'd1a28edd-bd83-480a-bd40-93d036c89f13', + 'network_id': 'fbb9b578-95eb-4b79-a116-78e5c4927176', 'ip_version': 6, 'ipv6_address_mode': None, 'ipv6_ra_mode': u'slaac'}, @@ -5338,6 +5406,7 @@ class TestNeutronDbPluginV2(base.BaseTestCase): 'enable_dhcp': True, 'gateway_ip': u'2001:200::1', 'id': u'dc813d3d-ed66-4184-8570-7325c8195e28', + 'network_id': 'fbb9b578-95eb-4b79-a116-78e5c4927176', 'ip_version': 6, 'ipv6_address_mode': None, 'ipv6_ra_mode': u'slaac'}] From ffc48f286e1756302d9259dc514dd562d3c251ba Mon Sep 17 00:00:00 2001 From: Henry Gessau Date: Thu, 16 Apr 2015 13:38:46 -0400 Subject: [PATCH 004/161] Add Kilo release milestone Change-Id: Id7d969c92b7c757b766760681357ac13c8079ca3 --- .../alembic_migrations/versions/HEAD | 2 +- .../versions/kilo_release.py | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 neutron/db/migration/alembic_migrations/versions/kilo_release.py diff --git a/neutron/db/migration/alembic_migrations/versions/HEAD b/neutron/db/migration/alembic_migrations/versions/HEAD index d9e9459801f..062799591c1 100644 --- a/neutron/db/migration/alembic_migrations/versions/HEAD +++ b/neutron/db/migration/alembic_migrations/versions/HEAD @@ -1 +1 @@ -20c469a5f920 +kilo diff --git a/neutron/db/migration/alembic_migrations/versions/kilo_release.py b/neutron/db/migration/alembic_migrations/versions/kilo_release.py new file mode 100644 index 00000000000..fd0911d273a --- /dev/null +++ b/neutron/db/migration/alembic_migrations/versions/kilo_release.py @@ -0,0 +1,29 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +"""kilo + +Revision ID: kilo +Revises: 20c469a5f920 +Create Date: 2015-04-16 00:00:00.000000 + +""" + +# revision identifiers, used by Alembic. +revision = 'kilo' +down_revision = '20c469a5f920' + + +def upgrade(): + """A no-op migration for marking the Kilo release.""" + pass From 2add4e5ad4d12c817737d04ddb973b3aeeb25af3 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Thu, 16 Apr 2015 16:27:38 -0700 Subject: [PATCH 005/161] Update .gitreview to point to stable/kilo This is the stable/kilo branch. When people make changes here it's highly likely that they want to propose them to stable/kilo on gerrit. Change-Id: Ie61a9f0c0b0b4896da33a201e42b1c4bc4bae49b --- .gitreview | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitreview b/.gitreview index 184583f0d66..df092ef8a47 100644 --- a/.gitreview +++ b/.gitreview @@ -2,3 +2,4 @@ host=review.openstack.org port=29418 project=openstack/neutron.git +defaultbranch=stable/kilo From 8b8095e43a143426c501669167490d7867a55749 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Tue, 31 Mar 2015 08:53:56 -0700 Subject: [PATCH 006/161] Revert "Add ipset element and hashsize tunables" This reverts commit b5b919a7a3569ccb93c3d7d523c1edfaeddb7cb9. The current ipset manager code isn't robust enough to handle ipsets that already exist with different parameters. This reverts the ability to change the parameters so we don't break upgrades to Kilo. Conflicts: neutron/agent/linux/ipset_manager.py neutron/tests/unit/agent/linux/test_ipset_manager.py Change-Id: I538714df52424f0502cb75daea310517d1142c42 Closes-Bug: #1444201 (cherry picked from commit 03be14a569d240865dabff8b4c30385abf1dbe62) --- etc/neutron.conf | 9 ----- neutron/agent/common/config.py | 15 -------- neutron/agent/linux/ipset_manager.py | 20 +--------- .../unit/agent/linux/test_ipset_manager.py | 37 ++----------------- 4 files changed, 6 insertions(+), 75 deletions(-) diff --git a/etc/neutron.conf b/etc/neutron.conf index 5d8640f90ea..2983cc6c0ff 100644 --- a/etc/neutron.conf +++ b/etc/neutron.conf @@ -660,15 +660,6 @@ # each rule's purpose. (System must support the iptables comments module.) # comment_iptables_rules = True -# Maximum number of elements which can be stored in an IPset. -# If None is specified, the system default will be used. -# ipset_maxelem = 131072 - -# Initial hash size for an IPset. Must be a power of 2, -# else the kernel will round it up automatically. -# If None is specified, the system default will be used. -# ipset_hashsize = 2048 - # Root helper daemon application to use when possible. # root_helper_daemon = diff --git a/neutron/agent/common/config.py b/neutron/agent/common/config.py index efc1ca47602..7e63ea38789 100644 --- a/neutron/agent/common/config.py +++ b/neutron/agent/common/config.py @@ -63,17 +63,6 @@ IPTABLES_OPTS = [ help=_("Add comments to iptables rules.")), ] -IPSET_OPTS = [ - cfg.IntOpt('ipset_maxelem', default=131072, - help=_("Maximum number of elements which can be stored in " - "an IPset. If None is specified, the system default " - "will be used.")), - cfg.IntOpt('ipset_hashsize', default=2048, - help=_("Initial hash size for an IPset. Must be a power of 2, " - "else the kernel will round it up automatically. If " - "None is specified, the system default will be used.")), -] - PROCESS_MONITOR_OPTS = [ cfg.StrOpt('check_child_processes_action', default='respawn', choices=['respawn', 'exit'], @@ -133,10 +122,6 @@ def register_iptables_opts(conf): conf.register_opts(IPTABLES_OPTS, 'AGENT') -def register_ipset_opts(conf): - conf.register_opts(IPSET_OPTS, 'AGENT') - - def register_process_monitor_opts(conf): conf.register_opts(PROCESS_MONITOR_OPTS, 'AGENT') diff --git a/neutron/agent/linux/ipset_manager.py b/neutron/agent/linux/ipset_manager.py index 33b6379b586..e5ab7a01e9c 100644 --- a/neutron/agent/linux/ipset_manager.py +++ b/neutron/agent/linux/ipset_manager.py @@ -11,9 +11,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from oslo_config import cfg - -from neutron.agent.common import config from neutron.agent.linux import utils as linux_utils from neutron.common import utils @@ -32,7 +29,6 @@ class IpsetManager(object): def __init__(self, execute=None, namespace=None): self.execute = execute or linux_utils.execute self.namespace = namespace - config.register_ipset_opts(cfg.CONF) self.ipset_sets = {} @staticmethod @@ -43,15 +39,6 @@ class IpsetManager(object): name = ethertype + id return name[:IPSET_NAME_MAX_LENGTH] - @staticmethod - def get_hashargs(): - args = [] - if cfg.CONF.AGENT.ipset_hashsize: - args.extend(['hashsize', str(cfg.CONF.AGENT.ipset_hashsize)]) - if cfg.CONF.AGENT.ipset_maxelem: - args.extend(['maxelem', str(cfg.CONF.AGENT.ipset_maxelem)]) - return args - def set_exists(self, id, ethertype): """Returns true if the id+ethertype pair is known to the manager.""" set_name = self.get_name(id, ethertype) @@ -98,10 +85,8 @@ class IpsetManager(object): def _refresh_set(self, set_name, member_ips, ethertype): new_set_name = set_name + SWAP_SUFFIX set_type = self._get_ipset_set_type(ethertype) - hash_args = ' '.join(self.get_hashargs()) - process_input = ["create %s hash:ip family %s %s" % (new_set_name, - set_type, - hash_args)] + process_input = ["create %s hash:ip family %s" % (new_set_name, + set_type)] for ip in member_ips: process_input.append("add %s %s" % (new_set_name, ip)) @@ -118,7 +103,6 @@ class IpsetManager(object): def _create_set(self, set_name, ethertype): cmd = ['ipset', 'create', '-exist', set_name, 'hash:ip', 'family', self._get_ipset_set_type(ethertype)] - cmd.extend(self.get_hashargs()) self._apply(cmd) self.ipset_sets[set_name] = [] diff --git a/neutron/tests/unit/agent/linux/test_ipset_manager.py b/neutron/tests/unit/agent/linux/test_ipset_manager.py index 19fbb7e20e6..cbd156218ff 100644 --- a/neutron/tests/unit/agent/linux/test_ipset_manager.py +++ b/neutron/tests/unit/agent/linux/test_ipset_manager.py @@ -12,9 +12,7 @@ # limitations under the License. import mock -from oslo_config import cfg -from neutron.agent.common import config as a_cfg from neutron.agent.linux import ipset_manager from neutron.tests import base @@ -27,13 +25,8 @@ FAKE_IPS = ['10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.4', class BaseIpsetManagerTest(base.BaseTestCase): - def setUp(self, maxelem=None, hashsize=None): + def setUp(self): super(BaseIpsetManagerTest, self).setUp() - cfg.CONF.register_opts(a_cfg.IPSET_OPTS, 'AGENT') - cfg.CONF.set_override('ipset_maxelem', maxelem, 'AGENT') - cfg.CONF.set_override('ipset_hashsize', hashsize, 'AGENT') - self.maxelem = maxelem - self.hashsize = hashsize self.ipset = ipset_manager.IpsetManager() self.execute = mock.patch.object(self.ipset, "execute").start() self.expected_calls = [] @@ -43,13 +36,7 @@ class BaseIpsetManagerTest(base.BaseTestCase): self.execute.assert_has_calls(self.expected_calls, any_order=False) def expect_set(self, addresses): - hash_args = [] - if self.hashsize: - hash_args.extend(['hashsize', str(self.hashsize)]) - if self.maxelem: - hash_args.extend(['maxelem', str(self.maxelem)]) - temp_input = ['create IPv4fake_sgid-new hash:ip family inet %s' % - ' '.join(hash_args)] + temp_input = ['create IPv4fake_sgid-new hash:ip family inet'] temp_input.extend('add IPv4fake_sgid-new %s' % ip for ip in addresses) input = '\n'.join(temp_input) self.expected_calls.extend([ @@ -76,14 +63,9 @@ class BaseIpsetManagerTest(base.BaseTestCase): run_as_root=True) for ip in addresses) def expect_create(self): - ipset_call = ['ipset', 'create', '-exist', TEST_SET_NAME, - 'hash:ip', 'family', 'inet'] - if self.hashsize: - ipset_call.extend(['hashsize', str(self.hashsize)]) - if self.maxelem: - ipset_call.extend(['maxelem', str(self.maxelem)]) self.expected_calls.append( - mock.call(ipset_call, + mock.call(['ipset', 'create', '-exist', TEST_SET_NAME, + 'hash:ip', 'family', 'inet'], process_input=None, run_as_root=True)) @@ -103,10 +85,6 @@ class BaseIpsetManagerTest(base.BaseTestCase): class IpsetManagerTestCase(BaseIpsetManagerTest): - """Run all tests, but with maxelem/hashsize values not configured - """ - def setUp(self): - super(IpsetManagerTestCase, self).setUp() def test_set_exists(self): self.add_first_ip() @@ -139,10 +117,3 @@ class IpsetManagerTestCase(BaseIpsetManagerTest): self.expect_destroy() self.ipset.destroy(TEST_SET_ID, ETHERTYPE) self.verify_mock_calls() - - -class IpsetManagerTestCaseHashArgs(IpsetManagerTestCase): - """Run all the above tests, but with maxelem/hashsize values configured - """ - def setUp(self): - super(IpsetManagerTestCase, self).setUp(maxelem=131072, hashsize=2048) From a6b2c22dcea73754dbfd0ef39c60ad28ab2dbb73 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Mon, 30 Mar 2015 23:52:56 -0700 Subject: [PATCH 007/161] Set IPset hash type to 'net' instead of 'ip' The previous hash type was 'ip' and this caused a major issue with the allowed address pairs extension since it results in CIDRs being passed to ipset. When the hash type is 'ip', a CIDR is completely enumerated into all of its addresses so 10.100.0.0/16 results in ~65k entries. This meant a single allowed_address_pairs entry could easily exhaust an entire set. This patch changes the hash type to 'net', which is designed to handle a CIDRs as a single entry. This patch also changes the names of the ipsets because creating an ipset with different parameters will cause an error and our ipset manager code isn't robust enough to handle that at this time. There is another ongoing patch to fix that but it won't be ready in time.[1] The related bug was closed by increasing the set limit, which did alleviate the problem. However, this change would also address the issue because the gate tests run an allowed address pairs extension test with the CIDR mentioned above. 1. I59e2e1c090cb95ee1bd14dbb53b6ff2c5e2713fd Related-Bug: #1439817 Closes-Bug: #1444397 Change-Id: I8177699b157cd3eac46e2f481f47b5d966c49b07 (cherry picked from commit a38b5df5cd3c47672705aad4c30e789ae11ec958) --- neutron/agent/linux/ipset_manager.py | 6 +++--- neutron/tests/unit/agent/linux/test_ipset_manager.py | 7 ++++--- neutron/tests/unit/agent/test_securitygroups_rpc.py | 10 +++++----- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/neutron/agent/linux/ipset_manager.py b/neutron/agent/linux/ipset_manager.py index e5ab7a01e9c..0f764185239 100644 --- a/neutron/agent/linux/ipset_manager.py +++ b/neutron/agent/linux/ipset_manager.py @@ -36,7 +36,7 @@ class IpsetManager(object): """Returns the given ipset name for an id+ethertype pair. This reference can be used from iptables. """ - name = ethertype + id + name = 'NET' + ethertype + id return name[:IPSET_NAME_MAX_LENGTH] def set_exists(self, id, ethertype): @@ -85,7 +85,7 @@ class IpsetManager(object): def _refresh_set(self, set_name, member_ips, ethertype): new_set_name = set_name + SWAP_SUFFIX set_type = self._get_ipset_set_type(ethertype) - process_input = ["create %s hash:ip family %s" % (new_set_name, + process_input = ["create %s hash:net family %s" % (new_set_name, set_type)] for ip in member_ips: process_input.append("add %s %s" % (new_set_name, ip)) @@ -101,7 +101,7 @@ class IpsetManager(object): self.ipset_sets[set_name].remove(member_ip) def _create_set(self, set_name, ethertype): - cmd = ['ipset', 'create', '-exist', set_name, 'hash:ip', 'family', + cmd = ['ipset', 'create', '-exist', set_name, 'hash:net', 'family', self._get_ipset_set_type(ethertype)] self._apply(cmd) self.ipset_sets[set_name] = [] diff --git a/neutron/tests/unit/agent/linux/test_ipset_manager.py b/neutron/tests/unit/agent/linux/test_ipset_manager.py index cbd156218ff..44840086f60 100644 --- a/neutron/tests/unit/agent/linux/test_ipset_manager.py +++ b/neutron/tests/unit/agent/linux/test_ipset_manager.py @@ -36,8 +36,9 @@ class BaseIpsetManagerTest(base.BaseTestCase): self.execute.assert_has_calls(self.expected_calls, any_order=False) def expect_set(self, addresses): - temp_input = ['create IPv4fake_sgid-new hash:ip family inet'] - temp_input.extend('add IPv4fake_sgid-new %s' % ip for ip in addresses) + temp_input = ['create NETIPv4fake_sgid-new hash:net family inet'] + temp_input.extend('add NETIPv4fake_sgid-new %s' % ip + for ip in addresses) input = '\n'.join(temp_input) self.expected_calls.extend([ mock.call(['ipset', 'restore', '-exist'], @@ -65,7 +66,7 @@ class BaseIpsetManagerTest(base.BaseTestCase): def expect_create(self): self.expected_calls.append( mock.call(['ipset', 'create', '-exist', TEST_SET_NAME, - 'hash:ip', 'family', 'inet'], + 'hash:net', 'family', 'inet'], process_input=None, run_as_root=True)) diff --git a/neutron/tests/unit/agent/test_securitygroups_rpc.py b/neutron/tests/unit/agent/test_securitygroups_rpc.py index feabbcbfdbd..6a4e2990f41 100644 --- a/neutron/tests/unit/agent/test_securitygroups_rpc.py +++ b/neutron/tests/unit/agent/test_securitygroups_rpc.py @@ -1776,7 +1776,7 @@ IPSET_FILTER_1 = """# Generated by iptables_manager [0:0] -A %(bn)s-i_port1 -s 10.0.0.2/32 -p udp -m udp --sport 67 --dport 68 \ -j RETURN [0:0] -A %(bn)s-i_port1 -p tcp -m tcp --dport 22 -j RETURN -[0:0] -A %(bn)s-i_port1 -m set --match-set IPv4security_group1 src -j \ +[0:0] -A %(bn)s-i_port1 -m set --match-set NETIPv4security_group1 src -j \ RETURN [0:0] -A %(bn)s-i_port1 -j %(bn)s-sg-fallback [0:0] -A %(bn)s-FORWARD %(physdev_mod)s --physdev-EGRESS tap_port1 \ @@ -1935,7 +1935,7 @@ IPSET_FILTER_2 = """# Generated by iptables_manager [0:0] -A %(bn)s-i_%(port1)s -s 10.0.0.2/32 -p udp -m udp --sport 67 \ --dport 68 -j RETURN [0:0] -A %(bn)s-i_%(port1)s -p tcp -m tcp --dport 22 -j RETURN -[0:0] -A %(bn)s-i_%(port1)s -m set --match-set IPv4security_group1 src -j \ +[0:0] -A %(bn)s-i_%(port1)s -m set --match-set NETIPv4security_group1 src -j \ RETURN [0:0] -A %(bn)s-i_%(port1)s -j %(bn)s-sg-fallback [0:0] -A %(bn)s-FORWARD %(physdev_mod)s --physdev-EGRESS tap_%(port1)s \ @@ -1963,7 +1963,7 @@ RETURN [0:0] -A %(bn)s-i_%(port2)s -s 10.0.0.2/32 -p udp -m udp --sport 67 \ --dport 68 -j RETURN [0:0] -A %(bn)s-i_%(port2)s -p tcp -m tcp --dport 22 -j RETURN -[0:0] -A %(bn)s-i_%(port2)s -m set --match-set IPv4security_group1 src -j \ +[0:0] -A %(bn)s-i_%(port2)s -m set --match-set NETIPv4security_group1 src -j \ RETURN [0:0] -A %(bn)s-i_%(port2)s -j %(bn)s-sg-fallback [0:0] -A %(bn)s-FORWARD %(physdev_mod)s --physdev-EGRESS tap_%(port2)s \ @@ -2018,7 +2018,7 @@ IPSET_FILTER_2_3 = """# Generated by iptables_manager [0:0] -A %(bn)s-i_%(port1)s -s 10.0.0.2/32 -p udp -m udp --sport 67 \ --dport 68 -j RETURN [0:0] -A %(bn)s-i_%(port1)s -p tcp -m tcp --dport 22 -j RETURN -[0:0] -A %(bn)s-i_%(port1)s -m set --match-set IPv4security_group1 src -j \ +[0:0] -A %(bn)s-i_%(port1)s -m set --match-set NETIPv4security_group1 src -j \ RETURN [0:0] -A %(bn)s-i_%(port1)s -p icmp -j RETURN [0:0] -A %(bn)s-i_%(port1)s -j %(bn)s-sg-fallback @@ -2047,7 +2047,7 @@ RETURN [0:0] -A %(bn)s-i_%(port2)s -s 10.0.0.2/32 -p udp -m udp --sport 67 \ --dport 68 -j RETURN [0:0] -A %(bn)s-i_%(port2)s -p tcp -m tcp --dport 22 -j RETURN -[0:0] -A %(bn)s-i_%(port2)s -m set --match-set IPv4security_group1 src -j \ +[0:0] -A %(bn)s-i_%(port2)s -m set --match-set NETIPv4security_group1 src -j \ RETURN [0:0] -A %(bn)s-i_%(port2)s -p icmp -j RETURN [0:0] -A %(bn)s-i_%(port2)s -j %(bn)s-sg-fallback From e2f6902315de76a1020aa87ea161c8fdc6697ed7 Mon Sep 17 00:00:00 2001 From: Swaminathan Vasudevan Date: Tue, 14 Apr 2015 21:34:33 -0700 Subject: [PATCH 008/161] Fixes race condition and boosts the scheduling performance This patch fixes a race-condition that occurs when the scheduler tries to check for dvr serviceable ports before it schedules a router when a subnet is associated with a router. Sometimes the dhcp port creation is delayed and so the router is not scheduled to the l3-agent. Also it boosts the scheduling performance on dvr-snat node for scheduling a router. This patch will provide a work around to fix this race condition and to boost the scheduling performance by scheduling a router on a dvr-snat when dhcp is enabled on the provided subnet, instead of checking all the available ports on the subnet. Closes-Bug: #1442494 Change-Id: I089fefdd8535bdc9ed90b3230438ab0bfb6aab4f (cherry picked from commit c65d3ab6ad4589e6e4a6b488d2eb5d1e4cfee138) --- neutron/db/l3_agentschedulers_db.py | 19 ++++++++++++++ .../unit/scheduler/test_l3_agent_scheduler.py | 26 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/neutron/db/l3_agentschedulers_db.py b/neutron/db/l3_agentschedulers_db.py index 931436bddcb..f661dcc6221 100644 --- a/neutron/db/l3_agentschedulers_db.py +++ b/neutron/db/l3_agentschedulers_db.py @@ -379,6 +379,25 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase, return False core_plugin = manager.NeutronManager.get_plugin() + # NOTE(swami):Before checking for existence of dvr + # serviceable ports on the host managed by the l3 + # agent, let's verify if at least one subnet has + # dhcp enabled. If so, then the host will have a + # dvr serviceable port, which is in fact the DHCP + # port. + # This optimization is valid assuming that the L3 + # DVR_SNAT node will be the one hosting the DHCP + # Agent. + agent_conf = self.get_configuration_dict(l3_agent) + agent_mode = agent_conf.get(constants.L3_AGENT_MODE, + constants.L3_AGENT_MODE_LEGACY) + + for subnet_id in subnet_ids: + subnet_dict = core_plugin.get_subnet(context, subnet_id) + if (subnet_dict['enable_dhcp'] and ( + agent_mode == constants.L3_AGENT_MODE_DVR_SNAT)): + return True + filter = {'fixed_ips': {'subnet_id': subnet_ids}} ports = core_plugin.get_ports(context, filters=filter) for port in ports: diff --git a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py index a68d2e70874..58b53471ed3 100644 --- a/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py +++ b/neutron/tests/unit/scheduler/test_l3_agent_scheduler.py @@ -671,6 +671,29 @@ class L3SchedulerTestBaseMixin(object): l3_agent, router['id']) self.assertFalse(val) + def test_check_ports_exist_on_l3agent_with_dhcp_enabled_subnets(self): + self._register_l3_dvr_agents() + router = self._make_router(self.fmt, + tenant_id=str(uuid.uuid4()), + name='r2') + router['external_gateway_info'] = None + router['id'] = str(uuid.uuid4()) + router['distributed'] = True + + agent_list = [self.l3_dvr_snat_agent] + subnet = {'id': str(uuid.uuid4()), + 'enable_dhcp': True} + + self.get_subnet_ids_on_router = mock.Mock( + return_value=[subnet['id']]) + + self.plugin.get_subnet = mock.Mock(return_value=subnet) + self.plugin.get_ports = mock.Mock() + val = self.check_ports_exist_on_l3agent( + self.adminContext, agent_list[0], router['id']) + self.assertTrue(val) + self.assertFalse(self.plugin.get_ports.called) + def test_check_ports_exist_on_l3agent_if_no_subnets_then_return(self): l3_agent, router = self._prepare_check_ports_exist_tests() with mock.patch.object(manager.NeutronManager, @@ -698,9 +721,12 @@ class L3SchedulerTestBaseMixin(object): 'binding:host_id': 'host_1', 'device_owner': 'compute:', 'id': 1234} + subnet = {'id': str(uuid.uuid4()), + 'enable_dhcp': False} self.plugin.get_ports.return_value = [port] self.get_subnet_ids_on_router = mock.Mock( return_value=[port['subnet_id']]) + self.plugin.get_subnet = mock.Mock(return_value=subnet) val = self.check_ports_exist_on_l3agent(self.adminContext, l3_agent, router['id']) self.assertTrue(val) From f7ae3a04b541767c638fc4c8ff1e0db78ab94996 Mon Sep 17 00:00:00 2001 From: Andreas Jaeger Date: Mon, 20 Apr 2015 11:07:37 +0200 Subject: [PATCH 009/161] Release Import of Translations from Transifex Manual import of Translations from Transifex. This change also removes all po files that are less than 66 per cent translated since such partially translated files will not help users. This updates also recreates all pot (translation source files) to reflect the state of the repository. This change needs to be done manually since the automatic import does not handle the proposed branches and we need to sync with latest translations. Change-Id: I1b7bd1773bcd12ab282e77ee0dc41c27846fb66b --- .../locale/de/LC_MESSAGES/neutron-log-info.po | 947 ----------------- .../locale/es/LC_MESSAGES/neutron-log-info.po | 948 ----------------- .../locale/fr/LC_MESSAGES/neutron-log-info.po | 954 ------------------ .../locale/it/LC_MESSAGES/neutron-log-info.po | 942 ----------------- .../locale/ja/LC_MESSAGES/neutron-log-info.po | 944 ----------------- .../ko_KR/LC_MESSAGES/neutron-log-info.po | 937 ----------------- neutron/locale/neutron-log-error.pot | 172 ++-- neutron/locale/neutron-log-info.pot | 107 +- neutron/locale/neutron.pot | 369 ++++--- .../pt_BR/LC_MESSAGES/neutron-log-info.po | 943 ----------------- .../zh_CN/LC_MESSAGES/neutron-log-info.po | 936 ----------------- .../zh_TW/LC_MESSAGES/neutron-log-info.po | 934 ----------------- 12 files changed, 359 insertions(+), 8774 deletions(-) delete mode 100644 neutron/locale/de/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/es/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/fr/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/it/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/ja/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po diff --git a/neutron/locale/de/LC_MESSAGES/neutron-log-info.po b/neutron/locale/de/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 7f268a3acd5..00000000000 --- a/neutron/locale/de/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,947 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Carsten Duch , 2014 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-03-31 22:26+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: German (http://www.transifex.com/projects/p/neutron/language/" -"de/)\n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "Laden von Plug-in: %s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Ausgelöste HTTP-Ausnahme: %s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s mit HTTP %(status)d zurückgegeben" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s hat einen Fehler zurückgegeben: %(exception)s" - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "Sicherheitsgruppenerweiterung wurde inaktiviert." - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Vorbereiten von Filtern für Geräte %s" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "Sicherheitsgruppenregel aktualisiert %r" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "Sicherheitsgruppenmitglied aktualisiert %r" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "Provider-Regel aktualisiert" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "Gerätefilter für %r entfernen" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "Firewallregeln aktualisieren" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "DHCP-Agent gestartet" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "Synchronisation von Status" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "'agent_updated' (Agent aktualisiert) durch Serverseite %s!" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "Agent der Ebene 3 gestartet" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "Gerät %s ist bereits vorhanden" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "Versuch, ungefilterten Portfilter %s zu aktualisieren" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "Versuch, ungefilterten Portfilter %r zu entfernen" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "Erweiterungsmanager wird initialisiert." - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "Geladene Erweiterung: %s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Das Zulassen der Sortierung ist aktiviert, da die native Paginierung die " -"native Sortierung erfordert" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "OVS-Bereinigungsprozedur erfolgreich abgeschlossen" - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "Agent erfolgreich initialisiert, läuft jetzt... " - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "Protokollfunktion aktiviert!" - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "Konfigurations-Paste-Datei: %s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr "" - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"Überprüfung für CIDR: %(new_cidr)s fehlgeschlagen - Überschneidung mit " -"Teilnetz %(subnet_id)s (CIDR: %(cidr)s)" - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "Ungültige IP-Adresse in Pool gefunden: %(start)s - %(end)s:" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" -"Angegebene IP-Adressen stimmen nicht mit der Teilnetz-IP-Version überein" - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "" -"Anfangs-IP-Adresse (%(start)s) ist größer als Ende-IP-Adresse (%(end)s)" - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "Pool gefunden, der größer ist als Teilnetz-CIDR:%(start)s - %(end)s" - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Überschneidungen bei Bereichen gefunden: %(l_range)s und %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "" -"Port %s wird übersprungen, da keine IP-Adresse auf ihm konfiguriert ist" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "Eventlet backdoor hört auf %(port)s für Prozess %(pid)d" - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "" -"Überspringe periodische Aufgabe %(task)s weil der Intervall negativ ist" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "Überspringe periodische Aufgabe %(task)s weil sie deaktiviert ist" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "%s abgefangen. Vorgang wird beendet" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "" -"Übergeordneter Prozess wurde unerwartet abgebrochen. Vorgang wird beendet" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "Untergeordnetes Element %s abgefangen; Vorgang wird beendet" - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "Verzweigung zu schnell; im Ruhemodus" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "Untergeordnetes Element %d gestartet" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "Starten von %d Workers" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "Untergeordnetes Element %(pid)d durch Signal %(sig)d abgebrochen" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "Untergeordnete %(pid)s mit Status %(code)d beendet" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "%s abgefangen, untergeordnete Elemente werden gestoppt" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "" - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "Warten auf Beenden von %d untergeordneten Elementen" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "Zugeordnetes VLAN (%d) aus dem Pool" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "Kein %s-Plug-in geladen" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "%(plugin_key)s: %(function_name)s mit Argumenten %(args)s ignoriert" - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "" -"Schleifeniteration hat Intervall (%(polling_interval)s contra %(elapsed)s) " -"überschritten!" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC-'agent_id': %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Port %(device)s aktualisiert. Details: %(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "Gerät %s nicht für Plug-in definiert" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "Zusatzeinheit %s entfernt" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "Port %s aktualisiert." - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "RPC-Dämon für Linux-Brückenagent gestartet!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "Agent nicht synchron mit Plug-in!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "Schnittstellenzuordnungen: %s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Bereiche für Netz-VLAN: %s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" -"Zuweisung von %(vlan_id)s als lokale VLAN-Adresse für net-id=%(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "Zurückfordern von vlan = %(vlan_id)s von net-id = %(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" -"Zuordnung von physischem Netz %(physical_network)s zu Brücke %(bridge)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "Agententunnel nicht synchron mit Plug-in!" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "" diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po b/neutron/locale/es/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index a8ef8fe790b..00000000000 --- a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,948 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-03-31 22:26+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/neutron/language/" -"es/)\n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "Cargando complementos: %s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Excepción de HTTP emitida: %s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "Se ha devuelto %(url)s con HTTP %(status)d" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s ha devuelto un error: %(exception)s" - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "La extensión security-group se ha inhabilitado." - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Preparando filtros para dispositivos %s" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "Se ha actualizado la regla de grupo de seguridad %r" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "Se ha actualizado el miembro de grupo de seguridad %r" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "Se ha actualizado regla de proveedor" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "Eliminar filtro de dispositivo para %r" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "Renovar reglas de cortafuegos" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "Se ha iniciado al agente DHCP" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "Sincronizando estado" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated por el lado del servidor %s!" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "Se ha iniciado al agente L3" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "El dispositivo %s ya existe" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "Se ha intentado actualizar el filtro de puerto que no está filtrado %s" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "Se ha intentado eliminar el filtro de puerto que no está filtrado %r" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "Inicializando gestor de ampliación." - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "Ampliación cargada: %s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Permitir ordenación está habilitado porque la paginación nativa requiere " -"ordenación nativa" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "La limpieza de OVS se ha completado satisfactoriamente" - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "" -"El agente se ha inicializado satisfactoriamente, ahora se está ejecutando... " - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "Registro habilitado." - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "Archivo de configuración de pegar: %s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr "" - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"Se ha encontrado un error en validación para CIDR: %(new_cidr)s; se solapa " -"con la subred %(subnet_id)s (CIDR: %(cidr)s)" - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "" -"Se ha encontrado una dirección IP no válida en la agrupación: %(start)s - " -"%(end)s:" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" -"Las direcciones IP especificadas no coinciden con la versión de IP de subred " - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "" -"La IP de inicio (%(start)s) es mayor que la IP de finalización (%(end)s)" - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "" -"Se ha encontrado una agrupación mayor que el CIDR de subred: %(start)s - " -"%(end)s" - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Rangos de solapamiento encontrados: %(l_range)s y %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "Saltando el puerto %s, ya que no hay ninguna IP configurada en él" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "Eventlet oculto escuchando en %(port)s para el proceso %(pid)d" - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "Omitiendo la tarea periódica %(task)s porque el intervalo es negativo" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "Omitiendo la tarea periódica %(task)s porque está inhabilitada" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "Se ha captado %s, saliendo" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "El proceso padre se ha detenido inesperadamente, saliendo" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "Hijo captado %s, saliendo" - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "Bifurcación demasiado rápida, en reposo" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "Se ha iniciado el hijo %d" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "Iniciando %d trabajadores" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "Hijo %(pid)d matado por señal %(sig)d" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "El hijo %(pid)s ha salido con el estado %(code)d" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "Se ha captado %s, deteniendo hijos" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "" - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "En espera de %d hijos para salir" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "Vlan asignada (%d) de la agrupación" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "No se ha cargado ningún plug-in de %s" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "" -"Se ha ignorado %(plugin_key)s: %(function_name)s con los argumentos %(args)s " - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "" -"La iteración de bucle ha superado el intervalo (%(polling_interval)s frente " -"a %(elapsed)s)." - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "agent_id de RPC: %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Se ha actualizado el puerto %(device)s. Detalles: %(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "El dispositivo %s no está definido en el plug-in" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "Se ha eliminado el adjunto %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "El puerto %s se ha actualizado." - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "Se ha iniciado el daemon RPC de agente de LinuxBridge." - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "El agente está fuera de sincronización con el plug-in." - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "Correlaciones de interfaz: %s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Rangos de VLAN de red: %s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "Asignando %(vlan_id)s como vlan local para net-id=%(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "Reclamando vlan = %(vlan_id)s de net-id = %(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" -"Correlacionando la red física %(physical_network)s con el puente %(bridge)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "Túnel de agente fuera de sincronización con el plug-in. " - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "" diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 51ecece6d0f..00000000000 --- a/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,954 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Maxime COQUEREL , 2014 -# Patte D , 2015 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-04-01 13:11+0000\n" -"Last-Translator: Patte D \n" -"Language-Team: French (http://www.transifex.com/projects/p/neutron/language/" -"fr/)\n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "Chargement du plugin core: %s" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "Le service %s est supporté par le core plugin" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "Chargement du plug-in : %s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "Chargement quota_driver: %s." - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "Service Neutron démarré, en écoute sur %(host)s:%(port)s" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Exception HTTP générée : %s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s retourné avec HTTP %(status)d" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s a retourné une erreur : %(exception)s." - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "Extension du groupe de sécurité désactivée." - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Préparation des filtres pour les unités %s" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "Règle de groupe de sécurité mise à jour %r" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "Membre de groupe de sécurité mis à jour %r" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "Règle de fournisseur mise à jour" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "Suppression du filtre d'unités pour %r" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "Régénération des règles de pare-feu" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "Port %(port_id)s n'est pas présent dans le pont %(br_name)s" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "Agent DHCP démarré" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "Etat de synchronisation" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "Etat de synchronisation complet" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated au niveau du serveur %s !" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "Agent de niveau 3 démarré" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "Le processus est exécuté avec uid/gid: %(uid)s/%(gid)s" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "L'unité %s existe déjà" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "" -"Tentative effectuée de mise à jour du filtre de ports (sans filtrage %s)" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "" -"Tentative effectuée de suppression du filtre de ports (sans filtrage %r)" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "Initialisation du gestionnaire d'extension." - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "Extension chargée : %s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Autorisation de tri activée car la mise en page native nécessite le tri natif" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "Échec %(action)s (Erreur client): %(exc)s" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "Le nettoyage d'OVS s'est terminé avec succès." - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "Agent initialisé avec succès, en cours d'exécution... " - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "Consignation activée !" - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "Config du fichier de collage : %s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr "IPv6 n'est pas activé sur le système." - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"La validation du routage CIDR %(new_cidr)s a échoué : il chevauche le sous-" -"réseau %(subnet_id)s (CIDR : %(cidr)s) " - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "Adresse IP non valide trouvée dans le pool : %(start)s - %(end)s :" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" -"Les adresses IP spécifiées ne correspondent à la version IP du sous-réseau" - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "" -"L'adresse IP de début (%(start)s) est supérieure à l'adresse IP de fin " -"(%(end)s)." - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "" -"Un pool plus volumineux que le routage CIDR de sous-réseau %(start)s - " -"%(end)s a été trouvé." - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Chevauchement d'intervalles trouvés : %(l_range)s et %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "Ignorer le port %s car aucune adresse IP n'est configurée" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "Eventlet backdoor en écoute sur le port %(port)s for process %(pid)d" - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "Tâche périodique %(task)s ignorée car son intervalle est négatif" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "Tâche périodique %(task)s car elle est désactivée" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "%s interceptée, sortie" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "Processus parent arrêté de manière inattendue, sortie" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "L'enfant a reçu %s, sortie" - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "Bifurcation trop rapide, pause" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "Enfant démarré %d" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "Démarrage des travailleurs %d" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "Enfant %(pid)d arrêté par le signal %(sig)d" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "Processus fils %(pid)s terminé avec le status %(code)d" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "%s interceptée, arrêt de l'enfant" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "Pause demandée après suppression de thread. Nettoyage." - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "En attente %d enfants pour sortie" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "Réseau VLAN alloué (%d) depuis le pool" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "Aucun plug-in %s chargé" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "%(plugin_key)s : %(function_name)s avec les arguments %(args)s ignoré" - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "" -"L'itération de boucle a dépassé l'intervalle (%(polling_interval)s contre " -"%(elapsed)s) !" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "agent_id RPC : %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Port %(device)s mis à jour. Détails : %(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "Unité %s non définie sur le plug-in" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "Connexion %s retirée" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "Port %s mis à jour." - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "Serveur démon RPC de l'agent LinuxBridge démarré !" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "Agent non synchronisé avec le plug-in !" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "Mappages d'interface : %s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "Tentative %(count)s de liaison port %(port)s" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "Le port %s a été effacé en même temps" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "Le sous-réseau %s a été effacé en même temps" - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" -"L'information de liaison pour le port %s n'a pas été trouvée, elle peut déjà " -"avoir été effacée." - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Plages de réseau local virtuel de réseau : %s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "Nom du réseau changé en %s" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "Nom de port changé en %s" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "Démarrage du service de l'agent APIC" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "service de l'agent APIC démarré" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "Agent initialisé avec succès, en cours d'exécution..." - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" -"Affectation de %(vlan_id)s comme réseau local virtuel pour net-id = " -"%(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" -"Récupération du réseau local virtuel = %(vlan_id)s à partir de net-id = " -"%(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "Ajout %s à la liste de ponts." - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "Mappage du réseau physique %(physical_network)s sur le pont %(bridge)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "Configuration complète de l'équipement %s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "Port auxiliaire %s ajouté" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "Tunnel d'agent désynchronisé avec le plug-in !" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "Aucun équipement avec MAC %s défini sur l'agent." - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "Appareil avec adresse MAC %s non-défini dans le plugin" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "Retrait de l'appareil ayant pour mac_address %s" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "Mappages d'Équipements Physiques: %s" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "Equipements exclus: %s" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "Agent %s déjà présent" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "Le plugin avait déjà lancé les RPC dans le processus parent." - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" -"Le fournisseur par défaut n'est pas spécifié pour le type de service %s" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "Chargement du pilote de Mesures %s" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "Chargement de pilote d'interface %s" diff --git a/neutron/locale/it/LC_MESSAGES/neutron-log-info.po b/neutron/locale/it/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 1f2fd145644..00000000000 --- a/neutron/locale/it/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,942 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# PierAlberto , 2014 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-03-31 22:26+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Italian (http://www.transifex.com/projects/p/neutron/language/" -"it/)\n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "Caricamento plugin: %s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Generata eccezione HTTP: %s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s restituito con HTTP %(status)d" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s ha restituito un errore: %(exception)s" - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "Estensione di security-group disabilitata." - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Preparazione filtri per i dispositivi %s" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "Regola gruppo di sicurezza aggiornata %r" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "Membro gruppo di sicurezza aggiornato %r" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "Provider regola aggiornato" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "Rimuovi filtro dispositivo per %r" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "Aggiorna regole firewall" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "Agent DHCP avviato" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "Stato sincronizzazione" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated dal lato server %s!" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "Agent L3 avviato" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "L'unità %s già esiste" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "Tentativo di aggiornare il filtro della porta che non è filtrata %s" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "Tentativo di rimuovere il filtro della porta che non è filtrata %r" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "Inizializzazione gestore estensioni." - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "Estensione caricata: %s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Consenti ordinamento è abilitato in quanto la paginaziona nativa richiede " -"l'ordinamento nativo" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "Ripulitura di OVS completata correttamente" - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "Agent inizializzato correttamente, ora in esecuzione... " - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "Accesso abilitato!" - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "Configurazione file paste: %s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr "" - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"Convalida per CIDR: %(new_cidr)s non riuscita - si sovrappone con la " -"sottorete %(subnet_id)s (CIDR: %(cidr)s)" - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "Trovato un indirizzo IP invalido nel pool: %(start)s - %(end)s:" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" -"Gli indirizzi IP specificati non corrispondono alla versione IP della " -"sottorete" - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "L'IP iniziale (%(start)s) è superiore all'IP finale (%(end)s)" - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "Trovato un pool più grande della sottorete CIDR:%(start)s - %(end)s" - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Trovati gli intervalli di sovrapposizione: %(l_range)s e %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "La porta %s viene ignorata in quanto non ha nessun IP configurato" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "Ascolto di eventlet backdoor su %(port)s per il processo %(pid)d" - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "" -"Abbadono dell'attività periodica %(task)s perché l'intervalo è negativo" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "Abbadono dell'attività periodica %(task)s perché è disabilitata" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "Rilevato %s, esistente" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "Il processo principale è stato interrotto inaspettatamente, uscire" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "Cogliere Child %s, uscendo" - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "Sblocco troppo veloce, attendere" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "Child avviato %d" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "Avvio %d operatori" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "Child %(pid)d interrotto dal segnale %(sig)d" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "Child %(pid)s terminato con stato %(code)d" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "Intercettato %s, arresto in corso dei children" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "" - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "In attesa %d degli elementi secondari per uscire" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "vlan (%d) allocata dal pool" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "Nessun plugin %s caricato" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "%(plugin_key)s: %(function_name)s con argomenti %(args)s ignorato" - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "" -"L'iterazione loop supera l'intervallo (%(polling_interval)s vs. %(elapsed)s)!" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "agent-id RPC: %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Porta %(device)s aggiornata. Dettagli: %(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "Unità %s non definita nel plugin" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "Collegamento %s rimosso" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "Porta %s aggiornata." - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "LinuxBridge Agent RPC Daemon avviato!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "Agent non sincronizzato con il plugin!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "Associazioni interfaccia: %s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Intervalli di rete VLAN: %s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "Assegnazione %(vlan_id)s come vlan locale per net-id=%(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "Recupero vlan = %(vlan_id)s da net-id = %(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "Associazione rete fisica %(physical_network)s al bridge %(bridge)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "Il tunnel agent non è sincronizzato con il plugin!" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "" diff --git a/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po b/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index dd818e5b59e..00000000000 --- a/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,944 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Sasuke(Kyohei MORIYAMA) <>, 2014 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-03-31 22:26+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/neutron/" -"language/ja/)\n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "プラグインの読み込み中: %s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "HTTP 例外がスローされました: %s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "HTTP %(status)d の %(url)s が返されました" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s が障害を返しました: %(exception)s" - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "security-group 拡張を無効にしました。" - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "デバイス %s のフィルターを準備中" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "セキュリティー・グループ・ルールが %r を更新しました" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "セキュリティー・グループ・メンバーが %r を更新しました" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "プロバイダー・ルールが更新されました" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "%r のデバイス・フィルターを削除" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "ファイアウォール・ルールの最新表示" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "DHCP エージェントが始動しました" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "状態の同期中" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "サーバー・サイド %s による agent_updated!" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "L3 エージェントが始動しました" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "デバイス %s は既に存在します" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "フィルター処理されていないポート・フィルター %s を更新しようとしました" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "フィルター処理されていないポート・フィルター %r を削除しようとしました" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "拡張マネージャーを初期化しています。" - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "拡張をロードしました: %s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"ネイティブ・ページ編集にはネイティブ・ソートが必要なため、ソートの許可が有効" -"になっています" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "OVS のクリーンアップが正常に完了しました" - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "エージェントが正常に初期化されました。現在実行中です... " - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "ロギングは有効です" - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "構成貼り付けファイル: %s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr " このシステムでは、 IPv6が有効ではありません。" - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"CIDR %(new_cidr)s の検証が失敗しました。サブネット %(subnet_id)s (CIDR: " -"%(cidr)s) とオーバーラップしています" - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "プールで無効な IP アドレスが見つかりました: %(start)s から %(end)s:" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "指定された IP アドレスが、サブネット IP バージョンと一致しません" - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "開始 IP (%(start)s) が終了 IP (%(end)s) より大きくなっています" - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "" -"サブネット CIDR より大きいプールが見つかりました: %(start)s から %(end)s" - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "オーバーラップする範囲が見つかりました: %(l_range)s から %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "ポート %s には IP が構成されていないため、このポートをスキップします" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "Eventlet backdoorは、プロセス%(pid)dの%(port)sをリスニングしています。" - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "タスクの間隔が負であるため、定期タスク %(task)s をスキップしています" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "タスクが使用不可であるため、定期タスク %(task)s をスキップしています" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "%s が見つかりました。終了しています" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "親プロセスが予期せずに停止しました。終了しています" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "" - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "fork が早すぎます。スリープ状態にしています" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "子 %d を開始しました" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "%d ワーカーを開始しています" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "子 %(pid)d がシグナル %(sig)d によって強制終了されました" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "子 %(pid)s が状況 %(code)d で終了しました" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "%s が見つかりました。子を停止しています" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "" - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "%d 個の子で終了を待機しています" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "プールからの割り振り済み VLAN (%d)" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "%s プラグインはロードされませんでした" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "" -"%(plugin_key)s: 引数 %(args)s が指定された %(function_name)s は無視されます" - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "" -"ループ反復が間隔を超えました (%(polling_interval)s に対して %(elapsed)s)。" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC agent_id: %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "ポート %(device)s が更新されました。詳細: %(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "デバイス %s がプラグインで定義されていません" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "接続機構 %s が削除されました" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "ポート %s が更新されました。" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "LinuxBridge Agent RPC デーモンが開始しました。" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "エージェントがプラグインと非同期です。" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "インターフェース・マッピング: %s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "ネットワーク VLAN の範囲: %s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" -"%(vlan_id)s を net-id=%(net_uuid)s のローカル VLAN として割り当てています" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "VLAN = %(vlan_id)s を net-id = %(net_uuid)s から再利用中" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" -"物理ネットワーク %(physical_network)s をブリッジ %(bridge)s にマップしていま" -"す" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "エージェント・トンネルがプラグインと非同期です" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "" diff --git a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po b/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index ca98207a36c..00000000000 --- a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,937 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-03-31 22:26+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/neutron/" -"language/ko_KR/)\n" -"Language: ko_KR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "로딩 플러그인: %s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "HTTP 예외 처리: %s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s이(가) HTTP %(status)d(으)로 리턴되었음" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s이(가) 결함을 리턴함: %(exception)s" - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "보안 그룹 확장을 사용하지 않습니다. " - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "%s 디바이스에 대한 필터 준비" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "보안 그룹 규칙이 %r을(를) 업데이트함" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "보안 그룹 멤버가 %r을(를) 업데이트함" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "제공자 규칙이 업데이트됨" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "%r의 디바이스 필터 제거" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "방화벽 규칙 새로 고치기" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "DHCP 에이전트가 시작됨" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "상태 동기화 중" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "서버측 %s!에 의한 agent_updated" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "L3 에이전트가 시작됨" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "%s 디바이스가 이미 존재함" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "필터링된 %s이(가) 아닌 포트 필터를 업데이트하려고 시도함" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "필터링된 %r이(가) 아닌 포트 필터를 제거하려고 시도함" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "확장기능 관리자를 초기화 중입니다. " - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "로드된 확장: %s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"네이티브 페이지 번호 매기기에 네이티브 정렬이 필요하므로 정렬을 사용할 수 있" -"음" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "OVS 정리가 완료됨" - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "에이전트가 초기화되었으며, 지금 실행 중... " - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "로깅 사용!" - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "구성 붙여넣기 파일: %s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr "" - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"CIDR %(new_cidr)s 유효성 검증 실패 - 서브넷 %(subnet_id)s(CIDR: %(cidr)s)과" -"(와) 겹침" - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "풀에서 올바르지 않은 IP 주소 발견: %(start)s - %(end)s:" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "지정된 IP 주소가 서브넷 IP 버전과 일치하지 않음" - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "시작 IP(%(start)s)가 끝 IP(%(end)s)보다 큼" - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "서브넷 CIDR보다 큰 풀 발견: %(start)s - %(end)s" - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "겹치는 범위 발견: %(l_range)s 및 %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "구성된 IP가 없어서 포트 %s을(를) 건너뜀" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "Eventlet 백도어는 프로세스 %(pid)d 일 동안 %(port)s에서 수신" - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "간격이 음수이기 때문에 주기적 태스크 %(task)s을(를) 건너뜀" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "사용 안하기 때문에 주기적 태스크 %(task)s을(를) 건너뜀" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "%s 발견, 종료 중" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "상위 프로세스가 예기치 않게 정지했습니다. 종료 중" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "자식으로 된 %s가 존재함." - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "포크가 너무 빠름. 정지 중" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "%d 하위를 시작했음" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "%d 작업자 시작 중" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "%(pid)d 하위가 %(sig)d 신호에 의해 강제 종료됨" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "%(pid)s 하위가 %(code)d 상태와 함께 종료했음" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "%s 발견, 하위 중지 중" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "" - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "%d 하위에서 종료하기를 대기 중임" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "풀에서 할당된 vlan(%d)" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "로드된 %s 플러그인이 없음" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "%(plugin_key)s: %(args)s 인수를 갖는 %(function_name)s이(가) 무시됨" - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "루프 반복이 간격을 초과했습니다(%(polling_interval)s 대 %(elapsed)s)!" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC agent_id: %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "%(device)s 포트가 업데이트되었습니다. 세부사항: %(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "%s 디바이스가 플러그인에서 정의되지 않음" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "첨부 %s이(가) 제거됨" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "%s 포트가 업데이트되었습니다. " - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "LinuxBridge 에이전트 RPC 디먼이 시작되었습니다!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "에이전트가 플러그인과 동기화되지 않았습니다!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "인터페이스 맵핑: %s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "형식 드라이버 이름을 설정했습니다: %s" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "형식 드라이버 이름을 불러왔습니다: %s" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "등록된 형식: %s" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "network_types를 임대합니다: %s" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "'%s' 형식 드라이버 초기화중" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "매커니즘 드라이버 이름을 설정했습니다: %s" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "매커니즘 드라이버 이름을 불러왔습니다: %s" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "모듈러 L2 플러그인 초기화를 완료했습니다" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "네트워크 VLAN 범위: %s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "%(vlan_id)s을(를) net-id=%(net_uuid)s에 대한 로컬 vlan으로 지정 중" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "net-id = %(net_uuid)s에서 vlan = %(vlan_id)s 재확보 중" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "실제 네트워크 %(physical_network)s을(를) 브릿지 %(bridge)s에 맵핑 중" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "에이전트 터널이 플러그인과 동기화되지 않았습니다!" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "" diff --git a/neutron/locale/neutron-log-error.pot b/neutron/locale/neutron-log-error.pot index e3d529db988..fbef98f6c96 100644 --- a/neutron/locale/neutron-log-error.pot +++ b/neutron/locale/neutron-log-error.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 2015.1.dev240\n" +"Project-Id-Version: neutron 2015.1.dev1.g2add4e5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" +"POT-Creation-Date: 2015-04-20 11:03+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -89,7 +89,7 @@ msgstr "" msgid "Timed out retrieving ofport on port %(pname)s. Exception: %(exception)s" msgstr "" -#: neutron/agent/common/ovs_lib.py:489 +#: neutron/agent/common/ovs_lib.py:506 #, python-format msgid "OVS flows could not be applied on bridge %s" msgstr "" @@ -113,56 +113,56 @@ msgstr "" msgid "Network %s info call failed." msgstr "" -#: neutron/agent/dhcp/agent.py:577 neutron/agent/l3/agent.py:617 -#: neutron/agent/metadata/agent.py:304 +#: neutron/agent/dhcp/agent.py:577 neutron/agent/l3/agent.py:606 +#: neutron/agent/metadata/agent.py:311 #: neutron/plugins/hyperv/agent/l2_agent.py:94 #: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:108 #: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:779 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:276 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:284 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:129 #: neutron/services/metering/agents/metering_agent.py:283 msgid "Failed reporting state!" msgstr "" -#: neutron/agent/l3/agent.py:173 neutron/tests/unit/test_l3_agent.py:1914 +#: neutron/agent/l3/agent.py:172 neutron/tests/unit/agent/l3/test_agent.py:2084 #, python-format msgid "Error importing interface driver '%s'" msgstr "" -#: neutron/agent/l3/agent.py:234 neutron/agent/linux/dhcp.py:786 +#: neutron/agent/l3/agent.py:232 neutron/agent/linux/dhcp.py:787 msgid "An interface driver must be specified" msgstr "" -#: neutron/agent/l3/agent.py:239 +#: neutron/agent/l3/agent.py:237 msgid "Router id is required if not using namespaces." msgstr "" -#: neutron/agent/l3/agent.py:246 +#: neutron/agent/l3/agent.py:244 #, python-format msgid "%s used in config as ipv6_gateway is not a valid IPv6 link-local address." msgstr "" -#: neutron/agent/l3/agent.py:387 +#: neutron/agent/l3/agent.py:379 #, python-format msgid "The external network bridge '%s' does not exist" msgstr "" -#: neutron/agent/l3/agent.py:447 +#: neutron/agent/l3/agent.py:433 #, python-format msgid "Failed to fetch router information for '%s'" msgstr "" -#: neutron/agent/l3/agent.py:471 +#: neutron/agent/l3/agent.py:457 #, python-format msgid "Removing incompatible router '%s'" msgstr "" -#: neutron/agent/l3/agent.py:475 +#: neutron/agent/l3/agent.py:461 #, python-format msgid "Failed to process compatible router '%s'" msgstr "" -#: neutron/agent/l3/agent.py:524 +#: neutron/agent/l3/agent.py:513 msgid "Failed synchronizing routers due to RPC error" msgstr "" @@ -182,7 +182,7 @@ msgstr "" msgid "DVR: removed snat failed" msgstr "" -#: neutron/agent/l3/dvr_router.py:500 +#: neutron/agent/l3/dvr_router.py:505 msgid "Missing subnet/agent_gateway_port" msgstr "" @@ -239,28 +239,28 @@ msgstr "" msgid "Pidfile %s already exist. Daemon already running?" msgstr "" -#: neutron/agent/linux/dhcp.py:792 +#: neutron/agent/linux/dhcp.py:793 #, python-format msgid "Error importing interface driver '%(driver)s': %(inner)s" msgstr "" -#: neutron/agent/linux/external_process.py:222 +#: neutron/agent/linux/external_process.py:224 #, python-format msgid "" "%(service)s for %(resource_type)s with uuid %(uuid)s not found. The " "process should not have died" msgstr "" -#: neutron/agent/linux/external_process.py:242 +#: neutron/agent/linux/external_process.py:244 #, python-format msgid "respawning %(service)s for uuid %(uuid)s" msgstr "" -#: neutron/agent/linux/external_process.py:248 +#: neutron/agent/linux/external_process.py:250 msgid "Exiting agent as programmed in check_child_processes_actions" msgstr "" -#: neutron/agent/linux/external_process.py:259 +#: neutron/agent/linux/external_process.py:261 #, python-format msgid "" "Exiting agent because of a malfunction with the %(service)s process " @@ -283,7 +283,7 @@ msgstr "" msgid "Failed unplugging interface '%s'" msgstr "" -#: neutron/agent/linux/ip_lib.py:673 +#: neutron/agent/linux/ip_lib.py:678 #, python-format msgid "Failed sending gratuitous ARP to %(addr)s on %(iface)s in namespace %(ns)s" msgstr "" @@ -317,17 +317,17 @@ msgstr "" msgid "Error received from ovsdb monitor: %s" msgstr "" -#: neutron/agent/linux/utils.py:219 +#: neutron/agent/linux/utils.py:220 #, python-format msgid "Unable to convert value in %s" msgstr "" -#: neutron/agent/metadata/agent.py:109 +#: neutron/agent/metadata/agent.py:116 #: neutron/agent/metadata/namespace_proxy.py:56 msgid "Unexpected error." msgstr "" -#: neutron/agent/ovsdb/impl_idl.py:103 +#: neutron/agent/ovsdb/impl_idl.py:106 #, python-format msgid "OVSDB Error: %s" msgstr "" @@ -470,11 +470,17 @@ msgstr "" #: neutron/cmd/sanity_check.py:126 msgid "" +"Check for Open vSwitch support of ARP header matching failed. ARP " +"spoofing suppression will not work. A newer version of OVS is required." +msgstr "" + +#: neutron/cmd/sanity_check.py:135 +msgid "" "Check for VF management support failed. Please ensure that the version of" " ip link being used has VF support." msgstr "" -#: neutron/cmd/sanity_check.py:136 +#: neutron/cmd/sanity_check.py:145 msgid "Check for native OVSDB support failed." msgstr "" @@ -483,11 +489,11 @@ msgstr "" msgid "Unexpected exception while checking supported feature via command: %s" msgstr "" -#: neutron/cmd/sanity/checks.py:119 +#: neutron/cmd/sanity/checks.py:129 msgid "Unexpected exception while checking supported ip link command" msgstr "" -#: neutron/cmd/sanity/checks.py:165 +#: neutron/cmd/sanity/checks.py:175 #, python-format msgid "" "Failed to import required modules. Ensure that the python-openvswitch " @@ -506,12 +512,12 @@ msgid "" "%(agent)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:926 neutron/plugins/ml2/plugin.py:552 +#: neutron/db/db_base_plugin_v2.py:931 neutron/plugins/ml2/plugin.py:559 #, python-format msgid "An exception occurred while creating the %(resource)s:%(item)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1689 +#: neutron/db/db_base_plugin_v2.py:1699 #, python-format msgid "Unable to generate mac address after %s attempts" msgstr "" @@ -535,6 +541,10 @@ msgstr "" msgid "Exception encountered during router rescheduling." msgstr "" +#: neutron/db/l3_db.py:539 +msgid "Cannot have multiple IPv4 subnets on router port" +msgstr "" + #: neutron/db/metering/metering_rpc.py:47 #, python-format msgid "Unable to find agent %s." @@ -660,7 +670,7 @@ msgid "" "the roll back. of a remove_router_interface operation" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:661 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:679 #: neutron/services/l3_router/l3_sdnve.py:203 #, python-format msgid "Delete floatingip failed in SDN-VE: %s" @@ -674,8 +684,8 @@ msgid "" msgstr "" #: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:255 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1617 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1629 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1712 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1724 #, python-format msgid "%s Agent terminated!" msgstr "" @@ -730,152 +740,152 @@ msgstr "" msgid "Parsing physical_interface_mappings failed: %s. Agent terminated!" msgstr "" -#: neutron/plugins/ml2/db.py:242 neutron/plugins/ml2/db.py:328 -#: neutron/plugins/ml2/plugin.py:1303 +#: neutron/plugins/ml2/db.py:242 neutron/plugins/ml2/db.py:327 +#: neutron/plugins/ml2/plugin.py:1310 #, python-format msgid "Multiple ports have port_id starting with %s" msgstr "" -#: neutron/plugins/ml2/managers.py:56 +#: neutron/plugins/ml2/managers.py:57 #, python-format msgid "" "Type driver '%(new_driver)s' ignored because type driver '%(old_driver)s'" " is already registered for type '%(type)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:72 +#: neutron/plugins/ml2/managers.py:73 #, python-format msgid "No type driver for tenant network_type: %s. Service terminated!" msgstr "" -#: neutron/plugins/ml2/managers.py:144 +#: neutron/plugins/ml2/managers.py:145 #, python-format msgid "Network %s has no segments" msgstr "" -#: neutron/plugins/ml2/managers.py:227 neutron/plugins/ml2/managers.py:254 +#: neutron/plugins/ml2/managers.py:228 neutron/plugins/ml2/managers.py:255 #, python-format msgid "Failed to release segment '%s' because network type is not supported." msgstr "" -#: neutron/plugins/ml2/managers.py:326 +#: neutron/plugins/ml2/managers.py:330 #, python-format msgid "Mechanism driver '%(name)s' failed in %(method)s" msgstr "" -#: neutron/plugins/ml2/managers.py:612 neutron/plugins/ml2/managers.py:674 +#: neutron/plugins/ml2/managers.py:616 neutron/plugins/ml2/managers.py:678 #, python-format msgid "Failed to bind port %(port)s on host %(host)s" msgstr "" -#: neutron/plugins/ml2/managers.py:627 +#: neutron/plugins/ml2/managers.py:631 #, python-format msgid "" "Exceeded maximum binding levels attempting to bind port %(port)s on host " "%(host)s" msgstr "" -#: neutron/plugins/ml2/managers.py:670 +#: neutron/plugins/ml2/managers.py:674 #, python-format msgid "Mechanism driver %s failed in bind_port" msgstr "" -#: neutron/plugins/ml2/managers.py:741 +#: neutron/plugins/ml2/managers.py:745 #, python-format msgid "Extension driver '%(name)s' failed in %(method)s" msgstr "" -#: neutron/plugins/ml2/plugin.py:275 +#: neutron/plugins/ml2/plugin.py:282 #, python-format msgid "Failed to commit binding results for %(port)s after %(max)s tries" msgstr "" -#: neutron/plugins/ml2/plugin.py:432 +#: neutron/plugins/ml2/plugin.py:439 #, python-format msgid "Serialized vif_details DB value '%(value)s' for port %(port)s is invalid" msgstr "" -#: neutron/plugins/ml2/plugin.py:443 +#: neutron/plugins/ml2/plugin.py:450 #, python-format msgid "Serialized profile DB value '%(value)s' for port %(port)s is invalid" msgstr "" -#: neutron/plugins/ml2/plugin.py:529 +#: neutron/plugins/ml2/plugin.py:536 #, python-format msgid "Could not find %s to delete." msgstr "" -#: neutron/plugins/ml2/plugin.py:532 +#: neutron/plugins/ml2/plugin.py:539 #, python-format msgid "Could not delete %(res)s %(id)s." msgstr "" -#: neutron/plugins/ml2/plugin.py:565 +#: neutron/plugins/ml2/plugin.py:572 #, python-format msgid "" "mechanism_manager.create_%(res)s_postcommit failed for %(res)s: " "'%(failed_id)s'. Deleting %(res)ss %(resource_ids)s" msgstr "" -#: neutron/plugins/ml2/plugin.py:611 +#: neutron/plugins/ml2/plugin.py:618 #, python-format msgid "mechanism_manager.create_network_postcommit failed, deleting network '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:681 +#: neutron/plugins/ml2/plugin.py:688 #, python-format msgid "Exception auto-deleting port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:693 +#: neutron/plugins/ml2/plugin.py:700 #, python-format msgid "Exception auto-deleting subnet %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:775 +#: neutron/plugins/ml2/plugin.py:782 msgid "mechanism_manager.delete_network_postcommit failed" msgstr "" -#: neutron/plugins/ml2/plugin.py:796 +#: neutron/plugins/ml2/plugin.py:803 #, python-format msgid "mechanism_manager.create_subnet_postcommit failed, deleting subnet '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:901 +#: neutron/plugins/ml2/plugin.py:908 #, python-format msgid "Exception deleting fixed_ip from port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:910 +#: neutron/plugins/ml2/plugin.py:917 msgid "mechanism_manager.delete_subnet_postcommit failed" msgstr "" -#: neutron/plugins/ml2/plugin.py:975 +#: neutron/plugins/ml2/plugin.py:982 #, python-format msgid "mechanism_manager.create_port_postcommit failed, deleting port '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:987 +#: neutron/plugins/ml2/plugin.py:994 #, python-format msgid "_bind_port_if_needed failed, deleting port '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:1017 +#: neutron/plugins/ml2/plugin.py:1024 #, python-format msgid "_bind_port_if_needed failed. Deleting all ports from create bulk '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:1162 +#: neutron/plugins/ml2/plugin.py:1169 #, python-format msgid "No Host supplied to bind DVR Port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:1284 +#: neutron/plugins/ml2/plugin.py:1291 #, python-format msgid "mechanism_manager.delete_port_postcommit failed for port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:1316 +#: neutron/plugins/ml2/plugin.py:1323 #, python-format msgid "Binding info for DVR port %s not found" msgstr "" @@ -1045,102 +1055,102 @@ msgstr "" msgid "a different subnet %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:348 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:356 msgid "No tunnel_type specified, cannot create tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:351 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:374 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:359 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:382 #, python-format msgid "tunnel_type %s not supported by agent" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:367 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:375 msgid "No tunnel_ip specified, cannot delete tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:371 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:379 msgid "No tunnel_type specified, cannot delete tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:509 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:517 #, python-format msgid "No local VLAN available for net-id=%s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:548 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:556 #, python-format msgid "" "Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " "tunneling disabled" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:567 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:575 #, python-format msgid "" "Cannot provision flat network for net-id=%(net_uuid)s - no bridge for " "physical_network %(physical_network)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:595 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:603 #, python-format msgid "" "Cannot provision VLAN network for net-id=%(net_uuid)s - no bridge for " "physical_network %(physical_network)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:604 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:612 #, python-format msgid "" "Cannot provision unknown network type %(network_type)s for net-" "id=%(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:660 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:668 #, python-format msgid "" "Cannot reclaim unknown network type %(network_type)s for net-" "id=%(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:805 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:855 msgid "" "Failed to create OVS patch port. Cannot have tunneling enabled on this " "agent, since this version of OVS does not support tunnels or patch ports." " Agent terminated!" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:932 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:982 #, python-format msgid "" "Bridge %(bridge)s for physical network %(physical_network)s does not " "exist. Agent terminated!" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1084 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1174 #, python-format msgid "Failed to set-up %(type)s tunnel port to %(ip)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1286 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1379 #, python-format msgid "" "process_network_ports - iteration:%d - failure while retrieving port " "details from server" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1315 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1408 #, python-format msgid "" "process_ancillary_network_ports - iteration:%d - failure while retrieving" " port details from server" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1461 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1554 msgid "Error while synchronizing tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1531 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1625 msgid "Error while processing VIF ports" msgstr "" diff --git a/neutron/locale/neutron-log-info.pot b/neutron/locale/neutron-log-info.pot index 6a23a3540be..12dacb5febd 100644 --- a/neutron/locale/neutron-log-info.pot +++ b/neutron/locale/neutron-log-info.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 2015.1.dev240\n" +"Project-Id-Version: neutron 2015.1.dev1.g2add4e5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" +"POT-Creation-Date: 2015-04-20 11:03+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -122,7 +122,7 @@ msgstr "" msgid "No ports here to refresh firewall" msgstr "" -#: neutron/agent/common/ovs_lib.py:393 +#: neutron/agent/common/ovs_lib.py:410 #, python-format msgid "Port %(port_id)s not present in bridge %(br_name)s" msgstr "" @@ -139,13 +139,13 @@ msgstr "" msgid "Synchronizing state complete" msgstr "" -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 +#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:611 #: neutron/services/metering/agents/metering_agent.py:286 #, python-format msgid "agent_updated by server side %s!" msgstr "" -#: neutron/agent/l3/agent.py:551 +#: neutron/agent/l3/agent.py:540 msgid "L3 agent started" msgstr "" @@ -166,7 +166,7 @@ msgstr "" msgid "Process runs with uid/gid: %(uid)s/%(gid)s" msgstr "" -#: neutron/agent/linux/dhcp.py:656 +#: neutron/agent/linux/dhcp.py:657 #, python-format msgid "" "Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is " @@ -234,7 +234,7 @@ msgstr "" #: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 #: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 #: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1729 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 msgid "Agent initialized successfully, now running... " msgstr "" @@ -311,7 +311,7 @@ msgstr "" msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1507 +#: neutron/db/db_base_plugin_v2.py:1517 #, python-format msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" msgstr "" @@ -322,7 +322,7 @@ msgid "" "rescheduling is disabled." msgstr "" -#: neutron/db/l3_db.py:1114 +#: neutron/db/l3_db.py:1178 #, python-format msgid "Skipping port %s as no IP is configure on it" msgstr "" @@ -332,12 +332,12 @@ msgstr "" msgid "Centralizing distributed router %s is not supported" msgstr "" -#: neutron/db/l3_dvr_db.py:535 +#: neutron/db/l3_dvr_db.py:539 #, python-format msgid "Agent Gateway port does not exist, so create one: %s" msgstr "" -#: neutron/db/l3_dvr_db.py:619 +#: neutron/db/l3_dvr_db.py:623 #, python-format msgid "SNAT interface port list does not exist, so create one: %s" msgstr "" @@ -370,6 +370,10 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/extensions/vlantransparent.py:45 +msgid "Disabled vlantransparent extension." +msgstr "" + #: neutron/notifiers/nova.py:266 #, python-format msgid "Nova event response: %s" @@ -564,7 +568,7 @@ msgid "RPC agent_id: %s" msgstr "" #: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1245 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 #, python-format msgid "Port %(device)s updated. Details: %(details)s" @@ -576,14 +580,14 @@ msgid "Device %s not defined on plugin" msgstr "" #: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1303 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1320 #, python-format msgid "Attachment %s removed" msgstr "" #: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1332 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 #, python-format msgid "Port %s updated." @@ -594,7 +598,7 @@ msgid "LinuxBridge Agent RPC Daemon Started!" msgstr "" #: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1522 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 msgid "Agent out of sync with plugin!" msgstr "" @@ -610,111 +614,111 @@ msgstr "" msgid "Added segment %(id)s of type %(network_type)s for network %(network_id)s" msgstr "" -#: neutron/plugins/ml2/managers.py:43 +#: neutron/plugins/ml2/managers.py:44 #, python-format msgid "Configured type driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:48 +#: neutron/plugins/ml2/managers.py:49 #, python-format msgid "Loaded type driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:64 +#: neutron/plugins/ml2/managers.py:65 #, python-format msgid "Registered types: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:75 +#: neutron/plugins/ml2/managers.py:76 #, python-format msgid "Tenant network_types: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:161 +#: neutron/plugins/ml2/managers.py:162 #, python-format msgid "Initializing driver for type '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:270 +#: neutron/plugins/ml2/managers.py:271 #, python-format msgid "Configured mechanism driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:276 +#: neutron/plugins/ml2/managers.py:277 #, python-format msgid "Loaded mechanism driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:288 +#: neutron/plugins/ml2/managers.py:289 #, python-format msgid "Registered mechanism drivers: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:293 +#: neutron/plugins/ml2/managers.py:294 #, python-format msgid "Initializing mechanism driver '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:699 +#: neutron/plugins/ml2/managers.py:703 #, python-format msgid "Configured extension driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:705 +#: neutron/plugins/ml2/managers.py:709 #, python-format msgid "Loaded extension driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:716 +#: neutron/plugins/ml2/managers.py:720 #, python-format msgid "Registered extension drivers: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:722 +#: neutron/plugins/ml2/managers.py:726 #, python-format msgid "Initializing extension driver '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:730 +#: neutron/plugins/ml2/managers.py:734 #, python-format msgid "Got %(alias)s extension from driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:779 +#: neutron/plugins/ml2/managers.py:783 #, python-format msgid "Extended network dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:786 +#: neutron/plugins/ml2/managers.py:790 #, python-format msgid "Extended subnet dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:793 +#: neutron/plugins/ml2/managers.py:797 #, python-format msgid "Extended port dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:144 +#: neutron/plugins/ml2/plugin.py:151 msgid "Modular L2 Plugin initialization complete" msgstr "" -#: neutron/plugins/ml2/plugin.py:281 +#: neutron/plugins/ml2/plugin.py:288 #, python-format msgid "Attempt %(count)s to bind port %(port)s" msgstr "" -#: neutron/plugins/ml2/plugin.py:678 +#: neutron/plugins/ml2/plugin.py:685 #, python-format msgid "Port %s was deleted concurrently" msgstr "" -#: neutron/plugins/ml2/plugin.py:689 +#: neutron/plugins/ml2/plugin.py:696 #, python-format msgid "Subnet %s was deleted concurrently" msgstr "" -#: neutron/plugins/ml2/plugin.py:1329 +#: neutron/plugins/ml2/plugin.py:1336 #, python-format msgid "" "Binding info for port %s was not found, it might have been deleted " @@ -821,54 +825,61 @@ msgstr "" msgid "L2 Agent operating in DVR Mode with MAC %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:526 #, python-format msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:627 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:717 +#, python-format +msgid "" +"Skipping ARP spoofing rules for port '%s' because it has port security " +"disabled" +msgstr "" + +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:764 #, python-format msgid "port_unbound(): net_uuid %s not in local_vlan_map" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:833 #, python-format msgid "Adding %s to list of bridges." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:976 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1125 #, python-format msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 #, python-format msgid "" "Port %s was not found on the integration bridge and will therefore not be" " processed" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1272 #, python-format msgid "Configuration for device %s completed." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1291 #, python-format msgid "Ancillary Port %s added" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1550 msgid "Agent tunnel out of sync with plugin!" msgstr "" diff --git a/neutron/locale/neutron.pot b/neutron/locale/neutron.pot index 1ef546fa12e..724742ef327 100644 --- a/neutron/locale/neutron.pot +++ b/neutron/locale/neutron.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 2015.1.dev240\n" +"Project-Id-Version: neutron 2015.1.dev1.g2add4e5\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" +"POT-Creation-Date: 2015-04-20 11:03+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -255,17 +255,30 @@ msgstr "" msgid "Add comments to iptables rules." msgstr "" -#: neutron/agent/common/config.py:69 +#: neutron/agent/common/config.py:68 +msgid "" +"Maximum number of elements which can be stored in an IPset. If None is " +"specified, the system default will be used." +msgstr "" + +#: neutron/agent/common/config.py:72 +msgid "" +"Initial hash size for an IPset. Must be a power of 2, else the kernel " +"will round it up automatically. If None is specified, the system default " +"will be used." +msgstr "" + +#: neutron/agent/common/config.py:80 msgid "Action to be executed when a child process dies" msgstr "" -#: neutron/agent/common/config.py:71 +#: neutron/agent/common/config.py:82 msgid "" "Interval between checks of child process liveness (seconds), use 0 to " "disable" msgstr "" -#: neutron/agent/common/config.py:137 +#: neutron/agent/common/config.py:152 msgid "Top-level directory for maintaining dhcp state" msgstr "" @@ -273,16 +286,16 @@ msgstr "" msgid "Timeout in seconds for ovs-vsctl commands" msgstr "" -#: neutron/agent/common/ovs_lib.py:411 +#: neutron/agent/common/ovs_lib.py:428 #, python-format msgid "Unable to determine mac address for %s" msgstr "" -#: neutron/agent/common/ovs_lib.py:505 +#: neutron/agent/common/ovs_lib.py:522 msgid "Cannot match priority on flow deletion or modification" msgstr "" -#: neutron/agent/common/ovs_lib.py:510 +#: neutron/agent/common/ovs_lib.py:527 msgid "Must specify one or more actions on flow addition or modification" msgstr "" @@ -341,7 +354,7 @@ msgstr "" msgid "Use broadcast in DHCP replies" msgstr "" -#: neutron/agent/l3/agent.py:278 +#: neutron/agent/l3/agent.py:276 msgid "" "The 'gateway_external_network_id' option must be configured for this " "agent as Neutron has more than one external network." @@ -472,7 +485,6 @@ msgid "Group (gid or name) running this process after its initialization" msgstr "" #: neutron/agent/l3/keepalived_state_change.py:122 -#: neutron/agent/metadata/driver.py:43 #: neutron/agent/metadata/namespace_proxy.py:153 #: neutron/tests/functional/agent/l3/test_keepalived_state_change.py:31 msgid "Location of Metadata Proxy UNIX domain socket" @@ -516,17 +528,17 @@ msgstr "" msgid "Unable to unlock pid file" msgstr "" -#: neutron/agent/linux/dhcp.py:239 +#: neutron/agent/linux/dhcp.py:240 #, python-format msgid "Error while reading %s" msgstr "" -#: neutron/agent/linux/dhcp.py:246 +#: neutron/agent/linux/dhcp.py:247 #, python-format msgid "Unable to convert value in %s" msgstr "" -#: neutron/agent/linux/dhcp.py:248 +#: neutron/agent/linux/dhcp.py:249 #, python-format msgid "Unable to access %s" msgstr "" @@ -559,32 +571,32 @@ msgstr "" msgid "Admin username" msgstr "" -#: neutron/agent/linux/interface.py:53 neutron/agent/metadata/config.py:24 +#: neutron/agent/linux/interface.py:53 neutron/agent/metadata/config.py:56 #: neutron/plugins/metaplugin/common/config.py:65 msgid "Admin password" msgstr "" -#: neutron/agent/linux/interface.py:56 neutron/agent/metadata/config.py:27 +#: neutron/agent/linux/interface.py:56 neutron/agent/metadata/config.py:59 #: neutron/plugins/metaplugin/common/config.py:68 msgid "Admin tenant name" msgstr "" -#: neutron/agent/linux/interface.py:58 neutron/agent/metadata/config.py:29 +#: neutron/agent/linux/interface.py:58 neutron/agent/metadata/config.py:61 #: neutron/plugins/metaplugin/common/config.py:70 msgid "Authentication URL" msgstr "" -#: neutron/agent/linux/interface.py:60 neutron/agent/metadata/config.py:31 +#: neutron/agent/linux/interface.py:60 neutron/agent/metadata/config.py:63 #: neutron/common/config.py:49 neutron/plugins/metaplugin/common/config.py:72 msgid "The type of authentication to use" msgstr "" -#: neutron/agent/linux/interface.py:62 neutron/agent/metadata/config.py:33 +#: neutron/agent/linux/interface.py:62 neutron/agent/metadata/config.py:65 #: neutron/plugins/metaplugin/common/config.py:74 msgid "Authentication region" msgstr "" -#: neutron/agent/linux/interface.py:65 neutron/agent/metadata/config.py:43 +#: neutron/agent/linux/interface.py:65 neutron/agent/metadata/config.py:75 msgid "Network service endpoint type to pull from the keystone catalog" msgstr "" @@ -630,7 +642,7 @@ msgstr "" msgid "Location to store IPv6 RA config files" msgstr "" -#: neutron/agent/linux/utils.py:118 +#: neutron/agent/linux/utils.py:119 msgid "" "\n" "Command: {cmd}\n" @@ -640,94 +652,45 @@ msgid "" "Stderr: {stderr}" msgstr "" -#: neutron/agent/metadata/agent.py:110 +#: neutron/agent/metadata/agent.py:117 #: neutron/agent/metadata/namespace_proxy.py:57 msgid "An unknown error has occurred. Please try your request again." msgstr "" -#: neutron/agent/metadata/agent.py:187 +#: neutron/agent/metadata/agent.py:194 msgid "" "Either one of parameter network_id or router_id must be passed to " "_get_ports method." msgstr "" -#: neutron/agent/metadata/agent.py:249 +#: neutron/agent/metadata/agent.py:256 #: neutron/agent/metadata/namespace_proxy.py:102 msgid "Remote metadata server experienced an internal server error." msgstr "" -#: neutron/agent/metadata/agent.py:255 +#: neutron/agent/metadata/agent.py:262 #: neutron/agent/metadata/namespace_proxy.py:108 #, python-format msgid "Unexpected response code: %s" msgstr "" -#: neutron/agent/metadata/config.py:22 -#: neutron/plugins/metaplugin/common/config.py:63 -msgid "Admin user" +#: neutron/agent/metadata/config.py:23 +msgid "Location for Metadata Proxy UNIX domain socket." msgstr "" -#: neutron/agent/metadata/config.py:36 -msgid "Turn off verification of the certificate for ssl" -msgstr "" - -#: neutron/agent/metadata/config.py:39 -msgid "Certificate Authority public key (CA cert) file for ssl" -msgstr "" - -#: neutron/agent/metadata/config.py:46 -msgid "IP address used by Nova metadata server." -msgstr "" - -#: neutron/agent/metadata/config.py:49 -msgid "TCP Port used by Nova metadata server." -msgstr "" - -#: neutron/agent/metadata/config.py:52 -msgid "Shared secret to sign instance-id request" -msgstr "" - -#: neutron/agent/metadata/config.py:57 -msgid "Protocol to access nova metadata, http or https" -msgstr "" - -#: neutron/agent/metadata/config.py:59 -msgid "Allow to perform insecure SSL (https) requests to nova metadata" -msgstr "" - -#: neutron/agent/metadata/config.py:63 -msgid "Client certificate for nova metadata api server." -msgstr "" - -#: neutron/agent/metadata/config.py:66 -msgid "Private key of client certificate." -msgstr "" - -#: neutron/agent/metadata/config.py:73 -msgid "Location for Metadata Proxy UNIX domain socket" -msgstr "" - -#: neutron/agent/metadata/config.py:76 -msgid "Number of separate worker processes for metadata server" -msgstr "" - -#: neutron/agent/metadata/config.py:80 -msgid "Number of backlog requests to configure the metadata server socket with" -msgstr "" - -#: neutron/agent/metadata/driver.py:47 +#: neutron/agent/metadata/config.py:26 msgid "" "User (uid or name) running metadata proxy after its initialization (if " -"empty: agent effective user)" +"empty: agent effective user)." msgstr "" -#: neutron/agent/metadata/driver.py:52 +#: neutron/agent/metadata/config.py:31 msgid "" "Group (gid or name) running metadata proxy after its initialization (if " -"empty: agent effective group)" +"empty: agent effective group)." msgstr "" -#: neutron/agent/metadata/driver.py:57 +#: neutron/agent/metadata/config.py:40 msgid "" "Enable/Disable log watch by metadata proxy. It should be disabled when " "metadata_proxy_user/group is not allowed to read/write its log file and " @@ -737,6 +700,65 @@ msgid "" " effective user id/name." msgstr "" +#: neutron/agent/metadata/config.py:54 +#: neutron/plugins/metaplugin/common/config.py:63 +msgid "Admin user" +msgstr "" + +#: neutron/agent/metadata/config.py:68 +msgid "Turn off verification of the certificate for ssl" +msgstr "" + +#: neutron/agent/metadata/config.py:71 +msgid "Certificate Authority public key (CA cert) file for ssl" +msgstr "" + +#: neutron/agent/metadata/config.py:78 +msgid "IP address used by Nova metadata server." +msgstr "" + +#: neutron/agent/metadata/config.py:81 +msgid "TCP Port used by Nova metadata server." +msgstr "" + +#: neutron/agent/metadata/config.py:84 +msgid "Shared secret to sign instance-id request" +msgstr "" + +#: neutron/agent/metadata/config.py:89 +msgid "Protocol to access nova metadata, http or https" +msgstr "" + +#: neutron/agent/metadata/config.py:91 +msgid "Allow to perform insecure SSL (https) requests to nova metadata" +msgstr "" + +#: neutron/agent/metadata/config.py:95 +msgid "Client certificate for nova metadata api server." +msgstr "" + +#: neutron/agent/metadata/config.py:98 +msgid "Private key of client certificate." +msgstr "" + +#: neutron/agent/metadata/config.py:112 +msgid "" +"Metadata Proxy UNIX domain socket mode, 3 values allowed: 'deduce': " +"deduce mode from metadata_proxy_user/group values, 'user': set metadata " +"proxy socket mode to 0o644, to use when metadata_proxy_user is agent " +"effective user or root, 'group': set metadata proxy socket mode to 0o664," +" to use when metadata_proxy_group is agent effective group or root, " +"'all': set metadata proxy socket mode to 0o666, to use otherwise." +msgstr "" + +#: neutron/agent/metadata/config.py:126 +msgid "Number of separate worker processes for metadata server" +msgstr "" + +#: neutron/agent/metadata/config.py:130 +msgid "Number of backlog requests to configure the metadata server socket with" +msgstr "" + #: neutron/agent/metadata/namespace_proxy.py:137 msgid "Network that will have instance metadata proxied." msgstr "" @@ -959,9 +981,10 @@ msgstr "" msgid "Duplicate hostroute '%s'" msgstr "" -#: neutron/api/v2/attributes.py:334 neutron/tests/unit/test_attributes.py:515 -#: neutron/tests/unit/test_attributes.py:529 -#: neutron/tests/unit/test_attributes.py:537 +#: neutron/api/v2/attributes.py:334 +#: neutron/tests/unit/api/v2/test_attributes.py:515 +#: neutron/tests/unit/api/v2/test_attributes.py:529 +#: neutron/tests/unit/api/v2/test_attributes.py:537 #, python-format msgid "'%(data)s' isn't a recognized IP subnet cidr, '%(cidr)s' is recommended" msgstr "" @@ -1117,7 +1140,7 @@ msgid "Tenant %(tenant_id)s not allowed to create %(resource)s on this network" msgstr "" #: neutron/api/v2/resource.py:127 -#: neutron/tests/unit/test_api_v2_resource.py:248 +#: neutron/tests/unit/api/v2/test_resource.py:248 msgid "Request Failed: internal server error while processing your request." msgstr "" @@ -1136,39 +1159,43 @@ msgid "" "ports created by Neutron on integration and external network bridges." msgstr "" -#: neutron/cmd/sanity_check.py:143 +#: neutron/cmd/sanity_check.py:152 msgid "Check for OVS vxlan support" msgstr "" -#: neutron/cmd/sanity_check.py:145 +#: neutron/cmd/sanity_check.py:154 msgid "Check for iproute2 vxlan support" msgstr "" -#: neutron/cmd/sanity_check.py:147 +#: neutron/cmd/sanity_check.py:156 msgid "Check for patch port support" msgstr "" -#: neutron/cmd/sanity_check.py:149 +#: neutron/cmd/sanity_check.py:158 msgid "Check for nova notification support" msgstr "" -#: neutron/cmd/sanity_check.py:151 +#: neutron/cmd/sanity_check.py:160 msgid "Check for ARP responder support" msgstr "" -#: neutron/cmd/sanity_check.py:153 +#: neutron/cmd/sanity_check.py:162 +msgid "Check for ARP header match support" +msgstr "" + +#: neutron/cmd/sanity_check.py:164 msgid "Check for VF management support" msgstr "" -#: neutron/cmd/sanity_check.py:155 +#: neutron/cmd/sanity_check.py:166 msgid "Check netns permission settings" msgstr "" -#: neutron/cmd/sanity_check.py:157 +#: neutron/cmd/sanity_check.py:168 msgid "Check minimal dnsmasq version" msgstr "" -#: neutron/cmd/sanity_check.py:159 +#: neutron/cmd/sanity_check.py:170 msgid "Check ovsdb native interface support" msgstr "" @@ -1946,58 +1973,58 @@ msgstr "" msgid "Cannot disable enable_dhcp with ipv6 attributes set" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1020 +#: neutron/db/db_base_plugin_v2.py:1030 #, python-format msgid "%(name)s '%(addr)s' does not match the ip_version '%(ip_version)s'" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1044 +#: neutron/db/db_base_plugin_v2.py:1054 msgid "Gateway is not valid on subnet" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1064 neutron/db/db_base_plugin_v2.py:1078 +#: neutron/db/db_base_plugin_v2.py:1074 neutron/db/db_base_plugin_v2.py:1088 #: neutron/plugins/opencontrail/contrail_plugin.py:312 msgid "new subnet" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1071 +#: neutron/db/db_base_plugin_v2.py:1081 #, python-format msgid "Error parsing dns address %s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1087 +#: neutron/db/db_base_plugin_v2.py:1097 msgid "ipv6_ra_mode is not valid when ip_version is 4" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1091 +#: neutron/db/db_base_plugin_v2.py:1101 msgid "ipv6_address_mode is not valid when ip_version is 4" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1224 +#: neutron/db/db_base_plugin_v2.py:1234 msgid "allocation_pools allowed only for specific subnet requests." msgstr "" -#: neutron/db/db_base_plugin_v2.py:1304 +#: neutron/db/db_base_plugin_v2.py:1314 msgid "ip_version must be specified in the absence of cidr and subnetpool_id" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1321 +#: neutron/db/db_base_plugin_v2.py:1331 msgid "cidr and prefixlen must not be supplied together" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1332 +#: neutron/db/db_base_plugin_v2.py:1342 msgid "A cidr must be specified in the absence of a subnet pool" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1583 +#: neutron/db/db_base_plugin_v2.py:1593 msgid "Existing prefixes must be a subset of the new prefixes" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1650 +#: neutron/db/db_base_plugin_v2.py:1660 msgid "Subnet pool has existing allocations" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1657 +#: neutron/db/db_base_plugin_v2.py:1667 msgid "mac address update" msgstr "" @@ -2066,67 +2093,71 @@ msgstr "" msgid "Cannot specify both subnet-id and port-id" msgstr "" -#: neutron/db/l3_db.py:514 -msgid "Router port must have exactly one fixed IP" +#: neutron/db/l3_db.py:518 +#, python-format +msgid "" +"Cannot have multiple router ports with the same network id if both " +"contain IPv6 subnets. Existing port %(p)s has IPv6 subnet(s) and network " +"id %(nid)s" msgstr "" -#: neutron/db/l3_db.py:528 +#: neutron/db/l3_db.py:560 msgid "Subnet for router interface must have a gateway IP" msgstr "" -#: neutron/db/l3_db.py:532 +#: neutron/db/l3_db.py:564 #, python-format msgid "" "IPv6 subnet %s configured to receive RAs from an external router cannot " "be added to Neutron Router." msgstr "" -#: neutron/db/l3_db.py:712 +#: neutron/db/l3_db.py:776 #, python-format msgid "Cannot add floating IP to port on subnet %s which has no gateway_ip" msgstr "" -#: neutron/db/l3_db.py:753 +#: neutron/db/l3_db.py:817 #, python-format msgid "" "Port %(port_id)s is associated with a different tenant than Floating IP " "%(floatingip_id)s and therefore cannot be bound." msgstr "" -#: neutron/db/l3_db.py:757 +#: neutron/db/l3_db.py:821 #, python-format msgid "" "Cannot create floating IP and bind it to Port %s, since that port is " "owned by a different tenant." msgstr "" -#: neutron/db/l3_db.py:769 +#: neutron/db/l3_db.py:833 #, python-format msgid "Port %(id)s does not have fixed ip %(address)s" msgstr "" -#: neutron/db/l3_db.py:776 +#: neutron/db/l3_db.py:840 #, python-format msgid "Cannot add floating IP to port %s that has no fixed IP addresses" msgstr "" -#: neutron/db/l3_db.py:780 +#: neutron/db/l3_db.py:844 #, python-format msgid "" "Port %s has multiple fixed IPs. Must provide a specific IP when " "assigning a floating IP" msgstr "" -#: neutron/db/l3_db.py:809 +#: neutron/db/l3_db.py:873 msgid "fixed_ip_address cannot be specified without a port_id" msgstr "" -#: neutron/db/l3_db.py:849 +#: neutron/db/l3_db.py:913 #, python-format msgid "Network %s is not a valid external network" msgstr "" -#: neutron/db/l3_db.py:993 +#: neutron/db/l3_db.py:1057 #, python-format msgid "has device owner %s" msgstr "" @@ -2137,11 +2168,11 @@ msgid "" " Only admin can override." msgstr "" -#: neutron/db/l3_dvr_db.py:551 +#: neutron/db/l3_dvr_db.py:555 msgid "Unable to create the Agent Gateway Port" msgstr "" -#: neutron/db/l3_dvr_db.py:584 +#: neutron/db/l3_dvr_db.py:588 msgid "Unable to create the SNAT Interface Port" msgstr "" @@ -2793,6 +2824,10 @@ msgstr "" msgid "API for retrieving service providers for Neutron advanced services" msgstr "" +#: neutron/extensions/vlantransparent.py:27 +msgid "Backend does not support VLAN Transparency." +msgstr "" + #: neutron/ipam/subnet_alloc.py:106 #, python-format msgid "Insufficient prefix space to allocate subnet size /%s" @@ -3676,27 +3711,34 @@ msgstr "" msgid "Update router-add-interface failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:556 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:562 #: neutron/services/l3_router/l3_sdnve.py:128 msgid "No port ID" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:562 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:568 #: neutron/services/l3_router/l3_sdnve.py:134 msgid "No fixed IP" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:590 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:588 +#, python-format +msgid "" +"Update router-remove-interface failed SDN-VE: subnet %(sid) is not " +"associated with any ports on router %(rid)" +msgstr "" + +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:603 #, python-format msgid "Update router-remove-interface failed SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:622 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:640 #, python-format msgid "Creating floating ip operation failed in SDN-VE controller: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:650 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:668 #, python-format msgid "Update floating ip failed in SDN-VE: %s" msgstr "" @@ -3927,16 +3969,16 @@ msgid "" " network MTU value that differs from the default segment_mtu value." msgstr "" -#: neutron/plugins/ml2/managers.py:89 +#: neutron/plugins/ml2/managers.py:90 msgid "network_type required" msgstr "" -#: neutron/plugins/ml2/managers.py:192 neutron/plugins/ml2/managers.py:201 +#: neutron/plugins/ml2/managers.py:193 neutron/plugins/ml2/managers.py:202 #, python-format msgid "network_type value '%s' not supported" msgstr "" -#: neutron/plugins/ml2/plugin.py:219 +#: neutron/plugins/ml2/plugin.py:226 msgid "binding:profile value too large" msgstr "" @@ -3945,10 +3987,6 @@ msgstr "" msgid "%(method)s failed." msgstr "" -#: neutron/plugins/ml2/common/exceptions.py:28 -msgid "Backend does not support VLAN Transparency." -msgstr "" - #: neutron/plugins/ml2/drivers/type_flat.py:33 msgid "" "List of physical_network names with which flat networks can be created. " @@ -4568,23 +4606,23 @@ msgid "" "error: %(error)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1559 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1653 msgid "" "DVR deployments for VXLAN/GRE underlays require L2-pop to be enabled, in " "both the Agent and Server side." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1577 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1671 #, python-format msgid "Parsing bridge_mappings failed: %s." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1598 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1693 #, python-format msgid "Invalid tunnel type specified: %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1601 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1696 msgid "Tunneling cannot be enabled without a valid local_ip." msgstr "" @@ -4648,15 +4686,26 @@ msgstr "" #: neutron/plugins/openvswitch/common/config.py:78 msgid "" +"Enable suppression of ARP responses that don't match an IP address that " +"belongs to the port from which they originate. Note: This prevents the " +"VMs attached to this agent from spoofing, it doesn't protect them from " +"other devices which have the capability to spoof (e.g. bare metal or VMs " +"attached to agents without this flag set to True). Spoofing rules will " +"not be added to any ports that have port security disabled. This requires" +" a version of OVS that supports matching ARP headers." +msgstr "" + +#: neutron/plugins/openvswitch/common/config.py:89 +msgid "" "Set or un-set the don't fragment (DF) bit on outgoing IP packet carrying " "GRE/VXLAN tunnel." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:81 +#: neutron/plugins/openvswitch/common/config.py:92 msgid "Make the l2 agent run in DVR mode." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:83 +#: neutron/plugins/openvswitch/common/config.py:94 msgid "" "Set new timeout in seconds for new rpc calls after agent receives " "SIGTERM. If value is set to 0, rpc timeout won't be changed" @@ -4978,19 +5027,8 @@ msgstr "" msgid "Keepalived didn't respawn" msgstr "" -#: neutron/tests/unit/test_api_v2_resource.py:157 -#: neutron/tests/unit/test_api_v2_resource.py:202 -msgid "Unmapped error" -msgstr "" - -#: neutron/tests/unit/test_api_v2_resource.py:261 -msgid "" -"The server has either erred or is incapable of performing the requested " -"operation." -msgstr "" - -#: neutron/tests/unit/test_iptables_manager.py:842 -#: neutron/tests/unit/test_iptables_manager.py:876 +#: neutron/tests/unit/agent/linux/test_iptables_manager.py:842 +#: neutron/tests/unit/agent/linux/test_iptables_manager.py:876 #, python-format msgid "" "IPTablesManager.apply failed to apply the following set of iptables " @@ -4998,31 +5036,42 @@ msgid "" "%s" msgstr "" -#: neutron/tests/unit/ml2/test_ml2_plugin.py:309 +#: neutron/tests/unit/api/v2/test_resource.py:157 +#: neutron/tests/unit/api/v2/test_resource.py:202 +msgid "Unmapped error" +msgstr "" + +#: neutron/tests/unit/api/v2/test_resource.py:261 +msgid "" +"The server has either erred or is incapable of performing the requested " +"operation." +msgstr "" + +#: neutron/tests/unit/plugins/ml2/test_plugin.py:310 #, python-format msgid "Deleting port %s" msgstr "" -#: neutron/tests/unit/ml2/test_ml2_plugin.py:310 +#: neutron/tests/unit/plugins/ml2/test_plugin.py:311 #, python-format msgid "The port '%s' was deleted" msgstr "" -#: neutron/tests/unit/ml2/drivers/mechanism_logger.py:33 +#: neutron/tests/unit/plugins/ml2/drivers/mechanism_logger.py:33 #, python-format msgid "" "%(method)s called with network settings %(current)s (original settings " "%(original)s) and network segments %(segments)s" msgstr "" -#: neutron/tests/unit/ml2/drivers/mechanism_logger.py:60 +#: neutron/tests/unit/plugins/ml2/drivers/mechanism_logger.py:60 #, python-format msgid "" "%(method)s called with subnet settings %(current)s (original settings " "%(original)s)" msgstr "" -#: neutron/tests/unit/ml2/drivers/mechanism_logger.py:86 +#: neutron/tests/unit/plugins/ml2/drivers/mechanism_logger.py:86 #, python-format msgid "" "%(method)s called with port settings %(current)s (original settings " @@ -5031,12 +5080,12 @@ msgid "" "%(segments_to_bind)s" msgstr "" -#: neutron/tests/unit/ml2/extensions/test_extension.py:54 +#: neutron/tests/unit/plugins/ml2/extensions/fake_extension.py:54 msgid "Adds test attributes to core resources." msgstr "" -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:955 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:972 +#: neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py:961 +#: neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py:978 #, python-format msgid "Failed to set-up %(type)s tunnel port to %(ip)s" msgstr "" diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 321c8452d31..00000000000 --- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,943 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-03-31 22:26+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" -"neutron/language/pt_BR/)\n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "Serviço %s é suportado pelo plugin núcleo" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "Carregando Plug-in: %s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" -"Inserindo política: %(new_policy)s no lugar de política deprecada: " -"%(old_policy)s" - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "Serviço Neutron iniciado, escutando em %(host)s:%(port)s" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Exceção de HTTP lançada: %s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s retornado com HTTP %(status)d" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s retornou uma falha: %(exception)s" - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "Extensão de grupo de segurança desativada." - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Preparando filtros para dispositivos %s" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "Regra do grupo de segurança atualizada %r" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "Membro do grupo de segurança atualizado %r" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "Regra do provedor atualizada" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "Remover filtro de dispositivo para %r" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "Atualizar regras de firewall" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "Nenhuma porta aqui para atualizar firewall" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "Agente DHCP iniciado" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "Sincronizando estado" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated por lado do servidor %s!" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "Agente L3 iniciado" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "O dispositivo %s já existe" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "Tentou atualizar o filtro de porta que não foi filtrado %s" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "Tentou remover o filtro de porta que não foi filtrado %r" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "Inicializando o Extension Manager." - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "Extensão carregada: %s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Permitir que a classificação seja ativada porque a paginação nativa requer " -"classificação nativa" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "Limpeza de OVS concluída com êxito" - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "Agente inicializado com êxito; em execução agora... " - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "Criação de log ativada!" - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "Arquivo de colagem configurado: %s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr "" - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"A validação para CIDR: %(new_cidr)s falhou - se sobrepõe com a sub-rede " -"%(subnet_id)s (CIDR: %(cidr)s)" - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "Localizado endereço IP inválido no pool: %(start)s - %(end)s:" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "Endereços IP especificado não correspondem à versão do IP da sub-rede" - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "IP inicial (%(start)s) é maior que IP final (%(end)s)" - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "Localizado pool maior que a sub-rede CIDR:%(start)s - %(end)s" - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Localizados intervalos de sobreposição: %(l_range)s e %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "Ignorando a porta %s porque nenhum IP está configurado nela" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "Backdoor de Eventlet escutando na porta %(port)s pelo processo %(pid)d" - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "Ignorando tarefa periódica %(task)s porque seu intervalo é negativo" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "Ignorando tarefa periódica %(task)s porque ela está desativada" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "%s capturadas, saindo" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "Processo pai saiu inesperadamente, saindo" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "Filho capturado %s, terminando" - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "Bifurcação muito rápida, suspendendo" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "Filho %d iniciado" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "Iniciando %d trabalhadores" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "%(pid)d filho eliminado pelo sinal %(sig)d" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "Filho %(pid)s encerrando com status %(code)d" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "%s capturado, parando filhos" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "" - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "Aguardando em %d filhos para sair" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "alocada VLAN (%d) do pool" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "Nenhum %s Plug-in carregado" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "%(plugin_key)s: %(function_name)s com args %(args)s ignorado" - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "" -"A iteração do loop excedeu o intervalo (%(polling_interval)s vs. " -"%(elapsed)s)!" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "agent_id de RPC: %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Porta %(device)s atualizada. Detalhes: %(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "Dispositivo %s não definido no plug-in" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "Anexo %s removido" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "Porta %s atualizada." - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "Daemon RPC do Agente LinuxBridge Iniciado!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "Agente fora de sincronização com o plug-in!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "Mapeamentos da interface: %s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" -"Adicionado segmento %(id)s de tipo %(network_type)s para a rede " -"%(network_id)s" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "Configurado nomes para o driver de tipo: %s" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "Carregados nomes do driver de tipo: %s" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "Tipos registrados: %s" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "Tipos de network_types: %s" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "inicializando driver para o tipo '%s'" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "Configurados nomes para o driver de mecanismo: %s" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "Carregados nomes do driver de mecanismo: %s" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "Registrados drivers de mecanismo : %s" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "Inicializando driver de mecanismo '%s'" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "Inicialização de plug-in L2 modular concluída" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "Nomes arbitrários de rede flat physical_network permitidos" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "Nomes permitidos de rede flat physical_network : %s" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "Inicialização do ML2 FlatTypeDriver concluída" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "Inicialização do ML2 LocalTypeDriver concluída" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "%(type)s faixas de ID: %(range)s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Intervalos de VLAN de rede: %s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "Inicialização do VlanTypeDriver concluída" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "Nome da rede alterado para %s" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "Designando %(vlan_id)s como vlan local para net-id=%(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "Recuperando vlan = %(vlan_id)s a partir de net-id = %(net_uuid)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "Adicionando %s na lista de pontes." - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "Mapeamento de rede física %(physical_network)s para a ponte %(bridge)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "Porta auxiliar %s adicionada" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "Túnel do agente fora de sincronização com o plug-in!" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "Provedor padrão não foi especificado para o tipo de serviço %s" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "Carregando driver de medição %s" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "" diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 0b950ac7dc2..00000000000 --- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,936 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# 汪军 , 2015 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-03-31 22:26+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/neutron/" -"language/zh_CN/)\n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "加载核心插件: %s" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "服务%s由核心插件支持" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "正在装入插件:%s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "在被废弃的策略:%(old_policy)s位置上插入策略:%(new_policy)s " - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "Neutron服务启动,正在%(host)s:%(port)s上监听" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "HTTP 异常抛出:%s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s 随HTTP %(status)d返回" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s 返回了故障:%(exception)s" - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "已禁用安全组扩展。" - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "正在为设备 %s 准备过滤器" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "已更新安全组规则 %r" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "已更新安全组成员 %r" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "已更新提供程序规则" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "请为 %r 除去设备过滤器" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "请刷新防火墙规则" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "已启动 DHCP 代理" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "正在使状态同步" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "同步状态完成" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "服务器端 %s 已更新代理!" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "已启动 L3 代理" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "路由器%(router_id)s 转换为%(state)s" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "进程运行uid/gid: %(uid)s/%(gid)s" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "设备 %s 已存在" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "已尝试更新未过滤的端口过滤器 %s" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "已尝试除去未过滤的端口过滤器 %r" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "正在初始化扩展管理员。" - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "加载的扩展:%s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "已启用允许排序,因为本机分页需要本机排序" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "%(action)s 失败 (客户端错误): %(exc)s" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "正在删除端口: %s" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "OVS 清除已成功完成" - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "代理已成功初始化,现在正在运行..." - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "已启用日志记录!" - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "%(prog)s 版本 %(version)s" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "配置粘贴文件:%s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr "IPv6在本系统上未使能。" - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "在主机 %(host)s上添加网络%(net)s到代理%(agent)%s" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"针对 CIDR %(new_cidr)s 的验证失败 - 与子网 %(subnet_id)s(CIDR 为 %(cidr)s)" -"重叠" - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "在池中找到无效 IP 地址:%(start)s - %(end)s:" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "指定的 IP 地址与子网 IP 版本不匹配" - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "起始 IP (%(start)s) 大于结束 IP (%(end)s)" - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "找到超过子网 CIDR (%(start)s - %(end)s) 的池" - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "找到重叠范围:%(l_range)s 和 %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "正在跳过端口 %s,因为没有在该端口上配置任何 IP" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "SNAT 已经绑定到服务节点。" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "表 %(old_t)r 已经更名为 %(new_t)r" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "Eventlet为进程 %(pid)d 在后台监听 %(port)s " - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "正在跳过周期性任务 %(task)s,因为其时间间隔为负" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "正在跳过周期性任务 %(task)s,因为它已禁用" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "捕获到 %s,正在退出" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "父进程已意外终止,正在退出" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "子代捕获 %s,正在退出" - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "派生速度太快,正在休眠" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "已启动子代 %d" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "正在启动 %d 工作程序" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "信号 %(sig)d 已终止子代 %(pid)d" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "子代 %(pid)s 已退出,状态为 %(code)d" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "捕获到 %s,正在停止子代" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "线程结束,正在清理" - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "正在等待 %d 个子代退出" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "已从池分配 vlan (%d)" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "未装入任何 %s 插件" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "%(plugin_key)s:已忽略具有自变量 %(args)s 的 %(function_name)s" - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "SDN-VE 控制器 IP 地址: %s" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "循环迭代超过时间间隔(%(polling_interval)s 对 %(elapsed)s)!" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC agent_id:%s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "端口 %(device)s 已更新。详细信息:%(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "未在插件上定义设备 %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "已除去附件 %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "端口 %s 已更新。" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "LinuxBridge 代理 RPC 守护程序已启动!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "代理与插件不同步!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "接口映射:%s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "增添segment%(id)s种类%(network_type)s在网络%(network_id)s" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "配置类型驱动名字: %s" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "已加载驱动程序: %s" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "已注册类型: %s" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "项目网络类型: %s" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "为类型 '%s'初始化驱动" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "配置装置驱动名称: %s" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "已加载的装置驱动名称: %s" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "初始化扩展驱动 '%s'" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "L2插件模块初始化完成" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "端口 %s 被同时删除" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "子网 %s 同时被删除 " - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "允许平面物理网络使用任意名字" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "可以使用的平面物理网络名字: %s" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "完成ML2 FlatTypeDriver的初始化" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "完成L2插件模块初始化" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "%(type)s ID 范围: %(range)s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "网络 VLAN 范围:%s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "Vlan类型驱动初始化完成" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "网络名改变为 %s" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "端口名改变为 %s" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "APIC 服务代理启动中 ..." - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "APIC 服务代理已启动" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "APIC 主机代理: 代理正启动在 %s" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "APIC 主机代理: 已启动在 %s" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "正在初始化CRD客户端 ..." - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "对于网络标识 %(net_uuid)s,正在将 %(vlan_id)s 分配为本地 vlan" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "正在从网络标识 %(net_uuid)s 恢复 vlan %(vlan_id)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "正在将物理网络 %(physical_network)s 映射至网桥 %(bridge)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "设备 %s 的配置已完成。" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "代理隧道与插件不同步!" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "物理设备映射:%s" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "正在加载接口驱动 %s" diff --git a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po b/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index a42231de67d..00000000000 --- a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,934 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-04-03 06:13+0000\n" -"PO-Revision-Date: 2015-03-31 22:26+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/neutron/" -"language/zh_TW/)\n" -"Language: zh_TW\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: neutron/manager.py:115 -#, python-format -msgid "Loading core plugin: %s" -msgstr "" - -#: neutron/manager.py:155 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "" - -#: neutron/manager.py:173 -#, python-format -msgid "Loading Plugin: %s" -msgstr "正在載入外掛程式:%s" - -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" - -#: neutron/quota.py:215 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:220 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/service.py:178 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "" - -#: neutron/wsgi.py:779 -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#: neutron/wsgi.py:796 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "已擲出 HTTP 異常狀況:%s" - -#: neutron/wsgi.py:812 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s 傳回了 HTTP %(status)d" - -#: neutron/wsgi.py:815 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s 傳回了錯誤:%(exception)s" - -#: neutron/agent/securitygroups_rpc.py:82 -msgid "Disabled security-group extension." -msgstr "已停用安全群組延伸。" - -#: neutron/agent/securitygroups_rpc.py:84 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:214 -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:226 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "正在準備裝置 %s 的過濾器" - -#: neutron/agent/securitygroups_rpc.py:256 -#, python-format -msgid "Security group rule updated %r" -msgstr "安全群組規則已更新 %r" - -#: neutron/agent/securitygroups_rpc.py:263 -#, python-format -msgid "Security group member updated %r" -msgstr "安全群組成員已更新 %r" - -#: neutron/agent/securitygroups_rpc.py:285 -msgid "Provider rule updated" -msgstr "已更新提供者規則" - -#: neutron/agent/securitygroups_rpc.py:297 -#, python-format -msgid "Remove device filter for %r" -msgstr "移除 %r 的裝置過濾器" - -#: neutron/agent/securitygroups_rpc.py:307 -msgid "Refresh firewall rules" -msgstr "重新整理防火牆規則" - -#: neutron/agent/securitygroups_rpc.py:311 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/common/ovs_lib.py:393 -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "" - -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:589 -msgid "DHCP agent started" -msgstr "已啟動 DHCP 代理程式" - -#: neutron/agent/dhcp/agent.py:144 -msgid "Synchronizing state" -msgstr "正在同步化狀態" - -#: neutron/agent/dhcp/agent.py:165 -msgid "Synchronizing state complete" -msgstr "" - -#: neutron/agent/dhcp/agent.py:586 neutron/agent/l3/agent.py:622 -#: neutron/services/metering/agents/metering_agent.py:286 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated 是由伺服器端 %s 執行!" - -#: neutron/agent/l3/agent.py:551 -msgid "L3 agent started" -msgstr "已啟動 L3 代理程式" - -#: neutron/agent/l3/ha.py:114 -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "" - -#: neutron/agent/l3/ha.py:124 -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" - -#: neutron/agent/linux/daemon.py:102 -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:656 -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" - -#: neutron/agent/linux/interface.py:268 neutron/agent/linux/interface.py:319 -#: neutron/agent/linux/interface.py:377 neutron/agent/linux/interface.py:420 -#, python-format -msgid "Device %s already exists" -msgstr "裝置 %s 已存在" - -#: neutron/agent/linux/iptables_firewall.py:114 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "已嘗試更新未過濾的埠過濾器 %s" - -#: neutron/agent/linux/iptables_firewall.py:125 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "已嘗試移除未過濾的埠過濾器 %r" - -#: neutron/api/extensions.py:404 -msgid "Initializing extension manager." -msgstr "正在起始設定延伸管理程式。" - -#: neutron/api/extensions.py:562 -#, python-format -msgid "Loaded extension: %s" -msgstr "已載入延伸:%s" - -#: neutron/api/v2/base.py:93 -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "已啟用容許排序,因為原生分頁需要原生排序" - -#: neutron/api/v2/resource.py:94 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "" - -#: neutron/callbacks/manager.py:135 -#, python-format -msgid "Notify callbacks for %(resource)s, %(event)s" -msgstr "" - -#: neutron/callbacks/manager.py:142 -#, python-format -msgid "Calling callback %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:73 -#, python-format -msgid "Deleting port: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:103 -#, python-format -msgid "Cleaning bridge: %s" -msgstr "" - -#: neutron/cmd/ovs_cleanup.py:110 -msgid "OVS cleanup completed successfully" -msgstr "已順利完成 OVS 清理" - -#: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1634 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 -msgid "Agent initialized successfully, now running... " -msgstr "已順利地起始設定代理程式,現正在執行中..." - -#: neutron/common/config.py:204 -msgid "Logging enabled!" -msgstr "已啟用記載!" - -#: neutron/common/config.py:205 -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "" - -#: neutron/common/config.py:224 -#, python-format -msgid "Config paste file: %s" -msgstr "配置貼上檔案:%s" - -#: neutron/common/ipv6_utils.py:63 -msgid "IPv6 is not enabled on this system." -msgstr "" - -#: neutron/db/agentschedulers_db.py:161 -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" - -#: neutron/db/agentschedulers_db.py:196 -#, python-format -msgid "Scheduling unhosted network %s" -msgstr "" - -#: neutron/db/agentschedulers_db.py:203 -#, python-format -msgid "" -"Failed to schedule network %s, no eligible agents or it might be already " -"scheduled by another server" -msgstr "" - -#: neutron/db/agentschedulers_db.py:211 -#, python-format -msgid "Adding network %(net)s to agent %(agent)%s on host %(host)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:630 -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"驗證 CIDR %(new_cidr)s 失敗 - 與子網路 %(subnet_id)s (CIDR %(cidr)s) 重疊" - -#: neutron/db/db_base_plugin_v2.py:657 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "在儲存區中發現無效的 IP 位址:%(start)s - %(end)s:" - -#: neutron/db/db_base_plugin_v2.py:664 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "指定的 IP 位址與子網路 IP 版本不符" - -#: neutron/db/db_base_plugin_v2.py:668 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "起始 IP (%(start)s) 大於結尾 IP (%(end)s)" - -#: neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "找到的儲存區大於子網路 CIDR:%(start)s - %(end)s" - -#: neutron/db/db_base_plugin_v2.py:697 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "發現重疊的範圍:%(l_range)s 及 %(r_range)s" - -#: neutron/db/db_base_plugin_v2.py:1507 -#, python-format -msgid "Found IP allocation %(alloc)s on subnet %(subnet)s, cannot delete" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:78 -msgid "" -"Skipping period L3 agent status check because automatic router rescheduling " -"is disabled." -msgstr "" - -#: neutron/db/l3_db.py:1114 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "正在跳過埠 %s,因為其上沒有配置 IP" - -#: neutron/db/l3_dvr_db.py:86 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:535 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:619 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:312 -msgid "SNAT already bound to a service node." -msgstr "" - -#: neutron/db/l3_hamode_db.py:188 -#, python-format -msgid "" -"Attempt %(count)s to allocate a VRID in the network %(network)s for the " -"router %(router)s" -msgstr "" - -#: neutron/db/l3_hamode_db.py:271 -#, python-format -msgid "" -"Number of available agents lower than max_l3_agents_per_router. L3 agents " -"available: %s" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:221 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/debug/commands.py:107 -#, python-format -msgid "%d probe(s) deleted" -msgstr "" - -#: neutron/notifiers/nova.py:266 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:146 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "" - -#: neutron/openstack/common/periodic_task.py:120 -#, python-format -msgid "Skipping periodic task %(task)s because its interval is negative" -msgstr "正在跳過定期作業 %(task)s,因為其間隔為負數" - -#: neutron/openstack/common/periodic_task.py:125 -#, python-format -msgid "Skipping periodic task %(task)s because it is disabled" -msgstr "正在跳過定期作業 %(task)s,因為它已停用" - -#: neutron/openstack/common/service.py:173 -#, python-format -msgid "Caught %s, exiting" -msgstr "已捕捉到 %s,正在結束" - -#: neutron/openstack/common/service.py:231 -msgid "Parent process has died unexpectedly, exiting" -msgstr "母程序已非預期地當掉,正在結束" - -#: neutron/openstack/common/service.py:262 -#, python-format -msgid "Child caught %s, exiting" -msgstr "" - -#: neutron/openstack/common/service.py:301 -msgid "Forking too fast, sleeping" -msgstr "分岔太快,正在休眠" - -#: neutron/openstack/common/service.py:320 -#, python-format -msgid "Started child %d" -msgstr "已開始子行程 %d" - -#: neutron/openstack/common/service.py:330 -#, python-format -msgid "Starting %d workers" -msgstr "正在啟動 %d 個工作程式" - -#: neutron/openstack/common/service.py:347 -#, python-format -msgid "Child %(pid)d killed by signal %(sig)d" -msgstr "信號 %(sig)d 結束了子項 %(pid)d" - -#: neutron/openstack/common/service.py:351 -#, python-format -msgid "Child %(pid)s exited with status %(code)d" -msgstr "子項 %(pid)s 已結束,狀態為 %(code)d" - -#: neutron/openstack/common/service.py:390 -#, python-format -msgid "Caught %s, stopping children" -msgstr "已捕捉到 %s,正在停止子項" - -#: neutron/openstack/common/service.py:399 -msgid "Wait called after thread killed. Cleaning up." -msgstr "" - -#: neutron/openstack/common/service.py:415 -#, python-format -msgid "Waiting on %d children to exit" -msgstr "正在等待 %d 個子項結束" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "已從儲存區配置 VLAN (%d)" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 -#, python-format -msgid "No %s Plugin loaded" -msgstr "未載入 %s 外掛程式" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:118 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "%(plugin_key)s:已忽略帶有引數 %(args)s 的 %(function_name)s" - -#: neutron/plugins/embrane/common/utils.py:44 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:77 -#, python-format -msgid "The IP addr of available SDN-VE controllers: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:80 -#, python-format -msgid "The SDN-VE controller IP address: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:236 -msgid "Bad resource for forming a list request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:246 -msgid "Bad resource for forming a show request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:256 -msgid "Bad resource for forming a create request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:268 -msgid "Bad resource for forming a update request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:279 -msgid "Bad resource for forming a delete request" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:307 -#, python-format -msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:32 -msgid "Fake SDNVE controller initialized" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:35 -msgid "Fake SDNVE controller: list" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:39 -msgid "Fake SDNVE controller: show" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:43 -msgid "Fake SDNVE controller: create" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:47 -msgid "Fake SDNVE controller: update" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:51 -msgid "Fake SDNVE controller: delete" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:55 -msgid "Fake SDNVE controller: get tenant by id" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:59 -msgid "Fake SDNVE controller: check and create tenant" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api_fake.py:63 -msgid "Fake SDNVE controller: get controller" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:147 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:153 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 -#, python-format -msgid "" -"Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 -#, python-format -msgid "" -"Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "迴圈反覆運算已超出間隔(%(polling_interval)s 與 %(elapsed)s)!" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC agent_id:%s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:863 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "已更新埠 %(device)s。詳細資料:%(details)s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "外掛程式上未定義裝置 %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:903 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1227 -#, python-format -msgid "Attachment %s removed" -msgstr "已移除連接裝置 %s" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:915 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1239 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 -#, python-format -msgid "Port %s updated." -msgstr "已更新埠 %s。" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:968 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "已啟動「LinuxBridge 代理程式 RPC 常駐程式」!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:978 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1429 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 -msgid "Agent out of sync with plugin!" -msgstr "代理程式與外掛程式不同步!" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 -#, python-format -msgid "Interface mappings: %s" -msgstr "介面對映:%s" - -#: neutron/plugins/ml2/db.py:60 -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:43 -#, python-format -msgid "Configured type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:48 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:64 -#, python-format -msgid "Registered types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:75 -#, python-format -msgid "Tenant network_types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:161 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:270 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:276 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:288 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:293 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:699 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:716 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:722 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:730 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:779 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:786 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:793 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:144 -msgid "Modular L2 Plugin initialization complete" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:281 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:678 -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:689 -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1329 -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "Arbitrary flat physical_network names allowed" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:78 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:85 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:37 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:99 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "網路 VLAN 範圍:%s" - -#: neutron/plugins/ml2/drivers/type_vlan.py:166 -msgid "VlanTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:104 -#, python-format -msgid "Network %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:117 -#, python-format -msgid "Network name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:147 -#, python-format -msgid "Network %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:243 -#, python-format -msgid "VM %s is not created as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:257 -#, python-format -msgid "Port name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:310 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 -msgid "APIC service agent starting ..." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 -msgid "APIC service agent started" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:179 -#, python-format -msgid "APIC host agent: agent starting on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:199 -#, python-format -msgid "APIC host agent: started on %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:40 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:54 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/ml2/extensions/port_security.py:33 -msgid "PortSecurityExtensionDriver initialization complete" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:153 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:204 -#, python-format -msgid "L2 Agent operating in DVR Mode with MAC %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:518 -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "正在將 %(vlan_id)s 指派為 net-id = %(net_uuid)s 的本端 VLAN" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:619 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "正在從 net-id = %(net_uuid)s 收回 VLAN = %(vlan_id)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:714 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:783 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:926 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "正在將實體網路 %(physical_network)s 對映到橋接器 %(bridge)s" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1035 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1149 -#, python-format -msgid "" -"Port %s was not found on the integration bridge and will therefore not be " -"processed" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "Configuration for device %s completed." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1198 -#, python-format -msgid "Ancillary Port %s added" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1457 -msgid "Agent tunnel out of sync with plugin!" -msgstr "代理程式通道與外掛程式不同步!" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:216 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:223 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:244 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:334 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:110 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/server/__init__.py:50 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/services/service_base.py:99 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:247 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:96 -#, python-format -msgid "Loading Metering driver %s" -msgstr "" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:89 -#, python-format -msgid "Loading interface driver %s" -msgstr "" From b339391bcb223c0f03d30f36dea47d13adb12c71 Mon Sep 17 00:00:00 2001 From: mathieu-rohon Date: Sat, 7 Mar 2015 13:30:49 +0100 Subject: [PATCH 010/161] ML2: Change port status only when it's bound to the host Currently, nothing prevents the port status to be changed to BUILD state when get_device_details() is sent by a host that doesn't own the port. In some cases the port might stay in BUILD state. This could happen during a live-migration, or for multi-hosted ports such as HA ports. This commit allows the port status modification only if the port is bound to the host that is asking for it. Closes-Bug: #1439857 Closes-Bug: #1438040 Closes-Bug: #1416933 Change-Id: I9b3673f453abbafaaa4f78542fcfebe8dc93f2bb (cherry picked from commit 9b53b82ce7dad551ebc0f02ff667d5345fb7e139) --- neutron/plugins/ml2/rpc.py | 15 ++++++++------- neutron/tests/unit/plugins/ml2/test_rpc.py | 22 ++++++++++++++++++++-- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/neutron/plugins/ml2/rpc.py b/neutron/plugins/ml2/rpc.py index af4b6747e5a..1764cdf367a 100644 --- a/neutron/plugins/ml2/rpc.py +++ b/neutron/plugins/ml2/rpc.py @@ -96,13 +96,14 @@ class RpcCallbacks(type_tunnel.TunnelRpcCallbackMixin): 'vif_type': port[portbindings.VIF_TYPE]}) return {'device': device} - new_status = (q_const.PORT_STATUS_BUILD if port['admin_state_up'] - else q_const.PORT_STATUS_DOWN) - if port['status'] != new_status: - plugin.update_port_status(rpc_context, - port_id, - new_status, - host) + if (not host or host == port_context.host): + new_status = (q_const.PORT_STATUS_BUILD if port['admin_state_up'] + else q_const.PORT_STATUS_DOWN) + if port['status'] != new_status: + plugin.update_port_status(rpc_context, + port_id, + new_status, + host) entry = {'device': device, 'network_id': port['network_id'], diff --git a/neutron/tests/unit/plugins/ml2/test_rpc.py b/neutron/tests/unit/plugins/ml2/test_rpc.py index facc9f9b56a..56cbdbcb979 100644 --- a/neutron/tests/unit/plugins/ml2/test_rpc.py +++ b/neutron/tests/unit/plugins/ml2/test_rpc.py @@ -88,6 +88,7 @@ class RpcCallbacksTestCase(base.BaseTestCase): def test_get_device_details_port_status_equal_new_status(self): port = collections.defaultdict(lambda: 'fake') self.plugin.get_bound_port_context().current = port + self.plugin.port_bound_to_host = mock.MagicMock(return_value=True) for admin_state_up in (True, False): new_status = (constants.PORT_STATUS_BUILD if admin_state_up else constants.PORT_STATUS_DOWN) @@ -98,8 +99,7 @@ class RpcCallbacksTestCase(base.BaseTestCase): port['admin_state_up'] = admin_state_up port['status'] = status self.plugin.update_port_status.reset_mock() - self.callbacks.get_device_details('fake_context', - host='fake_host') + self.callbacks.get_device_details('fake_context') self.assertEqual(status == new_status, not self.plugin.update_port_status.called) @@ -113,6 +113,24 @@ class RpcCallbacksTestCase(base.BaseTestCase): cached_networks=cached_networks) self.assertTrue('fake_port' in cached_networks) + def test_get_device_details_wrong_host(self): + port = collections.defaultdict(lambda: 'fake') + port_context = self.plugin.get_bound_port_context() + port_context.current = port + port_context.host = 'fake' + self.plugin.update_port_status.reset_mock() + self.callbacks.get_device_details('fake_context', + host='fake_host') + self.assertFalse(self.plugin.update_port_status.called) + + def test_get_device_details_port_no_host(self): + port = collections.defaultdict(lambda: 'fake') + port_context = self.plugin.get_bound_port_context() + port_context.current = port + self.plugin.update_port_status.reset_mock() + self.callbacks.get_device_details('fake_context') + self.assertTrue(self.plugin.update_port_status.called) + def test_get_devices_details_list(self): devices = [1, 2, 3, 4, 5] kwargs = {'host': 'fake_host', 'agent_id': 'fake_agent_id'} From 407be289360ec6dabbbe14d9b18dae7c9fa2db79 Mon Sep 17 00:00:00 2001 From: Kawaguchi Date: Tue, 21 Apr 2015 13:27:52 +0900 Subject: [PATCH 011/161] Fix typo acomplished => accomplished Change-Id: I73722e9984917a5a8c4e74207cf14d4040a7cf2f Related-Bug: #1390035 --- neutron/tests/functional/agent/l3/test_namespace_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neutron/tests/functional/agent/l3/test_namespace_manager.py b/neutron/tests/functional/agent/l3/test_namespace_manager.py index 51922e6ff17..74941bb790a 100755 --- a/neutron/tests/functional/agent/l3/test_namespace_manager.py +++ b/neutron/tests/functional/agent/l3/test_namespace_manager.py @@ -46,7 +46,7 @@ class NamespaceManagerTestFramework(base.BaseSudoTestCase): namespace.delete() except RuntimeError as e: # If the namespace didn't exist when delete was attempted, mission - # acomplished. Otherwise, re-raise the exception + # accomplished. Otherwise, re-raise the exception if 'No such file or directory' not in e.message: raise e From 9bc812e92fb27b297ccfe960267dcab173aea6c9 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Thu, 23 Apr 2015 02:15:06 +0000 Subject: [PATCH 012/161] Updated from global requirements Change-Id: I514c65fac38ef0e534e7401a5f3643b1906adea7 --- requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 47172ff25a9..de23f381f59 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,13 +12,13 @@ httplib2>=0.7.5 requests>=2.2.0,!=2.4.0 jsonrpclib Jinja2>=2.6 # BSD License (3 clause) -keystonemiddleware>=1.5.0 +keystonemiddleware>=1.5.0,<1.6.0 netaddr>=0.7.12 -python-neutronclient>=2.3.11,<3 +python-neutronclient>=2.3.11,<2.5.0 retrying>=1.2.3,!=1.3.0 # Apache-2.0 SQLAlchemy>=0.9.7,<=0.9.99 WebOb>=1.2.3 -python-keystoneclient>=1.1.0 +python-keystoneclient>=1.1.0,<1.4.0 alembic>=0.7.2 six>=1.9.0 stevedore>=1.3.0,<1.4.0 # Apache-2.0 @@ -34,4 +34,4 @@ oslo.rootwrap>=1.6.0,<1.7.0 # Apache-2.0 oslo.serialization>=1.4.0,<1.5.0 # Apache-2.0 oslo.utils>=1.4.0,<1.5.0 # Apache-2.0 -python-novaclient>=2.22.0 +python-novaclient>=2.22.0,<2.24.0 From cbfb3e487d97998ec49d7faa751bc26202da7d0e Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Mon, 20 Apr 2015 22:26:22 -0700 Subject: [PATCH 013/161] Only update MTU in update code for MTU The ML2 create_network_db was re-passing in the entire network with extensions like vlan_transparency present that was causing issues in the base update function it was calling. This corrects the behavior by having it only update the MTU, which is the only thing it was intending to update in the first place. Change-Id: I723c5c138e0830de98f6024c7635ec65065e9346 Closes-Bug: #1446784 (cherry picked from commit f85de393c469d1e649a1c1e5ee1b683246442351) --- neutron/plugins/ml2/plugin.py | 2 +- neutron/tests/unit/plugins/ml2/test_plugin.py | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 3f734d9e315..a1caff03576 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -598,7 +598,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, if net_data.get(api.MTU, 0) > 0: res = super(Ml2Plugin, self).update_network(context, - result['id'], network) + result['id'], {'network': {api.MTU: net_data[api.MTU]}}) result[api.MTU] = res.get(api.MTU, 0) return result, mech_context diff --git a/neutron/tests/unit/plugins/ml2/test_plugin.py b/neutron/tests/unit/plugins/ml2/test_plugin.py index e9cd744064d..96817683af6 100644 --- a/neutron/tests/unit/plugins/ml2/test_plugin.py +++ b/neutron/tests/unit/plugins/ml2/test_plugin.py @@ -266,6 +266,28 @@ class TestMl2NetworksV2(test_plugin.TestNetworksV2, self.assertEqual(db_api.MAX_RETRIES + 1, f.call_count) +class TestMl2NetworksWithVlanTransparencyAndMTU(TestMl2NetworksV2): + def setUp(self, plugin=None): + config.cfg.CONF.set_override('path_mtu', 1000, group='ml2') + config.cfg.CONF.set_override('segment_mtu', 1000, group='ml2') + config.cfg.CONF.set_override('advertise_mtu', True) + config.cfg.CONF.set_override('vlan_transparent', True) + super(TestMl2NetworksWithVlanTransparencyAndMTU, self).setUp(plugin) + + def test_create_network_vlan_transparent_and_mtu(self): + data = {'network': {'name': 'net1', + mpnet.SEGMENTS: + [{pnet.NETWORK_TYPE: 'vlan', + pnet.PHYSICAL_NETWORK: 'physnet1'}], + 'tenant_id': 'tenant_one'}} + network_req = self.new_create_request('networks', data) + res = network_req.get_response(self.api) + self.assertEqual(201, res.status_int) + network = self.deserialize(self.fmt, res)['network'] + self.assertEqual(network['mtu'], 1000) + self.assertIn('vlan_transparent', network) + + class TestMl2SubnetsV2(test_plugin.TestSubnetsV2, Ml2PluginV2TestCase): pass From 0536ec113bc438265ba547bb8a8006aa96e646e3 Mon Sep 17 00:00:00 2001 From: "watanabe.isao" Date: Wed, 15 Apr 2015 15:48:08 +0900 Subject: [PATCH 014/161] Restrict subnet create/update to avoid DHCP resync As we know, IPs in subnet CIDR are used for 1) Broadcast port 2) Gateway port 3) DHCP port if enable_dhcp is True, or update to True 4) Others go into allocation_pools Above 1) to 3) are created by default, which means if CIDR doesn't have that much of IPs, subnet create/update will cause a DHCP resync. This fix is to add some restricts to the issue: A) When subnet create, if enable_dhcp is True, /31 and /32 cidrs are forbidden for IPv4 subnets while /127 and /128 cidrs are forbidden for IPv6 subnets. B) When subnet update, if enable_dhcp is changing to True and there are no more IPs in allocation_pools, the request should be denied. Change-Id: I2e4a4d5841b9ad908f02b7d0795cba07596c023d Co-authored-by: Andrew Boik Closes-Bug: #1443798 (cherry picked from commit 0c1f96ad5a6606c1205bd50ea944c3a383892cde) --- neutron/db/db_base_plugin_v2.py | 24 +++++++++ .../tests/unit/db/test_db_base_plugin_v2.py | 52 ++++++++++++++++++- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index dcf7adc6f6f..24c251340b7 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -1052,6 +1052,30 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, if attributes.is_attr_set(s.get('cidr')): self._validate_ip_version(ip_ver, s['cidr'], 'cidr') + # TODO(watanabe.isao): After we found a way to avoid the re-sync + # from the agent side, this restriction could be removed. + if cur_subnet: + dhcp_was_enabled = cur_subnet.enable_dhcp + else: + dhcp_was_enabled = False + if s.get('enable_dhcp') and not dhcp_was_enabled: + subnet_prefixlen = netaddr.IPNetwork(s['cidr']).prefixlen + error_message = _("Subnet has a prefix length that is " + "incompatible with DHCP service enabled.") + if ((ip_ver == 4 and subnet_prefixlen > 30) or + (ip_ver == 6 and subnet_prefixlen > 126)): + raise n_exc.InvalidInput(error_message=error_message) + else: + # NOTE(watanabe.isao): The following restriction is necessary + # only when updating subnet. + if cur_subnet: + range_qry = context.session.query(models_v2. + IPAvailabilityRange).join(models_v2.IPAllocationPool) + ip_range = range_qry.filter_by(subnet_id=s['id']).first() + if not ip_range: + raise n_exc.IpAddressGenerationFailure( + net_id=cur_subnet.network_id) + if attributes.is_attr_set(s.get('gateway_ip')): self._validate_ip_version(ip_ver, s['gateway_ip'], 'gateway_ip') if (cfg.CONF.force_gateway_on_subnet and diff --git a/neutron/tests/unit/db/test_db_base_plugin_v2.py b/neutron/tests/unit/db/test_db_base_plugin_v2.py index e8ef97e8fdb..0804e9047d9 100644 --- a/neutron/tests/unit/db/test_db_base_plugin_v2.py +++ b/neutron/tests/unit/db/test_db_base_plugin_v2.py @@ -1339,7 +1339,7 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s data['port']['fixed_ips']) def test_no_more_port_exception(self): - with self.subnet(cidr='10.0.0.0/32', gateway_ip=None) as subnet: + with self.subnet(cidr='10.0.0.0/32', enable_dhcp=False) as subnet: id = subnet['subnet']['network_id'] res = self._create_port(self.fmt, id) data = self.deserialize(self.fmt, res) @@ -3223,7 +3223,7 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): self.subnet(cidr='14.129.122.5/22'), self.subnet(cidr='15.129.122.5/24'), self.subnet(cidr='16.129.122.5/28'), - self.subnet(cidr='17.129.122.5/32', gateway_ip=None) + self.subnet(cidr='17.129.122.5/32', enable_dhcp=False) ) as subs: # the API should accept and correct these for users self.assertEqual(subs[0]['subnet']['cidr'], '10.0.0.0/8') @@ -3235,6 +3235,24 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): self.assertEqual(subs[6]['subnet']['cidr'], '16.129.122.0/28') self.assertEqual(subs[7]['subnet']['cidr'], '17.129.122.5/32') + def _test_create_subnet_with_invalid_netmask_returns_400(self, *args): + with self.network() as network: + for cidr in args: + ip_version = netaddr.IPNetwork(cidr).version + self._create_subnet(self.fmt, + network['network']['id'], + cidr, + webob.exc.HTTPClientError.code, + ip_version=ip_version) + + def test_create_subnet_with_invalid_netmask_returns_400_ipv4(self): + self._test_create_subnet_with_invalid_netmask_returns_400( + '10.0.0.0/31', '10.0.0.0/32') + + def test_create_subnet_with_invalid_netmask_returns_400_ipv6(self): + self._test_create_subnet_with_invalid_netmask_returns_400( + 'cafe:cafe::/127', 'cafe:cafe::/128') + def test_create_subnet_bad_ip_version(self): with self.network() as network: # Check bad IP version @@ -4153,6 +4171,36 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): self.assertEqual(res.status_int, webob.exc.HTTPClientError.code) + def _test_subnet_update_enable_dhcp_no_ip_available_returns_409( + self, allocation_pools, cidr): + ip_version = netaddr.IPNetwork(cidr).version + with self.network() as network: + with self.subnet(network=network, + allocation_pools=allocation_pools, + enable_dhcp=False, + cidr=cidr, + ip_version=ip_version) as subnet: + id = subnet['subnet']['network_id'] + self._create_port(self.fmt, id) + data = {'subnet': {'enable_dhcp': True}} + req = self.new_update_request('subnets', data, + subnet['subnet']['id']) + res = req.get_response(self.api) + self.assertEqual(res.status_int, + webob.exc.HTTPConflict.code) + + def test_subnet_update_enable_dhcp_no_ip_available_returns_409_ipv4(self): + allocation_pools = [{'start': '10.0.0.2', 'end': '10.0.0.2'}] + cidr = '10.0.0.0/30' + self._test_subnet_update_enable_dhcp_no_ip_available_returns_409( + allocation_pools, cidr) + + def test_subnet_update_enable_dhcp_no_ip_available_returns_409_ipv6(self): + allocation_pools = [{'start': '2001:db8::2', 'end': '2001:db8::2'}] + cidr = '2001:db8::/126' + self._test_subnet_update_enable_dhcp_no_ip_available_returns_409( + allocation_pools, cidr) + def test_show_subnet(self): with self.network() as network: with self.subnet(network=network) as subnet: From 53b3e751f3c7b32bed48c14742d3dd3a1178d00d Mon Sep 17 00:00:00 2001 From: Maru Newby Date: Thu, 9 Apr 2015 17:00:57 +0000 Subject: [PATCH 015/161] Double functional testing timeout to 180s The increase in ovs testing is resulting in job failure due to timeouts in test_killed_monitor_respawns. Giving the test more time to complete should reduce the failure rate. Change-Id: I2ba9b1eb388bfbbebbd6b0f3edb6d5a5ae0bfead Closes-Bug: #1442272 (cherry picked from commit 81098620c298394e1a98127ceeba7f297db2d906) --- tox.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tox.ini b/tox.ini index 32cecacf8f1..6a9cc8ffb8f 100644 --- a/tox.ini +++ b/tox.ini @@ -32,7 +32,7 @@ setenv = OS_TEST_PATH=./neutron/tests/api [testenv:functional] setenv = OS_TEST_PATH=./neutron/tests/functional - OS_TEST_TIMEOUT=90 + OS_TEST_TIMEOUT=180 deps = {[testenv]deps} -r{toxinidir}/neutron/tests/functional/requirements.txt @@ -43,14 +43,14 @@ setenv = OS_TEST_PATH=./neutron/tests/functional OS_ROOTWRAP_CMD=sudo {envbindir}/neutron-rootwrap {envdir}/etc/neutron/rootwrap.conf OS_ROOTWRAP_DAEMON_CMD=sudo {envbindir}/neutron-rootwrap-daemon {envdir}/etc/neutron/rootwrap.conf OS_FAIL_ON_MISSING_DEPS=1 - OS_TEST_TIMEOUT=90 + OS_TEST_TIMEOUT=180 sitepackages=True deps = {[testenv:functional]deps} [testenv:fullstack] setenv = OS_TEST_PATH=./neutron/tests/fullstack - OS_TEST_TIMEOUT=90 + OS_TEST_TIMEOUT=180 deps = {[testenv]deps} -r{toxinidir}/neutron/tests/functional/requirements.txt @@ -61,7 +61,7 @@ setenv = OS_TEST_PATH=./neutron/tests/fullstack OS_ROOTWRAP_CMD=sudo {envbindir}/neutron-rootwrap {envdir}/etc/neutron/rootwrap.conf OS_ROOTWRAP_DAEMON_CMD=sudo {envbindir}/neutron-rootwrap-daemon {envdir}/etc/neutron/rootwrap.conf OS_FAIL_ON_MISSING_DEPS=1 - OS_TEST_TIMEOUT=90 + OS_TEST_TIMEOUT=180 sitepackages=True deps = {[testenv:functional]deps} From 38211ae67cb76ade85b08c028b6e88bfc867afc9 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Mon, 20 Apr 2015 17:06:38 +0200 Subject: [PATCH 016/161] tests: confirm that _output_hosts_file does not log too often I3ad7864eeb2f959549ed356a1e34fa18804395cc didn't include any regression unit tests to validate that the method won't ever log too often again, reintroducing performance drop in later patches. It didn't play well with stable backports of the fix, where context was lost when doing the backport, that left the bug unfixed in stable/juno even though the patch was merged there [1]. The patch adds an explicit note in the code that suggests not to add new log messages inside the loop to avoid regression, and a unit test was added to capture it. Once the test is merged in master, it will be proposed for stable/juno inclusion, with additional changes that would fix the regression again. Related-Bug: #1414218 Change-Id: I5d43021932d6a994638c348eda277dd8337cf041 (cherry picked from commit 3b74095a935f6d2027e6bf04cc4aa21f8a1b46f2) --- neutron/agent/linux/dhcp.py | 2 ++ neutron/tests/unit/agent/linux/test_dhcp.py | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index 55509cb84b2..f594b775c0f 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -483,6 +483,8 @@ class Dnsmasq(DhcpLocalProcess): LOG.debug('Building host file: %s', filename) dhcp_enabled_subnet_ids = [s.id for s in self.network.subnets if s.enable_dhcp] + # NOTE(ihrachyshka): the loop should not log anything inside it, to + # avoid potential performance drop when lots of hosts are dumped for (port, alloc, hostname, name) in self._iter_hosts(): if not alloc: if getattr(port, 'extra_dhcp_opts', False): diff --git a/neutron/tests/unit/agent/linux/test_dhcp.py b/neutron/tests/unit/agent/linux/test_dhcp.py index 09a91a7caa5..fca35c1bb8b 100644 --- a/neutron/tests/unit/agent/linux/test_dhcp.py +++ b/neutron/tests/unit/agent/linux/test_dhcp.py @@ -1403,6 +1403,16 @@ class TestDnsmasq(TestBase): 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb'], sorted(result)) + def test__output_hosts_file_log_only_twice(self): + dm = self._get_dnsmasq(FakeDualStackNetworkSingleDHCP()) + with mock.patch.object(dhcp.LOG, 'process') as process: + process.return_value = ('fake_message', {}) + dm._output_hosts_file() + # The method logs twice, at the start of and the end. There should be + # no other logs, no matter how many hosts there are to dump in the + # file. + self.assertEqual(2, process.call_count) + def test_only_populates_dhcp_enabled_subnets(self): exp_host_name = '/dhcp/eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee/host' exp_host_data = ('00:00:80:aa:bb:cc,host-192-168-0-2.openstacklocal,' From d37e566dcadf8a540eb5f84b668847fa192393a1 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Fri, 24 Apr 2015 00:35:31 -0700 Subject: [PATCH 017/161] Don't resync on DHCP agent setup failure There are various cases where the DHCP agent will try to create a DHCP port for a network and there will be a failure. This has primarily been caused by a lack of available IP addresses in the allocation pool. Trying to fix all availability corner cases on the server side will be very difficult due to race conditions between multiple ports being created, the dhcp_agents_per_network parameter, etc. This patch just stops the resync attempt on the agent side if a failure is caused by an IP address generation problem. Future updates to the subnet will cause another attempt so if the tenant does fix the issue they will get DHCP service. Change-Id: I0896730126d6dca13fe9284b4d812cfb081b6218 Closes-Bug: #1447883 (cherry picked from commit db9ac7e0110a0c2ef1b65213317ee8b7f1053ddc) --- neutron/agent/dhcp/agent.py | 7 ++++++- neutron/tests/unit/agent/dhcp/test_agent.py | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/neutron/agent/dhcp/agent.py b/neutron/agent/dhcp/agent.py index 214bfdff14d..c11c1f24ee5 100644 --- a/neutron/agent/dhcp/agent.py +++ b/neutron/agent/dhcp/agent.py @@ -120,7 +120,12 @@ class DhcpAgent(manager.Manager): 'still exist.'), {'net_id': network.id, 'action': action}) except Exception as e: - self.schedule_resync(e, network.id) + if getattr(e, 'exc_type', '') != 'IpAddressGenerationFailure': + # Don't resync if port could not be created because of an IP + # allocation failure. When the subnet is updated with a new + # allocation pool or a port is deleted to free up an IP, this + # will automatically be retried on the notification + self.schedule_resync(e, network.id) if (isinstance(e, oslo_messaging.RemoteError) and e.exc_type == 'NetworkNotFound' or isinstance(e, exceptions.NetworkNotFound)): diff --git a/neutron/tests/unit/agent/dhcp/test_agent.py b/neutron/tests/unit/agent/dhcp/test_agent.py index c618658f7c5..5aca05ffca4 100644 --- a/neutron/tests/unit/agent/dhcp/test_agent.py +++ b/neutron/tests/unit/agent/dhcp/test_agent.py @@ -300,6 +300,11 @@ class TestDhcpAgent(base.BaseTestCase): self.assertEqual(log.call_count, 1) self.assertEqual(expected_sync, schedule_resync.called) + def test_call_driver_ip_address_generation_failure(self): + error = oslo_messaging.RemoteError( + exc_type='IpAddressGenerationFailure') + self._test_call_driver_failure(exc=error, expected_sync=False) + def test_call_driver_failure(self): self._test_call_driver_failure() From 4e71c48bbfd5e8b8c59f0c45ade52ba8eddc8b63 Mon Sep 17 00:00:00 2001 From: rossella Date: Thu, 15 Jan 2015 16:15:23 +0100 Subject: [PATCH 018/161] Add devices to update in RPC call security_groups_provider_updated When a security_groups_provider_updated is received then a global refresh of the firewall is performed. This can be avoided if the plugins pass as parameter of the call the devices that belongs to the network updated. Partially-Implements: blueprint restructure-l2-agent Change-Id: I1e78f3a5ec7e5c5bcba338a0097566422411ef7e --- neutron/agent/securitygroups_rpc.py | 12 +++++------ .../api/rpc/handlers/securitygroups_rpc.py | 11 ++++++---- neutron/db/securitygroups_rpc_base.py | 17 +++++++++++----- .../agent/linuxbridge_neutron_agent.py | 3 ++- .../openvswitch/agent/ovs_neutron_agent.py | 3 ++- .../unit/agent/test_securitygroups_rpc.py | 20 +++++++++++++------ .../rpc/handlers/test_securitygroups_rpc.py | 2 +- neutron/tests/unit/plugins/ml2/test_plugin.py | 17 ++++++++++++---- 8 files changed, 57 insertions(+), 28 deletions(-) diff --git a/neutron/agent/securitygroups_rpc.py b/neutron/agent/securitygroups_rpc.py index 5b24dbe3af2..a7dc73123b9 100644 --- a/neutron/agent/securitygroups_rpc.py +++ b/neutron/agent/securitygroups_rpc.py @@ -202,15 +202,15 @@ class SecurityGroupAgentRpc(object): else: self.refresh_firewall(devices) - def security_groups_provider_updated(self): + def security_groups_provider_updated(self, devices_to_update): LOG.info(_LI("Provider rule updated")) if self.defer_refresh_firewall: - # NOTE(salv-orlando): A 'global refresh' might not be - # necessary if the subnet for which the provider rules - # were updated is known - self.global_refresh_firewall = True + if devices_to_update is None: + self.global_refresh_firewall = True + else: + self.devices_to_refilter |= set(devices_to_update) else: - self.refresh_firewall() + self.refresh_firewall(devices_to_update) def remove_devices_filter(self, device_ids): if not device_ids: diff --git a/neutron/api/rpc/handlers/securitygroups_rpc.py b/neutron/api/rpc/handlers/securitygroups_rpc.py index 58d9c7d3dcd..24e268065ce 100644 --- a/neutron/api/rpc/handlers/securitygroups_rpc.py +++ b/neutron/api/rpc/handlers/securitygroups_rpc.py @@ -153,12 +153,14 @@ class SecurityGroupAgentRpcApiMixin(object): cctxt.cast(context, 'security_groups_member_updated', security_groups=security_groups) - def security_groups_provider_updated(self, context): + def security_groups_provider_updated(self, context, + devices_to_update=None): """Notify provider updated security groups.""" - cctxt = self.client.prepare(version=self.SG_RPC_VERSION, + cctxt = self.client.prepare(version=1.3, topic=self._get_security_group_topic(), fanout=True) - cctxt.cast(context, 'security_groups_provider_updated') + cctxt.cast(context, 'security_groups_provider_updated', + devices_to_update=devices_to_update) class SecurityGroupAgentRpcCallbackMixin(object): @@ -205,6 +207,7 @@ class SecurityGroupAgentRpcCallbackMixin(object): def security_groups_provider_updated(self, context, **kwargs): """Callback for security group provider update.""" LOG.debug("Provider rule updated") + devices_to_update = kwargs.get('devices_to_update') if not self.sg_agent: return self._security_groups_agent_not_set() - self.sg_agent.security_groups_provider_updated() + self.sg_agent.security_groups_provider_updated(devices_to_update) diff --git a/neutron/db/securitygroups_rpc_base.py b/neutron/db/securitygroups_rpc_base.py index c47493599e1..9d448a9b96d 100644 --- a/neutron/db/securitygroups_rpc_base.py +++ b/neutron/db/securitygroups_rpc_base.py @@ -147,22 +147,29 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): occurs and the plugin agent fetches the update provider rule in the other RPC call (security_group_rules_for_devices). """ - security_groups_provider_updated = False + sg_provider_updated_networks = set() sec_groups = set() for port in ports: if port['device_owner'] == q_const.DEVICE_OWNER_DHCP: - security_groups_provider_updated = True + sg_provider_updated_networks.add( + port['network_id']) # For IPv6, provider rule need to be updated in case router # interface is created or updated after VM port is created. elif port['device_owner'] == q_const.DEVICE_OWNER_ROUTER_INTF: if any(netaddr.IPAddress(fixed_ip['ip_address']).version == 6 for fixed_ip in port['fixed_ips']): - security_groups_provider_updated = True + sg_provider_updated_networks.add( + port['network_id']) else: sec_groups |= set(port.get(ext_sg.SECURITYGROUPS)) - if security_groups_provider_updated: - self.notifier.security_groups_provider_updated(context) + if sg_provider_updated_networks: + ports_query = context.session.query(models_v2.Port.id).filter( + models_v2.Port.network_id.in_( + sg_provider_updated_networks)).all() + ports_to_update = [p.id for p in ports_query] + self.notifier.security_groups_provider_updated( + context, ports_to_update) if sec_groups: self.notifier.security_groups_member_updated( context, list(sec_groups)) diff --git a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py index 7b1f2861500..24f94d035e1 100644 --- a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py +++ b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py @@ -637,7 +637,8 @@ class LinuxBridgeRpcCallbacks(sg_rpc.SecurityGroupAgentRpcCallbackMixin, # Set RPC API version to 1.0 by default. # history # 1.1 Support Security Group RPC - target = oslo_messaging.Target(version='1.1') + # 1.3 Added param devices_to_update to security_groups_provider_updated + target = oslo_messaging.Target(version='1.3') def __init__(self, context, agent, sg_agent): super(LinuxBridgeRpcCallbacks, self).__init__() diff --git a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py index 9e510c70b36..8185d4d88de 100644 --- a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py @@ -117,7 +117,8 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, # 1.0 Initial version # 1.1 Support Security Group RPC # 1.2 Support DVR (Distributed Virtual Router) RPC - target = oslo_messaging.Target(version='1.2') + # 1.3 Added param devices_to_update to security_groups_provider_updated + target = oslo_messaging.Target(version='1.3') def __init__(self, integ_br, tun_br, local_ip, bridge_mappings, polling_interval, tunnel_types=None, diff --git a/neutron/tests/unit/agent/test_securitygroups_rpc.py b/neutron/tests/unit/agent/test_securitygroups_rpc.py index 8dd6c90b0a6..0493540789f 100644 --- a/neutron/tests/unit/agent/test_securitygroups_rpc.py +++ b/neutron/tests/unit/agent/test_securitygroups_rpc.py @@ -1186,9 +1186,9 @@ class SecurityGroupAgentRpcTestCase(BaseSecurityGroupAgentRpcTestCase): def test_security_groups_provider_updated(self): self.agent.refresh_firewall = mock.Mock() - self.agent.security_groups_provider_updated() + self.agent.security_groups_provider_updated(None) self.agent.refresh_firewall.assert_has_calls( - [mock.call.refresh_firewall()]) + [mock.call.refresh_firewall(None)]) def test_refresh_firewall(self): self.agent.prepare_devices_filter(['fake_port_id']) @@ -1304,9 +1304,9 @@ class SecurityGroupAgentEnhancedRpcTestCase( def test_security_groups_provider_updated_enhanced_rpc(self): self.agent.refresh_firewall = mock.Mock() - self.agent.security_groups_provider_updated() + self.agent.security_groups_provider_updated(None) self.agent.refresh_firewall.assert_has_calls( - [mock.call.refresh_firewall()]) + [mock.call.refresh_firewall(None)]) def test_refresh_firewall_enhanced_rpc(self): self.agent.prepare_devices_filter(['fake_port_id']) @@ -1438,9 +1438,16 @@ class SecurityGroupAgentRpcWithDeferredRefreshTestCase( self.assertIn('fake_device_2', self.agent.devices_to_refilter) def test_security_groups_provider_updated(self): - self.agent.security_groups_provider_updated() + self.agent.security_groups_provider_updated(None) self.assertTrue(self.agent.global_refresh_firewall) + def test_security_groups_provider_updated_devices_specified(self): + self.agent.security_groups_provider_updated( + ['fake_device_1', 'fake_device_2']) + self.assertFalse(self.agent.global_refresh_firewall) + self.assertIn('fake_device_1', self.agent.devices_to_refilter) + self.assertIn('fake_device_2', self.agent.devices_to_refilter) + def test_setup_port_filters_new_ports_only(self): self.agent.prepare_devices_filter = mock.Mock() self.agent.refresh_firewall = mock.Mock() @@ -1593,7 +1600,8 @@ class SecurityGroupAgentRpcApiTestCase(base.BaseTestCase): def test_security_groups_provider_updated(self): self.notifier.security_groups_provider_updated(None) self.mock_cast.assert_has_calls( - [mock.call(None, 'security_groups_provider_updated')]) + [mock.call(None, 'security_groups_provider_updated', + devices_to_update=None)]) def test_security_groups_rule_updated(self): self.notifier.security_groups_rule_updated( diff --git a/neutron/tests/unit/api/rpc/handlers/test_securitygroups_rpc.py b/neutron/tests/unit/api/rpc/handlers/test_securitygroups_rpc.py index 7c8b79f67d1..a3bc79cf1d2 100644 --- a/neutron/tests/unit/api/rpc/handlers/test_securitygroups_rpc.py +++ b/neutron/tests/unit/api/rpc/handlers/test_securitygroups_rpc.py @@ -61,4 +61,4 @@ class SGAgentRpcCallBackMixinTestCase(base.BaseTestCase): def test_security_groups_provider_updated(self): self.rpc.security_groups_provider_updated(None) self.rpc.sg_agent.assert_has_calls( - [mock.call.security_groups_provider_updated()]) + [mock.call.security_groups_provider_updated(None)]) diff --git a/neutron/tests/unit/plugins/ml2/test_plugin.py b/neutron/tests/unit/plugins/ml2/test_plugin.py index cc51029fdfa..f20a2202462 100644 --- a/neutron/tests/unit/plugins/ml2/test_plugin.py +++ b/neutron/tests/unit/plugins/ml2/test_plugin.py @@ -468,6 +468,15 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase): m_upd.assert_called_once_with(ctx, used_sg) self.assertFalse(p_upd.called) + def _check_security_groups_provider_updated_args(self, p_upd_mock, net_id): + query_params = "network_id=%s" % net_id + network_ports = self._list('ports', query_params=query_params) + network_ports_ids = [port['id'] for port in network_ports['ports']] + self.assertTrue(p_upd_mock.called) + p_upd_args = p_upd_mock.call_args + ports_ids = p_upd_args[0][1] + self.assertEqual(sorted(network_ports_ids), sorted(ports_ids)) + def test_create_ports_bulk_with_sec_grp_member_provider_update(self): ctx = context.get_admin_context() plugin = manager.NeutronManager.get_plugin() @@ -496,15 +505,14 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase): ports = self.deserialize(self.fmt, res) used_sg = ports['ports'][0]['security_groups'] m_upd.assert_called_once_with(ctx, used_sg) - p_upd.assert_called_once_with(ctx) - + self._check_security_groups_provider_updated_args(p_upd, net_id) m_upd.reset_mock() p_upd.reset_mock() data[0]['device_owner'] = constants.DEVICE_OWNER_DHCP self._create_bulk_from_list(self.fmt, 'port', data, context=ctx) self.assertFalse(m_upd.called) - p_upd.assert_called_once_with(ctx) + self._check_security_groups_provider_updated_args(p_upd, net_id) def test_create_ports_bulk_with_sec_grp_provider_update_ipv6(self): ctx = context.get_admin_context() @@ -532,7 +540,8 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase): self._create_bulk_from_list(self.fmt, 'port', data, context=ctx) self.assertFalse(m_upd.called) - p_upd.assert_called_once_with(ctx) + self._check_security_groups_provider_updated_args( + p_upd, net_id) def test_delete_port_no_notify_in_disassociate_floatingips(self): ctx = context.get_admin_context() From 7260e0e3fc2ea479e80e0962624aca7fd38a1f60 Mon Sep 17 00:00:00 2001 From: Henry Gessau Date: Mon, 27 Apr 2015 09:59:21 -0400 Subject: [PATCH 019/161] Run radvd as root During the refactoring of external process management radvd lost its root privileges. Closes-bug: 1448813 Change-Id: I84883fe81684afafac9b024282a03f447c8f825a (cherry picked from commit a5e54338770fc074e01fa88dbf909ee1af1b66b2) --- neutron/agent/linux/ra.py | 3 ++- neutron/tests/unit/agent/l3/test_agent.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/neutron/agent/linux/ra.py b/neutron/agent/linux/ra.py index 7f800c26961..d9eca8d6475 100644 --- a/neutron/agent/linux/ra.py +++ b/neutron/agent/linux/ra.py @@ -103,7 +103,8 @@ class DaemonMonitor(object): default_cmd_callback=callback, namespace=self._router_ns, service=RADVD_SERVICE_NAME, - conf=cfg.CONF) + conf=cfg.CONF, + run_as_root=True) def _spawn_radvd(self, radvd_conf): def callback(pid_file): diff --git a/neutron/tests/unit/agent/l3/test_agent.py b/neutron/tests/unit/agent/l3/test_agent.py index 4c6682bd8aa..a5016f815f9 100644 --- a/neutron/tests/unit/agent/l3/test_agent.py +++ b/neutron/tests/unit/agent/l3/test_agent.py @@ -1399,7 +1399,8 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): service=process, default_cmd_callback=mock.ANY, namespace=ri.ns_name, - conf=mock.ANY)] + conf=mock.ANY, + run_as_root=True)] def _process_router_ipv6_subnet_added( self, router, ipv6_subnet_modes=None): From 6d15bf48ee27ceab64e88f81ba6433058313759a Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Sat, 9 May 2015 00:52:29 +0200 Subject: [PATCH 020/161] Remove from BridgeDevice homemade execute in namespace Currently BridgeDevice[1] defines homemade execute with namespace support but could use IPWrapper. This change replaces homemade implementation with IPWrapper use to respect DRY principle. [1] neutron.agent.linux.bridge_lib Change-Id: I12d4d40432e57ce8b6960276c41321c1efd98705 --- neutron/agent/linux/bridge_lib.py | 9 +++----- .../tests/unit/agent/linux/test_bridge_lib.py | 21 ++++++++----------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/neutron/agent/linux/bridge_lib.py b/neutron/agent/linux/bridge_lib.py index 5db2e5b5bc0..2bbc9f2cefa 100644 --- a/neutron/agent/linux/bridge_lib.py +++ b/neutron/agent/linux/bridge_lib.py @@ -17,16 +17,13 @@ # under the License. from neutron.agent.linux import ip_lib -from neutron.agent.linux import utils class BridgeDevice(ip_lib.IPDevice): - def _brctl(self, cmd, log_fail_as_error=True): + def _brctl(self, cmd): cmd = ['brctl'] + cmd - if self.namespace: - cmd = ['ip', 'netns', 'exec', self.namespace] + cmd - return utils.execute(cmd, run_as_root=True, - log_fail_as_error=log_fail_as_error) + ip_wrapper = ip_lib.IPWrapper(self.namespace) + return ip_wrapper.netns.execute(cmd, run_as_root=True) @classmethod def addbr(cls, name, namespace=None): diff --git a/neutron/tests/unit/agent/linux/test_bridge_lib.py b/neutron/tests/unit/agent/linux/test_bridge_lib.py index c85539b1cb3..768c276b298 100644 --- a/neutron/tests/unit/agent/linux/test_bridge_lib.py +++ b/neutron/tests/unit/agent/linux/test_bridge_lib.py @@ -18,7 +18,6 @@ import mock from neutron.agent.linux import bridge_lib -from neutron.agent.linux import utils from neutron.tests import base @@ -30,30 +29,28 @@ class BridgeLibTest(base.BaseTestCase): def setUp(self): super(BridgeLibTest, self).setUp() - self.execute = mock.patch.object( - utils, "execute", spec=utils.execute).start() + ip_wrapper = mock.patch('neutron.agent.linux.ip_lib.IPWrapper').start() + self.execute = ip_wrapper.return_value.netns.execute - def _verify_bridge_mock(self, cmd, namespace=None): - if namespace is not None: - cmd = ['ip', 'netns', 'exec', namespace] + cmd - self.execute.assert_called_once_with(cmd, run_as_root=True, - log_fail_as_error=True) + def _verify_bridge_mock(self, cmd): + self.execute.assert_called_once_with(cmd, run_as_root=True) self.execute.reset_mock() def _test_br(self, namespace=None): br = bridge_lib.BridgeDevice.addbr(self._BR_NAME, namespace) - self._verify_bridge_mock(['brctl', 'addbr', self._BR_NAME], namespace) + self.assertEqual(namespace, br.namespace) + self._verify_bridge_mock(['brctl', 'addbr', self._BR_NAME]) br.addif(self._IF_NAME) self._verify_bridge_mock( - ['brctl', 'addif', self._BR_NAME, self._IF_NAME], namespace) + ['brctl', 'addif', self._BR_NAME, self._IF_NAME]) br.delif(self._IF_NAME) self._verify_bridge_mock( - ['brctl', 'delif', self._BR_NAME, self._IF_NAME], namespace) + ['brctl', 'delif', self._BR_NAME, self._IF_NAME]) br.delbr() - self._verify_bridge_mock(['brctl', 'delbr', self._BR_NAME], namespace) + self._verify_bridge_mock(['brctl', 'delbr', self._BR_NAME]) def test_addbr_with_namespace(self): self._test_br(self._NAMESPACE) From 3d2543d710c7071ffeb5c9857ac30a4d95695a7b Mon Sep 17 00:00:00 2001 From: dql Date: Mon, 9 Mar 2015 12:52:11 +0800 Subject: [PATCH 021/161] fix DHCP port changed when dhcp-agent restart When DHCP server is started, the periodic task is running before loading cache state.The method port_update_end need to use the cache information, but the cache information has not been loaded. Change-Id: I0d1da11bb559b7f0f9d4428b82573fb26916a933 Closes-Bug: #1420042 --- neutron/agent/dhcp/agent.py | 3 +++ neutron/tests/unit/agent/dhcp/test_agent.py | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/neutron/agent/dhcp/agent.py b/neutron/agent/dhcp/agent.py index 89fd0773ed5..4d52df8d61c 100644 --- a/neutron/agent/dhcp/agent.py +++ b/neutron/agent/dhcp/agent.py @@ -70,6 +70,9 @@ class DhcpAgent(manager.Manager): config=self.conf, resource_type='dhcp') + def init_host(self): + self.sync_state() + def _populate_networks_cache(self): """Populate the networks cache when the DHCP-agent starts.""" try: diff --git a/neutron/tests/unit/agent/dhcp/test_agent.py b/neutron/tests/unit/agent/dhcp/test_agent.py index 6ea10afefd5..19dfcaa59fe 100644 --- a/neutron/tests/unit/agent/dhcp/test_agent.py +++ b/neutron/tests/unit/agent/dhcp/test_agent.py @@ -221,6 +221,12 @@ class TestDhcpAgent(base.BaseTestCase): self.mock_makedirs_p = mock.patch("os.makedirs") self.mock_makedirs = self.mock_makedirs_p.start() + def test_init_host(self): + dhcp = dhcp_agent.DhcpAgent(HOSTNAME) + with mock.patch.object(dhcp, 'sync_state') as sync_state: + dhcp.init_host() + sync_state.assert_called_once_with() + def test_dhcp_agent_manager(self): state_rpc_str = 'neutron.agent.rpc.PluginReportStateAPI' # sync_state is needed for this test From 3682e3391f188845d0c7f382f0ccd4b38db3904e Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Mon, 4 May 2015 23:36:19 +0200 Subject: [PATCH 022/161] Ensure non-overlapping cidrs in subnetpools without galera _get_allocated_cidrs[1] locks only allocated subnets in a subnetpool (with mysql/postgresql at least). It ensures we don't allocate a cidr overlapping with existent cidrs but nothing disallows a concurrent subnet allocation to create a subnet in the same subnetpool. This change replaces the lock on subnetpool subnets by a lock on the subnetpool itself. It disallows to allocate concurrently 2 subnets in the same subnetpool and ensure non-overlapping cidrs in the same subnetpool. Moreover this change solves a trouble with postgresql which disallows to lock an empty select with an outer join: it happens on first subnet allocation in a subnetpool when no specific cidr is provided. Moving the lock ensures the lock is done on a non-empty select. But this change does not ensure non-overlapping cidrs in subnetpools with galera because galera doesn't support SELECT FOR UPDATE locks. A follow-up change will (try to?) remove locks from subnet allocation[1] in order to ensure non-overlapping cidrs in subnetpools also with galera. [1] in neutron.ipam.subnet_alloc.SubnetAllocator Closes-Bug: #1451558 Partial-Bug: #1451576 Change-Id: I73854f9863f44621ae0d89c5dc4893ccc16d07e4 --- neutron/ipam/subnet_alloc.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/neutron/ipam/subnet_alloc.py b/neutron/ipam/subnet_alloc.py index 49b6eda2ab5..fdcabcca861 100644 --- a/neutron/ipam/subnet_alloc.py +++ b/neutron/ipam/subnet_alloc.py @@ -38,9 +38,20 @@ class SubnetAllocator(driver.Pool): super(SubnetAllocator, self).__init__(subnetpool, context) self._sp_helper = SubnetPoolHelper() + def _lock_subnetpool(self): + """Lock subnetpool associated row. + + This method disallows to allocate concurrently 2 subnets in the same + subnetpool, it's required to ensure non-overlapping cidrs in the same + subnetpool. + """ + # FIXME(cbrandily): not working with Galera + (self._context.session.query(models_v2.SubnetPool.id). + filter_by(id=self._subnetpool['id']). + with_lockmode('update').first()) + def _get_allocated_cidrs(self): - query = self._context.session.query( - models_v2.Subnet).with_lockmode('update') + query = self._context.session.query(models_v2.Subnet) subnets = query.filter_by(subnetpool_id=self._subnetpool['id']) return (x.cidr for x in subnets) @@ -62,8 +73,7 @@ class SubnetAllocator(driver.Pool): subnetpool_id = self._subnetpool['id'] tenant_id = self._subnetpool['tenant_id'] with self._context.session.begin(subtransactions=True): - qry = self._context.session.query( - models_v2.Subnet).with_lockmode('update') + qry = self._context.session.query(models_v2.Subnet) allocations = qry.filter_by(subnetpool_id=subnetpool_id, tenant_id=tenant_id) value = 0 @@ -88,6 +98,7 @@ class SubnetAllocator(driver.Pool): def _allocate_any_subnet(self, request): with self._context.session.begin(subtransactions=True): + self._lock_subnetpool() self._check_subnetpool_tenant_quota(request.tenant_id, request.prefixlen) prefix_pool = self._get_available_prefix_list() @@ -111,6 +122,7 @@ class SubnetAllocator(driver.Pool): def _allocate_specific_subnet(self, request): with self._context.session.begin(subtransactions=True): + self._lock_subnetpool() self._check_subnetpool_tenant_quota(request.tenant_id, request.prefixlen) cidr = request.subnet_cidr From 359b7c971a88f6dff64e8e4d558210a880f3ee0f Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Thu, 7 May 2015 14:59:38 +1000 Subject: [PATCH 023/161] Ensure netfilter is enabled for bridges Since security-groups use iptables rules on Linux bridges, we need to ensure that netfilter is enabled for bridges. Unfortunately, there seems to be a long history of distributions having differing defaults for this, best described in [1]. It seems at the moment everyone has to discover this for themselves; packstack found it in Ia8c86dcb31810a8d6b133a161388604fde9bead4, then fuel found the same thing in I8582c24706c3a7253e00569eef275f116d765bca and then finally someone else hit it and put it into documentation with I4ed3cec03a1b3a7d56dfe18394154ec1b2db6791. I just spent a long time figuring it out too when deploying with devstack. Rather than having yet another fix in devstack, I don't see why neutron shouldn't be ensuring the setting is correct when it starts up -- without these settings enabled, security-groups are silently broken. This does that, and modifies test-cases to check we make the calls. [1] http://wiki.libvirt.org/page/Net.bridge-nf-call_and_sysctl.conf Change-Id: If2d316eb8c422dc1e4f34b17a50b93dd72993a99 --- neutron/agent/linux/iptables_firewall.py | 29 ++++++++++++++++++- .../unit/agent/test_securitygroups_rpc.py | 10 +++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/neutron/agent/linux/iptables_firewall.py b/neutron/agent/linux/iptables_firewall.py index 840fba7f6f7..5cea8e39bab 100644 --- a/neutron/agent/linux/iptables_firewall.py +++ b/neutron/agent/linux/iptables_firewall.py @@ -22,6 +22,7 @@ from neutron.agent import firewall from neutron.agent.linux import ipset_manager from neutron.agent.linux import iptables_comments as ic from neutron.agent.linux import iptables_manager +from neutron.agent.linux import utils from neutron.common import constants from neutron.common import ipv6_utils from neutron.extensions import portsecurity as psec @@ -71,6 +72,32 @@ class IptablesFirewallDriver(firewall.FirewallDriver): lambda: collections.defaultdict(list)) self.pre_sg_members = None self.enable_ipset = cfg.CONF.SECURITYGROUP.enable_ipset + self._enabled_netfilter_for_bridges = False + + def _enable_netfilter_for_bridges(self): + # we only need to set these values once, but it has to be when + # we create a bridge; before that the bridge module might not + # be loaded and the proc values aren't there. + if self._enabled_netfilter_for_bridges: + return + else: + self._enabled_netfilter_for_bridges = True + + # These proc values ensure that netfilter is enabled on + # bridges; essential for enforcing security groups rules with + # OVS Hybrid. Distributions can differ on whether this is + # enabled by default or not (Ubuntu - yes, Redhat - no, for + # example). + LOG.debug("Enabling netfilter for bridges") + utils.execute(['sysctl', '-w', + 'net.bridge.bridge-nf-call-arptables=1'], + run_as_root=True) + utils.execute(['sysctl', '-w', + 'net.bridge.bridge-nf-call-ip6tables=1'], + run_as_root=True) + utils.execute(['sysctl', '-w', + 'net.bridge.bridge-nf-call-iptables=1'], + run_as_root=True) @property def ports(self): @@ -103,7 +130,7 @@ class IptablesFirewallDriver(firewall.FirewallDriver): LOG.debug("Preparing device (%s) filter", port['device']) self._remove_chains() self._set_ports(port) - + self._enable_netfilter_for_bridges() # each security group has it own chains self._setup_chains() self.iptables.apply() diff --git a/neutron/tests/unit/agent/test_securitygroups_rpc.py b/neutron/tests/unit/agent/test_securitygroups_rpc.py index b732b6b5af5..6d050e6cc13 100644 --- a/neutron/tests/unit/agent/test_securitygroups_rpc.py +++ b/neutron/tests/unit/agent/test_securitygroups_rpc.py @@ -2483,6 +2483,9 @@ class TestSecurityGroupAgentWithIptables(base.BaseTestCase): cfg.CONF.set_override('enable_ipset', False, group='SECURITYGROUP') cfg.CONF.set_override('comment_iptables_rules', False, group='AGENT') + self.utils_exec = mock.patch( + 'neutron.agent.linux.utils.execute').start() + self.rpc = mock.Mock() self._init_agent(defer_refresh_firewall) @@ -2607,6 +2610,13 @@ class TestSecurityGroupAgentWithIptables(base.BaseTestCase): self.assertThat(kwargs['process_input'], matchers.MatchesRegex(expected_regex)) + expected = ['net.bridge.bridge-nf-call-arptables=1', + 'net.bridge.bridge-nf-call-ip6tables=1', + 'net.bridge.bridge-nf-call-iptables=1'] + for e in expected: + self.utils_exec.assert_any_call(['sysctl', '-w', e], + run_as_root=True) + def _replay_iptables(self, v4_filter, v6_filter, raw): self._register_mock_call( ['iptables-save', '-c'], From 45b28ddfe8ac23871e65feb4132d5f048c783222 Mon Sep 17 00:00:00 2001 From: Vincent Legoll Date: Fri, 5 Jun 2015 13:05:48 +0200 Subject: [PATCH 024/161] Fix typo in test class name Make "Redering" -> "Rendering" Change-Id: Ieedb446fa1e06705eb70293d83350d4dfd57d2db Signed-off-by: Vincent Legoll --- neutron/tests/unit/common/test_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neutron/tests/unit/common/test_utils.py b/neutron/tests/unit/common/test_utils.py index 48e59b428b2..cee645c8d54 100644 --- a/neutron/tests/unit/common/test_utils.py +++ b/neutron/tests/unit/common/test_utils.py @@ -636,7 +636,7 @@ class TestIpVersionFromInt(base.BaseTestCase): 8) -class TestDelayedStringRederer(base.BaseTestCase): +class TestDelayedStringRenderer(base.BaseTestCase): def test_call_deferred_until_str(self): my_func = mock.MagicMock(return_value='Brie cheese!') delayed = utils.DelayedStringRenderer(my_func, 1, 2, key_arg=44) From 713ba0e8d7ce59eaff41518360530b2e7831c322 Mon Sep 17 00:00:00 2001 From: Carl Baldwin Date: Thu, 4 Jun 2015 22:25:44 +0000 Subject: [PATCH 025/161] Refactor awkward logic in setup_dhcp_port I noticed this logic as I was reviewing another patch set [1]. I didn't like removing subnet ids from dhcp_enabled_subnet_ids and I wasn't too keen on the ips_need_removal semantics that were kind of forced by the existing structure of the code. I hope you find this alternative much clearer. I like straight-forward code with less indentation that doesn't use awkward booleans like ips_needs_removal. [1] https://review.openstack.org/#/c/157697/6 Change-Id: I8bd3d6924a855ea08f8096e66bd3bfbb165a4da3 --- neutron/agent/linux/dhcp.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index 70453d265f7..ae6fd43fadb 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -849,33 +849,28 @@ class DeviceManager(object): """Create/update DHCP port for the host if needed and return port.""" device_id = self.get_device_id(network) - subnets = {} - dhcp_enabled_subnet_ids = [] - for subnet in network.subnets: - if subnet.enable_dhcp: - dhcp_enabled_subnet_ids.append(subnet.id) - subnets[subnet.id] = subnet + subnets = {subnet.id: subnet for subnet in network.subnets + if subnet.enable_dhcp} dhcp_port = None for port in network.ports: port_device_id = getattr(port, 'device_id', None) if port_device_id == device_id: + dhcp_enabled_subnet_ids = set(subnets) port_fixed_ips = [] - ips_needs_removal = False for fixed_ip in port.fixed_ips: if fixed_ip.subnet_id in dhcp_enabled_subnet_ids: port_fixed_ips.append( {'subnet_id': fixed_ip.subnet_id, 'ip_address': fixed_ip.ip_address}) - dhcp_enabled_subnet_ids.remove(fixed_ip.subnet_id) - else: - ips_needs_removal = True - # If there are dhcp_enabled_subnet_ids here that means that - # we need to add those to the port and call update. - if dhcp_enabled_subnet_ids or ips_needs_removal: + port_subnet_ids = set(ip.subnet_id for ip in port.fixed_ips) + # If there is a new dhcp enabled subnet or a port that is no + # longer on a dhcp enabled subnet, we need to call update. + if dhcp_enabled_subnet_ids != port_subnet_ids: port_fixed_ips.extend( - [dict(subnet_id=s) for s in dhcp_enabled_subnet_ids]) + dict(subnet_id=s) + for s in dhcp_enabled_subnet_ids - port_subnet_ids) dhcp_port = self.plugin.update_dhcp_port( port.id, {'port': {'network_id': network.id, 'fixed_ips': port_fixed_ips}}) @@ -911,7 +906,7 @@ class DeviceManager(object): device_id=device_id, network_id=network.id, tenant_id=network.tenant_id, - fixed_ips=[dict(subnet_id=s) for s in dhcp_enabled_subnet_ids]) + fixed_ips=[dict(subnet_id=s) for s in subnets]) dhcp_port = self.plugin.create_dhcp_port({'port': port_dict}) if not dhcp_port: From 127de06c7e09e1468f2855a3033fb6193a6b9365 Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Wed, 6 May 2015 22:40:39 +0200 Subject: [PATCH 026/161] Clean only floating-ip related connection states Currently init_l3 deletes connection states related to ALL ips deleted in init_l3 but it's required only when floating-ips are deleted[1]. This change deletes only connection states related to floating-ips deleted in init_l3 ... it avoids to delete connection states in dhcp agents and on router internal ports! [1] look at change Ia9bd7ae243a0859dcb97e2fa939f7d16f9c2456c Closes-Bug: #1452434 Related-Bug: #1334926 Change-Id: Icfcfc585df6fd41de1e1345fd731e4631a6950ce --- neutron/agent/l3/dvr_fip_ns.py | 3 +- neutron/agent/l3/router_info.py | 3 +- neutron/agent/linux/interface.py | 9 ++++-- neutron/tests/unit/agent/l3/test_agent.py | 9 ++++-- .../tests/unit/agent/linux/test_interface.py | 32 ++++++++++++++++--- 5 files changed, 44 insertions(+), 12 deletions(-) diff --git a/neutron/agent/l3/dvr_fip_ns.py b/neutron/agent/l3/dvr_fip_ns.py index e2e63eb2700..9b7eee99a88 100644 --- a/neutron/agent/l3/dvr_fip_ns.py +++ b/neutron/agent/l3/dvr_fip_ns.py @@ -103,7 +103,8 @@ class FipNamespace(namespaces.Namespace): prefix=FIP_EXT_DEV_PREFIX) ip_cidrs = common_utils.fixed_ip_cidrs(ex_gw_port['fixed_ips']) - self.driver.init_l3(interface_name, ip_cidrs, namespace=ns_name) + self.driver.init_l3(interface_name, ip_cidrs, namespace=ns_name, + clean_connections=True) for fixed_ip in ex_gw_port['fixed_ips']: ip_lib.send_gratuitous_arp(ns_name, diff --git a/neutron/agent/l3/router_info.py b/neutron/agent/l3/router_info.py index 6e213d2f24f..0dfbc13ef58 100644 --- a/neutron/agent/l3/router_info.py +++ b/neutron/agent/l3/router_info.py @@ -462,7 +462,8 @@ class RouterInfo(object): gateway_ips=gateway_ips, extra_subnets=ex_gw_port.get('extra_subnets', []), preserve_ips=preserve_ips, - enable_ra_on_gw=enable_ra_on_gw) + enable_ra_on_gw=enable_ra_on_gw, + clean_connections=True) for fixed_ip in ex_gw_port['fixed_ips']: ip_lib.send_gratuitous_arp(ns_name, interface_name, diff --git a/neutron/agent/linux/interface.py b/neutron/agent/linux/interface.py index ed1e91e98f7..470e8f34f25 100644 --- a/neutron/agent/linux/interface.py +++ b/neutron/agent/linux/interface.py @@ -79,13 +79,15 @@ class LinuxInterfaceDriver(object): def init_l3(self, device_name, ip_cidrs, namespace=None, preserve_ips=[], gateway_ips=None, extra_subnets=[], - enable_ra_on_gw=False): + enable_ra_on_gw=False, clean_connections=False): """Set the L3 settings for the interface using data from the port. ip_cidrs: list of 'X.X.X.X/YY' strings preserve_ips: list of ip cidrs that should not be removed from device gateway_ips: For gateway ports, list of external gateway ip addresses enable_ra_on_gw: Boolean to indicate configuring acceptance of IPv6 RA + clean_connections: Boolean to indicate if we should cleanup connections + associated to removed ips """ device = ip_lib.IPDevice(device_name, namespace=namespace) @@ -113,7 +115,10 @@ class LinuxInterfaceDriver(object): # clean up any old addresses for ip_cidr in previous: if ip_cidr not in preserve_ips: - device.delete_addr_and_conntrack_state(ip_cidr) + if clean_connections: + device.delete_addr_and_conntrack_state(ip_cidr) + else: + device.addr.delete(ip_cidr) for gateway_ip in gateway_ips or []: device.route.add_gateway(gateway_ip) diff --git a/neutron/tests/unit/agent/l3/test_agent.py b/neutron/tests/unit/agent/l3/test_agent.py index 52dbb073fb6..5e67dda6ae0 100644 --- a/neutron/tests/unit/agent/l3/test_agent.py +++ b/neutron/tests/unit/agent/l3/test_agent.py @@ -611,7 +611,8 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): 'gateway_ips': gateway_ips, 'namespace': 'qrouter-' + router['id'], 'extra_subnets': [], - 'enable_ra_on_gw': enable_ra_on_gw} + 'enable_ra_on_gw': enable_ra_on_gw, + 'clean_connections': True} else: exp_arp_calls = [mock.call(ri.ns_name, interface_name, '20.0.0.30', mock.ANY)] @@ -632,7 +633,8 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): 'gateway_ips': gateway_ips, 'namespace': 'qrouter-' + router['id'], 'extra_subnets': [{'cidr': '172.16.0.0/24'}], - 'enable_ra_on_gw': enable_ra_on_gw} + 'enable_ra_on_gw': enable_ra_on_gw, + 'clean_connections': True} self.mock_driver.init_l3.assert_called_with(interface_name, ip_cidrs, **kwargs) @@ -799,7 +801,8 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): 'gateway_ips': gateway_ips, 'namespace': 'qrouter-' + router['id'], 'extra_subnets': [{'cidr': '172.16.0.0/24'}], - 'enable_ra_on_gw': False} + 'enable_ra_on_gw': False, + 'clean_connections': True} self.mock_driver.init_l3.assert_called_with(interface_name, ip_cidrs, **kwargs) diff --git a/neutron/tests/unit/agent/linux/test_interface.py b/neutron/tests/unit/agent/linux/test_interface.py index 8bbc210dd9b..1834524e899 100644 --- a/neutron/tests/unit/agent/linux/test_interface.py +++ b/neutron/tests/unit/agent/linux/test_interface.py @@ -94,7 +94,7 @@ class TestABCDriver(TestBase): [mock.call('tap0', namespace=ns), mock.call().addr.list(filters=['permanent']), mock.call().addr.add('192.168.1.2/24'), - mock.call().delete_addr_and_conntrack_state('172.16.77.240/24'), + mock.call().addr.delete('172.16.77.240/24'), mock.call().route.list_onlink_routes(constants.IP_VERSION_4), mock.call().route.list_onlink_routes(constants.IP_VERSION_6), mock.call().route.add_onlink_route('172.20.0.0/24')]) @@ -129,6 +129,29 @@ class TestABCDriver(TestBase): self.assertFalse(self.ip_dev().addr.delete.called) self.assertFalse(self.ip_dev().delete_addr_and_conntrack_state.called) + def _test_l3_init_clean_connections(self, clean_connections): + addresses = [ + dict(scope='global', dynamic=False, cidr='10.0.0.1/24'), + dict(scope='global', dynamic=False, cidr='10.0.0.3/32')] + self.ip_dev().addr.list = mock.Mock(return_value=addresses) + + bc = BaseChild(self.conf) + ns = '12345678-1234-5678-90ab-ba0987654321' + bc.init_l3('tap0', ['10.0.0.1/24'], namespace=ns, + clean_connections=clean_connections) + + delete = self.ip_dev().delete_addr_and_conntrack_state + if clean_connections: + delete.assert_called_once_with('10.0.0.3/32') + else: + self.assertFalse(delete.called) + + def test_l3_init_with_clean_connections(self): + self._test_l3_init_clean_connections(True) + + def test_l3_init_without_clean_connections(self): + self._test_l3_init_clean_connections(False) + def _test_l3_init_with_ipv6(self, include_gw_ip): addresses = [dict(scope='global', dynamic=False, @@ -148,8 +171,7 @@ class TestABCDriver(TestBase): [mock.call('tap0', namespace=ns), mock.call().addr.list(filters=['permanent']), mock.call().addr.add('2001:db8:a::124/64'), - mock.call().delete_addr_and_conntrack_state( - '2001:db8:a::123/64')]) + mock.call().addr.delete('2001:db8:a::123/64')]) if include_gw_ip: expected_calls += ( [mock.call().route.add_gateway('2001:db8:a::1')]) @@ -182,8 +204,8 @@ class TestABCDriver(TestBase): mock.call().addr.list(filters=['permanent']), mock.call().addr.add('192.168.1.2/24'), mock.call().addr.add('2001:db8:a::124/64'), - mock.call().delete_addr_and_conntrack_state('172.16.77.240/24'), - mock.call().delete_addr_and_conntrack_state('2001:db8:a::123/64'), + mock.call().addr.delete('172.16.77.240/24'), + mock.call().addr.delete('2001:db8:a::123/64'), mock.call().route.list_onlink_routes(constants.IP_VERSION_4), mock.call().route.list_onlink_routes(constants.IP_VERSION_6), mock.call().route.add_onlink_route('172.20.0.0/24')], From b239f75644bfdfec86f8a8efdabd6b11b766e822 Mon Sep 17 00:00:00 2001 From: shihanzhang Date: Tue, 26 May 2015 16:42:44 +0800 Subject: [PATCH 027/161] Update ipset members when corresponding sg member is empty if a security group has a rule with 'remote-group-id', the ports in this security group should update its relevant ipset member when the remote-group members is empty. Change-Id: I980ebfd8f6537f803d9d5cbf21ca33f727fea3b3 Closes-bug: #1458786 --- neutron/agent/linux/iptables_firewall.py | 3 +-- neutron/tests/unit/agent/linux/test_iptables_firewall.py | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/neutron/agent/linux/iptables_firewall.py b/neutron/agent/linux/iptables_firewall.py index 4dd988fde8b..1cae8f6429f 100644 --- a/neutron/agent/linux/iptables_firewall.py +++ b/neutron/agent/linux/iptables_firewall.py @@ -458,8 +458,7 @@ class IptablesFirewallDriver(firewall.FirewallDriver): for ip_version, sg_ids in security_group_ids.items(): for sg_id in sg_ids: current_ips = self.sg_members[sg_id][ip_version] - if current_ips: - self.ipset.set_members(sg_id, ip_version, current_ips) + self.ipset.set_members(sg_id, ip_version, current_ips) def _generate_ipset_rule_args(self, sg_rule, remote_gid): ethertype = sg_rule.get('ethertype') diff --git a/neutron/tests/unit/agent/linux/test_iptables_firewall.py b/neutron/tests/unit/agent/linux/test_iptables_firewall.py index 53726f81c73..7491d5a8740 100644 --- a/neutron/tests/unit/agent/linux/test_iptables_firewall.py +++ b/neutron/tests/unit/agent/linux/test_iptables_firewall.py @@ -1695,3 +1695,11 @@ class IptablesFirewallEnhancedIpsetTestCase(BaseIptablesFirewallTestCase): self.firewall._build_ipv4v6_mac_ip_list(mac_oth, ipv6, mac_ipv4_pairs, mac_ipv6_pairs) self.assertEqual(fake_ipv6_pair, mac_ipv6_pairs) + + def test_update_ipset_members(self): + self.firewall.sg_members[FAKE_SGID][_IPv4] = [] + self.firewall.sg_members[FAKE_SGID][_IPv6] = [] + sg_info = {constants.IPv4: [FAKE_SGID]} + self.firewall._update_ipset_members(sg_info) + calls = [mock.call.set_members(FAKE_SGID, constants.IPv4, [])] + self.firewall.ipset.assert_has_calls(calls) From 725543684cbe0df0edc4b6924f85e63e1628fa92 Mon Sep 17 00:00:00 2001 From: rossella Date: Thu, 5 Mar 2015 09:24:10 +0000 Subject: [PATCH 028/161] Add get_events to OVSDB monitor OVSDB monitor can generate the events that the OVS agent needs to process (device added or updated). Instead of notifying only that a change occurred and that polling is needed, pass the events to the agent Change-Id: I3d17bf995ad4508c4c6d089de550148da1465fa1 Partially-Implements: blueprint restructure-l2-agent --- neutron/agent/linux/ovsdb_monitor.py | 46 ++++++++++++++--- neutron/agent/linux/polling.py | 3 ++ neutron/tests/common/net_helpers.py | 9 +++- .../agent/linux/test_ovsdb_monitor.py | 50 +++++++++++++++++-- .../unit/agent/linux/test_ovsdb_monitor.py | 12 +++-- 5 files changed, 106 insertions(+), 14 deletions(-) diff --git a/neutron/agent/linux/ovsdb_monitor.py b/neutron/agent/linux/ovsdb_monitor.py index 7e0ef251184..f992bca25b5 100644 --- a/neutron/agent/linux/ovsdb_monitor.py +++ b/neutron/agent/linux/ovsdb_monitor.py @@ -14,13 +14,19 @@ import eventlet from oslo_log import log as logging +from oslo_serialization import jsonutils from neutron.agent.linux import async_process +from neutron.agent.ovsdb import api as ovsdb from neutron.i18n import _LE LOG = logging.getLogger(__name__) +OVSDB_ACTION_INITIAL = 'initial' +OVSDB_ACTION_INSERT = 'insert' +OVSDB_ACTION_DELETE = 'delete' + class OvsdbMonitor(async_process.AsyncProcess): """Manages an invocation of 'ovsdb-client monitor'.""" @@ -63,22 +69,50 @@ class SimpleInterfaceMonitor(OvsdbMonitor): def __init__(self, respawn_interval=None): super(SimpleInterfaceMonitor, self).__init__( 'Interface', - columns=['name', 'ofport'], + columns=['name', 'ofport', 'external_ids'], format='json', respawn_interval=respawn_interval, ) self.data_received = False + self.new_events = {'added': [], 'removed': []} @property def has_updates(self): """Indicate whether the ovsdb Interface table has been updated. - True will be returned if the monitor process is not active. - This 'failing open' minimizes the risk of falsely indicating - the absence of updates at the expense of potential false - positives. + If the monitor process is not active an error will be logged since + it won't be able to communicate any update. This situation should be + temporary if respawn_interval is set. """ - return bool(list(self.iter_stdout())) or not self.is_active() + if not self.is_active(): + LOG.error(_LE("Interface monitor is not active")) + else: + self.process_events() + return bool(self.new_events['added'] or self.new_events['removed']) + + def get_events(self): + self.process_events() + events = self.new_events + self.new_events = {'added': [], 'removed': []} + return events + + def process_events(self): + devices_added = [] + devices_removed = [] + for row in self.iter_stdout(): + json = jsonutils.loads(row).get('data') + for ovs_id, action, name, ofport, external_ids in json: + if external_ids: + external_ids = ovsdb.val_to_py(external_ids) + device = {'name': name, + 'ofport': ofport, + 'external_ids': external_ids} + if action in (OVSDB_ACTION_INITIAL, OVSDB_ACTION_INSERT): + devices_added.append(device) + elif action == OVSDB_ACTION_DELETE: + devices_removed.append(device) + self.new_events['added'].extend(devices_added) + self.new_events['removed'].extend(devices_removed) def start(self, block=False, timeout=5): super(SimpleInterfaceMonitor, self).start() diff --git a/neutron/agent/linux/polling.py b/neutron/agent/linux/polling.py index dffabf34030..ac3a4a620c2 100644 --- a/neutron/agent/linux/polling.py +++ b/neutron/agent/linux/polling.py @@ -60,3 +60,6 @@ class InterfacePollingMinimizer(base_polling.BasePollingManager): # collect output. eventlet.sleep() return self._monitor.has_updates + + def get_events(self): + return self._monitor.get_events() diff --git a/neutron/tests/common/net_helpers.py b/neutron/tests/common/net_helpers.py index 5d665f7f9ce..ae494f5f358 100644 --- a/neutron/tests/common/net_helpers.py +++ b/neutron/tests/common/net_helpers.py @@ -181,6 +181,12 @@ class OVSBridgeFixture(fixtures.Fixture): class OVSPortFixture(PortFixture): + def __init__(self, bridge=None, namespace=None, attrs=None): + super(OVSPortFixture, self).__init__(bridge, namespace) + if attrs is None: + attrs = [] + self.attrs = attrs + def _create_bridge_fixture(self): return OVSBridgeFixture() @@ -196,7 +202,8 @@ class OVSPortFixture(PortFixture): self.port.link.set_up() def create_port(self, name): - self.bridge.add_port(name, ('type', 'internal')) + self.attrs.insert(0, ('type', 'internal')) + self.bridge.add_port(name, *self.attrs) return name diff --git a/neutron/tests/functional/agent/linux/test_ovsdb_monitor.py b/neutron/tests/functional/agent/linux/test_ovsdb_monitor.py index a9ae8c2365e..fc49b1ae4d1 100644 --- a/neutron/tests/functional/agent/linux/test_ovsdb_monitor.py +++ b/neutron/tests/functional/agent/linux/test_ovsdb_monitor.py @@ -107,9 +107,51 @@ class TestSimpleInterfaceMonitor(BaseMonitorTest): utils.wait_until_true(lambda: self.monitor.data_received is True) self.assertTrue(self.monitor.has_updates, 'Initial call should always be true') - self.assertFalse(self.monitor.has_updates, - 'has_updates without port addition should be False') + # clear the event list + self.monitor.get_events() self.useFixture(net_helpers.OVSPortFixture()) # has_updates after port addition should become True - while not self.monitor.has_updates: - eventlet.sleep(0.01) + utils.wait_until_true(lambda: self.monitor.has_updates is True) + + def _expected_devices_events(self, devices, state): + """Helper to check that events are received for expected devices. + + :param devices: The list of expected devices. WARNING: This list + is modified by this method + :param state: The state of the devices (added or removed) + """ + events = self.monitor.get_events() + event_devices = [ + (dev['name'], dev['external_ids']) for dev in events.get(state)] + for dev in event_devices: + if dev[0] in devices: + devices.remove(dev[0]) + self.assertEqual(dev[1].get('iface-status'), 'active') + if not devices: + return True + + def test_get_events(self): + utils.wait_until_true(lambda: self.monitor.data_received is True) + devices = self.monitor.get_events() + self.assertTrue(devices.get('added'), + 'Initial call should always be true') + p_attrs = [('external_ids', {'iface-status': 'active'})] + br = self.useFixture(net_helpers.OVSBridgeFixture()) + p1 = self.useFixture(net_helpers.OVSPortFixture( + br.bridge, None, p_attrs)) + p2 = self.useFixture(net_helpers.OVSPortFixture( + br.bridge, None, p_attrs)) + added_devices = [p1.port.name, p2.port.name] + utils.wait_until_true( + lambda: self._expected_devices_events(added_devices, 'added')) + br.bridge.delete_port(p1.port.name) + br.bridge.delete_port(p2.port.name) + removed_devices = [p1.port.name, p2.port.name] + utils.wait_until_true( + lambda: self._expected_devices_events(removed_devices, 'removed')) + # restart + self.monitor.stop(block=True) + self.monitor.start(block=True, timeout=60) + devices = self.monitor.get_events() + self.assertTrue(devices.get('added'), + 'Initial call should always be true') diff --git a/neutron/tests/unit/agent/linux/test_ovsdb_monitor.py b/neutron/tests/unit/agent/linux/test_ovsdb_monitor.py index 9b8b9768706..604d6cc4ad8 100644 --- a/neutron/tests/unit/agent/linux/test_ovsdb_monitor.py +++ b/neutron/tests/unit/agent/linux/test_ovsdb_monitor.py @@ -55,9 +55,6 @@ class TestSimpleInterfaceMonitor(base.BaseTestCase): super(TestSimpleInterfaceMonitor, self).setUp() self.monitor = ovsdb_monitor.SimpleInterfaceMonitor() - def test_has_updates_is_true_by_default(self): - self.assertTrue(self.monitor.has_updates) - def test_has_updates_is_false_if_active_with_no_output(self): target = ('neutron.agent.linux.ovsdb_monitor.SimpleInterfaceMonitor' '.is_active') @@ -87,3 +84,12 @@ class TestSimpleInterfaceMonitor(base.BaseTestCase): return_value=output): self.monitor._read_stdout() self.assertFalse(self.monitor.data_received) + + def test_has_updates_after_calling_get_events_is_false(self): + with mock.patch.object( + self.monitor, 'process_events') as process_events: + self.monitor.new_events = {'added': ['foo'], 'removed': ['foo1']} + self.assertTrue(self.monitor.has_updates) + self.monitor.get_events() + self.assertTrue(process_events.called) + self.assertFalse(self.monitor.has_updates) From 00899b56213753d523842f29d50353a067df6064 Mon Sep 17 00:00:00 2001 From: Cyril Roelandt Date: Mon, 8 Jun 2015 14:42:18 +0000 Subject: [PATCH 029/161] Python3: Enable all working tests in tox.ini Thanks to the recent Python3-related changes, these tests can now be run on Python 3. Change-Id: I7f689e221e59128012d46da2c90e61d5206fe828 Blueprint: neutron-python3 --- tox.ini | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index bd28ed3e269..636a2a37739 100644 --- a/tox.ini +++ b/tox.ini @@ -89,7 +89,95 @@ commands = sphinx-build -W -b html doc/source doc/build [testenv:py34] commands = python -m testtools.run \ - neutron.tests.unit.common.test_rpc + neutron.tests.unit.services.metering.drivers.test_iptables \ + neutron.tests.unit.services.l3_router.test_l3_apic \ + neutron.tests.unit.plugins.sriovnicagent.test_sriov_nic_agent \ + neutron.tests.unit.plugins.sriovnicagent.test_pci_lib \ + neutron.tests.unit.plugins.openvswitch.agent.ovs_test_base \ + neutron.tests.unit.plugins.openvswitch.agent.openflow.ovs_ofctl.test_br_phys \ + neutron.tests.unit.plugins.openvswitch.agent.openflow.ovs_ofctl.test_br_int \ + neutron.tests.unit.plugins.openvswitch.agent.openflow.ovs_ofctl.test_br_tun \ + neutron.tests.unit.plugins.brocade.test_brocade_db \ + neutron.tests.unit.plugins.brocade.test_brocade_vlan \ + neutron.tests.unit.plugins.oneconvergence.test_nvsd_agent \ + neutron.tests.unit.plugins.oneconvergence.test_plugin_helper \ + neutron.tests.unit.plugins.oneconvergence.test_nvsdlib \ + neutron.tests.unit.plugins.ibm.test_sdnve_api \ + neutron.tests.unit.plugins.ml2.test_db \ + neutron.tests.unit.plugins.ml2.test_driver_context \ + neutron.tests.unit.plugins.ml2.test_rpc \ + neutron.tests.unit.plugins.ml2.drivers.mlnx.test_mech_mlnx \ + neutron.tests.unit.plugins.ml2.drivers.test_mech_openvswitch \ + neutron.tests.unit.plugins.ml2.drivers.test_mech_linuxbridge \ + neutron.tests.unit.plugins.ml2.drivers.base_type_tunnel \ + neutron.tests.unit.plugins.ml2.drivers.ext_test \ + neutron.tests.unit.plugins.ml2.drivers.mech_sriov.test_mech_sriov_nic_switch \ + neutron.tests.unit.plugins.ml2.drivers.mech_fake_agent \ + neutron.tests.unit.plugins.ml2.drivers.arista.test_mechanism_arista \ + neutron.tests.unit.plugins.ml2.drivers.test_type_local \ + neutron.tests.unit.plugins.ml2.drivers.mechanism_logger \ + neutron.tests.unit.plugins.ml2.drivers.cisco.apic.test_apic_sync \ + neutron.tests.unit.plugins.ml2.drivers.cisco.apic.base \ + neutron.tests.unit.plugins.ml2.drivers.cisco.apic.test_apic_topology \ + neutron.tests.unit.plugins.ml2.drivers.test_type_flat \ + neutron.tests.unit.plugins.ml2.drivers.mechanism_test \ + neutron.tests.unit.plugins.ml2.extensions.fake_extension \ + neutron.tests.unit.plugins.cisco.n1kv.fake_client \ + neutron.tests.unit.plugins.cisco.test_network_db \ + neutron.tests.unit.db.test_l3_dvr_db \ + neutron.tests.unit.db.test_agents_db \ + neutron.tests.unit.db.test_dvr_mac_db \ + neutron.tests.unit.debug.test_commands \ + neutron.tests.unit.tests.test_base \ + neutron.tests.unit.database_stubs \ + neutron.tests.unit.dummy_plugin \ + neutron.tests.unit.extension_stubs \ + neutron.tests.unit.testlib_api \ + neutron.tests.unit.api.test_api_common \ + neutron.tests.unit.api.rpc.handlers.test_dhcp_rpc \ + neutron.tests.unit.api.rpc.handlers.test_securitygroups_rpc \ + neutron.tests.unit.api.rpc.handlers.test_dvr_rpc \ + neutron.tests.unit.api.rpc.agentnotifiers.test_dhcp_rpc_agent_api \ + neutron.tests.unit.agent.metadata.test_driver \ + neutron.tests.unit.agent.l2population_rpc_base \ + neutron.tests.unit.agent.test_rpc \ + neutron.tests.unit.agent.test_l2population_rpc \ + neutron.tests.unit.agent.l3.test_link_local_allocator \ + neutron.tests.unit.agent.l3.test_ha_router \ + neutron.tests.unit.agent.l3.test_legacy_router \ + neutron.tests.unit.agent.l3.test_router_info \ + neutron.tests.unit.agent.l3.test_router_processing_queue \ + neutron.tests.unit.agent.l3.test_namespace_manager \ + neutron.tests.unit.agent.l3.test_dvr_fip_ns \ + neutron.tests.unit.agent.common.test_config \ + neutron.tests.unit.agent.common.test_polling \ + neutron.tests.unit.agent.linux.test_keepalived \ + neutron.tests.unit.agent.linux.test_ipset_manager \ + neutron.tests.unit.agent.linux.test_ebtables_manager \ + neutron.tests.unit.agent.linux.test_ebtables_driver \ + neutron.tests.unit.agent.linux.test_polling \ + neutron.tests.unit.agent.linux.test_ip_monitor \ + neutron.tests.unit.agent.linux.test_iptables_manager \ + neutron.tests.unit.agent.linux.test_ovsdb_monitor \ + neutron.tests.unit.agent.linux.test_bridge_lib \ + neutron.tests.unit.agent.linux.test_ip_link_support \ + neutron.tests.unit.agent.linux.test_interface \ + neutron.tests.unit.test_auth \ + neutron.tests.unit.extensions.v2attributes \ + neutron.tests.unit.extensions.extendedattribute \ + neutron.tests.unit.extensions.base \ + neutron.tests.unit.extensions.foxinsocks \ + neutron.tests.unit.extensions.extensionattribute \ + neutron.tests.unit.callbacks.test_manager \ + neutron.tests.unit.hacking.test_checks \ + neutron.tests.unit.common.test_config \ + neutron.tests.unit.common.test_rpc \ + neutron.tests.unit.cmd.test_ovs_cleanup \ + neutron.tests.unit.cmd.test_netns_cleanup \ + neutron.tests.unit.ipam.drivers.neutrondb_ipam.test_db_api \ + neutron.tests.unit.ipam.drivers.neutrondb_ipam.test_driver \ + neutron.tests.unit.notifiers.test_nova \ + neutron.tests.unit.notifiers.test_batch_notifier [flake8] # E125 continuation line does not distinguish itself from next logical line From 3a5a8a62c372f3a516caa59fd655dcf923a82519 Mon Sep 17 00:00:00 2001 From: Kyle Mestery Date: Mon, 8 Jun 2015 15:27:23 +0000 Subject: [PATCH 030/161] Add Neutron PTL Office Hours To ensure a weekly oppurtunity to sync between the PTL and the Lieutenants, officially setup Neutron PTL Office Hours. Depends-On: Ia5c8090e90939097104cb95c0aa3b883f7b4dd9b Change-Id: Iab3c21764937ebb3a1d0553b3a3d42b5c44bf3cc Signed-off-by: Kyle Mestery --- doc/source/policies/index.rst | 1 + doc/source/policies/office-hours.rst | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 doc/source/policies/office-hours.rst diff --git a/doc/source/policies/index.rst b/doc/source/policies/index.rst index 9a780eeb56e..6a766ac9159 100644 --- a/doc/source/policies/index.rst +++ b/doc/source/policies/index.rst @@ -32,6 +32,7 @@ Policies core-reviewers gate-failure-triage code-reviews + office-hours Indices and tables ------------------ diff --git a/doc/source/policies/office-hours.rst b/doc/source/policies/office-hours.rst new file mode 100644 index 00000000000..fd50012c99c --- /dev/null +++ b/doc/source/policies/office-hours.rst @@ -0,0 +1,21 @@ +Neutron PTL Office Hours +------------------------ + +Neutron has evolved into a platform. As part of the broader ["Big Tent"][1] +initiative, Neutron has also opened it's doors to the Neutron Stadium +effort. This, combined with the new [Lieutenant System][2], means the PTL is +now responsible for leading an increasingly large and diverse group of +contributors. To ensure weekly syncs between the PTL and the Lieutenants, +as well as to allow for projects under the Neutron Stadium to have a sync +point with the PTL, the project is setting up office hours in the +#openstack-neutron-release IRC channel. The PTL will use these office hours +to allow for questions and syncing with Lieutenants. + +The current office hours can be seen on the [OpenStack eavesdrop][3] page. + +Please note the #openstack-neutron-release channel is logged to allow the +consumption of these discussion by those who cannot make the times above. + +[1]: http://superuser.openstack.org/articles/openstack-as-layers-but-also-a-big-tent-but-also-a-bunch-of-cats +[2]: http://docs.openstack.org/developer/neutron/policies/core-reviewers.html#core-review-hierarchy +[3]: http://eavesdrop.openstack.org/ From b322ebae09cc59ed0a860ea6e39ed9b6fa6c5c12 Mon Sep 17 00:00:00 2001 From: yuyangbj Date: Wed, 13 May 2015 14:07:36 +0800 Subject: [PATCH 031/161] Fixes bulk insertion of data to ml2_port_binding We should use schema definition to insert bulk of data to table. Closes-Bug: #1454566 Change-Id: I66b3ee8c2f9fa6f04b9e89dc49d1a3d277d63191 --- .../2b801560a332_remove_hypervneutronplugin_tables.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/neutron/db/migration/alembic_migrations/versions/2b801560a332_remove_hypervneutronplugin_tables.py b/neutron/db/migration/alembic_migrations/versions/2b801560a332_remove_hypervneutronplugin_tables.py index 31515849956..711ebe05e3e 100644 --- a/neutron/db/migration/alembic_migrations/versions/2b801560a332_remove_hypervneutronplugin_tables.py +++ b/neutron/db/migration/alembic_migrations/versions/2b801560a332_remove_hypervneutronplugin_tables.py @@ -32,6 +32,7 @@ revision = '2b801560a332' down_revision = '2d2a8a565438' from alembic import op +import sqlalchemy as sa from sqlalchemy.sql import expression as sa_expr from neutron.extensions import portbindings @@ -119,8 +120,9 @@ def _migrate_port_bindings(engine): if segment: binding['segment'] = segment if ml2_bindings: - ml2_port_bindings = sa_expr.table('ml2_port_bindings') - op.execute(ml2_port_bindings.insert(), ml2_bindings) + md = sa.MetaData() + sa.Table('ml2_port_bindings', md, autoload=True, autoload_with=engine) + op.bulk_insert(md.tables['ml2_port_bindings'], ml2_bindings) def upgrade(): From d0bbfc090bb25f1e05b98f0ad70c18209b87ed6b Mon Sep 17 00:00:00 2001 From: Zhenguo Niu Date: Tue, 9 Jun 2015 08:28:45 +0800 Subject: [PATCH 032/161] Fix typos in docs Change-Id: I71aeb8f1e5fc5f3e330e593a463858dd65e6093b --- doc/source/devref/callbacks.rst | 2 +- doc/source/devref/contribute.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/devref/callbacks.rst b/doc/source/devref/callbacks.rst index 4c9f5488447..baaa98a83b7 100644 --- a/doc/source/devref/callbacks.rst +++ b/doc/source/devref/callbacks.rst @@ -223,7 +223,7 @@ There are a few options to unsubscribe registered callbacks: resource R, any notification of events related to resource R will no longer be handed over to C, after the unsubscribe_by_resource() invocation. * unsubscribe_all(): say that callback C has subscribed to events A, B for resource R1, - and events C, D for resource R2, any notification of events pertaining resouces R1 and + and events C, D for resource R2, any notification of events pertaining resources R1 and R2 will no longer be handed over to C, after the unsubscribe_all() invocation. The snippet below shows these concepts in action: diff --git a/doc/source/devref/contribute.rst b/doc/source/devref/contribute.rst index 932474e7500..8f90e4d757d 100644 --- a/doc/source/devref/contribute.rst +++ b/doc/source/devref/contribute.rst @@ -391,7 +391,7 @@ will be removed. The following aspects are captured: effort is not considered justified. Assessment may change in the future. - Absense of an entry for an existing plugin or driver means no active effort + Absence of an entry for an existing plugin or driver means no active effort has been observed or potentially not required. * Completed in: the release in which the effort is considered completed. Code completion can be deemed as such, if there is no overlap/duplication between From e61865807c4c8ff959a7746fe3e17f1ae574c9d0 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Wed, 3 Jun 2015 19:03:29 -0700 Subject: [PATCH 033/161] Defer segment lookup in NetworkContext object Avoid call to get network segments for network context objects until a caller actually tries to lookup the segments. This optimizes cases where the user of a port context never looks at the segments of the associated network context (e.g. update_port_status). Closes-Bug: #1463254 Change-Id: I7e95f81d9a3ef26ccdb18c6bfdf9adc29523aa79 --- neutron/plugins/ml2/driver_context.py | 7 +- .../unit/plugins/ml2/test_driver_context.py | 69 ++++++++++++------- 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/neutron/plugins/ml2/driver_context.py b/neutron/plugins/ml2/driver_context.py index ef418fe16e2..6e9b295b594 100644 --- a/neutron/plugins/ml2/driver_context.py +++ b/neutron/plugins/ml2/driver_context.py @@ -42,8 +42,8 @@ class NetworkContext(MechanismDriverContext, api.NetworkContext): super(NetworkContext, self).__init__(plugin, plugin_context) self._network = network self._original_network = original_network - self._segments = db.get_network_segments(plugin_context.session, - network['id']) + self._segments = None + self._session = plugin_context.session @property def current(self): @@ -55,6 +55,9 @@ class NetworkContext(MechanismDriverContext, api.NetworkContext): @property def network_segments(self): + if not self._segments: + self._segments = db.get_network_segments(self._session, + self._network['id']) return self._segments diff --git a/neutron/tests/unit/plugins/ml2/test_driver_context.py b/neutron/tests/unit/plugins/ml2/test_driver_context.py index e30349c9c6c..8171071b6c2 100644 --- a/neutron/tests/unit/plugins/ml2/test_driver_context.py +++ b/neutron/tests/unit/plugins/ml2/test_driver_context.py @@ -37,13 +37,12 @@ class TestPortContext(base.BaseTestCase): port = {'device_owner': constants.DEVICE_OWNER_DVR_INTERFACE} binding.host = 'foohost' - with mock.patch.object(driver_context.db, 'get_network_segments'): - ctx = driver_context.PortContext(plugin, - plugin_context, - port, - network, - binding, - None) + ctx = driver_context.PortContext(plugin, + plugin_context, + port, + network, + binding, + None) self.assertEqual('foohost', ctx.host) def test_host_super(self): @@ -56,13 +55,12 @@ class TestPortContext(base.BaseTestCase): portbindings.HOST_ID: 'host'} binding.host = 'foohost' - with mock.patch.object(driver_context.db, 'get_network_segments'): - ctx = driver_context.PortContext(plugin, - plugin_context, - port, - network, - binding, - None) + ctx = driver_context.PortContext(plugin, + plugin_context, + port, + network, + binding, + None) self.assertEqual('host', ctx.host) def test_status(self): @@ -74,13 +72,12 @@ class TestPortContext(base.BaseTestCase): port = {'device_owner': constants.DEVICE_OWNER_DVR_INTERFACE} binding.status = 'foostatus' - with mock.patch.object(driver_context.db, 'get_network_segments'): - ctx = driver_context.PortContext(plugin, - plugin_context, - port, - network, - binding, - None) + ctx = driver_context.PortContext(plugin, + plugin_context, + port, + network, + binding, + None) self.assertEqual('foostatus', ctx.status) def test_status_super(self): @@ -93,11 +90,37 @@ class TestPortContext(base.BaseTestCase): 'status': 'status'} binding.status = 'foostatus' - with mock.patch.object(driver_context.db, 'get_network_segments'): + ctx = driver_context.PortContext(plugin, + plugin_context, + port, + network, + binding, + None) + self.assertEqual('status', ctx.status) + + def test_segments_lazy_lookup(self): + plugin = mock.Mock() + plugin_context = mock.Mock() + network = mock.MagicMock() + binding = mock.Mock() + + port = {'device_owner': 'compute', + 'status': 'status'} + binding.status = 'foostatus' + + with mock.patch.object(driver_context.db, + 'get_network_segments') as gs: ctx = driver_context.PortContext(plugin, plugin_context, port, network, binding, None) - self.assertEqual('status', ctx.status) + self.assertFalse(gs.called) + # accessing the network_segments property should trigger + # a lookup the first time + seg = ctx.network.network_segments + self.assertTrue(gs.called) + gs.reset_mock() + self.assertEqual(seg, ctx.network.network_segments) + self.assertFalse(gs.called) From 89c0875178f22651109a85d3c522d80324368caf Mon Sep 17 00:00:00 2001 From: Gal Sagie Date: Mon, 8 Jun 2015 14:27:47 +0300 Subject: [PATCH 034/161] Add documentations for VXLAN Tunnels The VXLAN type driver is currently supported, this patch add description and links for more information to the user. Change-Id: Idb221ca4cce1a3a27bebe5ae6fc1e6ab5d030836 --- doc/source/devref/openvswitch_agent.rst | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/doc/source/devref/openvswitch_agent.rst b/doc/source/devref/openvswitch_agent.rst index c6f165064a7..ae8660af3c5 100644 --- a/doc/source/devref/openvswitch_agent.rst +++ b/doc/source/devref/openvswitch_agent.rst @@ -6,7 +6,10 @@ This Agent uses the `OpenVSwitch`_ virtual switch to create L2 connectivity for instances, along with bridges created in conjunction with OpenStack Nova for filtering. -ovs-neutron-agent can be configured to use two different networking technologies to create tenant isolation, either GRE tunnels or VLAN tags. +ovs-neutron-agent can be configured to use different networking technologies +to create tenant isolation. +These technologies are implemented as ML2 type drivers which are used in +conjunction with the OpenVSwitch mechanism driver. VLAN Tags --------- @@ -23,6 +26,16 @@ GRE Tunneling is documented in depth in the `Networking in too much detail `_ by RedHat. + +VXLAN Tunnels +------------- + +VXLAN is an overlay technology which encapsulates MAC frames +at layer 2 into a UDP header. +More information can be found in `The VXLAN wiki page. + `_ + + Further Reading --------------- From 734e77365b0f241a3cea0f3c9dfb1d5fcf6eac8c Mon Sep 17 00:00:00 2001 From: Salvatore Orlando Date: Fri, 17 Apr 2015 15:00:20 -0700 Subject: [PATCH 035/161] Remove get_admin_roles and associated logic get_admin_roles was introduced so that contextes generated from within plugins could be used for policy checks. This was the case up to the Havana release as several plugins invoked the policy engine directly to authorize requests. This was an incorrect behaviour and has now been fixed, meaning that get_admin_roles is no longer need and can be safely removed. This will result in a leaner and more reliable codebase. Indeed the function being removed here was the cause of several bugs where the policy engine was initialized too early in the server bootstrap process. While this patch removes the feature it does not remove the load_admin_roles parameter from context.get_admin_context. Doing so will break other projects such as neutron-lbaas. The parameter is deprecated by this patch and an appropriate warning emitted. As a consequence neutron's will now no longer perform policy checks when context.is_admin=True. This flag is instead set either when a context is explicitly created for granting admin privileges, or when Neutron is operating in noauth mode. In the latter case every request is treated by neutron as an admin request, and get_admin_roles is simply ensuring the appropriate roles get pushed into the context so that the policy engine will grant admin rights to the request. This behaviour is probably just a waste of resource; also it is not adding anything from a security perspective. On the other hand not performing checks when context.is_admin is True should not pose a security threat either in noauth mode or with the keystone middleware. In the former case the software keeps operating assuming admin rights for every requests, whereas in the latter case the keystone middleware will always supply a context with the appropriate roles, and there is no way for an attacker to trick keystonemiddleware into generating a context for which is_admin=True. Finally, this patch also does some non-trivial changes in test_l3.py as some tests were mocking context.to_dict ignoring the is_admin flag. Closes-Bug: #1446021 Change-Id: I8a5c02712a0b43f3e36a4f14620ebbd73fbfb03f --- neutron/common/rpc.py | 3 +- neutron/context.py | 13 +-- neutron/policy.py | 30 ++---- neutron/tests/functional/db/test_ipam.py | 1 - .../tests/unit/db/test_db_base_plugin_v2.py | 22 ++-- neutron/tests/unit/extensions/test_l3.py | 102 +++++++++--------- .../tests/unit/extensions/test_quotasv2.py | 2 +- .../opencontrail/test_contrail_plugin.py | 3 +- neutron/tests/unit/test_context.py | 8 -- neutron/tests/unit/test_policy.py | 41 +------ requirements.txt | 1 + 11 files changed, 81 insertions(+), 145 deletions(-) diff --git a/neutron/common/rpc.py b/neutron/common/rpc.py index 732f0527f2a..8c4df963fbc 100644 --- a/neutron/common/rpc.py +++ b/neutron/common/rpc.py @@ -130,8 +130,7 @@ class RequestContextSerializer(om_serializer.Serializer): tenant_id = rpc_ctxt_dict.pop('tenant_id', None) if not tenant_id: tenant_id = rpc_ctxt_dict.pop('project_id', None) - return context.Context(user_id, tenant_id, - load_admin_roles=False, **rpc_ctxt_dict) + return context.Context(user_id, tenant_id, **rpc_ctxt_dict) class Service(service.Service): diff --git a/neutron/context.py b/neutron/context.py index 4847d06fa21..ee6ca8ed7d4 100644 --- a/neutron/context.py +++ b/neutron/context.py @@ -18,6 +18,7 @@ import copy import datetime +from debtcollector import removals from oslo_context import context as oslo_context from oslo_log import log as logging @@ -36,9 +37,8 @@ class ContextBase(oslo_context.RequestContext): """ def __init__(self, user_id, tenant_id, is_admin=None, read_deleted="no", - roles=None, timestamp=None, load_admin_roles=True, - request_id=None, tenant_name=None, user_name=None, - overwrite=True, auth_token=None, **kwargs): + roles=None, timestamp=None, request_id=None, tenant_name=None, + user_name=None, overwrite=True, auth_token=None, **kwargs): """Object initialization. :param read_deleted: 'no' indicates deleted records are hidden, 'yes' @@ -68,11 +68,6 @@ class ContextBase(oslo_context.RequestContext): self.is_advsvc = self.is_admin or policy.check_is_advsvc(self) if self.is_admin is None: self.is_admin = policy.check_is_admin(self) - elif self.is_admin and load_admin_roles: - # Ensure context is populated with admin roles - admin_roles = policy.get_admin_roles() - if admin_roles: - self.roles = list(set(self.roles) | set(admin_roles)) @property def project_id(self): @@ -150,12 +145,12 @@ class Context(ContextBase): return self._session +@removals.removed_kwarg('load_admin_roles') def get_admin_context(read_deleted="no", load_admin_roles=True): return Context(user_id=None, tenant_id=None, is_admin=True, read_deleted=read_deleted, - load_admin_roles=load_admin_roles, overwrite=False) diff --git a/neutron/policy.py b/neutron/policy.py index 9352a00a1b9..a2d099f6761 100644 --- a/neutron/policy.py +++ b/neutron/policy.py @@ -384,6 +384,10 @@ def check(context, action, target, plugin=None, might_not_exist=False, :return: Returns True if access is permitted else False. """ + # If we already know the context has admin rights do not perform an + # additional check and authorize the operation + if context.is_admin: + return True if might_not_exist and not (_ENFORCER.rules and action in _ENFORCER.rules): return True match_rule, target, credentials = _prepare_check(context, @@ -417,6 +421,10 @@ def enforce(context, action, target, plugin=None, pluralized=None): :raises neutron.openstack.common.policy.PolicyNotAuthorized: if verification fails. """ + # If we already know the context has admin rights do not perform an + # additional check and authorize the operation + if context.is_admin: + return True rule, target, credentials = _prepare_check(context, action, target, @@ -459,25 +467,3 @@ def _extract_roles(rule, roles): elif hasattr(rule, 'rules'): for rule in rule.rules: _extract_roles(rule, roles) - - -def get_admin_roles(): - """Return a list of roles which are granted admin rights according - to policy settings. - """ - # NOTE(salvatore-orlando): This function provides a solution for - # populating implicit contexts with the appropriate roles so that - # they correctly pass policy checks, and will become superseded - # once all explicit policy checks are removed from db logic and - # plugin modules. For backward compatibility it returns the literal - # admin if ADMIN_CTX_POLICY is not defined - init() - if not _ENFORCER.rules or ADMIN_CTX_POLICY not in _ENFORCER.rules: - return ['admin'] - try: - admin_ctx_rule = _ENFORCER.rules[ADMIN_CTX_POLICY] - except (KeyError, TypeError): - return - roles = [] - _extract_roles(admin_ctx_rule, roles) - return roles diff --git a/neutron/tests/functional/db/test_ipam.py b/neutron/tests/functional/db/test_ipam.py index 8886947ee05..3c3a9d163a4 100644 --- a/neutron/tests/functional/db/test_ipam.py +++ b/neutron/tests/functional/db/test_ipam.py @@ -37,7 +37,6 @@ def get_admin_test_context(db_url): tenant_id=None, is_admin=True, read_deleted="no", - load_admin_roles=True, overwrite=False) facade = session.EngineFacade(db_url, mysql_sql_mode='STRICT_ALL_TABLES') ctx._session = facade.get_session(autocommit=False, expire_on_commit=True) diff --git a/neutron/tests/unit/db/test_db_base_plugin_v2.py b/neutron/tests/unit/db/test_db_base_plugin_v2.py index ff566b3d383..6ef20399faf 100644 --- a/neutron/tests/unit/db/test_db_base_plugin_v2.py +++ b/neutron/tests/unit/db/test_db_base_plugin_v2.py @@ -436,12 +436,14 @@ class NeutronDbPluginV2TestCase(testlib_api.WebTestCase): def _make_subnet(self, fmt, network, gateway, cidr, allocation_pools=None, ip_version=4, enable_dhcp=True, dns_nameservers=None, host_routes=None, shared=None, - ipv6_ra_mode=None, ipv6_address_mode=None): + ipv6_ra_mode=None, ipv6_address_mode=None, + tenant_id=None, set_context=False): res = self._create_subnet(fmt, net_id=network['network']['id'], cidr=cidr, gateway_ip=gateway, - tenant_id=network['network']['tenant_id'], + tenant_id=(tenant_id or + network['network']['tenant_id']), allocation_pools=allocation_pools, ip_version=ip_version, enable_dhcp=enable_dhcp, @@ -449,7 +451,8 @@ class NeutronDbPluginV2TestCase(testlib_api.WebTestCase): host_routes=host_routes, shared=shared, ipv6_ra_mode=ipv6_ra_mode, - ipv6_address_mode=ipv6_address_mode) + ipv6_address_mode=ipv6_address_mode, + set_context=set_context) # Things can go wrong - raise HTTP exc with res code only # so it can be caught by unit tests if res.status_int >= webob.exc.HTTPClientError.code: @@ -583,7 +586,9 @@ class NeutronDbPluginV2TestCase(testlib_api.WebTestCase): host_routes=None, shared=None, ipv6_ra_mode=None, - ipv6_address_mode=None): + ipv6_address_mode=None, + tenant_id=None, + set_context=False): with optional_ctx(network, self.network) as network_to_use: subnet = self._make_subnet(fmt or self.fmt, network_to_use, @@ -596,7 +601,9 @@ class NeutronDbPluginV2TestCase(testlib_api.WebTestCase): host_routes, shared=shared, ipv6_ra_mode=ipv6_ra_mode, - ipv6_address_mode=ipv6_address_mode) + ipv6_address_mode=ipv6_address_mode, + tenant_id=tenant_id, + set_context=set_context) yield subnet @contextlib.contextmanager @@ -3664,7 +3671,7 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): def _test_validate_subnet_ipv6_modes(self, cur_subnet=None, expect_success=True, **modes): plugin = manager.NeutronManager.get_plugin() - ctx = context.get_admin_context(load_admin_roles=False) + ctx = context.get_admin_context() new_subnet = {'ip_version': 6, 'cidr': 'fe80::/64', 'enable_dhcp': True, @@ -4579,8 +4586,7 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): plugin = manager.NeutronManager.get_plugin() e = self.assertRaises(exception, plugin._validate_subnet, - context.get_admin_context( - load_admin_roles=False), + context.get_admin_context(), subnet) self.assertThat( str(e), diff --git a/neutron/tests/unit/extensions/test_l3.py b/neutron/tests/unit/extensions/test_l3.py index 2392adc03bb..7d340cfc3eb 100644 --- a/neutron/tests/unit/extensions/test_l3.py +++ b/neutron/tests/unit/extensions/test_l3.py @@ -1120,34 +1120,28 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): expected_code=error_code) def test_router_add_interface_subnet_with_bad_tenant_returns_404(self): - with mock.patch('neutron.context.Context.to_dict') as tdict: - tenant_id = _uuid() - admin_context = {'roles': ['admin']} - tenant_context = {'tenant_id': 'bad_tenant', - 'roles': []} - tdict.return_value = admin_context - with self.router(tenant_id=tenant_id) as r: - with self.network(tenant_id=tenant_id) as n: - with self.subnet(network=n) as s: - tdict.return_value = tenant_context - err_code = exc.HTTPNotFound.code - self._router_interface_action('add', - r['router']['id'], - s['subnet']['id'], - None, - err_code) - tdict.return_value = admin_context - body = self._router_interface_action('add', - r['router']['id'], - s['subnet']['id'], - None) - self.assertIn('port_id', body) - tdict.return_value = tenant_context - self._router_interface_action('remove', - r['router']['id'], - s['subnet']['id'], - None, - err_code) + tenant_id = _uuid() + with self.router(tenant_id=tenant_id, set_context=True) as r: + with self.network(tenant_id=tenant_id, set_context=True) as n: + with self.subnet(network=n, set_context=True) as s: + err_code = exc.HTTPNotFound.code + self._router_interface_action('add', + r['router']['id'], + s['subnet']['id'], + None, + expected_code=err_code, + tenant_id='bad_tenant') + body = self._router_interface_action('add', + r['router']['id'], + s['subnet']['id'], + None) + self.assertIn('port_id', body) + self._router_interface_action('remove', + r['router']['id'], + s['subnet']['id'], + None, + expected_code=err_code, + tenant_id='bad_tenant') def test_router_add_interface_subnet_with_port_from_other_tenant(self): tenant_id = _uuid() @@ -1270,33 +1264,33 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): HTTPBadRequest.code) def test_router_add_interface_port_bad_tenant_returns_404(self): - with mock.patch('neutron.context.Context.to_dict') as tdict: - admin_context = {'roles': ['admin']} - tenant_context = {'tenant_id': 'bad_tenant', - 'roles': []} - tdict.return_value = admin_context - with self.router() as r: - with self.port() as p: - tdict.return_value = tenant_context - err_code = exc.HTTPNotFound.code - self._router_interface_action('add', - r['router']['id'], - None, - p['port']['id'], - err_code) - tdict.return_value = admin_context - self._router_interface_action('add', - r['router']['id'], - None, - p['port']['id']) + tenant_id = _uuid() + with self.router(tenant_id=tenant_id, set_context=True) as r: + with self.network(tenant_id=tenant_id, set_context=True) as n: + with self.subnet(tenant_id=tenant_id, network=n, + set_context=True) as s: + with self.port(tenant_id=tenant_id, subnet=s, + set_context=True) as p: + err_code = exc.HTTPNotFound.code + self._router_interface_action('add', + r['router']['id'], + None, + p['port']['id'], + expected_code=err_code, + tenant_id='bad_tenant') + self._router_interface_action('add', + r['router']['id'], + None, + p['port']['id'], + tenant_id=tenant_id) - tdict.return_value = tenant_context - # clean-up - self._router_interface_action('remove', - r['router']['id'], - None, - p['port']['id'], - err_code) + # clean-up should fail as well + self._router_interface_action('remove', + r['router']['id'], + None, + p['port']['id'], + expected_code=err_code, + tenant_id='bad_tenant') def test_router_add_interface_dup_subnet1_returns_400(self): with self.router() as r: diff --git a/neutron/tests/unit/extensions/test_quotasv2.py b/neutron/tests/unit/extensions/test_quotasv2.py index 7c1b51866a9..6f8fd6b0a2a 100644 --- a/neutron/tests/unit/extensions/test_quotasv2.py +++ b/neutron/tests/unit/extensions/test_quotasv2.py @@ -322,7 +322,7 @@ class QuotaExtensionDbTestCase(QuotaExtensionTestCase): tenant_id = 'tenant_id1' self.assertRaises(exceptions.QuotaResourceUnknown, quota.QUOTAS.limit_check, - context.get_admin_context(load_admin_roles=False), + context.get_admin_context(), tenant_id, foobar=1) diff --git a/neutron/tests/unit/plugins/opencontrail/test_contrail_plugin.py b/neutron/tests/unit/plugins/opencontrail/test_contrail_plugin.py index e7fa6694694..17df9fcab35 100644 --- a/neutron/tests/unit/plugins/opencontrail/test_contrail_plugin.py +++ b/neutron/tests/unit/plugins/opencontrail/test_contrail_plugin.py @@ -231,8 +231,7 @@ class TestContrailSubnetsV2(test_plugin.TestSubnetsV2, 'nexthop': '1.2.3.4'}]} error = self.assertRaises(exception, FAKE_SERVER._validate_subnet, - neutron_context.get_admin_context( - load_admin_roles=False), + neutron_context.get_admin_context(), subnet) self.assertThat( str(error), diff --git a/neutron/tests/unit/test_context.py b/neutron/tests/unit/test_context.py index a53cd111cf7..1ecf338a22f 100644 --- a/neutron/tests/unit/test_context.py +++ b/neutron/tests/unit/test_context.py @@ -105,14 +105,6 @@ class TestNeutronContext(base.BaseTestCase): self.assertIsNone(ctx_dict['auth_token']) self.assertFalse(hasattr(ctx, 'session')) - def test_neutron_context_with_load_roles_true(self): - ctx = context.get_admin_context() - self.assertIn('admin', ctx.roles) - - def test_neutron_context_with_load_roles_false(self): - ctx = context.get_admin_context(load_admin_roles=False) - self.assertFalse(ctx.roles) - def test_neutron_context_elevated_retains_request_id(self): ctx = context.Context('user_id', 'tenant_id') self.assertFalse(ctx.is_admin) diff --git a/neutron/tests/unit/test_policy.py b/neutron/tests/unit/test_policy.py index 4d732d32588..cab94f24b36 100644 --- a/neutron/tests/unit/test_policy.py +++ b/neutron/tests/unit/test_policy.py @@ -359,6 +359,9 @@ class NeutronPolicyTestCase(base.BaseTestCase): def test_check_is_admin_with_admin_context_succeeds(self): admin_context = context.get_admin_context() + # explicitly set roles as this test verifies user credentials + # with the policy engine + admin_context.roles = ['admin'] self.assertTrue(policy.check_is_admin(admin_context)) def test_check_is_admin_with_user_context_fails(self): @@ -559,44 +562,6 @@ class NeutronPolicyTestCase(base.BaseTestCase): def test_enforce_tenant_id_check_invalid_parent_resource_raises(self): self._test_enforce_tenant_id_raises('tenant_id:%(foobaz_tenant_id)s') - def test_get_roles_context_is_admin_rule_missing(self): - rules = dict((k, common_policy.parse_rule(v)) for k, v in { - "some_other_rule": "role:admin", - }.items()) - policy.set_rules(common_policy.Rules(rules)) - # 'admin' role is expected for bw compatibility - self.assertEqual(['admin'], policy.get_admin_roles()) - - def test_get_roles_with_role_check(self): - rules = dict((k, common_policy.parse_rule(v)) for k, v in { - policy.ADMIN_CTX_POLICY: "role:admin", - }.items()) - policy.set_rules(common_policy.Rules(rules)) - self.assertEqual(['admin'], policy.get_admin_roles()) - - def test_get_roles_with_rule_check(self): - rules = dict((k, common_policy.parse_rule(v)) for k, v in { - policy.ADMIN_CTX_POLICY: "rule:some_other_rule", - "some_other_rule": "role:admin", - }.items()) - policy.set_rules(common_policy.Rules(rules)) - self.assertEqual(['admin'], policy.get_admin_roles()) - - def test_get_roles_with_or_check(self): - self.rules = dict((k, common_policy.parse_rule(v)) for k, v in { - policy.ADMIN_CTX_POLICY: "rule:rule1 or rule:rule2", - "rule1": "role:admin_1", - "rule2": "role:admin_2" - }.items()) - self.assertEqual(['admin_1', 'admin_2'], - policy.get_admin_roles()) - - def test_get_roles_with_other_rules(self): - self.rules = dict((k, common_policy.parse_rule(v)) for k, v in { - policy.ADMIN_CTX_POLICY: "role:xxx or other:value", - }.items()) - self.assertEqual(['xxx'], policy.get_admin_roles()) - def _test_set_rules_with_deprecated_policy(self, input_rules, expected_rules): policy.set_rules(input_rules.copy()) diff --git a/requirements.txt b/requirements.txt index 47fa0316d1f..101d0e31dd2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,7 @@ pbr>=0.11,<2.0 Paste PasteDeploy>=1.5.0 Routes>=1.12.3,!=2.0 +debtcollector>=0.3.0 # Apache-2.0 eventlet>=0.17.3 greenlet>=0.3.2 httplib2>=0.7.5 From 6b13cc5275df53c765c450d570521c425c3345d9 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Tue, 9 Jun 2015 10:57:29 +0200 Subject: [PATCH 036/161] Enable all deprecation warnings for test runs We would like to catch all deprecation warnings during test runs to be notified in advance about potential problems with next library releases we depend on. Change-Id: I876d8c4de88618b01898ab537a44920789d8178e --- neutron/tests/base.py | 4 ++++ neutron/tests/tools.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/neutron/tests/base.py b/neutron/tests/base.py index 7b18901044b..a9cf779ee8b 100644 --- a/neutron/tests/base.py +++ b/neutron/tests/base.py @@ -45,6 +45,7 @@ from neutron import manager from neutron import policy from neutron.tests import fake_notifier from neutron.tests import post_mortem_debug +from neutron.tests import tools CONF = cfg.CONF @@ -126,6 +127,9 @@ class DietTestCase(testtools.TestCase): self.addOnException(post_mortem_debug.get_exception_handler( debugger)) + # Make sure we see all relevant deprecation warnings when running tests + self.useFixture(tools.WarningsFixture()) + if bool_from_env('OS_DEBUG'): _level = std_logging.DEBUG else: diff --git a/neutron/tests/tools.py b/neutron/tests/tools.py index fd53793fee6..40c308d5996 100644 --- a/neutron/tests/tools.py +++ b/neutron/tests/tools.py @@ -13,6 +13,8 @@ # License for the specific language governing permissions and limitations # under the License. +import warnings + import fixtures import six @@ -49,6 +51,21 @@ class AttributeMapMemento(fixtures.Fixture): attributes.RESOURCE_ATTRIBUTE_MAP = self.contents_backup +class WarningsFixture(fixtures.Fixture): + """Filters out warnings during test runs.""" + + warning_types = ( + DeprecationWarning, PendingDeprecationWarning, ImportWarning + ) + + def setUp(self): + super(WarningsFixture, self).setUp() + for wtype in self.warning_types: + warnings.filterwarnings( + "always", category=wtype, module='^neutron\\.') + self.addCleanup(warnings.resetwarnings) + + """setup_mock_calls and verify_mock_calls are convenient methods to setup a sequence of mock calls. From 826428dc8aeef124c2251624ae34fdc003e69ca4 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 9 Jun 2015 19:00:40 +0900 Subject: [PATCH 037/161] Add a comment on _check_update_has_security_groups Despite of its name, _check_update_has_security_groups can handle create requests as well. There are plugins actually using it for create. eg. ml2, vmware Change-Id: I3c26ad0ac00b12ce24096bfc27606797af2d9098 --- neutron/db/securitygroups_db.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/neutron/db/securitygroups_db.py b/neutron/db/securitygroups_db.py index 1fec3f2239b..3caca9bbc91 100644 --- a/neutron/db/securitygroups_db.py +++ b/neutron/db/securitygroups_db.py @@ -709,8 +709,9 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase): return False def _check_update_has_security_groups(self, port): - """Return True if port has as a security group and False if the - security_group field is is_attr_set or []. + """Return True if port has security_groups attribute set and + its not empty, or False otherwise. + This method is called both for port create and port update. """ if (ext_sg.SECURITYGROUPS in port['port'] and (attributes.is_attr_set(port['port'][ext_sg.SECURITYGROUPS]) and From d0be7bc57f573d5696108b571c731decfbde9f0b Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Tue, 9 Jun 2015 12:46:54 +0200 Subject: [PATCH 038/161] Make pep8 job succeed when /etc/neutron/neutron.conf is not installed Currently, if /etc/neutron/neutron.conf is not installed in the system, neutron-db-manage fails in oslo.config code when trying to determine the default configuration file to use. Test job should not rely on any contents inside /etc/. Instead, pass --config-file with test-only configuration explicitly into the utility. neutron.conf.test was renamed into neutron.conf since for some reason oslo.config does not support a name that does not have .conf at its filename end. Change-Id: I719829fc83a7b20a49c338aaf1dbef916dcc768c --- neutron/tests/base.py | 4 ++-- neutron/tests/etc/{neutron.conf.test => neutron.conf} | 0 neutron/tests/unit/agent/dhcp/test_agent.py | 4 ++-- neutron/tests/unit/api/test_extensions.py | 2 +- neutron/tests/unit/db/test_db_base_plugin_v2.py | 2 +- tox.ini | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename neutron/tests/etc/{neutron.conf.test => neutron.conf} (100%) diff --git a/neutron/tests/base.py b/neutron/tests/base.py index 7b18901044b..f55dbeab3b1 100644 --- a/neutron/tests/base.py +++ b/neutron/tests/base.py @@ -238,10 +238,10 @@ class BaseTestCase(DietTestCase): @staticmethod def config_parse(conf=None, args=None): """Create the default configurations.""" - # neutron.conf.test includes rpc_backend which needs to be cleaned up + # neutron.conf includes rpc_backend which needs to be cleaned up if args is None: args = [] - args += ['--config-file', etcdir('neutron.conf.test')] + args += ['--config-file', etcdir('neutron.conf')] if conf is None: config.init(args=args) else: diff --git a/neutron/tests/etc/neutron.conf.test b/neutron/tests/etc/neutron.conf similarity index 100% rename from neutron/tests/etc/neutron.conf.test rename to neutron/tests/etc/neutron.conf diff --git a/neutron/tests/unit/agent/dhcp/test_agent.py b/neutron/tests/unit/agent/dhcp/test_agent.py index 64da28398f1..a068ea01634 100644 --- a/neutron/tests/unit/agent/dhcp/test_agent.py +++ b/neutron/tests/unit/agent/dhcp/test_agent.py @@ -236,7 +236,7 @@ class TestDhcpAgent(base.BaseTestCase): with mock.patch.object(sys, 'argv') as sys_argv: sys_argv.return_value = [ 'dhcp', '--config-file', - base.etcdir('neutron.conf.test')] + base.etcdir('neutron.conf')] cfg.CONF.register_opts(dhcp_config.DHCP_AGENT_OPTS) config.register_interface_driver_opts_helper(cfg.CONF) config.register_agent_state_opts_helper(cfg.CONF) @@ -260,7 +260,7 @@ class TestDhcpAgent(base.BaseTestCase): with mock.patch.object(sys, 'argv') as sys_argv: with mock.patch(launcher_str) as launcher: sys_argv.return_value = ['dhcp', '--config-file', - base.etcdir('neutron.conf.test')] + base.etcdir('neutron.conf')] entry.main() launcher.assert_has_calls( [mock.call(), mock.call().launch_service(mock.ANY), diff --git a/neutron/tests/unit/api/test_extensions.py b/neutron/tests/unit/api/test_extensions.py index aabece09d4c..9a32e865f94 100644 --- a/neutron/tests/unit/api/test_extensions.py +++ b/neutron/tests/unit/api/test_extensions.py @@ -726,7 +726,7 @@ class ExtensionExtendedAttributeTestCase(base.BaseTestCase): "ExtensionExtendedAttributeTestPlugin" ) - # point config file to: neutron/tests/etc/neutron.conf.test + # point config file to: neutron/tests/etc/neutron.conf self.config_parse() self.setup_coreplugin(plugin) diff --git a/neutron/tests/unit/db/test_db_base_plugin_v2.py b/neutron/tests/unit/db/test_db_base_plugin_v2.py index b215ab3de39..215cca0de1d 100644 --- a/neutron/tests/unit/db/test_db_base_plugin_v2.py +++ b/neutron/tests/unit/db/test_db_base_plugin_v2.py @@ -164,7 +164,7 @@ class NeutronDbPluginV2TestCase(testlib_api.WebTestCase): def setup_config(self): # Create the default configurations - args = ['--config-file', base.etcdir('neutron.conf.test')] + args = ['--config-file', base.etcdir('neutron.conf')] # If test_config specifies some config-file, use it, as well for config_file in test_lib.test_config.get('config_files', []): args.extend(['--config-file', config_file]) diff --git a/tox.ini b/tox.ini index 636a2a37739..a33e89a23b2 100644 --- a/tox.ini +++ b/tox.ini @@ -72,7 +72,7 @@ commands= # Checks for coding and style guidelines flake8 sh ./tools/coding-checks.sh --pylint '{posargs}' - neutron-db-manage check_migration + neutron-db-manage --config-file neutron/tests/etc/neutron.conf check_migration whitelist_externals = sh bash From ea35b299f06050608f3e7bb6fbc880006ed31024 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Wed, 3 Jun 2015 18:25:14 -0700 Subject: [PATCH 039/161] Allow update_port_status to take network param Allow the update_port_status function to take a network as an optional parameter to skip calling get_network again if the caller has already done so. Closes-Bug: #1463656 Change-Id: I994f3abdb1b0ad3b2766f409b206ad4a8b2309b6 --- neutron/plugins/ml2/plugin.py | 13 ++++++++----- neutron/plugins/ml2/rpc.py | 3 ++- neutron/tests/unit/plugins/ml2/test_plugin.py | 10 ++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index df831fdc81f..ba8054b9989 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -1375,10 +1375,13 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, return self._bind_port_if_needed(port_context) - def update_port_status(self, context, port_id, status, host=None): + def update_port_status(self, context, port_id, status, host=None, + network=None): """ Returns port_id (non-truncated uuid) if the port exists. Otherwise returns None. + network can be passed in to avoid another get_network call if + one was already performed by the caller. """ updated = False session = context.session @@ -1398,8 +1401,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, original_port = self._make_port_dict(port) port.status = status updated_port = self._make_port_dict(port) - network = self.get_network(context, - original_port['network_id']) + network = network or self.get_network( + context, original_port['network_id']) levels = db.get_binding_levels(session, port.id, port.port_binding.host) mech_context = driver_context.PortContext( @@ -1426,8 +1429,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, port_id) return original_port = self._make_port_dict(port) - network = self.get_network(context, - original_port['network_id']) + network = network or self.get_network( + context, original_port['network_id']) port.status = db.generate_dvr_port_status(session, port['id']) updated_port = self._make_port_dict(port) levels = db.get_binding_levels(session, port_id, host) diff --git a/neutron/plugins/ml2/rpc.py b/neutron/plugins/ml2/rpc.py index b9d478cd51a..eeccde6a0e9 100644 --- a/neutron/plugins/ml2/rpc.py +++ b/neutron/plugins/ml2/rpc.py @@ -103,7 +103,8 @@ class RpcCallbacks(type_tunnel.TunnelRpcCallbackMixin): plugin.update_port_status(rpc_context, port_id, new_status, - host) + host, + port_context.network.current) entry = {'device': device, 'network_id': port['network_id'], diff --git a/neutron/tests/unit/plugins/ml2/test_plugin.py b/neutron/tests/unit/plugins/ml2/test_plugin.py index 50dfd319641..aa7de37213a 100644 --- a/neutron/tests/unit/plugins/ml2/test_plugin.py +++ b/neutron/tests/unit/plugins/ml2/test_plugin.py @@ -412,6 +412,16 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase): plugin.update_port(ctx, port['port']['id'], port) self.assertTrue(sg_member_update.called) + def test_update_port_status_with_network(self): + ctx = context.get_admin_context() + plugin = manager.NeutronManager.get_plugin() + with self.port() as port: + net = plugin.get_network(ctx, port['port']['network_id']) + with mock.patch.object(plugin, 'get_network') as get_net: + plugin.update_port_status(ctx, port['port']['id'], 'UP', + network=net) + self.assertFalse(get_net.called) + def test_update_port_mac(self): self.check_update_port_mac( host_arg={portbindings.HOST_ID: HOST}, From 6d0d72973152bb45587437c80d4ffe0fe7bba761 Mon Sep 17 00:00:00 2001 From: Elena Ezhova Date: Tue, 7 Apr 2015 14:58:13 +0300 Subject: [PATCH 040/161] Handle SIGHUP: neutron-server (multiprocess) and metadata agent All launchers implemented in common.service require each service to implement reset method because it is called in case a process receives a SIGHUP. This change adds the reset method to neutron.service.RpcWorker and neutron.wsgi.WorkerService which are used to wrap rpc and api workers correspondingly. Now neutron-server running in multiprocess mode (api_workers > 0 and rpc_workers > 0) and metadata agent don't die on receiving SIGHUP and support reloading policy_path and logging options in config. Note that reset is called only in case a service is running in daemon mode. Other changes made in the scope of this patch that need to be mentioned: * Don't empty self._servers list in RpcWorker's stop method When a service is restarted all services are gracefully shutdowned, resetted and started again (see openstack.common.service code). As graceful shutdown implies calling service.stop() and then service.wait() we don't want to clean self._servers list because it would be impossible to wait for them to stop processing requests and cleaning up their resources. Otherwise, this would lead to problems with rpc after starting the rpc server again. * Create a duplicate socket each time WorkerService starts When api worker is stopped it kills the eventlet wsgi server which internally closes the wsgi server socket object. This server socket object becomes not usable which leads to "Bad file descriptor" errors on service restart. Added functional and unit tests. DocImpact Partial-Bug: #1276694 Change-Id: I75b00946b7cae891c6eb192e853118e7d49e4a24 --- neutron/common/config.py | 9 + neutron/service.py | 9 +- neutron/tests/functional/requirements.txt | 1 + neutron/tests/functional/test_server.py | 247 ++++++++++++++++++++++ neutron/tests/unit/test_service.py | 33 +++ neutron/tests/unit/test_wsgi.py | 14 +- neutron/wsgi.py | 16 +- 7 files changed, 321 insertions(+), 8 deletions(-) create mode 100644 neutron/tests/functional/test_server.py create mode 100644 neutron/tests/unit/test_service.py diff --git a/neutron/common/config.py b/neutron/common/config.py index 93f57159f3e..c8e4eebf52c 100644 --- a/neutron/common/config.py +++ b/neutron/common/config.py @@ -31,6 +31,7 @@ from paste import deploy from neutron.api.v2 import attributes from neutron.common import utils from neutron.i18n import _LI +from neutron import policy from neutron import version @@ -210,6 +211,14 @@ def setup_logging(): LOG.debug("command line: %s", " ".join(sys.argv)) +def reset_service(): + # Reset worker in case SIGHUP is called. + # Note that this is called only in case a service is running in + # daemon mode. + setup_logging() + policy.refresh() + + def load_paste_app(app_name): """Builds and returns a WSGI app from a paste config file. diff --git a/neutron/service.py b/neutron/service.py index 708882b7312..e27dd5cdc2f 100644 --- a/neutron/service.py +++ b/neutron/service.py @@ -32,7 +32,6 @@ from neutron.i18n import _LE, _LI from neutron import manager from neutron.openstack.common import loopingcall from neutron.openstack.common import service as common_service -from neutron import policy from neutron import wsgi @@ -128,7 +127,10 @@ class RpcWorker(object): for server in self._servers: if isinstance(server, rpc_server.MessageHandlingServer): server.stop() - self._servers = [] + + @staticmethod + def reset(): + config.reset_service() def serve_rpc(): @@ -288,8 +290,7 @@ class Service(n_rpc.Service): LOG.exception(_LE("Exception occurs when waiting for timer")) def reset(self): - config.setup_logging() - policy.refresh() + config.reset_service() def periodic_tasks(self, raise_on_error=False): """Tasks to be run at a periodic interval.""" diff --git a/neutron/tests/functional/requirements.txt b/neutron/tests/functional/requirements.txt index 0c5f2215b44..f98f475bc61 100644 --- a/neutron/tests/functional/requirements.txt +++ b/neutron/tests/functional/requirements.txt @@ -4,5 +4,6 @@ # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. +psutil>=1.1.1,<2.0.0 psycopg2 MySQL-python diff --git a/neutron/tests/functional/test_server.py b/neutron/tests/functional/test_server.py new file mode 100644 index 00000000000..8f81f684956 --- /dev/null +++ b/neutron/tests/functional/test_server.py @@ -0,0 +1,247 @@ +# Copyright 2015 Mirantis Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import httplib2 +import mock +import os +import signal +import socket +import time +import traceback + +from oslo_config import cfg +import psutil + +from neutron.agent.linux import utils +from neutron import service +from neutron.tests import base +from neutron import wsgi + + +CONF = cfg.CONF + +# This message will be written to temporary file each time +# reset method is called. +FAKE_RESET_MSG = "reset".encode("utf-8") + +TARGET_PLUGIN = 'neutron.plugins.ml2.plugin.Ml2Plugin' + + +class TestNeutronServer(base.BaseTestCase): + def setUp(self): + super(TestNeutronServer, self).setUp() + self.service_pid = None + self.workers = None + self.temp_file = self.get_temp_file_path("test_server.tmp") + self.health_checker = None + self.pipein, self.pipeout = os.pipe() + self.addCleanup(self._destroy_workers) + + def _destroy_workers(self): + if self.service_pid: + # Make sure all processes are stopped + os.kill(self.service_pid, signal.SIGKILL) + + def _start_server(self, callback, workers): + """Run a given service. + + :param callback: callback that will start the required service + :param workers: number of service workers + :returns: list of spawned workers' pids + """ + + self.workers = workers + + # Fork a new process in which server will be started + pid = os.fork() + if pid == 0: + status = 0 + try: + callback(workers) + except SystemExit as exc: + status = exc.code + except BaseException: + traceback.print_exc() + status = 2 + + # Really exit + os._exit(status) + + self.service_pid = pid + + if self.workers > 0: + # Wait at most 10 seconds to spawn workers + condition = lambda: self.workers == len(self._get_workers()) + + utils.wait_until_true( + condition, timeout=10, sleep=0.1, + exception=RuntimeError( + "Failed to start %d workers." % self.workers)) + + workers = self._get_workers() + self.assertEqual(len(workers), self.workers) + return workers + + # Wait for a service to start. + utils.wait_until_true(self.health_checker, timeout=10, sleep=0.1, + exception=RuntimeError( + "Failed to start service.")) + + return [self.service_pid] + + def _get_workers(self): + """Get the list of processes in which WSGI server is running.""" + + if self.workers > 0: + return [proc.pid for proc in psutil.process_iter() + if proc.ppid == self.service_pid] + else: + return [proc.pid for proc in psutil.process_iter() + if proc.pid == self.service_pid] + + def _fake_reset(self): + """Writes FAKE_RESET_MSG to temporary file on each call.""" + + with open(self.temp_file, 'a') as f: + f.write(FAKE_RESET_MSG) + + def _test_restart_service_on_sighup(self, service, workers=0): + """Test that a service correctly restarts on receiving SIGHUP. + + 1. Start a service with a given number of workers. + 2. Send SIGHUP to the service. + 3. Wait for workers (if any) to restart. + 4. Assert that the pids of the workers didn't change after restart. + """ + + start_workers = self._start_server(callback=service, workers=workers) + + os.kill(self.service_pid, signal.SIGHUP) + + # Wait for temp file to be created and its size become equal + # to size of FAKE_RESET_MSG repeated (workers + 1) times. + expected_size = len(FAKE_RESET_MSG) * (workers + 1) + condition = lambda: (os.path.isfile(self.temp_file) + and os.stat(self.temp_file).st_size == + expected_size) + + utils.wait_until_true( + condition, timeout=5, sleep=0.1, + exception=RuntimeError( + "Timed out waiting for file %(filename)s to be created and " + "its size become equal to %(size)s." % + {'filename': self.temp_file, + 'size': expected_size})) + + # Verify that reset has been called for parent process in which + # a service was started and for each worker by checking that + # FAKE_RESET_MSG has been written to temp file workers + 1 times. + with open(self.temp_file, 'r') as f: + res = f.readline() + self.assertEqual(FAKE_RESET_MSG * (workers + 1), res) + + # Make sure worker pids don't change + end_workers = self._get_workers() + self.assertEqual(start_workers, end_workers) + + +class TestWsgiServer(TestNeutronServer): + """Tests for neutron.wsgi.Server.""" + + def setUp(self): + super(TestWsgiServer, self).setUp() + self.health_checker = self._check_active + self.port = None + + @staticmethod + def application(environ, start_response): + """A primitive test application.""" + + response_body = 'Response' + status = '200 OK' + response_headers = [('Content-Type', 'text/plain'), + ('Content-Length', str(len(response_body)))] + start_response(status, response_headers) + return [response_body] + + def _check_active(self): + """Check a wsgi service is active by making a GET request.""" + port = int(os.read(self.pipein, 5)) + conn = httplib2.HTTPConnectionWithTimeout("localhost", port) + try: + conn.request("GET", "/") + resp = conn.getresponse() + return resp.status == 200 + except socket.error: + return False + + def _run_wsgi(self, workers=0): + """Start WSGI server with a test application.""" + + # Mock reset method to check that it is being called + # on receiving SIGHUP. + with mock.patch("neutron.wsgi.WorkerService.reset") as reset_method: + reset_method.side_effect = self._fake_reset + + server = wsgi.Server("Test") + server.start(self.application, 0, "0.0.0.0", + workers=workers) + + # Memorize a port that was chosen for the service + self.port = server.port + os.write(self.pipeout, str(self.port)) + + server.wait() + + def test_restart_wsgi_on_sighup_multiple_workers(self): + self._test_restart_service_on_sighup(service=self._run_wsgi, + workers=2) + + +class TestRPCServer(TestNeutronServer): + """Tests for neutron RPC server.""" + + def setUp(self): + super(TestRPCServer, self).setUp() + self.setup_coreplugin(TARGET_PLUGIN) + self._plugin_patcher = mock.patch(TARGET_PLUGIN, autospec=True) + self.plugin = self._plugin_patcher.start() + self.plugin.return_value.rpc_workers_supported = True + self.health_checker = self._check_active + + def _check_active(self): + time.sleep(5) + return True + + def _serve_rpc(self, workers=0): + """Start RPC server with a given number of workers.""" + + # Mock reset method to check that it is being called + # on receiving SIGHUP. + with mock.patch("neutron.service.RpcWorker.reset") as reset_method: + with mock.patch( + "neutron.manager.NeutronManager.get_plugin" + ) as get_plugin: + reset_method.side_effect = self._fake_reset + get_plugin.return_value = self.plugin + + CONF.set_override("rpc_workers", workers) + + launcher = service.serve_rpc() + launcher.wait() + + def test_restart_rpc_on_sighup_multiple_workers(self): + self._test_restart_service_on_sighup(service=self._serve_rpc, + workers=2) diff --git a/neutron/tests/unit/test_service.py b/neutron/tests/unit/test_service.py new file mode 100644 index 00000000000..582449f5a36 --- /dev/null +++ b/neutron/tests/unit/test_service.py @@ -0,0 +1,33 @@ +# Copyright 2015 Mirantis Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock + +from neutron import service +from neutron.tests import base + + +class TestRpcWorker(base.BaseTestCase): + + @mock.patch("neutron.policy.refresh") + @mock.patch("neutron.common.config.setup_logging") + def test_reset(self, setup_logging_mock, refresh_mock): + _plugin = mock.Mock() + + rpc_worker = service.RpcWorker(_plugin) + rpc_worker.reset() + + setup_logging_mock.assert_called_once_with() + refresh_mock.assert_called_once_with() diff --git a/neutron/tests/unit/test_wsgi.py b/neutron/tests/unit/test_wsgi.py index 584a66610ee..3331f450f80 100644 --- a/neutron/tests/unit/test_wsgi.py +++ b/neutron/tests/unit/test_wsgi.py @@ -65,6 +65,18 @@ class TestWorkerService(base.BaseTestCase): workerservice.start() self.assertFalse(apimock.called) + @mock.patch("neutron.policy.refresh") + @mock.patch("neutron.common.config.setup_logging") + def test_reset(self, setup_logging_mock, refresh_mock): + _service = mock.Mock() + _app = mock.Mock() + + worker_service = wsgi.WorkerService(_service, _app) + worker_service.reset() + + setup_logging_mock.assert_called_once_with() + refresh_mock.assert_called_once_with() + class TestWSGIServer(base.BaseTestCase): """WSGI server tests.""" @@ -132,7 +144,7 @@ class TestWSGIServer(base.BaseTestCase): mock.call( server._run, None, - mock_listen.return_value) + mock_listen.return_value.dup.return_value) ]) def test_app(self): diff --git a/neutron/wsgi.py b/neutron/wsgi.py index 437e57b0984..0aecc8069df 100644 --- a/neutron/wsgi.py +++ b/neutron/wsgi.py @@ -37,6 +37,7 @@ import six import webob.dec import webob.exc +from neutron.common import config from neutron.common import exceptions as exception from neutron import context from neutron.db import api @@ -99,12 +100,17 @@ class WorkerService(object): self._server = None def start(self): + # When api worker is stopped it kills the eventlet wsgi server which + # internally closes the wsgi server socket object. This server socket + # object becomes not usable which leads to "Bad file descriptor" + # errors on service restart. + # Duplicate a socket object to keep a file descriptor usable. + dup_sock = self._service._socket.dup() if CONF.use_ssl: - self._service._socket = self._service.wrap_ssl( - self._service._socket) + dup_sock = self._service.wrap_ssl(dup_sock) self._server = self._service.pool.spawn(self._service._run, self._application, - self._service._socket) + dup_sock) def wait(self): if isinstance(self._server, eventlet.greenthread.GreenThread): @@ -115,6 +121,10 @@ class WorkerService(object): self._server.kill() self._server = None + @staticmethod + def reset(): + config.reset_service() + class Server(object): """Server class to manage multiple WSGI sockets and applications.""" From 753196480d9cca10c5b91dfa8221e89f658fa110 Mon Sep 17 00:00:00 2001 From: Jakub Libosvar Date: Wed, 27 May 2015 13:54:06 +0000 Subject: [PATCH 041/161] Break Pinger class to functions As the class served only for storing parameters that can be passed as actual function parameters, there is no reason for class. Change-Id: I553b4d6daeb78d495cda09894582a3d885b5d1b5 --- neutron/tests/common/machine_fixtures.py | 35 ++----------------- neutron/tests/common/net_helpers.py | 19 ++++++++++ .../tests/functional/agent/test_ovs_flows.py | 13 +++---- 3 files changed, 26 insertions(+), 41 deletions(-) diff --git a/neutron/tests/common/machine_fixtures.py b/neutron/tests/common/machine_fixtures.py index bc097d31fd8..da548beb62a 100644 --- a/neutron/tests/common/machine_fixtures.py +++ b/neutron/tests/common/machine_fixtures.py @@ -12,39 +12,10 @@ # License for the specific language governing permissions and limitations # under the License. # - import fixtures -import netaddr from neutron.agent.linux import ip_lib from neutron.tests.common import net_helpers -from neutron.tests import tools - - -class Pinger(object): - def __init__(self, namespace, timeout=1, max_attempts=1): - self.namespace = namespace - self._timeout = timeout - self._max_attempts = max_attempts - - def _ping_destination(self, dest_address): - ns_ip_wrapper = ip_lib.IPWrapper(self.namespace) - ipversion = netaddr.IPAddress(dest_address).version - ping_command = 'ping' if ipversion == 4 else 'ping6' - ns_ip_wrapper.netns.execute([ping_command, '-c', self._max_attempts, - '-W', self._timeout, dest_address]) - - def assert_ping(self, dst_ip): - self._ping_destination(dst_ip) - - def assert_no_ping(self, dst_ip): - try: - self._ping_destination(dst_ip) - tools.fail("destination ip %(dst_ip)s is replying to ping " - "from namespace %(ns)s, but it shouldn't" % - {'ns': self.namespace, 'dst_ip': dst_ip}) - except RuntimeError: - pass class FakeMachine(fixtures.Fixture): @@ -89,12 +60,10 @@ class FakeMachine(fixtures.Fixture): return ns_ip_wrapper.netns.execute(*args, **kwargs) def assert_ping(self, dst_ip): - pinger = Pinger(self.namespace) - pinger.assert_ping(dst_ip) + net_helpers.assert_ping(self.namespace, dst_ip) def assert_no_ping(self, dst_ip): - pinger = Pinger(self.namespace) - pinger.assert_no_ping(dst_ip) + net_helpers.assert_no_ping(self.namespace, dst_ip) class PeerMachines(fixtures.Fixture): diff --git a/neutron/tests/common/net_helpers.py b/neutron/tests/common/net_helpers.py index 5d665f7f9ce..8884c66966c 100644 --- a/neutron/tests/common/net_helpers.py +++ b/neutron/tests/common/net_helpers.py @@ -62,6 +62,25 @@ def set_namespace_gateway(port_dev, gateway_ip): port_dev.route.add_gateway(gateway_ip) +def assert_ping(src_namespace, dst_ip, timeout=1, count=1): + ipversion = netaddr.IPAddress(dst_ip).version + ping_command = 'ping' if ipversion == 4 else 'ping6' + ns_ip_wrapper = ip_lib.IPWrapper(src_namespace) + ns_ip_wrapper.netns.execute([ping_command, '-c', count, '-W', timeout, + dst_ip]) + + +def assert_no_ping(src_namespace, dst_ip, timeout=1, count=1): + try: + assert_ping(src_namespace, dst_ip, timeout, count) + except RuntimeError: + pass + else: + tools.fail("destination ip %(destination)s is replying to ping from " + "namespace %(ns)s, but it shouldn't" % + {'ns': src_namespace, 'destination': dst_ip}) + + class NamespaceFixture(fixtures.Fixture): """Create a namespace. diff --git a/neutron/tests/functional/agent/test_ovs_flows.py b/neutron/tests/functional/agent/test_ovs_flows.py index bf9936d633a..90107d85552 100644 --- a/neutron/tests/functional/agent/test_ovs_flows.py +++ b/neutron/tests/functional/agent/test_ovs_flows.py @@ -23,7 +23,6 @@ from neutron.agent.linux import ip_lib from neutron.cmd.sanity import checks from neutron.plugins.openvswitch.agent import ovs_neutron_agent as ovsagt from neutron.plugins.openvswitch.common import constants -from neutron.tests.common import machine_fixtures from neutron.tests.common import net_helpers from neutron.tests.functional.agent import test_ovs_lib from neutron.tests.functional import base @@ -98,8 +97,6 @@ class _ARPSpoofTestCase(object): net_helpers.NamespaceFixture()).name self.dst_namespace = self.useFixture( net_helpers.NamespaceFixture()).name - self.pinger = machine_fixtures.Pinger( - self.src_namespace, max_attempts=2) self.src_p = self.useFixture( net_helpers.OVSPortFixture(self.br, self.src_namespace)).port self.dst_p = self.useFixture( @@ -112,7 +109,7 @@ class _ARPSpoofTestCase(object): self._setup_arp_spoof_for_port(self.dst_p.name, [self.dst_addr]) self.src_p.addr.add('%s/24' % self.src_addr) self.dst_p.addr.add('%s/24' % self.dst_addr) - self.pinger.assert_ping(self.dst_addr) + net_helpers.assert_ping(self.src_namespace, self.dst_addr, count=2) def test_arp_spoof_doesnt_block_ipv6(self): self.src_addr = '2000::1' @@ -124,7 +121,7 @@ class _ARPSpoofTestCase(object): # make sure the IPv6 addresses are ready before pinging self.src_p.addr.wait_until_address_ready(self.src_addr) self.dst_p.addr.wait_until_address_ready(self.dst_addr) - self.pinger.assert_ping(self.dst_addr) + net_helpers.assert_ping(self.src_namespace, self.dst_addr, count=2) def test_arp_spoof_blocks_response(self): # this will prevent the destination from responding to the ARP @@ -132,7 +129,7 @@ class _ARPSpoofTestCase(object): self._setup_arp_spoof_for_port(self.dst_p.name, ['192.168.0.3']) self.src_p.addr.add('%s/24' % self.src_addr) self.dst_p.addr.add('%s/24' % self.dst_addr) - self.pinger.assert_no_ping(self.dst_addr) + net_helpers.assert_no_ping(self.src_namespace, self.dst_addr, count=2) def test_arp_spoof_blocks_request(self): # this will prevent the source from sending an ARP @@ -154,7 +151,7 @@ class _ARPSpoofTestCase(object): self.dst_addr]) self.src_p.addr.add('%s/24' % self.src_addr) self.dst_p.addr.add('%s/24' % self.dst_addr) - self.pinger.assert_ping(self.dst_addr) + net_helpers.assert_ping(self.src_namespace, self.dst_addr, count=2) def test_arp_spoof_disable_port_security(self): # block first and then disable port security to make sure old rules @@ -164,7 +161,7 @@ class _ARPSpoofTestCase(object): psec=False) self.src_p.addr.add('%s/24' % self.src_addr) self.dst_p.addr.add('%s/24' % self.dst_addr) - self.pinger.assert_ping(self.dst_addr) + net_helpers.assert_ping(self.src_namespace, self.dst_addr, count=2) def _setup_arp_spoof_for_port(self, port, addrs, psec=True): of_port_map = self.br.get_vif_port_to_ofport_map() From 53ec63c430d123cd1ed4acd3b94537e9cb380bcd Mon Sep 17 00:00:00 2001 From: Romil Gupta Date: Thu, 4 Jun 2015 04:21:14 -0700 Subject: [PATCH 042/161] Fix a regression in "Separate ovs-ofctl using code as a driver" change The tunnels are not getting established between Network Node and Compute Nodes in non DVR mode with l2pop enabled and throws the AttributeError: add_tunnel_port. This fixes a regression in change Ie1224f8a1c17268cd7d1c474ed82fdfb8852eaa8. Co-Authored-By: YAMAMOTO Takashi Closes-Bug: #1461486 Change-Id: I1106fd3dd32f6f827eb25dec4815ff1120af96f0 --- .../agent/openflow/ovs_ofctl/br_tun.py | 20 +++++--- .../agent/openflow/ovs_ofctl/test_br_tun.py | 51 +++++++++++++++++++ 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/neutron/plugins/openvswitch/agent/openflow/ovs_ofctl/br_tun.py b/neutron/plugins/openvswitch/agent/openflow/ovs_ofctl/br_tun.py index 58301dfefe5..eeaf6ee8f05 100644 --- a/neutron/plugins/openvswitch/agent/openflow/ovs_ofctl/br_tun.py +++ b/neutron/plugins/openvswitch/agent/openflow/ovs_ofctl/br_tun.py @@ -203,14 +203,16 @@ class OVSTunnelBridge(ovs_bridge.OVSAgentBridge, dl_vlan=vlan, nw_dst='%s' % ip) - def setup_tunnel_port(self, network_type, port): - self.add_flow(priority=1, - in_port=port, - actions="resubmit(,%s)" % - constants.TUN_TABLE[network_type]) + def setup_tunnel_port(self, network_type, port, deferred_br=None): + br = deferred_br if deferred_br else self + br.add_flow(priority=1, + in_port=port, + actions="resubmit(,%s)" % + constants.TUN_TABLE[network_type]) - def cleanup_tunnel_port(self, port): - self.delete_flows(in_port=port) + def cleanup_tunnel_port(self, port, deferred_br=None): + br = deferred_br if deferred_br else self + br.delete_flows(in_port=port) def add_dvr_mac_tun(self, mac, port): # Table DVR_NOT_LEARN ensures unique dvr macs in the cloud @@ -237,10 +239,12 @@ class DeferredOVSTunnelBridge(ovs_lib.DeferredOVSBridge): 'delete_flood_to_tun', 'install_arp_responder', 'delete_arp_responder', + 'setup_tunnel_port', + 'cleanup_tunnel_port', ] def __getattr__(self, name): if name in self._METHODS: m = getattr(self.br, name) return functools.partial(m, deferred_br=self) - raise AttributeError(name) + return super(DeferredOVSTunnelBridge, self).__getattr__(name) diff --git a/neutron/tests/unit/plugins/openvswitch/agent/openflow/ovs_ofctl/test_br_tun.py b/neutron/tests/unit/plugins/openvswitch/agent/openflow/ovs_ofctl/test_br_tun.py index 27a046d0a4b..1a6ac5816c7 100644 --- a/neutron/tests/unit/plugins/openvswitch/agent/openflow/ovs_ofctl/test_br_tun.py +++ b/neutron/tests/unit/plugins/openvswitch/agent/openflow/ovs_ofctl/test_br_tun.py @@ -257,3 +257,54 @@ class OVSTunnelBridgeTest(ovs_bridge_test_base.OVSBridgeTestBase, call.delete_flows(eth_src=mac, table_id=9), ] self.assertEqual(expected, self.mock.mock_calls) + + def _mock_add_tunnel_port(self, deferred_br=False): + port_name = 'fake_port' + remote_ip = '192.168.1.3' + local_ip = '192.168.1.2' + tunnel_type = 'vxlan' + vxlan_udp_port = '4789' + dont_fragment = True + if deferred_br: + with mock.patch('neutron.agent.common.ovs_lib.OVSBridge.add_port', + return_value=9999) as add_port, \ + self.br.deferred() as deferred_br: + ofport = deferred_br.add_tunnel_port(port_name, remote_ip, + local_ip, tunnel_type, + vxlan_udp_port, + dont_fragment) + else: + with mock.patch('neutron.agent.common.ovs_lib.OVSBridge.add_port', + return_value=9999) as add_port: + ofport = self.br.add_tunnel_port(port_name, remote_ip, + local_ip, tunnel_type, + vxlan_udp_port, + dont_fragment) + self.assertEqual(9999, ofport) + self.assertEqual(1, add_port.call_count) + self.assertEqual(port_name, add_port.call_args[0][0]) + + def _mock_delete_port(self, deferred_br=False): + port_name = 'fake_port' + if deferred_br: + with mock.patch('neutron.agent.common.ovs_lib.OVSBridge.' + 'delete_port') as delete_port, \ + self.br.deferred() as deferred_br: + deferred_br.delete_port(port_name) + else: + with mock.patch('neutron.agent.common.ovs_lib.OVSBridge.' + 'delete_port') as delete_port: + self.br.delete_port(port_name) + self.assertEqual([call(port_name)], delete_port.mock_calls) + + def test_add_tunnel_port(self): + self._mock_add_tunnel_port() + + def test_delete_port(self): + self._mock_delete_port() + + def test_deferred_br_add_tunnel_port(self): + self._mock_add_tunnel_port(True) + + def test_deferred_br_delete_port(self): + self._mock_delete_port(True) From 66fece4f84e62f14fb59a721b37986784976d0c4 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Thu, 23 Apr 2015 14:03:52 +0200 Subject: [PATCH 043/161] policy: cleanup deprecation code to handle old extension:xxx rules It served and warned users for enough time (since Icehouse) to be sure everyone was notified about the need to update their policy file. Change-Id: I240b935741e49fbf65c0b95715af04af4b2a73e7 --- neutron/policy.py | 48 +------------------------------ neutron/tests/unit/test_policy.py | 30 ------------------- 2 files changed, 1 insertion(+), 77 deletions(-) diff --git a/neutron/policy.py b/neutron/policy.py index a2d099f6761..7c21559c6bf 100644 --- a/neutron/policy.py +++ b/neutron/policy.py @@ -18,7 +18,6 @@ Policy engine for neutron. Largely copied from nova. """ import collections -import itertools import logging as std_logging import re @@ -30,7 +29,7 @@ import six from neutron.api.v2 import attributes from neutron.common import constants as const from neutron.common import exceptions -from neutron.i18n import _LE, _LI, _LW +from neutron.i18n import _LE, _LW from neutron.openstack.common import policy @@ -39,22 +38,6 @@ LOG = logging.getLogger(__name__) _ENFORCER = None ADMIN_CTX_POLICY = 'context_is_admin' ADVSVC_CTX_POLICY = 'context_is_advsvc' -# Maps deprecated 'extension' policies to new-style policies -DEPRECATED_POLICY_MAP = { - 'extension:provider_network': - ['network:provider:network_type', - 'network:provider:physical_network', - 'network:provider:segmentation_id'], - 'extension:router': - ['network:router:external'], - 'extension:port_binding': - ['port:binding:vif_type', 'port:binding:vif_details', - 'port:binding:profile', 'port:binding:host_id'] -} -DEPRECATED_ACTION_MAP = { - 'view': ['get'], - 'set': ['create', 'update'] -} def reset(): @@ -95,35 +78,6 @@ def set_rules(policies, overwrite=True): """ LOG.debug("Loading policies from file: %s", _ENFORCER.policy_path) - # Ensure backward compatibility with folsom/grizzly convention - # for extension rules - for pol in policies.keys(): - if any([pol.startswith(depr_pol) for depr_pol in - DEPRECATED_POLICY_MAP.keys()]): - LOG.warn(_LW("Found deprecated policy rule:%s. Please consider " - "upgrading your policy configuration file"), pol) - pol_name, action = pol.rsplit(':', 1) - try: - new_actions = DEPRECATED_ACTION_MAP[action] - new_policies = DEPRECATED_POLICY_MAP[pol_name] - # bind new actions and policies together - for actual_policy in ['_'.join(item) for item in - itertools.product(new_actions, - new_policies)]: - if actual_policy not in policies: - # New policy, same rule - LOG.info(_LI("Inserting policy:%(new_policy)s in " - "place of deprecated " - "policy:%(old_policy)s"), - {'new_policy': actual_policy, - 'old_policy': pol}) - policies[actual_policy] = policies[pol] - # Remove old-style policy - del policies[pol] - except KeyError: - LOG.error(_LE("Backward compatibility unavailable for " - "deprecated policy %s. The policy will " - "not be enforced"), pol) init() _ENFORCER.set_rules(policies, overwrite) diff --git a/neutron/tests/unit/test_policy.py b/neutron/tests/unit/test_policy.py index cab94f24b36..a20e531f743 100644 --- a/neutron/tests/unit/test_policy.py +++ b/neutron/tests/unit/test_policy.py @@ -562,36 +562,6 @@ class NeutronPolicyTestCase(base.BaseTestCase): def test_enforce_tenant_id_check_invalid_parent_resource_raises(self): self._test_enforce_tenant_id_raises('tenant_id:%(foobaz_tenant_id)s') - def _test_set_rules_with_deprecated_policy(self, input_rules, - expected_rules): - policy.set_rules(input_rules.copy()) - # verify deprecated policy has been removed - for pol in input_rules.keys(): - self.assertNotIn(pol, policy._ENFORCER.rules) - # verify deprecated policy was correctly translated. Iterate - # over items for compatibility with unittest2 in python 2.6 - for rule in expected_rules: - self.assertIn(rule, policy._ENFORCER.rules) - self.assertEqual(str(policy._ENFORCER.rules[rule]), - expected_rules[rule]) - - def test_set_rules_with_deprecated_view_policy(self): - self._test_set_rules_with_deprecated_policy( - {'extension:router:view': 'rule:admin_or_owner'}, - {'get_network:router:external': 'rule:admin_or_owner'}) - - def test_set_rules_with_deprecated_set_policy(self): - expected_policies = ['create_network:provider:network_type', - 'create_network:provider:physical_network', - 'create_network:provider:segmentation_id', - 'update_network:provider:network_type', - 'update_network:provider:physical_network', - 'update_network:provider:segmentation_id'] - self._test_set_rules_with_deprecated_policy( - {'extension:provider_network:set': 'rule:admin_only'}, - dict((policy, 'rule:admin_only') for policy in - expected_policies)) - def test_process_rules(self): action = "create_" + FAKE_RESOURCE_NAME # Construct RuleChecks for an action, attribute and subattribute From 9143ce10e422bd17c4817dfe08163879e0e5a4ca Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Thu, 23 Apr 2015 12:12:52 +0200 Subject: [PATCH 044/161] Consume oslo.policy Some non intrusive changes to tests are needed, so that we don't rely on library symbols that are now private (f.e. parse_rule). Closes-Bug: #1458945 Change-Id: I90326479e908042fec9ecb25fa19a8dd5b15e7d8 --- neutron/api/v2/base.py | 12 +- neutron/api/v2/resource.py | 4 +- neutron/openstack/common/policy.py | 963 ------------------------- neutron/policy.py | 13 +- neutron/tests/unit/api/v2/test_base.py | 6 +- neutron/tests/unit/test_policy.py | 119 ++- openstack-common.conf | 1 - requirements.txt | 1 + 8 files changed, 78 insertions(+), 1041 deletions(-) delete mode 100644 neutron/openstack/common/policy.py diff --git a/neutron/api/v2/base.py b/neutron/api/v2/base.py index ea4d45b2cb4..8237905d26b 100644 --- a/neutron/api/v2/base.py +++ b/neutron/api/v2/base.py @@ -18,6 +18,7 @@ import copy import netaddr from oslo_config import cfg from oslo_log import log as logging +from oslo_policy import policy as oslo_policy from oslo_utils import excutils import six import webob.exc @@ -30,7 +31,6 @@ from neutron.common import constants as const from neutron.common import exceptions from neutron.common import rpc as n_rpc from neutron.i18n import _LE, _LI -from neutron.openstack.common import policy as common_policy from neutron import policy from neutron import quota @@ -44,7 +44,7 @@ FAULT_MAP = {exceptions.NotFound: webob.exc.HTTPNotFound, exceptions.ServiceUnavailable: webob.exc.HTTPServiceUnavailable, exceptions.NotAuthorized: webob.exc.HTTPForbidden, netaddr.AddrFormatError: webob.exc.HTTPBadRequest, - common_policy.PolicyNotAuthorized: webob.exc.HTTPForbidden + oslo_policy.PolicyNotAuthorized: webob.exc.HTTPForbidden } @@ -192,7 +192,7 @@ class Controller(object): # Fetch the resource and verify if the user can access it try: resource = self._item(request, id, True) - except common_policy.PolicyNotAuthorized: + except oslo_policy.PolicyNotAuthorized: msg = _('The resource could not be found.') raise webob.exc.HTTPNotFound(msg) body = kwargs.pop('body', None) @@ -338,7 +338,7 @@ class Controller(object): field_list=field_list, parent_id=parent_id), fields_to_strip=added_fields)} - except common_policy.PolicyNotAuthorized: + except oslo_policy.PolicyNotAuthorized: # To avoid giving away information, pretend that it # doesn't exist msg = _('The resource could not be found.') @@ -481,7 +481,7 @@ class Controller(object): action, obj, pluralized=self._collection) - except common_policy.PolicyNotAuthorized: + except oslo_policy.PolicyNotAuthorized: # To avoid giving away information, pretend that it # doesn't exist msg = _('The resource could not be found.') @@ -537,7 +537,7 @@ class Controller(object): action, orig_obj, pluralized=self._collection) - except common_policy.PolicyNotAuthorized: + except oslo_policy.PolicyNotAuthorized: with excutils.save_and_reraise_exception() as ctxt: # If a tenant is modifying it's own object, it's safe to return # a 403. Otherwise, pretend that it doesn't exist to avoid diff --git a/neutron/api/v2/resource.py b/neutron/api/v2/resource.py index 09919b93815..dec23b00a2e 100644 --- a/neutron/api/v2/resource.py +++ b/neutron/api/v2/resource.py @@ -22,13 +22,13 @@ import sys import netaddr import oslo_i18n from oslo_log import log as logging +from oslo_policy import policy as oslo_policy import six import webob.dec import webob.exc from neutron.common import exceptions from neutron.i18n import _LE, _LI -from neutron.openstack.common import policy as common_policy from neutron import wsgi @@ -83,7 +83,7 @@ def Resource(controller, faults=None, deserializers=None, serializers=None): result = method(request=request, **args) except (exceptions.NeutronException, netaddr.AddrFormatError, - common_policy.PolicyNotAuthorized) as e: + oslo_policy.PolicyNotAuthorized) as e: for fault in faults: if isinstance(e, fault): mapped_exc = faults[fault] diff --git a/neutron/openstack/common/policy.py b/neutron/openstack/common/policy.py deleted file mode 100644 index f5abde3682a..00000000000 --- a/neutron/openstack/common/policy.py +++ /dev/null @@ -1,963 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2012 OpenStack Foundation. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -Common Policy Engine Implementation - -Policies can be expressed in one of two forms: A list of lists, or a -string written in the new policy language. - -In the list-of-lists representation, each check inside the innermost -list is combined as with an "and" conjunction--for that check to pass, -all the specified checks must pass. These innermost lists are then -combined as with an "or" conjunction. As an example, take the following -rule, expressed in the list-of-lists representation:: - - [["role:admin"], ["project_id:%(project_id)s", "role:projectadmin"]] - -This is the original way of expressing policies, but there now exists a -new way: the policy language. - -In the policy language, each check is specified the same way as in the -list-of-lists representation: a simple "a:b" pair that is matched to -the correct class to perform that check:: - - +===========================================================================+ - | TYPE | SYNTAX | - +===========================================================================+ - |User's Role | role:admin | - +---------------------------------------------------------------------------+ - |Rules already defined on policy | rule:admin_required | - +---------------------------------------------------------------------------+ - |Against URL's¹ | http://my-url.org/check | - +---------------------------------------------------------------------------+ - |User attributes² | project_id:%(target.project.id)s | - +---------------------------------------------------------------------------+ - |Strings | :'xpto2035abc' | - | | 'myproject': | - +---------------------------------------------------------------------------+ - | | project_id:xpto2035abc | - |Literals | domain_id:20 | - | | True:%(user.enabled)s | - +===========================================================================+ - -¹URL checking must return 'True' to be valid -²User attributes (obtained through the token): user_id, domain_id or project_id - -Conjunction operators are available, allowing for more expressiveness -in crafting policies. So, in the policy language, the previous check in -list-of-lists becomes:: - - role:admin or (project_id:%(project_id)s and role:projectadmin) - -The policy language also has the "not" operator, allowing a richer -policy rule:: - - project_id:%(project_id)s and not role:dunce - -Attributes sent along with API calls can be used by the policy engine -(on the right side of the expression), by using the following syntax:: - - :%(user.id)s - -Contextual attributes of objects identified by their IDs are loaded -from the database. They are also available to the policy engine and -can be checked through the `target` keyword:: - - :%(target.role.name)s - -Finally, two special policy checks should be mentioned; the policy -check "@" will always accept an access, and the policy check "!" will -always reject an access. (Note that if a rule is either the empty -list ("[]") or the empty string, this is equivalent to the "@" policy -check.) Of these, the "!" policy check is probably the most useful, -as it allows particular rules to be explicitly disabled. -""" - -import abc -import ast -import copy -import logging -import os -import re - -from oslo_config import cfg -from oslo_serialization import jsonutils -import six -import six.moves.urllib.parse as urlparse -import six.moves.urllib.request as urlrequest - -from neutron.openstack.common import fileutils -from neutron.openstack.common._i18n import _, _LE - - -policy_opts = [ - cfg.StrOpt('policy_file', - default='policy.json', - help=_('The JSON file that defines policies.')), - cfg.StrOpt('policy_default_rule', - default='default', - help=_('Default rule. Enforced when a requested rule is not ' - 'found.')), - cfg.MultiStrOpt('policy_dirs', - default=['policy.d'], - help=_('Directories where policy configuration files are ' - 'stored. They can be relative to any directory ' - 'in the search path defined by the config_dir ' - 'option, or absolute paths. The file defined by ' - 'policy_file must exist for these directories to ' - 'be searched. Missing or empty directories are ' - 'ignored.')), -] - -CONF = cfg.CONF -CONF.register_opts(policy_opts) - -LOG = logging.getLogger(__name__) - -_checks = {} - - -def list_opts(): - """Entry point for oslo-config-generator.""" - return [(None, copy.deepcopy(policy_opts))] - - -class PolicyNotAuthorized(Exception): - - def __init__(self, rule): - msg = _("Policy doesn't allow %s to be performed.") % rule - super(PolicyNotAuthorized, self).__init__(msg) - - -class Rules(dict): - """A store for rules. Handles the default_rule setting directly.""" - - @classmethod - def load_json(cls, data, default_rule=None): - """Allow loading of JSON rule data.""" - - # Suck in the JSON data and parse the rules - rules = dict((k, parse_rule(v)) for k, v in - jsonutils.loads(data).items()) - - return cls(rules, default_rule) - - def __init__(self, rules=None, default_rule=None): - """Initialize the Rules store.""" - - super(Rules, self).__init__(rules or {}) - self.default_rule = default_rule - - def __missing__(self, key): - """Implements the default rule handling.""" - - if isinstance(self.default_rule, dict): - raise KeyError(key) - - # If the default rule isn't actually defined, do something - # reasonably intelligent - if not self.default_rule: - raise KeyError(key) - - if isinstance(self.default_rule, BaseCheck): - return self.default_rule - - # We need to check this or we can get infinite recursion - if self.default_rule not in self: - raise KeyError(key) - - elif isinstance(self.default_rule, six.string_types): - return self[self.default_rule] - - def __str__(self): - """Dumps a string representation of the rules.""" - - # Start by building the canonical strings for the rules - out_rules = {} - for key, value in self.items(): - # Use empty string for singleton TrueCheck instances - if isinstance(value, TrueCheck): - out_rules[key] = '' - else: - out_rules[key] = str(value) - - # Dump a pretty-printed JSON representation - return jsonutils.dumps(out_rules, indent=4) - - -class Enforcer(object): - """Responsible for loading and enforcing rules. - - :param policy_file: Custom policy file to use, if none is - specified, `CONF.policy_file` will be - used. - :param rules: Default dictionary / Rules to use. It will be - considered just in the first instantiation. If - `load_rules(True)`, `clear()` or `set_rules(True)` - is called this will be overwritten. - :param default_rule: Default rule to use, CONF.default_rule will - be used if none is specified. - :param use_conf: Whether to load rules from cache or config file. - :param overwrite: Whether to overwrite existing rules when reload rules - from config file. - """ - - def __init__(self, policy_file=None, rules=None, - default_rule=None, use_conf=True, overwrite=True): - self.default_rule = default_rule or CONF.policy_default_rule - self.rules = Rules(rules, self.default_rule) - - self.policy_path = None - self.policy_file = policy_file or CONF.policy_file - self.use_conf = use_conf - self.overwrite = overwrite - - def set_rules(self, rules, overwrite=True, use_conf=False): - """Create a new Rules object based on the provided dict of rules. - - :param rules: New rules to use. It should be an instance of dict. - :param overwrite: Whether to overwrite current rules or update them - with the new rules. - :param use_conf: Whether to reload rules from cache or config file. - """ - - if not isinstance(rules, dict): - raise TypeError(_("Rules must be an instance of dict or Rules, " - "got %s instead") % type(rules)) - self.use_conf = use_conf - if overwrite: - self.rules = Rules(rules, self.default_rule) - else: - self.rules.update(rules) - - def clear(self): - """Clears Enforcer rules, policy's cache and policy's path.""" - self.set_rules({}) - fileutils.delete_cached_file(self.policy_path) - self.default_rule = None - self.policy_path = None - - def load_rules(self, force_reload=False): - """Loads policy_path's rules. - - Policy file is cached and will be reloaded if modified. - - :param force_reload: Whether to reload rules from config file. - """ - - if force_reload: - self.use_conf = force_reload - - if self.use_conf: - if not self.policy_path: - self.policy_path = self._get_policy_path(self.policy_file) - - self._load_policy_file(self.policy_path, force_reload, - overwrite=self.overwrite) - for path in CONF.policy_dirs: - try: - path = self._get_policy_path(path) - except cfg.ConfigFilesNotFoundError: - continue - self._walk_through_policy_directory(path, - self._load_policy_file, - force_reload, False) - - @staticmethod - def _walk_through_policy_directory(path, func, *args): - # We do not iterate over sub-directories. - policy_files = next(os.walk(path))[2] - policy_files.sort() - for policy_file in [p for p in policy_files if not p.startswith('.')]: - func(os.path.join(path, policy_file), *args) - - def _load_policy_file(self, path, force_reload, overwrite=True): - reloaded, data = fileutils.read_cached_file( - path, force_reload=force_reload) - if reloaded or not self.rules or not overwrite: - rules = Rules.load_json(data, self.default_rule) - self.set_rules(rules, overwrite=overwrite, use_conf=True) - LOG.debug("Reloaded policy file: %(path)s", - {'path': path}) - - def _get_policy_path(self, path): - """Locate the policy json data file/path. - - :param path: It's value can be a full path or related path. When - full path specified, this function just returns the full - path. When related path specified, this function will - search configuration directories to find one that exists. - - :returns: The policy path - - :raises: ConfigFilesNotFoundError if the file/path couldn't - be located. - """ - policy_path = CONF.find_file(path) - - if policy_path: - return policy_path - - raise cfg.ConfigFilesNotFoundError((path,)) - - def enforce(self, rule, target, creds, do_raise=False, - exc=None, *args, **kwargs): - """Checks authorization of a rule against the target and credentials. - - :param rule: A string or BaseCheck instance specifying the rule - to evaluate. - :param target: As much information about the object being operated - on as possible, as a dictionary. - :param creds: As much information about the user performing the - action as possible, as a dictionary. - :param do_raise: Whether to raise an exception or not if check - fails. - :param exc: Class of the exception to raise if the check fails. - Any remaining arguments passed to enforce() (both - positional and keyword arguments) will be passed to - the exception class. If not specified, PolicyNotAuthorized - will be used. - - :return: Returns False if the policy does not allow the action and - exc is not provided; otherwise, returns a value that - evaluates to True. Note: for rules using the "case" - expression, this True value will be the specified string - from the expression. - """ - - self.load_rules() - - # Allow the rule to be a Check tree - if isinstance(rule, BaseCheck): - result = rule(target, creds, self) - elif not self.rules: - # No rules to reference means we're going to fail closed - result = False - else: - try: - # Evaluate the rule - result = self.rules[rule](target, creds, self) - except KeyError: - LOG.debug("Rule [%s] doesn't exist" % rule) - # If the rule doesn't exist, fail closed - result = False - - # If it is False, raise the exception if requested - if do_raise and not result: - if exc: - raise exc(*args, **kwargs) - - raise PolicyNotAuthorized(rule) - - return result - - -@six.add_metaclass(abc.ABCMeta) -class BaseCheck(object): - """Abstract base class for Check classes.""" - - @abc.abstractmethod - def __str__(self): - """String representation of the Check tree rooted at this node.""" - - pass - - @abc.abstractmethod - def __call__(self, target, cred, enforcer): - """Triggers if instance of the class is called. - - Performs the check. Returns False to reject the access or a - true value (not necessary True) to accept the access. - """ - - pass - - -class FalseCheck(BaseCheck): - """A policy check that always returns False (disallow).""" - - def __str__(self): - """Return a string representation of this check.""" - - return "!" - - def __call__(self, target, cred, enforcer): - """Check the policy.""" - - return False - - -class TrueCheck(BaseCheck): - """A policy check that always returns True (allow).""" - - def __str__(self): - """Return a string representation of this check.""" - - return "@" - - def __call__(self, target, cred, enforcer): - """Check the policy.""" - - return True - - -class Check(BaseCheck): - """A base class to allow for user-defined policy checks.""" - - def __init__(self, kind, match): - """Initiates Check instance. - - :param kind: The kind of the check, i.e., the field before the - ':'. - :param match: The match of the check, i.e., the field after - the ':'. - """ - - self.kind = kind - self.match = match - - def __str__(self): - """Return a string representation of this check.""" - - return "%s:%s" % (self.kind, self.match) - - -class NotCheck(BaseCheck): - """Implements the "not" logical operator. - - A policy check that inverts the result of another policy check. - """ - - def __init__(self, rule): - """Initialize the 'not' check. - - :param rule: The rule to negate. Must be a Check. - """ - - self.rule = rule - - def __str__(self): - """Return a string representation of this check.""" - - return "not %s" % self.rule - - def __call__(self, target, cred, enforcer): - """Check the policy. - - Returns the logical inverse of the wrapped check. - """ - - return not self.rule(target, cred, enforcer) - - -class AndCheck(BaseCheck): - """Implements the "and" logical operator. - - A policy check that requires that a list of other checks all return True. - """ - - def __init__(self, rules): - """Initialize the 'and' check. - - :param rules: A list of rules that will be tested. - """ - - self.rules = rules - - def __str__(self): - """Return a string representation of this check.""" - - return "(%s)" % ' and '.join(str(r) for r in self.rules) - - def __call__(self, target, cred, enforcer): - """Check the policy. - - Requires that all rules accept in order to return True. - """ - - for rule in self.rules: - if not rule(target, cred, enforcer): - return False - - return True - - def add_check(self, rule): - """Adds rule to be tested. - - Allows addition of another rule to the list of rules that will - be tested. Returns the AndCheck object for convenience. - """ - - self.rules.append(rule) - return self - - -class OrCheck(BaseCheck): - """Implements the "or" operator. - - A policy check that requires that at least one of a list of other - checks returns True. - """ - - def __init__(self, rules): - """Initialize the 'or' check. - - :param rules: A list of rules that will be tested. - """ - - self.rules = rules - - def __str__(self): - """Return a string representation of this check.""" - - return "(%s)" % ' or '.join(str(r) for r in self.rules) - - def __call__(self, target, cred, enforcer): - """Check the policy. - - Requires that at least one rule accept in order to return True. - """ - - for rule in self.rules: - if rule(target, cred, enforcer): - return True - return False - - def add_check(self, rule): - """Adds rule to be tested. - - Allows addition of another rule to the list of rules that will - be tested. Returns the OrCheck object for convenience. - """ - - self.rules.append(rule) - return self - - -def _parse_check(rule): - """Parse a single base check rule into an appropriate Check object.""" - - # Handle the special checks - if rule == '!': - return FalseCheck() - elif rule == '@': - return TrueCheck() - - try: - kind, match = rule.split(':', 1) - except Exception: - LOG.exception(_LE("Failed to understand rule %s") % rule) - # If the rule is invalid, we'll fail closed - return FalseCheck() - - # Find what implements the check - if kind in _checks: - return _checks[kind](kind, match) - elif None in _checks: - return _checks[None](kind, match) - else: - LOG.error(_LE("No handler for matches of kind %s") % kind) - return FalseCheck() - - -def _parse_list_rule(rule): - """Translates the old list-of-lists syntax into a tree of Check objects. - - Provided for backwards compatibility. - """ - - # Empty rule defaults to True - if not rule: - return TrueCheck() - - # Outer list is joined by "or"; inner list by "and" - or_list = [] - for inner_rule in rule: - # Elide empty inner lists - if not inner_rule: - continue - - # Handle bare strings - if isinstance(inner_rule, six.string_types): - inner_rule = [inner_rule] - - # Parse the inner rules into Check objects - and_list = [_parse_check(r) for r in inner_rule] - - # Append the appropriate check to the or_list - if len(and_list) == 1: - or_list.append(and_list[0]) - else: - or_list.append(AndCheck(and_list)) - - # If we have only one check, omit the "or" - if not or_list: - return FalseCheck() - elif len(or_list) == 1: - return or_list[0] - - return OrCheck(or_list) - - -# Used for tokenizing the policy language -_tokenize_re = re.compile(r'\s+') - - -def _parse_tokenize(rule): - """Tokenizer for the policy language. - - Most of the single-character tokens are specified in the - _tokenize_re; however, parentheses need to be handled specially, - because they can appear inside a check string. Thankfully, those - parentheses that appear inside a check string can never occur at - the very beginning or end ("%(variable)s" is the correct syntax). - """ - - for tok in _tokenize_re.split(rule): - # Skip empty tokens - if not tok or tok.isspace(): - continue - - # Handle leading parens on the token - clean = tok.lstrip('(') - for i in range(len(tok) - len(clean)): - yield '(', '(' - - # If it was only parentheses, continue - if not clean: - continue - else: - tok = clean - - # Handle trailing parens on the token - clean = tok.rstrip(')') - trail = len(tok) - len(clean) - - # Yield the cleaned token - lowered = clean.lower() - if lowered in ('and', 'or', 'not'): - # Special tokens - yield lowered, clean - elif clean: - # Not a special token, but not composed solely of ')' - if len(tok) >= 2 and ((tok[0], tok[-1]) in - [('"', '"'), ("'", "'")]): - # It's a quoted string - yield 'string', tok[1:-1] - else: - yield 'check', _parse_check(clean) - - # Yield the trailing parens - for i in range(trail): - yield ')', ')' - - -class ParseStateMeta(type): - """Metaclass for the ParseState class. - - Facilitates identifying reduction methods. - """ - - def __new__(mcs, name, bases, cls_dict): - """Create the class. - - Injects the 'reducers' list, a list of tuples matching token sequences - to the names of the corresponding reduction methods. - """ - - reducers = [] - - for key, value in cls_dict.items(): - if not hasattr(value, 'reducers'): - continue - for reduction in value.reducers: - reducers.append((reduction, key)) - - cls_dict['reducers'] = reducers - - return super(ParseStateMeta, mcs).__new__(mcs, name, bases, cls_dict) - - -def reducer(*tokens): - """Decorator for reduction methods. - - Arguments are a sequence of tokens, in order, which should trigger running - this reduction method. - """ - - def decorator(func): - # Make sure we have a list of reducer sequences - if not hasattr(func, 'reducers'): - func.reducers = [] - - # Add the tokens to the list of reducer sequences - func.reducers.append(list(tokens)) - - return func - - return decorator - - -@six.add_metaclass(ParseStateMeta) -class ParseState(object): - """Implement the core of parsing the policy language. - - Uses a greedy reduction algorithm to reduce a sequence of tokens into - a single terminal, the value of which will be the root of the Check tree. - - Note: error reporting is rather lacking. The best we can get with - this parser formulation is an overall "parse failed" error. - Fortunately, the policy language is simple enough that this - shouldn't be that big a problem. - """ - - def __init__(self): - """Initialize the ParseState.""" - - self.tokens = [] - self.values = [] - - def reduce(self): - """Perform a greedy reduction of the token stream. - - If a reducer method matches, it will be executed, then the - reduce() method will be called recursively to search for any more - possible reductions. - """ - - for reduction, methname in self.reducers: - if (len(self.tokens) >= len(reduction) and - self.tokens[-len(reduction):] == reduction): - # Get the reduction method - meth = getattr(self, methname) - - # Reduce the token stream - results = meth(*self.values[-len(reduction):]) - - # Update the tokens and values - self.tokens[-len(reduction):] = [r[0] for r in results] - self.values[-len(reduction):] = [r[1] for r in results] - - # Check for any more reductions - return self.reduce() - - def shift(self, tok, value): - """Adds one more token to the state. Calls reduce().""" - - self.tokens.append(tok) - self.values.append(value) - - # Do a greedy reduce... - self.reduce() - - @property - def result(self): - """Obtain the final result of the parse. - - Raises ValueError if the parse failed to reduce to a single result. - """ - - if len(self.values) != 1: - raise ValueError("Could not parse rule") - return self.values[0] - - @reducer('(', 'check', ')') - @reducer('(', 'and_expr', ')') - @reducer('(', 'or_expr', ')') - def _wrap_check(self, _p1, check, _p2): - """Turn parenthesized expressions into a 'check' token.""" - - return [('check', check)] - - @reducer('check', 'and', 'check') - def _make_and_expr(self, check1, _and, check2): - """Create an 'and_expr'. - - Join two checks by the 'and' operator. - """ - - return [('and_expr', AndCheck([check1, check2]))] - - @reducer('and_expr', 'and', 'check') - def _extend_and_expr(self, and_expr, _and, check): - """Extend an 'and_expr' by adding one more check.""" - - return [('and_expr', and_expr.add_check(check))] - - @reducer('check', 'or', 'check') - def _make_or_expr(self, check1, _or, check2): - """Create an 'or_expr'. - - Join two checks by the 'or' operator. - """ - - return [('or_expr', OrCheck([check1, check2]))] - - @reducer('or_expr', 'or', 'check') - def _extend_or_expr(self, or_expr, _or, check): - """Extend an 'or_expr' by adding one more check.""" - - return [('or_expr', or_expr.add_check(check))] - - @reducer('not', 'check') - def _make_not_expr(self, _not, check): - """Invert the result of another check.""" - - return [('check', NotCheck(check))] - - -def _parse_text_rule(rule): - """Parses policy to the tree. - - Translates a policy written in the policy language into a tree of - Check objects. - """ - - # Empty rule means always accept - if not rule: - return TrueCheck() - - # Parse the token stream - state = ParseState() - for tok, value in _parse_tokenize(rule): - state.shift(tok, value) - - try: - return state.result - except ValueError: - # Couldn't parse the rule - LOG.exception(_LE("Failed to understand rule %s") % rule) - - # Fail closed - return FalseCheck() - - -def parse_rule(rule): - """Parses a policy rule into a tree of Check objects.""" - - # If the rule is a string, it's in the policy language - if isinstance(rule, six.string_types): - return _parse_text_rule(rule) - return _parse_list_rule(rule) - - -def register(name, func=None): - """Register a function or Check class as a policy check. - - :param name: Gives the name of the check type, e.g., 'rule', - 'role', etc. If name is None, a default check type - will be registered. - :param func: If given, provides the function or class to register. - If not given, returns a function taking one argument - to specify the function or class to register, - allowing use as a decorator. - """ - - # Perform the actual decoration by registering the function or - # class. Returns the function or class for compliance with the - # decorator interface. - def decorator(func): - _checks[name] = func - return func - - # If the function or class is given, do the registration - if func: - return decorator(func) - - return decorator - - -@register("rule") -class RuleCheck(Check): - def __call__(self, target, creds, enforcer): - """Recursively checks credentials based on the defined rules.""" - - try: - return enforcer.rules[self.match](target, creds, enforcer) - except KeyError: - # We don't have any matching rule; fail closed - return False - - -@register("role") -class RoleCheck(Check): - def __call__(self, target, creds, enforcer): - """Check that there is a matching role in the cred dict.""" - - return self.match.lower() in [x.lower() for x in creds['roles']] - - -@register('http') -class HttpCheck(Check): - def __call__(self, target, creds, enforcer): - """Check http: rules by calling to a remote server. - - This example implementation simply verifies that the response - is exactly 'True'. - """ - - url = ('http:' + self.match) % target - - # Convert instances of object() in target temporarily to - # empty dict to avoid circular reference detection - # errors in jsonutils.dumps(). - temp_target = copy.deepcopy(target) - for key in target.keys(): - element = target.get(key) - if type(element) is object: - temp_target[key] = {} - - data = {'target': jsonutils.dumps(temp_target), - 'credentials': jsonutils.dumps(creds)} - post_data = urlparse.urlencode(data) - f = urlrequest.urlopen(url, post_data) - return f.read() == "True" - - -@register(None) -class GenericCheck(Check): - def __call__(self, target, creds, enforcer): - """Check an individual match. - - Matches look like: - - tenant:%(tenant_id)s - role:compute:admin - True:%(user.enabled)s - 'Member':%(role.name)s - """ - - try: - match = self.match % target - except KeyError: - # While doing GenericCheck if key not - # present in Target return false - return False - - try: - # Try to interpret self.kind as a literal - leftval = ast.literal_eval(self.kind) - except ValueError: - try: - kind_parts = self.kind.split('.') - leftval = creds - for kind_part in kind_parts: - leftval = leftval[kind_part] - except KeyError: - return False - return match == six.text_type(leftval) diff --git a/neutron/policy.py b/neutron/policy.py index 7c21559c6bf..5424dbe685e 100644 --- a/neutron/policy.py +++ b/neutron/policy.py @@ -21,7 +21,9 @@ import collections import logging as std_logging import re +from oslo_config import cfg from oslo_log import log as logging +from oslo_policy import policy from oslo_utils import excutils from oslo_utils import importutils import six @@ -30,7 +32,6 @@ from neutron.api.v2 import attributes from neutron.common import constants as const from neutron.common import exceptions from neutron.i18n import _LE, _LW -from neutron.openstack.common import policy LOG = logging.getLogger(__name__) @@ -47,19 +48,19 @@ def reset(): _ENFORCER = None -def init(): +def init(conf=cfg.CONF, policy_file=None): """Init an instance of the Enforcer class.""" global _ENFORCER if not _ENFORCER: - _ENFORCER = policy.Enforcer() + _ENFORCER = policy.Enforcer(conf, policy_file=policy_file) _ENFORCER.load_rules(True) -def refresh(): +def refresh(policy_file=None): """Reset policy and init a new instance of Enforcer.""" reset() - init() + init(policy_file=policy_file) def get_resource_and_action(action, pluralized=None): @@ -372,7 +373,7 @@ def enforce(context, action, target, plugin=None, pluralized=None): :param pluralized: pluralized case of resource e.g. firewall_policy -> pluralized = "firewall_policies" - :raises neutron.openstack.common.policy.PolicyNotAuthorized: + :raises oslo_policy.policy.PolicyNotAuthorized: if verification fails. """ # If we already know the context has admin rights do not perform an diff --git a/neutron/tests/unit/api/v2/test_base.py b/neutron/tests/unit/api/v2/test_base.py index ab05215e3f9..dfac39a8443 100644 --- a/neutron/tests/unit/api/v2/test_base.py +++ b/neutron/tests/unit/api/v2/test_base.py @@ -17,6 +17,7 @@ import os import mock from oslo_config import cfg +from oslo_policy import policy as oslo_policy import six from six import moves import six.moves.urllib.parse as urlparse @@ -33,7 +34,6 @@ from neutron.api.v2 import router from neutron.common import exceptions as n_exc from neutron import context from neutron import manager -from neutron.openstack.common import policy as common_policy from neutron.openstack.common import uuidutils from neutron import policy from neutron import quota @@ -1047,8 +1047,8 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase): def test_get_keystone_strip_admin_only_attribute(self): tenant_id = _uuid() # Inject rule in policy engine - rules = {'get_network:name': common_policy.parse_rule( - "rule:admin_only")} + rules = oslo_policy.Rules.from_dict( + {'get_network:name': "rule:admin_only"}) policy.set_rules(rules, overwrite=False) res = self._test_get(tenant_id, tenant_id, 200) res = self.deserialize(res) diff --git a/neutron/tests/unit/test_policy.py b/neutron/tests/unit/test_policy.py index a20e531f743..56ab849b6c9 100644 --- a/neutron/tests/unit/test_policy.py +++ b/neutron/tests/unit/test_policy.py @@ -16,7 +16,7 @@ """Test of Policy Engine For Neutron""" import mock -from oslo_config import cfg +from oslo_policy import policy as oslo_policy from oslo_serialization import jsonutils from oslo_utils import importutils import six @@ -28,7 +28,6 @@ from neutron.common import constants as const from neutron.common import exceptions from neutron import context from neutron import manager -from neutron.openstack.common import policy as common_policy from neutron import policy from neutron.tests import base @@ -44,14 +43,13 @@ class PolicyFileTestCase(base.BaseTestCase): action = "example:test" with open(tmpfilename, "w") as policyfile: policyfile.write("""{"example:test": ""}""") - cfg.CONF.set_override('policy_file', tmpfilename) - policy.refresh() + policy.refresh(policy_file=tmpfilename) policy.enforce(self.context, action, self.target) with open(tmpfilename, "w") as policyfile: policyfile.write("""{"example:test": "!"}""") - policy.refresh() + policy.refresh(policy_file=tmpfilename) self.target = {'tenant_id': 'fake_tenant'} - self.assertRaises(common_policy.PolicyNotAuthorized, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, action, @@ -75,19 +73,18 @@ class PolicyTestCase(base.BaseTestCase): } policy.refresh() # NOTE(vish): then overload underlying rules - policy.set_rules(dict((k, common_policy.parse_rule(v)) - for k, v in rules.items())) + policy.set_rules(oslo_policy.Rules.from_dict(rules)) self.context = context.Context('fake', 'fake', roles=['member']) self.target = {} def test_enforce_nonexistent_action_throws(self): action = "example:noexist" - self.assertRaises(common_policy.PolicyNotAuthorized, policy.enforce, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, action, self.target) def test_enforce_bad_action_throws(self): action = "example:denied" - self.assertRaises(common_policy.PolicyNotAuthorized, policy.enforce, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, action, self.target) def test_check_bad_action_noraise(self): @@ -124,7 +121,7 @@ class PolicyTestCase(base.BaseTestCase): with mock.patch.object(urlrequest, 'urlopen', new=fakeurlopen): action = "example:get_http" target = {} - self.assertRaises(common_policy.PolicyNotAuthorized, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, action, target) @@ -133,12 +130,12 @@ class PolicyTestCase(base.BaseTestCase): target_not_mine = {'tenant_id': 'another'} action = "example:my_file" policy.enforce(self.context, action, target_mine) - self.assertRaises(common_policy.PolicyNotAuthorized, policy.enforce, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, action, target_not_mine) def test_early_AND_enforcement(self): action = "example:early_and_fail" - self.assertRaises(common_policy.PolicyNotAuthorized, policy.enforce, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, action, self.target) def test_early_OR_enforcement(self): @@ -166,13 +163,12 @@ class DefaultPolicyTestCase(base.BaseTestCase): } with open(tmpfilename, "w") as policyfile: jsonutils.dump(self.rules, policyfile) - cfg.CONF.set_override('policy_file', tmpfilename) - policy.refresh() + policy.refresh(policy_file=tmpfilename) self.context = context.Context('fake', 'fake') def test_policy_called(self): - self.assertRaises(common_policy.PolicyNotAuthorized, policy.enforce, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, "example:exist", {}) def test_not_found_policy_calls_default(self): @@ -208,14 +204,33 @@ class NeutronPolicyTestCase(base.BaseTestCase): def fakepolicyinit(self, **kwargs): enf = policy._ENFORCER - enf.set_rules(common_policy.Rules(self.rules)) + enf.set_rules(oslo_policy.Rules(self.rules)) def setUp(self): super(NeutronPolicyTestCase, self).setUp() policy.refresh() # Add Fake resources to RESOURCE_ATTRIBUTE_MAP attributes.RESOURCE_ATTRIBUTE_MAP.update(FAKE_RESOURCES) - self.rules = dict((k, common_policy.parse_rule(v)) for k, v in { + self._set_rules() + + def remove_fake_resource(): + del attributes.RESOURCE_ATTRIBUTE_MAP["%ss" % FAKE_RESOURCE_NAME] + + self.patcher = mock.patch.object(neutron.policy, + 'init', + new=self.fakepolicyinit) + self.patcher.start() + self.addCleanup(remove_fake_resource) + self.context = context.Context('fake', 'fake', roles=['user']) + plugin_klass = importutils.import_class( + "neutron.db.db_base_plugin_v2.NeutronDbPluginV2") + self.manager_patcher = mock.patch('neutron.manager.NeutronManager') + fake_manager = self.manager_patcher.start() + fake_manager_instance = fake_manager.return_value + fake_manager_instance.plugin = plugin_klass() + + def _set_rules(self, **kwargs): + rules_dict = { "context_is_admin": "role:admin", "context_is_advsvc": "role:advsvc", "admin_or_network_owner": "rule:context_is_admin or " @@ -253,23 +268,9 @@ class NeutronPolicyTestCase(base.BaseTestCase): "insert_rule": "rule:admin_or_owner", "remove_rule": "rule:admin_or_owner", - }.items()) - - def remove_fake_resource(): - del attributes.RESOURCE_ATTRIBUTE_MAP["%ss" % FAKE_RESOURCE_NAME] - - self.patcher = mock.patch.object(neutron.policy, - 'init', - new=self.fakepolicyinit) - self.patcher.start() - self.addCleanup(remove_fake_resource) - self.context = context.Context('fake', 'fake', roles=['user']) - plugin_klass = importutils.import_class( - "neutron.db.db_base_plugin_v2.NeutronDbPluginV2") - self.manager_patcher = mock.patch('neutron.manager.NeutronManager') - fake_manager = self.manager_patcher.start() - fake_manager_instance = fake_manager.return_value - fake_manager_instance.plugin = plugin_klass() + } + rules_dict.update(**kwargs) + self.rules = oslo_policy.Rules.from_dict(rules_dict) def test_firewall_policy_insert_rule_with_admin_context(self): action = "insert_rule" @@ -319,22 +320,22 @@ class NeutronPolicyTestCase(base.BaseTestCase): def test_nonadmin_write_on_private_fails(self): self._test_nonadmin_action_on_attr('create', 'shared', False, - common_policy.PolicyNotAuthorized) + oslo_policy.PolicyNotAuthorized) def test_nonadmin_read_on_private_fails(self): self._test_nonadmin_action_on_attr('get', 'shared', False, - common_policy.PolicyNotAuthorized) + oslo_policy.PolicyNotAuthorized) def test_nonadmin_write_on_shared_fails(self): self._test_nonadmin_action_on_attr('create', 'shared', True, - common_policy.PolicyNotAuthorized) + oslo_policy.PolicyNotAuthorized) def test_advsvc_get_network_works(self): self._test_advsvc_action_on_attr('get', 'network', 'shared', False) def test_advsvc_create_network_fails(self): self._test_advsvc_action_on_attr('create', 'network', 'shared', False, - common_policy.PolicyNotAuthorized) + oslo_policy.PolicyNotAuthorized) def test_advsvc_create_port_works(self): self._test_advsvc_action_on_attr('create', 'port:mac', 'shared', False) @@ -352,7 +353,7 @@ class NeutronPolicyTestCase(base.BaseTestCase): def test_advsvc_create_subnet_fails(self): self._test_advsvc_action_on_attr('create', 'subnet', 'shared', False, - common_policy.PolicyNotAuthorized) + oslo_policy.PolicyNotAuthorized) def test_nonadmin_read_on_shared_succeeds(self): self._test_nonadmin_action_on_attr('get', 'shared', True) @@ -406,13 +407,13 @@ class NeutronPolicyTestCase(base.BaseTestCase): def test_reset_adminonly_attr_to_default_fails(self): kwargs = {const.ATTRIBUTES_TO_UPDATE: ['shared']} self._test_nonadmin_action_on_attr('update', 'shared', False, - common_policy.PolicyNotAuthorized, + oslo_policy.PolicyNotAuthorized, **kwargs) def test_enforce_adminonly_attribute_nonadminctx_returns_403(self): action = "create_network" target = {'shared': True, 'tenant_id': 'somebody_else'} - self.assertRaises(common_policy.PolicyNotAuthorized, policy.enforce, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, action, target) def _test_build_subattribute_match_rule(self, validate_value): @@ -466,7 +467,7 @@ class NeutronPolicyTestCase(base.BaseTestCase): action = "create_" + FAKE_RESOURCE_NAME target = {'tenant_id': 'fake', 'attr': {'sub_attr_1': 'x', 'sub_attr_2': 'y'}} - self.assertRaises(common_policy.PolicyNotAuthorized, policy.enforce, + self.assertRaises(oslo_policy.PolicyNotAuthorized, policy.enforce, self.context, action, target, None) def test_enforce_regularuser_on_read(self): @@ -529,9 +530,9 @@ class NeutronPolicyTestCase(base.BaseTestCase): def fakegetnetwork(*args, **kwargs): return {'tenant_id': 'fake'} - del self.rules['admin_or_network_owner'] - self.rules['admin_or_network_owner'] = common_policy.parse_rule( - "role:admin or tenant_id:%(network_tenant_id)s") + self._set_rules( + admin_or_network_owner="role:admin or " + "tenant_id:%(network_tenant_id)s") action = "create_port:mac" with mock.patch.object(manager.NeutronManager.get_instance().plugin, 'get_network', new=fakegetnetwork): @@ -543,11 +544,11 @@ class NeutronPolicyTestCase(base.BaseTestCase): # Try and add a bad rule self.assertRaises( exceptions.PolicyInitError, - common_policy.parse_rule, - 'tenant_id:(wrong_stuff)') + oslo_policy.Rules.from_dict, + {'test_policy': 'tenant_id:(wrong_stuff)'}) def _test_enforce_tenant_id_raises(self, bad_rule): - self.rules['admin_or_owner'] = common_policy.parse_rule(bad_rule) + self._set_rules(admin_or_owner=bad_rule) # Trigger a policy with rule admin_or_owner action = "create_network" target = {'tenant_id': 'fake'} @@ -565,20 +566,18 @@ class NeutronPolicyTestCase(base.BaseTestCase): def test_process_rules(self): action = "create_" + FAKE_RESOURCE_NAME # Construct RuleChecks for an action, attribute and subattribute - match_rule = common_policy.RuleCheck('rule', action) - attr_rule = common_policy.RuleCheck('rule', '%s:%ss' % - (action, - FAKE_RESOURCE_NAME)) - sub_attr_rules = [common_policy.RuleCheck('rule', '%s:%s:%s' % - (action, 'attr', - 'sub_attr_1'))] + match_rule = oslo_policy.RuleCheck('rule', action) + attr_rule = oslo_policy.RuleCheck( + 'rule', '%s:%ss' % (action, FAKE_RESOURCE_NAME)) + sub_attr_rules = [oslo_policy.RuleCheck( + 'rule', '%s:%s:%s' % (action, 'attr', 'sub_attr_1'))] # Build an AndCheck from the given RuleChecks # Make the checks nested to better check the recursion - sub_attr_rules = common_policy.AndCheck(sub_attr_rules) - attr_rule = common_policy.AndCheck( + sub_attr_rules = oslo_policy.AndCheck(sub_attr_rules) + attr_rule = oslo_policy.AndCheck( [attr_rule, sub_attr_rules]) - match_rule = common_policy.AndCheck([match_rule, attr_rule]) + match_rule = oslo_policy.AndCheck([match_rule, attr_rule]) # Assert that the rules are correctly extracted from the match_rule rules = policy._process_rules_list([], match_rule) self.assertEqual(['create_fake_resource', @@ -588,6 +587,6 @@ class NeutronPolicyTestCase(base.BaseTestCase): @mock.patch.object(policy.LOG, 'isEnabledFor', return_value=True) @mock.patch.object(policy.LOG, 'debug') def test_log_rule_list(self, mock_debug, mock_is_e): - policy.log_rule_list(common_policy.RuleCheck('rule', 'create_')) + policy.log_rule_list(oslo_policy.RuleCheck('rule', 'create_')) self.assertTrue(mock_is_e.called) self.assertTrue(mock_debug.called) diff --git a/openstack-common.conf b/openstack-common.conf index 549005c12ec..c5421f062d7 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -6,7 +6,6 @@ module=fileutils module=install_venv_common module=loopingcall module=periodic_task -module=policy module=service module=systemd module=threadgroup diff --git a/requirements.txt b/requirements.txt index 101d0e31dd2..48a1b51fc33 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,6 +30,7 @@ oslo.i18n>=1.5.0 # Apache-2.0 oslo.log>=1.0.0 # Apache-2.0 oslo.messaging>=1.8.0 # Apache-2.0 oslo.middleware>=1.2.0 # Apache-2.0 +oslo.policy>=0.5.0 # Apache-2.0 oslo.rootwrap>=1.6.0 # Apache-2.0 oslo.serialization>=1.4.0 # Apache-2.0 oslo.utils>=1.4.0 # Apache-2.0 From 303f37f4e0c84f90e40b95731a828fc6ce8a0bbf Mon Sep 17 00:00:00 2001 From: Cyril Roelandt Date: Mon, 8 Jun 2015 16:09:49 +0000 Subject: [PATCH 045/161] Python 3: use next() instead of iterator.next() The latter only works in Python 2. Also define a __next__ method in the classes that define a next method. Change-Id: Iaa1a1e500facab50d8bcdffda39ccad3f2e4e9bb Blueprint: neutron-python3 --- neutron/agent/linux/ip_lib.py | 8 ++++---- neutron/db/model_base.py | 4 +++- neutron/ipam/subnet_alloc.py | 2 +- neutron/plugins/ml2/drivers/type_tunnel.py | 4 ++-- neutron/tests/tempest/common/glance_http.py | 4 +++- neutron/tests/unit/agent/l3/test_agent.py | 4 ++-- tox.ini | 4 ++++ 7 files changed, 19 insertions(+), 11 deletions(-) diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index ce5dec796d1..32fe1f9ac84 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -557,13 +557,13 @@ class IpRouteCommand(IpDeviceCommandBase): ).split('\n') for subnet_route_line in subnet_route_list_lines: i = iter(subnet_route_line.split()) - while(i.next() != 'dev'): + while(next(i) != 'dev'): pass - device = i.next() + device = next(i) try: - while(i.next() != 'src'): + while(next(i) != 'src'): pass - src = i.next() + src = next(i) except Exception: src = '' if device != interface_name: diff --git a/neutron/db/model_base.py b/neutron/db/model_base.py index b613447d4a8..e1abbd5533a 100644 --- a/neutron/db/model_base.py +++ b/neutron/db/model_base.py @@ -28,9 +28,11 @@ class NeutronBase(models.ModelBase): return self def next(self): - n = self._i.next().name + n = next(self._i).name return n, getattr(self, n) + __next__ = next + def __repr__(self): """sqlalchemy based automatic __repr__ method.""" items = ['%s=%r' % (col.name, getattr(self, col.name)) diff --git a/neutron/ipam/subnet_alloc.py b/neutron/ipam/subnet_alloc.py index 49b6eda2ab5..ff9b30c9a58 100644 --- a/neutron/ipam/subnet_alloc.py +++ b/neutron/ipam/subnet_alloc.py @@ -93,7 +93,7 @@ class SubnetAllocator(driver.Pool): prefix_pool = self._get_available_prefix_list() for prefix in prefix_pool: if request.prefixlen >= prefix.prefixlen: - subnet = prefix.subnet(request.prefixlen).next() + subnet = next(prefix.subnet(request.prefixlen)) gateway_ip = request.gateway_ip if not gateway_ip: gateway_ip = subnet.network + 1 diff --git a/neutron/plugins/ml2/drivers/type_tunnel.py b/neutron/plugins/ml2/drivers/type_tunnel.py index 12dce86f48f..14904b31d8a 100644 --- a/neutron/plugins/ml2/drivers/type_tunnel.py +++ b/neutron/plugins/ml2/drivers/type_tunnel.py @@ -40,7 +40,7 @@ class TunnelTypeDriver(helpers.SegmentTypeDriver): def __init__(self, model): super(TunnelTypeDriver, self).__init__(model) - self.segmentation_key = iter(self.primary_keys).next() + self.segmentation_key = next(iter(self.primary_keys)) @abc.abstractmethod def sync_allocations(self): @@ -203,7 +203,7 @@ class EndpointTunnelTypeDriver(TunnelTypeDriver): def __init__(self, segment_model, endpoint_model): super(EndpointTunnelTypeDriver, self).__init__(segment_model) self.endpoint_model = endpoint_model - self.segmentation_key = iter(self.primary_keys).next() + self.segmentation_key = next(iter(self.primary_keys)) def get_endpoint_by_host(self, host): LOG.debug("get_endpoint_by_host() called for host %s", host) diff --git a/neutron/tests/tempest/common/glance_http.py b/neutron/tests/tempest/common/glance_http.py index 6cdbadc3bab..0a6f985e7c6 100644 --- a/neutron/tests/tempest/common/glance_http.py +++ b/neutron/tests/tempest/common/glance_http.py @@ -367,7 +367,7 @@ class ResponseBodyIterator(object): def __iter__(self): while True: - yield self.next() + yield next(self) def next(self): chunk = self.resp.read(CHUNKSIZE) @@ -375,3 +375,5 @@ class ResponseBodyIterator(object): return chunk else: raise StopIteration() + + __next__ = next diff --git a/neutron/tests/unit/agent/l3/test_agent.py b/neutron/tests/unit/agent/l3/test_agent.py index 577eef30c75..aeec5c6f1c2 100644 --- a/neutron/tests/unit/agent/l3/test_agent.py +++ b/neutron/tests/unit/agent/l3/test_agent.py @@ -136,8 +136,8 @@ def router_append_subnet(router, count=1, ip_version=4, interfaces = copy.deepcopy(router.get(l3_constants.INTERFACE_KEY, [])) if interface_id: try: - interface = (i for i in interfaces - if i['id'] == interface_id).next() + interface = next(i for i in interfaces + if i['id'] == interface_id) except StopIteration: raise ValueError("interface_id not found") diff --git a/tox.ini b/tox.ini index 636a2a37739..d7cf102ed1e 100644 --- a/tox.ini +++ b/tox.ini @@ -113,6 +113,8 @@ commands = python -m testtools.run \ neutron.tests.unit.plugins.ml2.drivers.ext_test \ neutron.tests.unit.plugins.ml2.drivers.mech_sriov.test_mech_sriov_nic_switch \ neutron.tests.unit.plugins.ml2.drivers.mech_fake_agent \ + neutron.tests.unit.plugins.ml2.drivers.test_type_vxlan \ + neutron.tests.unit.plugins.ml2.drivers.test_type_gre \ neutron.tests.unit.plugins.ml2.drivers.arista.test_mechanism_arista \ neutron.tests.unit.plugins.ml2.drivers.test_type_local \ neutron.tests.unit.plugins.ml2.drivers.mechanism_logger \ @@ -151,6 +153,7 @@ commands = python -m testtools.run \ neutron.tests.unit.agent.l3.test_dvr_fip_ns \ neutron.tests.unit.agent.common.test_config \ neutron.tests.unit.agent.common.test_polling \ + neutron.tests.unit.agent.linux.test_ip_lib \ neutron.tests.unit.agent.linux.test_keepalived \ neutron.tests.unit.agent.linux.test_ipset_manager \ neutron.tests.unit.agent.linux.test_ebtables_manager \ @@ -176,6 +179,7 @@ commands = python -m testtools.run \ neutron.tests.unit.cmd.test_netns_cleanup \ neutron.tests.unit.ipam.drivers.neutrondb_ipam.test_db_api \ neutron.tests.unit.ipam.drivers.neutrondb_ipam.test_driver \ + neutron.tests.unit.ipam.test_subnet_alloc \ neutron.tests.unit.notifiers.test_nova \ neutron.tests.unit.notifiers.test_batch_notifier From 6886655b491aede40aa9f4a0bd4c6d402d5a7a78 Mon Sep 17 00:00:00 2001 From: Salvatore Orlando Date: Tue, 28 Apr 2015 04:59:35 -0700 Subject: [PATCH 046/161] Context: Remove logic for read_deleted and deprecate it The read_deleted parameter in the Context object is simply unused. This patch removes associated logic, and for what is worth, adds deprecation warnings against explicit usage of read_deleted when creating a context instance, generate an admin context, and elevating a context instance. Change-Id: Ic69d22dc229ebe8fac1f6be0c4860d19732505b1 Closes-Bug: #1449462 --- neutron/context.py | 36 ++++--------------- neutron/tests/functional/db/test_ipam.py | 1 - .../unit/_test_extension_portbindings.py | 15 +++----- 3 files changed, 12 insertions(+), 40 deletions(-) diff --git a/neutron/context.py b/neutron/context.py index ee6ca8ed7d4..3debe4ccd90 100644 --- a/neutron/context.py +++ b/neutron/context.py @@ -36,15 +36,12 @@ class ContextBase(oslo_context.RequestContext): """ - def __init__(self, user_id, tenant_id, is_admin=None, read_deleted="no", - roles=None, timestamp=None, request_id=None, tenant_name=None, + @removals.removed_kwarg('read_deleted') + def __init__(self, user_id, tenant_id, is_admin=None, roles=None, + timestamp=None, request_id=None, tenant_name=None, user_name=None, overwrite=True, auth_token=None, **kwargs): """Object initialization. - :param read_deleted: 'no' indicates deleted records are hidden, 'yes' - indicates deleted records are visible, 'only' indicates that - *only* deleted records are visible. - :param overwrite: Set to False to ensure that the greenthread local copy of the index is not overwritten. @@ -59,7 +56,6 @@ class ContextBase(oslo_context.RequestContext): self.user_name = user_name self.tenant_name = tenant_name - self.read_deleted = read_deleted if not timestamp: timestamp = datetime.datetime.utcnow() self.timestamp = timestamp @@ -89,28 +85,12 @@ class ContextBase(oslo_context.RequestContext): def user_id(self, user_id): self.user = user_id - def _get_read_deleted(self): - return self._read_deleted - - def _set_read_deleted(self, read_deleted): - if read_deleted not in ('no', 'yes', 'only'): - raise ValueError(_("read_deleted can only be one of 'no', " - "'yes' or 'only', not %r") % read_deleted) - self._read_deleted = read_deleted - - def _del_read_deleted(self): - del self._read_deleted - - read_deleted = property(_get_read_deleted, _set_read_deleted, - _del_read_deleted) - def to_dict(self): context = super(ContextBase, self).to_dict() context.update({ 'user_id': self.user_id, 'tenant_id': self.tenant_id, 'project_id': self.project_id, - 'read_deleted': self.read_deleted, 'roles': self.roles, 'timestamp': str(self.timestamp), 'tenant_name': self.tenant_name, @@ -123,6 +103,7 @@ class ContextBase(oslo_context.RequestContext): def from_dict(cls, values): return cls(**values) + @removals.removed_kwarg('read_deleted') def elevated(self, read_deleted=None): """Return a version of this context with admin flag set.""" context = copy.copy(self) @@ -131,9 +112,6 @@ class ContextBase(oslo_context.RequestContext): if 'admin' not in [x.lower() for x in context.roles]: context.roles = context.roles + ["admin"] - if read_deleted is not None: - context.read_deleted = read_deleted - return context @@ -145,17 +123,17 @@ class Context(ContextBase): return self._session +@removals.removed_kwarg('read_deleted') @removals.removed_kwarg('load_admin_roles') def get_admin_context(read_deleted="no", load_admin_roles=True): return Context(user_id=None, tenant_id=None, is_admin=True, - read_deleted=read_deleted, overwrite=False) +@removals.removed_kwarg('read_deleted') def get_admin_context_without_session(read_deleted="no"): return ContextBase(user_id=None, tenant_id=None, - is_admin=True, - read_deleted=read_deleted) + is_admin=True) diff --git a/neutron/tests/functional/db/test_ipam.py b/neutron/tests/functional/db/test_ipam.py index 3c3a9d163a4..c30b72b5579 100644 --- a/neutron/tests/functional/db/test_ipam.py +++ b/neutron/tests/functional/db/test_ipam.py @@ -36,7 +36,6 @@ def get_admin_test_context(db_url): ctx = context.Context(user_id=None, tenant_id=None, is_admin=True, - read_deleted="no", overwrite=False) facade = session.EngineFacade(db_url, mysql_sql_mode='STRICT_ALL_TABLES') ctx._session = facade.get_session(autocommit=False, expire_on_commit=True) diff --git a/neutron/tests/unit/_test_extension_portbindings.py b/neutron/tests/unit/_test_extension_portbindings.py index b3d82abcca7..42840d410f5 100644 --- a/neutron/tests/unit/_test_extension_portbindings.py +++ b/neutron/tests/unit/_test_extension_portbindings.py @@ -58,8 +58,7 @@ class PortBindingsTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase): def _get_non_admin_context(self): return context.Context(user_id=None, tenant_id=self._tenant_id, - is_admin=False, - read_deleted="no") + is_admin=False) def test_port_vif_details(self): with self.port(name='name') as port: @@ -204,8 +203,7 @@ class PortBindingsHostTestCaseMixin(object): # By default user is admin - now test non admin user ctx = context.Context(user_id=None, tenant_id=self._tenant_id, - is_admin=False, - read_deleted="no") + is_admin=False) non_admin_port = self._show( 'ports', port_id, neutron_context=ctx)['port'] self._check_response_no_portbindings_host(non_admin_port) @@ -227,8 +225,7 @@ class PortBindingsHostTestCaseMixin(object): # By default user is admin - now test non admin user ctx = context.Context(user_id=None, tenant_id=self._tenant_id, - is_admin=False, - read_deleted="no") + is_admin=False) ports = self._list('ports', neutron_context=ctx)['ports'] self.assertEqual(2, len(ports)) for non_admin_port in ports: @@ -319,8 +316,7 @@ class PortBindingsVnicTestCaseMixin(object): # By default user is admin - now test non admin user ctx = context.Context(user_id=None, tenant_id=self._tenant_id, - is_admin=False, - read_deleted="no") + is_admin=False) non_admin_port = self._show( 'ports', port_id, neutron_context=ctx)['port'] self._check_response_portbindings_vnic_type(non_admin_port) @@ -342,8 +338,7 @@ class PortBindingsVnicTestCaseMixin(object): # By default user is admin - now test non admin user ctx = context.Context(user_id=None, tenant_id=self._tenant_id, - is_admin=False, - read_deleted="no") + is_admin=False) ports = self._list('ports', neutron_context=ctx)['ports'] self.assertEqual(2, len(ports)) for non_admin_port in ports: From f08e9f1f53efa97e07f21ca72a940fcbeb4570e5 Mon Sep 17 00:00:00 2001 From: Jeremy Stanley Date: Wed, 20 May 2015 01:03:59 +0000 Subject: [PATCH 047/161] Switch from MySQL-python to PyMySQL As discussed in the Liberty Design Summit "Moving apps to Python 3" cross-project workshop, the way forward in the near future is to switch to the pure-python PyMySQL library as a default. https://etherpad.openstack.org/p/liberty-cross-project-python3 Change-Id: I73e0fdb6eca70e7d029a40a2f6f17a7c0797a21d --- etc/neutron.conf | 2 +- etc/neutron/plugins/oneconvergence/nvsdplugin.ini | 2 +- neutron/db/migration/migrate_to_ml2.py | 2 +- neutron/plugins/brocade/README.md | 2 +- neutron/tests/fullstack/base.py | 9 +++++---- neutron/tests/functional/requirements.txt | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/etc/neutron.conf b/etc/neutron.conf index 5b58519d0ea..7a11b939fb5 100755 --- a/etc/neutron.conf +++ b/etc/neutron.conf @@ -708,7 +708,7 @@ admin_password = %SERVICE_PASSWORD% [database] # This line MUST be changed to actually run the plugin. # Example: -# connection = mysql://root:pass@127.0.0.1:3306/neutron +# connection = mysql+pymysql://root:pass@127.0.0.1:3306/neutron # Replace 127.0.0.1 above with the IP address of the database used by the # main neutron server. (Leave it as is if the database runs on this host.) # connection = sqlite:// diff --git a/etc/neutron/plugins/oneconvergence/nvsdplugin.ini b/etc/neutron/plugins/oneconvergence/nvsdplugin.ini index a1c05d971e3..2d8cc77a504 100644 --- a/etc/neutron/plugins/oneconvergence/nvsdplugin.ini +++ b/etc/neutron/plugins/oneconvergence/nvsdplugin.ini @@ -32,4 +32,4 @@ # root_helper = sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf [database] -# connection = mysql://root:@127.0.0.1/?charset=utf8 +# connection = mysql+pymysql://root:@127.0.0.1/?charset=utf8 diff --git a/neutron/db/migration/migrate_to_ml2.py b/neutron/db/migration/migrate_to_ml2.py index e6c5db332fd..e1b9579bcd5 100755 --- a/neutron/db/migration/migrate_to_ml2.py +++ b/neutron/db/migration/migrate_to_ml2.py @@ -32,7 +32,7 @@ Known Limitations: Example usage: python -m neutron.db.migration.migrate_to_ml2 openvswitch \ - mysql://login:pass@127.0.0.1/neutron + mysql+pymysql://login:pass@127.0.0.1/neutron Note that migration of tunneling state will only be attempted if the --tunnel-type parameter is provided. diff --git a/neutron/plugins/brocade/README.md b/neutron/plugins/brocade/README.md index 82b3ad89d83..1baa3124746 100644 --- a/neutron/plugins/brocade/README.md +++ b/neutron/plugins/brocade/README.md @@ -76,7 +76,7 @@ the configuration file specified in the brocade.ini files: ostype = NOS [database] - connection = mysql://root:pass@localhost/brocade_neutron?charset=utf8 + connection = mysql+pymysql://root:pass@localhost/brocade_neutron?charset=utf8 (please see list of more configuration parameters in the brocade.ini file) diff --git a/neutron/tests/fullstack/base.py b/neutron/tests/fullstack/base.py index 9fed9f3e621..c886bd5e790 100644 --- a/neutron/tests/fullstack/base.py +++ b/neutron/tests/fullstack/base.py @@ -52,10 +52,11 @@ class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase): we only support MySQL for now, but the groundwork for adding Postgres is already laid. """ - conn = "mysql://%(username)s:%(password)s@127.0.0.1/%(db_name)s" % { - 'username': test_base.DbFixture.USERNAME, - 'password': test_base.DbFixture.PASSWORD, - 'db_name': self.engine.url.database} + conn = ("mysql+pymysql://%(username)s:%(password)s" + "@127.0.0.1/%(db_name)s" % { + 'username': test_base.DbFixture.USERNAME, + 'password': test_base.DbFixture.PASSWORD, + 'db_name': self.engine.url.database}) self.original_conn = cfg.CONF.database.connection self.addCleanup(self._revert_connection_address) diff --git a/neutron/tests/functional/requirements.txt b/neutron/tests/functional/requirements.txt index 0c5f2215b44..2d664cb354a 100644 --- a/neutron/tests/functional/requirements.txt +++ b/neutron/tests/functional/requirements.txt @@ -5,4 +5,4 @@ # process, which may cause wedges in the gate later. psycopg2 -MySQL-python +PyMySQL>=0.6.2 # MIT License From e33d92c894df4664d01d040ba4305c7cb4ef6e27 Mon Sep 17 00:00:00 2001 From: Fawad Khaliq Date: Tue, 9 Jun 2015 22:18:18 -0700 Subject: [PATCH 048/161] Added networking-plumgrid in plugin requirements Closes-Bug: 1463665 Change-Id: I7152dedd83659ee51274be31ef305af9e82d695a --- neutron/plugins/plumgrid/requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 neutron/plugins/plumgrid/requirements.txt diff --git a/neutron/plugins/plumgrid/requirements.txt b/neutron/plugins/plumgrid/requirements.txt new file mode 100644 index 00000000000..9d9d8a09cff --- /dev/null +++ b/neutron/plugins/plumgrid/requirements.txt @@ -0,0 +1 @@ +networking-plumgrid From 328b72cf8c5f514434de0b73c9137bde52b5eeea Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Wed, 10 Jun 2015 07:04:25 +0000 Subject: [PATCH 049/161] Revert "Defer segment lookup in NetworkContext object" This reverts commit e61865807c4c8ff959a7746fe3e17f1ae574c9d0. This patch likely violated the idea of a NetworkContext being a snapshot of the network at the time it was created. This needs a different approach. Change-Id: I20b132a0181d35b0517330fb7fbf293c3e979d0e --- neutron/plugins/ml2/driver_context.py | 7 +- .../unit/plugins/ml2/test_driver_context.py | 69 +++++++------------ 2 files changed, 25 insertions(+), 51 deletions(-) diff --git a/neutron/plugins/ml2/driver_context.py b/neutron/plugins/ml2/driver_context.py index 6e9b295b594..ef418fe16e2 100644 --- a/neutron/plugins/ml2/driver_context.py +++ b/neutron/plugins/ml2/driver_context.py @@ -42,8 +42,8 @@ class NetworkContext(MechanismDriverContext, api.NetworkContext): super(NetworkContext, self).__init__(plugin, plugin_context) self._network = network self._original_network = original_network - self._segments = None - self._session = plugin_context.session + self._segments = db.get_network_segments(plugin_context.session, + network['id']) @property def current(self): @@ -55,9 +55,6 @@ class NetworkContext(MechanismDriverContext, api.NetworkContext): @property def network_segments(self): - if not self._segments: - self._segments = db.get_network_segments(self._session, - self._network['id']) return self._segments diff --git a/neutron/tests/unit/plugins/ml2/test_driver_context.py b/neutron/tests/unit/plugins/ml2/test_driver_context.py index 8171071b6c2..e30349c9c6c 100644 --- a/neutron/tests/unit/plugins/ml2/test_driver_context.py +++ b/neutron/tests/unit/plugins/ml2/test_driver_context.py @@ -37,12 +37,13 @@ class TestPortContext(base.BaseTestCase): port = {'device_owner': constants.DEVICE_OWNER_DVR_INTERFACE} binding.host = 'foohost' - ctx = driver_context.PortContext(plugin, - plugin_context, - port, - network, - binding, - None) + with mock.patch.object(driver_context.db, 'get_network_segments'): + ctx = driver_context.PortContext(plugin, + plugin_context, + port, + network, + binding, + None) self.assertEqual('foohost', ctx.host) def test_host_super(self): @@ -55,12 +56,13 @@ class TestPortContext(base.BaseTestCase): portbindings.HOST_ID: 'host'} binding.host = 'foohost' - ctx = driver_context.PortContext(plugin, - plugin_context, - port, - network, - binding, - None) + with mock.patch.object(driver_context.db, 'get_network_segments'): + ctx = driver_context.PortContext(plugin, + plugin_context, + port, + network, + binding, + None) self.assertEqual('host', ctx.host) def test_status(self): @@ -72,12 +74,13 @@ class TestPortContext(base.BaseTestCase): port = {'device_owner': constants.DEVICE_OWNER_DVR_INTERFACE} binding.status = 'foostatus' - ctx = driver_context.PortContext(plugin, - plugin_context, - port, - network, - binding, - None) + with mock.patch.object(driver_context.db, 'get_network_segments'): + ctx = driver_context.PortContext(plugin, + plugin_context, + port, + network, + binding, + None) self.assertEqual('foostatus', ctx.status) def test_status_super(self): @@ -90,37 +93,11 @@ class TestPortContext(base.BaseTestCase): 'status': 'status'} binding.status = 'foostatus' - ctx = driver_context.PortContext(plugin, - plugin_context, - port, - network, - binding, - None) - self.assertEqual('status', ctx.status) - - def test_segments_lazy_lookup(self): - plugin = mock.Mock() - plugin_context = mock.Mock() - network = mock.MagicMock() - binding = mock.Mock() - - port = {'device_owner': 'compute', - 'status': 'status'} - binding.status = 'foostatus' - - with mock.patch.object(driver_context.db, - 'get_network_segments') as gs: + with mock.patch.object(driver_context.db, 'get_network_segments'): ctx = driver_context.PortContext(plugin, plugin_context, port, network, binding, None) - self.assertFalse(gs.called) - # accessing the network_segments property should trigger - # a lookup the first time - seg = ctx.network.network_segments - self.assertTrue(gs.called) - gs.reset_mock() - self.assertEqual(seg, ctx.network.network_segments) - self.assertFalse(gs.called) + self.assertEqual('status', ctx.status) From da42745c466c14e6dbe58cdbc830ae5d1c8bb114 Mon Sep 17 00:00:00 2001 From: Jakub Libosvar Date: Tue, 9 Jun 2015 16:08:50 +0000 Subject: [PATCH 050/161] Introduce functions using arping executable The arpinger is gonna be used in the next changeset introducing connection testers. Change-Id: I90ae32c2f52f1debfb11ae2a08b2828ee2be04cc --- neutron/tests/common/net_helpers.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/neutron/tests/common/net_helpers.py b/neutron/tests/common/net_helpers.py index 8884c66966c..cce352d0cbf 100644 --- a/neutron/tests/common/net_helpers.py +++ b/neutron/tests/common/net_helpers.py @@ -81,6 +81,31 @@ def assert_no_ping(src_namespace, dst_ip, timeout=1, count=1): {'ns': src_namespace, 'destination': dst_ip}) +def assert_arping(src_namespace, dst_ip, source=None, timeout=1, count=1): + """Send arp request using arping executable. + + NOTE: ARP protocol is used in IPv4 only. IPv6 uses Neighbour Discovery + Protocol instead. + """ + ns_ip_wrapper = ip_lib.IPWrapper(src_namespace) + arping_cmd = ['arping', '-c', count, '-w', timeout] + if source: + arping_cmd.extend(['-s', source]) + arping_cmd.append(dst_ip) + ns_ip_wrapper.netns.execute(arping_cmd) + + +def assert_no_arping(src_namespace, dst_ip, source=None, timeout=1, count=1): + try: + assert_arping(src_namespace, dst_ip, source, timeout, count) + except RuntimeError: + pass + else: + tools.fail("destination ip %(destination)s is replying to arp from " + "namespace %(ns)s, but it shouldn't" % + {'ns': src_namespace, 'destination': dst_ip}) + + class NamespaceFixture(fixtures.Fixture): """Create a namespace. From 1c124a309bc941c078b8bb622ea248a3ed3829e1 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Tue, 9 Jun 2015 11:28:10 +0200 Subject: [PATCH 051/161] Switch to os-testr to control testr It's a nice wrapper spinned out recently from tempest-lib that should cover all our needs that we currently fulfill with pretty_tox.sh. Change-Id: I2268ed45ab628fe5dcab657d6287594847ab587c --- test-requirements.txt | 1 + tools/pretty_tox.sh | 6 ------ tox.ini | 4 ++-- 3 files changed, 3 insertions(+), 8 deletions(-) delete mode 100755 tools/pretty_tox.sh diff --git a/test-requirements.txt b/test-requirements.txt index be4bd087cbc..6a6436aa3fd 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -16,4 +16,5 @@ testtools>=0.9.36,!=1.2.0 testscenarios>=0.4 WebTest>=2.0 oslotest>=1.5.1 # Apache-2.0 +os-testr>=0.1.0 tempest-lib>=0.5.0 diff --git a/tools/pretty_tox.sh b/tools/pretty_tox.sh deleted file mode 100755 index 0fc360530d5..00000000000 --- a/tools/pretty_tox.sh +++ /dev/null @@ -1,6 +0,0 @@ -#! /bin/sh - -TESTRARGS=$1 - -exec 3>&1 -status=$(exec 4>&1 >&3; ( python setup.py testr --slowest --testr-args="--subunit $TESTRARGS"; echo $? >&4 ) | subunit-trace -f) && exit $status diff --git a/tox.ini b/tox.ini index bd28ed3e269..8f9cf95dc9d 100644 --- a/tox.ini +++ b/tox.ini @@ -12,8 +12,8 @@ deps = -r{toxinidir}/requirements.txt whitelist_externals = sh commands = dsvm-functional: {toxinidir}/tools/deploy_rootwrap.sh {toxinidir} {envdir}/etc {envdir}/bin - sh tools/pretty_tox.sh '{posargs}' -# there is also secret magic in pretty_tox.sh which lets you run in a fail only + ostestr --regex '{posargs}' +# there is also secret magic in ostestr which lets you run in a fail only # mode. To do this define the TRACE_FAILONLY environmental variable. [testenv:api] From eeacb95e65a749ce3a032246c36d10cad9df22b1 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Wed, 10 Jun 2015 13:10:54 +0200 Subject: [PATCH 052/161] Actually allow to pass TRACE_FAILONLY to ostestr The comment below suggests to use TRACE_FAILONLY to fail quickly when running unit tests, while tox 2.0 does not allow to pass envvars from the cli caller unless they are explicitly mentioned in passenv= directive. Change-Id: I6861498e7609b0c21fad844009420ea9734e2352 --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 8f9cf95dc9d..ab568012d70 100644 --- a/tox.ini +++ b/tox.ini @@ -5,6 +5,7 @@ skipsdist = True [testenv] setenv = VIRTUAL_ENV={envdir} +passenv = TRACE_FAILONLY usedevelop = True install_command = pip install -U {opts} {packages} deps = -r{toxinidir}/requirements.txt From 87fecfcc50f371d8dd593b3cd372da9db56f39c6 Mon Sep 17 00:00:00 2001 From: "Sean M. Collins" Date: Wed, 10 Jun 2015 10:29:33 -0400 Subject: [PATCH 053/161] Make Vlantransparent extension inherit from ExtensionDescriptor Change-Id: Ic615578a1fe1d401b53d0b44ff5275d9518b97fd --- neutron/extensions/vlantransparent.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neutron/extensions/vlantransparent.py b/neutron/extensions/vlantransparent.py index 4c2d8f980d8..3965d476355 100644 --- a/neutron/extensions/vlantransparent.py +++ b/neutron/extensions/vlantransparent.py @@ -15,6 +15,7 @@ from oslo_config import cfg from oslo_log import log as logging +from neutron.api import extensions from neutron.api.v2 import attributes from neutron.common import exceptions as nexception from neutron.i18n import _LI @@ -45,7 +46,7 @@ def disable_extension_by_config(aliases): LOG.info(_LI('Disabled vlantransparent extension.')) -class Vlantransparent(object): +class Vlantransparent(extensions.ExtensionDescriptor): """Extension class supporting vlan transparent networks.""" @classmethod From ca63dfd0f39c7d691247c146b7529937c5804c9e Mon Sep 17 00:00:00 2001 From: Romil Gupta Date: Wed, 10 Jun 2015 09:43:56 -0700 Subject: [PATCH 054/161] Remove useless pass from methods in type_tunnel.py The pass is useless because there is a docstring in the methods. Generally considered as uncovered by coverage tool. Change-Id: Id1275c51e9adb865a3da9f0db007f3092b55b140 --- neutron/plugins/ml2/drivers/type_tunnel.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/neutron/plugins/ml2/drivers/type_tunnel.py b/neutron/plugins/ml2/drivers/type_tunnel.py index 12dce86f48f..02025cb65a3 100644 --- a/neutron/plugins/ml2/drivers/type_tunnel.py +++ b/neutron/plugins/ml2/drivers/type_tunnel.py @@ -53,7 +53,6 @@ class TunnelTypeDriver(helpers.SegmentTypeDriver): param ip: the IP address of the endpoint param host: the Host name of the endpoint """ - pass @abc.abstractmethod def get_endpoints(self): @@ -62,7 +61,6 @@ class TunnelTypeDriver(helpers.SegmentTypeDriver): :returns a list of dict [{ip_address:endpoint_ip, host:endpoint_host}, ..] """ - pass @abc.abstractmethod def get_endpoint_by_host(self, host): @@ -75,7 +73,6 @@ class TunnelTypeDriver(helpers.SegmentTypeDriver): else :returns None """ - pass @abc.abstractmethod def get_endpoint_by_ip(self, ip): @@ -88,7 +85,6 @@ class TunnelTypeDriver(helpers.SegmentTypeDriver): else :returns None """ - pass @abc.abstractmethod def delete_endpoint(self, ip): @@ -96,7 +92,6 @@ class TunnelTypeDriver(helpers.SegmentTypeDriver): param ip: the IP address of the endpoint """ - pass def _initialize(self, raw_tunnel_ranges): self.tunnel_ranges = [] From 27df3e9fb98407e94bdeb9df493a9a3a0be639ca Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Mon, 1 Jun 2015 22:29:39 +0200 Subject: [PATCH 055/161] Ensure no "agent" functional tests are skipped in the gate Some "agent" functional tests[1] can be skipped if some requirements are not satisfied in order to allow developers to run functional tests on various environments. These tests should not be skipped in the gate. This change defines the decorator no_skip_on_missing_deps[2] to ensure no "agent" functional tests are skipped in the gate. More precisely no_skip_on_missing_deps transforms a skipTest into an error in: * dsvm-functional and dsvm-fullstack jobs, * functional and fullstack jobs when OS_FAIL_ON_MISSING_DEPS is evaluated as True. The change enlarges OS_FAIL_ON_MISSING_DEPS environment variable scope (ie: missing dependencies + system requirements). [1] in neutron.tests.functional [2] in neutron.tests.common.base Change-Id: Iacd4a5ef249fc1d7c75135ead9d0cf99d8a98a06 Closes-Bug: #1459844 --- neutron/tests/common/base.py | 27 +++++++++++++++++++ .../tests/functional/agent/test_ovs_flows.py | 9 +++++-- neutron/tests/functional/base.py | 7 +++-- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/neutron/tests/common/base.py b/neutron/tests/common/base.py index 5d1fbb3f031..11499e8050e 100644 --- a/neutron/tests/common/base.py +++ b/neutron/tests/common/base.py @@ -11,8 +11,14 @@ # under the License. # +import functools +import unittest.case + +import testtools.testcase + from neutron.common import constants as n_const from neutron.tests import base +from neutron.tests import tools def create_resource(prefix, creation_func, *args, **kwargs): @@ -40,3 +46,24 @@ def create_resource(prefix, creation_func, *args, **kwargs): return creation_func(name, *args, **kwargs) except RuntimeError: pass + + +def no_skip_on_missing_deps(wrapped): + """Do not allow a method/test to skip on missing dependencies. + + This decorator raises an error if a skip is raised by wrapped method when + OS_FAIL_ON_MISSING_DEPS is evaluated to True. This decorator should be used + only for missing dependencies (including missing system requirements). + """ + + @functools.wraps(wrapped) + def wrapper(*args, **kwargs): + try: + return wrapped(*args, **kwargs) + except (testtools.TestCase.skipException, unittest.case.SkipTest) as e: + if base.bool_from_env('OS_FAIL_ON_MISSING_DEPS'): + tools.fail( + '%s cannot be skipped because OS_FAIL_ON_MISSING_DEPS ' + 'is enabled, skip reason: %s' % (wrapped.__name__, e)) + raise + return wrapper diff --git a/neutron/tests/functional/agent/test_ovs_flows.py b/neutron/tests/functional/agent/test_ovs_flows.py index 90107d85552..0108577bb0b 100644 --- a/neutron/tests/functional/agent/test_ovs_flows.py +++ b/neutron/tests/functional/agent/test_ovs_flows.py @@ -23,6 +23,7 @@ from neutron.agent.linux import ip_lib from neutron.cmd.sanity import checks from neutron.plugins.openvswitch.agent import ovs_neutron_agent as ovsagt from neutron.plugins.openvswitch.common import constants +from neutron.tests.common import base as common_base from neutron.tests.common import net_helpers from neutron.tests.functional.agent import test_ovs_lib from neutron.tests.functional import base @@ -85,12 +86,11 @@ class _OVSAgentOFCtlTestBase(_OVSAgentTestBase): class _ARPSpoofTestCase(object): def setUp(self): - if not checks.arp_header_match_supported(): - self.skipTest("ARP header matching not supported") # NOTE(kevinbenton): it would be way cooler to use scapy for # these but scapy requires the python process to be running as # root to bind to the ports. super(_ARPSpoofTestCase, self).setUp() + self.skip_without_arp_support() self.src_addr = '192.168.0.1' self.dst_addr = '192.168.0.2' self.src_namespace = self.useFixture( @@ -104,6 +104,11 @@ class _ARPSpoofTestCase(object): # wait to add IPs until after anti-spoof rules to ensure ARP doesn't # happen before + @common_base.no_skip_on_missing_deps + def skip_without_arp_support(self): + if not checks.arp_header_match_supported(): + self.skipTest("ARP header matching not supported") + def test_arp_spoof_doesnt_block_normal_traffic(self): self._setup_arp_spoof_for_port(self.src_p.name, [self.src_addr]) self._setup_arp_spoof_for_port(self.dst_p.name, [self.dst_addr]) diff --git a/neutron/tests/functional/base.py b/neutron/tests/functional/base.py index 0907ea729bc..ea4997f6f09 100644 --- a/neutron/tests/functional/base.py +++ b/neutron/tests/functional/base.py @@ -20,6 +20,7 @@ from oslo_config import cfg from neutron.agent.common import config from neutron.agent.linux import utils from neutron.tests import base +from neutron.tests.common import base as common_base SUDO_CMD = 'sudo -n' @@ -51,9 +52,6 @@ class BaseSudoTestCase(base.BaseTestCase): if not base.bool_from_env('OS_SUDO_TESTING'): self.skipTest('Testing with sudo is not enabled') - self.fail_on_missing_deps = ( - base.bool_from_env('OS_FAIL_ON_MISSING_DEPS')) - config.register_root_helper(cfg.CONF) self.config(group='AGENT', root_helper=os.environ.get('OS_ROOTWRAP_CMD', SUDO_CMD)) @@ -61,10 +59,11 @@ class BaseSudoTestCase(base.BaseTestCase): root_helper_daemon=os.environ.get( 'OS_ROOTWRAP_DAEMON_CMD')) + @common_base.no_skip_on_missing_deps def check_command(self, cmd, error_text, skip_msg, run_as_root=False): try: utils.execute(cmd, run_as_root=run_as_root) except RuntimeError as e: - if error_text in str(e) and not self.fail_on_missing_deps: + if error_text in str(e): self.skipTest(skip_msg) raise From c34ce7c9845cc56f981e0ee8714d1f9345df5852 Mon Sep 17 00:00:00 2001 From: Saksham Varma Date: Tue, 7 Apr 2015 18:12:02 -0700 Subject: [PATCH 056/161] Moving out the cisco n1kv section to stackforge Since most of the n1kv plugin code resides in stackforge/networking-cisco repo, it's best to move the n1kv section there Change-Id: Ic1388980dea0d27dfa5e84869f1f20cc9bff78e5 Closes-Bug: #1441400 --- etc/neutron/plugins/ml2/ml2_conf_cisco.ini | 39 ---------------------- 1 file changed, 39 deletions(-) diff --git a/etc/neutron/plugins/ml2/ml2_conf_cisco.ini b/etc/neutron/plugins/ml2/ml2_conf_cisco.ini index fa4b5b0d529..699b2ec3724 100644 --- a/etc/neutron/plugins/ml2/ml2_conf_cisco.ini +++ b/etc/neutron/plugins/ml2/ml2_conf_cisco.ini @@ -207,45 +207,6 @@ # cidr_exposed=10.10.40.2/16 # gateway_ip=10.10.40.1 - -[ml2_cisco_n1kv] - -# (StrOpt) Name of the policy profile to be associated with a port when no -# policy profile is specified during port creates. -# default_policy_profile = default-pp - -# (StrOpt) Name of the VLAN network profile to be associated with a network. -# default_vlan_network_profile = default-vlan-np - -# (StrOpt) Name of the VXLAN network profile to be associated with a network. -# default_vxlan_network_profile = default-vxlan-np - -# (IntOpt) Time in seconds for which the plugin polls the VSM for updates in -# policy profiles. -# poll_duration = 60 - -# (IntOpt) Timeout duration in seconds for the http request -# http_timeout = 15 - -# (BoolOpt) Specify whether tenants are restricted from accessing all the -# policy profiles. -# Default value: False, indicating all tenants can access all policy profiles. -# -# restrict_policy_profiles = False - -# Describe Cisco N1KV VSM connectivity -# In this section you can specify connectivity details in order for plugin -# to connect to N1KV Virtual Supervisor Module (VSM). -# -# n1kv_vsm_ips =,,.... -# username = -# password = -# -# An example would be: -# n1kv_vsm_ips = 1.1.1.1,1.1.1.2 -# username = user -# password = password - [ml2_cisco_ucsm] # Cisco UCS Manager IP address From fd85b3ead32cd988e93f1d33d219ffd52cd77a51 Mon Sep 17 00:00:00 2001 From: Cyril Roelandt Date: Wed, 10 Jun 2015 10:20:58 +0000 Subject: [PATCH 057/161] Python3: replace 'unicode' with 'six.text_type' In Python 3, 'unicode' does not exist; 'six.text_type' should be used instead. Change-Id: I71011b4beee9817a61278eb473804cfb798de74a Blueprint: neutron-python3 --- neutron/agent/metadata/agent.py | 7 +++++-- neutron/agent/metadata/namespace_proxy.py | 7 +++++-- neutron/api/extensions.py | 3 ++- neutron/common/exceptions.py | 6 ++++-- neutron/policy.py | 2 +- neutron/tests/unit/api/v2/test_base.py | 4 +++- neutron/wsgi.py | 2 +- 7 files changed, 21 insertions(+), 10 deletions(-) diff --git a/neutron/agent/metadata/agent.py b/neutron/agent/metadata/agent.py index e2cad9c9ace..769d8039bc0 100644 --- a/neutron/agent/metadata/agent.py +++ b/neutron/agent/metadata/agent.py @@ -20,6 +20,7 @@ from neutronclient.v2_0 import client from oslo_config import cfg from oslo_log import log as logging import oslo_messaging +import six import six.moves.urllib.parse as urlparse import webob @@ -116,7 +117,8 @@ class MetadataProxyHandler(object): LOG.exception(_LE("Unexpected error.")) msg = _('An unknown error has occurred. ' 'Please try your request again.') - return webob.exc.HTTPInternalServerError(explanation=unicode(msg)) + explanation = six.text_type(msg) + return webob.exc.HTTPInternalServerError(explanation=explanation) def _get_ports_from_server(self, router_id=None, ip_address=None, networks=None): @@ -257,7 +259,8 @@ class MetadataProxyHandler(object): 'Remote metadata server experienced an internal server error.' ) LOG.warn(msg) - return webob.exc.HTTPInternalServerError(explanation=unicode(msg)) + explanation = six.text_type(msg) + return webob.exc.HTTPInternalServerError(explanation=explanation) else: raise Exception(_('Unexpected response code: %s') % resp.status) diff --git a/neutron/agent/metadata/namespace_proxy.py b/neutron/agent/metadata/namespace_proxy.py index e84a256de69..d68cb2493a5 100644 --- a/neutron/agent/metadata/namespace_proxy.py +++ b/neutron/agent/metadata/namespace_proxy.py @@ -15,6 +15,7 @@ import httplib2 from oslo_config import cfg from oslo_log import log as logging +import six import six.moves.urllib.parse as urlparse import webob @@ -56,7 +57,8 @@ class NetworkMetadataProxyHandler(object): LOG.exception(_LE("Unexpected error.")) msg = _('An unknown error has occurred. ' 'Please try your request again.') - return webob.exc.HTTPInternalServerError(explanation=unicode(msg)) + explanation = six.text_type(msg) + return webob.exc.HTTPInternalServerError(explanation=explanation) def _proxy_request(self, remote_address, method, path_info, query_string, body): @@ -103,7 +105,8 @@ class NetworkMetadataProxyHandler(object): 'Remote metadata server experienced an internal server error.' ) LOG.debug(msg) - return webob.exc.HTTPInternalServerError(explanation=unicode(msg)) + explanation = six.text_type(msg) + return webob.exc.HTTPInternalServerError(explanation=explanation) else: raise Exception(_('Unexpected response code: %s') % resp.status) diff --git a/neutron/api/extensions.py b/neutron/api/extensions.py index fa275bfe02f..f6b4601ba21 100644 --- a/neutron/api/extensions.py +++ b/neutron/api/extensions.py @@ -506,7 +506,8 @@ class ExtensionManager(object): LOG.debug('Ext namespace: %s', extension.get_namespace()) LOG.debug('Ext updated: %s', extension.get_updated()) except AttributeError as ex: - LOG.exception(_LE("Exception loading extension: %s"), unicode(ex)) + LOG.exception(_LE("Exception loading extension: %s"), + six.text_type(ex)) return False return True diff --git a/neutron/common/exceptions.py b/neutron/common/exceptions.py index 5d29d2afe04..c6ec6ccca54 100644 --- a/neutron/common/exceptions.py +++ b/neutron/common/exceptions.py @@ -18,6 +18,7 @@ Neutron base exception handling. """ from oslo_utils import excutils +import six class NeutronException(Exception): @@ -40,8 +41,9 @@ class NeutronException(Exception): # at least get the core message out if something happened super(NeutronException, self).__init__(self.message) - def __unicode__(self): - return unicode(self.msg) + if six.PY2: + def __unicode__(self): + return unicode(self.msg) def use_fatal_exceptions(self): return False diff --git a/neutron/policy.py b/neutron/policy.py index a2d099f6761..63a0820b3f1 100644 --- a/neutron/policy.py +++ b/neutron/policy.py @@ -313,7 +313,7 @@ class OwnerCheck(policy.Check): f) match = self.match % target if self.kind in creds: - return match == unicode(creds[self.kind]) + return match == six.text_type(creds[self.kind]) return False diff --git a/neutron/tests/unit/api/v2/test_base.py b/neutron/tests/unit/api/v2/test_base.py index ab05215e3f9..ccb4f44b14f 100644 --- a/neutron/tests/unit/api/v2/test_base.py +++ b/neutron/tests/unit/api/v2/test_base.py @@ -929,7 +929,9 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase): return_value.update(initial_input['port']) instance = self.plugin.return_value - instance.get_network.return_value = {'tenant_id': unicode(tenant_id)} + instance.get_network.return_value = { + 'tenant_id': six.text_type(tenant_id) + } instance.get_ports_count.return_value = 1 instance.create_port.return_value = return_value res = self.api.post(_get_path('ports', fmt=self.fmt), diff --git a/neutron/wsgi.py b/neutron/wsgi.py index 437e57b0984..7adba758e4b 100644 --- a/neutron/wsgi.py +++ b/neutron/wsgi.py @@ -412,7 +412,7 @@ class JSONDictSerializer(DictSerializer): def default(self, data): def sanitizer(obj): - return unicode(obj) + return six.text_type(obj) return jsonutils.dumps(data, default=sanitizer) From 9c8a19ba4032f98ecbffe53c4e731587550ded96 Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Wed, 10 Jun 2015 22:08:45 +0200 Subject: [PATCH 058/161] Correct indentation in neutron.api.v2.attributes This change corrects subnetpool resource definition indentation in neutron.api.v2.attributes. Change-Id: I6738ff6b73bd0b943cec32f14ccb8946ba28d2e3 --- neutron/api/v2/attributes.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/neutron/api/v2/attributes.py b/neutron/api/v2/attributes.py index 8adecc1ed38..bfc056010fc 100644 --- a/neutron/api/v2/attributes.py +++ b/neutron/api/v2/attributes.py @@ -816,23 +816,23 @@ RESOURCE_ATTRIBUTE_MAP = { 'allow_put': False, 'is_visible': True}, 'default_prefixlen': {'allow_post': True, - 'allow_put': True, - 'validate': {'type:non_negative': None}, - 'convert_to': convert_to_int, - 'default': ATTR_NOT_SPECIFIED, - 'is_visible': True}, + 'allow_put': True, + 'validate': {'type:non_negative': None}, + 'convert_to': convert_to_int, + 'default': ATTR_NOT_SPECIFIED, + 'is_visible': True}, 'min_prefixlen': {'allow_post': True, - 'allow_put': True, - 'default': ATTR_NOT_SPECIFIED, - 'validate': {'type:non_negative': None}, - 'convert_to': convert_to_int, - 'is_visible': True}, + 'allow_put': True, + 'default': ATTR_NOT_SPECIFIED, + 'validate': {'type:non_negative': None}, + 'convert_to': convert_to_int, + 'is_visible': True}, 'max_prefixlen': {'allow_post': True, - 'allow_put': True, - 'default': ATTR_NOT_SPECIFIED, - 'validate': {'type:non_negative': None}, - 'convert_to': convert_to_int, - 'is_visible': True}, + 'allow_put': True, + 'default': ATTR_NOT_SPECIFIED, + 'validate': {'type:non_negative': None}, + 'convert_to': convert_to_int, + 'is_visible': True}, SHARED: {'allow_post': True, 'allow_put': False, 'default': False, From 7c331be77fb6a835f1fb79c674d8d6c39c7eb357 Mon Sep 17 00:00:00 2001 From: armando-migliaccio Date: Wed, 10 Jun 2015 16:53:25 -0700 Subject: [PATCH 059/161] Document existence of br-tun and br-int in the OVS agent Question about the use of the two bridges has come up in the past multiple times, so let's fill the gap in the developer documentation. A user-facing documentation patch will have to follow up, if we want to be very thorough. Change-Id: I6dac0f9bdaf7b3b7bff8745d4103ccc71df61a0a --- doc/source/devref/openvswitch_agent.rst | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/doc/source/devref/openvswitch_agent.rst b/doc/source/devref/openvswitch_agent.rst index ae8660af3c5..6f3045a030b 100644 --- a/doc/source/devref/openvswitch_agent.rst +++ b/doc/source/devref/openvswitch_agent.rst @@ -36,6 +36,41 @@ More information can be found in `The VXLAN wiki page. `_ +Bridge Management +----------------- + +In order to make the agent capable of handling more than one tunneling +technology, to decouple the requirements of segmentation technology +from tenant isolation, and to preserve backward compatibility for OVS +agents working without tunneling, the agent relies on a tunneling bridge, +or br-tun, and the well known integration bridge, or br-int. + +All VM VIFs are plugged into the integration bridge. VM VIFs on a given +virtual network share a common "local" VLAN (i.e. not propagated +externally). The VLAN id of this local VLAN is mapped to the physical +networking details realizing that virtual network. + +For virtual networks realized as VXLAN/GRE tunnels, a Logical Switch +(LS) identifier is used to differentiate tenant traffic on inter-HV +tunnels. A mesh of tunnels is created to other Hypervisors in the +cloud. These tunnels originate and terminate on the tunneling bridge +of each hypervisor, leaving br-int unaffected. Port patching is done +to connect local VLANs on the integration bridge to inter-hypervisor +tunnels on the tunnel bridge. + +For each virtual network realized as a VLAN or flat network, a veth +or a pair of patch ports is used to connect the local VLAN on +the integration bridge with the physical network bridge, with flow +rules adding, modifying, or stripping VLAN tags as necessary, thus +preserving backward compatibility with the way the OVS agent used +to work prior to the tunneling capability (for more details, please +look at https://review.openstack.org/#/c/4367). + +Bear in mind, that this design decision may be overhauled in the +future to support existing VLAN-tagged traffic (coming from NFV VMs +for instance) and/or to deal with potential QinQ support natively +available in the Open vSwitch. + Further Reading --------------- From 1c29fab7cb3e586be72dd7910e2022b45c809c5f Mon Sep 17 00:00:00 2001 From: Brian Haley Date: Thu, 4 Jun 2015 23:54:31 -0400 Subject: [PATCH 060/161] Change ensure_dir to not check directory exists first I224be69168ede8a496a5f7d59b04b722f4de7192 added an EEXIST check, so no need to check if the directory is already there, just try and create it. Change-Id: Iba51fc8263bf59326489319d0dd3f69af00a8eeb --- neutron/agent/linux/utils.py | 14 ++++++-------- neutron/tests/unit/agent/linux/test_dhcp.py | 2 -- neutron/tests/unit/agent/linux/test_utils.py | 8 ++++++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/neutron/agent/linux/utils.py b/neutron/agent/linux/utils.py index dc22a0e069b..f57a1c919e7 100644 --- a/neutron/agent/linux/utils.py +++ b/neutron/agent/linux/utils.py @@ -191,14 +191,12 @@ def find_child_pids(pid): def ensure_dir(dir_path): """Ensure a directory with 755 permissions mode.""" - if not os.path.isdir(dir_path): - try: - os.makedirs(dir_path, 0o755) - except OSError as e: - # Make sure that the error was that the directory was created - # by a different (concurrent) worker. If not, raise the error. - if e.errno != errno.EEXIST: - raise + try: + os.makedirs(dir_path, 0o755) + except OSError as e: + # If the directory already existed, don't raise the error. + if e.errno != errno.EEXIST: + raise def _get_conf_base(cfg_root, uuid, ensure_conf_dir): diff --git a/neutron/tests/unit/agent/linux/test_dhcp.py b/neutron/tests/unit/agent/linux/test_dhcp.py index 483680326a4..0e5014bd6e1 100644 --- a/neutron/tests/unit/agent/linux/test_dhcp.py +++ b/neutron/tests/unit/agent/linux/test_dhcp.py @@ -661,8 +661,6 @@ class TestBase(base.BaseTestCase): self.execute = self.execute_p.start() self.makedirs = mock.patch('os.makedirs').start() - self.isdir = mock.patch('os.path.isdir').start() - self.isdir.return_value = False self.rmtree = mock.patch('shutil.rmtree').start() self.external_process = mock.patch( diff --git a/neutron/tests/unit/agent/linux/test_utils.py b/neutron/tests/unit/agent/linux/test_utils.py index aa510f96de7..9958d0422f8 100644 --- a/neutron/tests/unit/agent/linux/test_utils.py +++ b/neutron/tests/unit/agent/linux/test_utils.py @@ -283,13 +283,17 @@ class TestBaseOSUtils(base.BaseTestCase): getgrgid.assert_called_once_with(self.EGID) @mock.patch('os.makedirs') - @mock.patch('os.path.exists', return_value=False) - def test_ensure_dir_no_fail_if_exists(self, path_exists, makedirs): + def test_ensure_dir_no_fail_if_exists(self, makedirs): error = OSError() error.errno = errno.EEXIST makedirs.side_effect = error utils.ensure_dir("/etc/create/concurrently") + @mock.patch('os.makedirs') + def test_ensure_dir_calls_makedirs(self, makedirs): + utils.ensure_dir("/etc/create/directory") + makedirs.assert_called_once_with("/etc/create/directory", 0o755) + class TestUnixDomainHttpConnection(base.BaseTestCase): def test_connect(self): From 7b51521e31f896d0095510b52644b728aaadca5a Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Wed, 10 Jun 2015 21:45:41 -0700 Subject: [PATCH 061/161] power grab The current core reviewers hierarchy didn't have a place for the parts of ML2 that weren't related to agent communication. For now we can put all of ML2 under the built-in control-plane until we decide it needs to be put somewhere else. Change-Id: Ic4924e0041c4cbb955d8fac0f96ec56406d6466e --- doc/source/policies/core-reviewers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/policies/core-reviewers.rst b/doc/source/policies/core-reviewers.rst index 09a1c451a6d..0c690aa3ae9 100644 --- a/doc/source/policies/core-reviewers.rst +++ b/doc/source/policies/core-reviewers.rst @@ -83,7 +83,7 @@ The following are the current Neutron Lieutenants. Some notes on the above: * "Built-In Control Plane" means the L2 agents, DHCP agents, SGs, metadata - agents and the portion of ML2 which communicates with the agents. + agents and ML2. * The client includes commands installed server side. * L3 includes the L3 agent, DVR, and IPAM. * Services includes FWaaS, LBaaS, and VPNaaS. From cd56a657a19a5a756d191c614becfd3e386b3c80 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Thu, 11 Jun 2015 06:03:07 +0000 Subject: [PATCH 062/161] Imported Translations from Transifex For more information about this automatic import see: https://wiki.openstack.org/wiki/Translations/Infrastructure Change-Id: If91f3ac94562cc5130dd5ea5ac5d71aec64b74e3 --- .../locale/es/LC_MESSAGES/neutron-log-info.po | 7 +- neutron/locale/neutron-log-error.pot | 267 +++++----- neutron/locale/neutron-log-info.pot | 235 ++++----- neutron/locale/neutron-log-warning.pot | 119 ++--- neutron/locale/neutron.pot | 487 ++++++++---------- .../pt_BR/LC_MESSAGES/neutron-log-info.po | 11 +- .../zh_CN/LC_MESSAGES/neutron-log-info.po | 9 +- 7 files changed, 538 insertions(+), 597 deletions(-) diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po b/neutron/locale/es/LC_MESSAGES/neutron-log-info.po index 862493ba88c..db80f74801c 100644 --- a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/es/LC_MESSAGES/neutron-log-info.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Neutron\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-05-29 06:16+0000\n" -"PO-Revision-Date: 2015-05-28 20:54+0000\n" +"POT-Creation-Date: 2015-06-11 06:02+0000\n" +"PO-Revision-Date: 2015-06-10 23:52+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/neutron/language/" "es/)\n" @@ -265,6 +265,9 @@ msgstr "" "Se ha encontrado un error en validación para CIDR: %(new_cidr)s; se solapa " "con la subred %(subnet_id)s (CIDR: %(cidr)s)" +msgid "Wait called after thread killed. Cleaning up." +msgstr "Esperar llamado después de cortar la línea. Limpiando." + #, python-format msgid "Waiting on %d children to exit" msgstr "En espera de %d hijos para salir" diff --git a/neutron/locale/neutron-log-error.pot b/neutron/locale/neutron-log-error.pot index a5b1b8ea5a9..1214d575b1c 100644 --- a/neutron/locale/neutron-log-error.pot +++ b/neutron/locale/neutron-log-error.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 2015.2.0.dev533\n" +"Project-Id-Version: neutron 2015.2.0.dev464\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-06-02 06:15+0000\n" +"POT-Creation-Date: 2015-06-11 06:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,83 +17,76 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: neutron/manager.py:133 +#: neutron/manager.py:134 msgid "Error, plugin is not set" msgstr "" -#: neutron/manager.py:144 -#, python-format -msgid "Error loading plugin by name, %s" -msgstr "" - #: neutron/manager.py:145 #, python-format +msgid "Error loading plugin by name, %s" +msgstr "" + +#: neutron/manager.py:146 +#, python-format msgid "Error loading plugin by class, %s" msgstr "" -#: neutron/policy.py:123 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy " -"will not be enforced" -msgstr "" - -#: neutron/policy.py:311 +#: neutron/policy.py:266 #, python-format msgid "Policy check error while calling %s!" msgstr "" -#: neutron/service.py:107 neutron/service.py:165 +#: neutron/service.py:106 neutron/service.py:167 msgid "Unrecoverable error: please check log for details." msgstr "" -#: neutron/service.py:148 +#: neutron/service.py:146 #, python-format msgid "'rpc_workers = %d' ignored because start_rpc_listeners is not implemented." msgstr "" -#: neutron/service.py:172 +#: neutron/service.py:174 msgid "No known API applications configured." msgstr "" -#: neutron/service.py:279 +#: neutron/service.py:281 msgid "Exception occurs when timer stops" msgstr "" -#: neutron/service.py:288 +#: neutron/service.py:290 msgid "Exception occurs when waiting for timer" msgstr "" -#: neutron/wsgi.py:152 +#: neutron/wsgi.py:159 #, python-format msgid "Unable to listen on %(host)s:%(port)s" msgstr "" -#: neutron/wsgi.py:788 +#: neutron/wsgi.py:799 #, python-format msgid "InvalidContentType: %s" msgstr "" -#: neutron/wsgi.py:792 +#: neutron/wsgi.py:803 #, python-format msgid "MalformedRequestBody: %s" msgstr "" -#: neutron/wsgi.py:801 +#: neutron/wsgi.py:812 msgid "Internal error" msgstr "" -#: neutron/agent/common/ovs_lib.py:218 neutron/agent/common/ovs_lib.py:313 +#: neutron/agent/common/ovs_lib.py:219 neutron/agent/common/ovs_lib.py:314 #, python-format msgid "Unable to execute %(cmd)s. Exception: %(exception)s" msgstr "" -#: neutron/agent/common/ovs_lib.py:239 +#: neutron/agent/common/ovs_lib.py:240 #, python-format msgid "Timed out retrieving ofport on port %(pname)s. Exception: %(exception)s" msgstr "" -#: neutron/agent/common/ovs_lib.py:532 +#: neutron/agent/common/ovs_lib.py:533 #, python-format msgid "OVS flows could not be applied on bridge %s" msgstr "" @@ -117,61 +110,61 @@ msgstr "" msgid "Network %s info call failed." msgstr "" -#: neutron/agent/dhcp/agent.py:582 neutron/agent/l3/agent.py:616 +#: neutron/agent/dhcp/agent.py:573 neutron/agent/l3/agent.py:627 #: neutron/agent/metadata/agent.py:311 #: neutron/plugins/hyperv/agent/l2_agent.py:94 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:108 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:787 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:295 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:109 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:812 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:300 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:129 #: neutron/services/metering/agents/metering_agent.py:283 msgid "Failed reporting state!" msgstr "" -#: neutron/agent/l3/agent.py:172 neutron/tests/unit/agent/l3/test_agent.py:2150 +#: neutron/agent/l3/agent.py:173 neutron/tests/unit/agent/l3/test_agent.py:2193 #, python-format msgid "Error importing interface driver '%s'" msgstr "" -#: neutron/agent/l3/agent.py:234 neutron/agent/linux/dhcp.py:875 +#: neutron/agent/l3/agent.py:235 neutron/agent/linux/dhcp.py:879 msgid "An interface driver must be specified" msgstr "" -#: neutron/agent/l3/agent.py:239 +#: neutron/agent/l3/agent.py:240 msgid "Router id is required if not using namespaces." msgstr "" -#: neutron/agent/l3/agent.py:246 +#: neutron/agent/l3/agent.py:247 #, python-format msgid "%s used in config as ipv6_gateway is not a valid IPv6 link-local address." msgstr "" -#: neutron/agent/l3/agent.py:328 +#: neutron/agent/l3/agent.py:329 #, python-format msgid "Error while deleting router %s" msgstr "" -#: neutron/agent/l3/agent.py:392 +#: neutron/agent/l3/agent.py:398 #, python-format msgid "The external network bridge '%s' does not exist" msgstr "" -#: neutron/agent/l3/agent.py:446 +#: neutron/agent/l3/agent.py:452 #, python-format msgid "Failed to fetch router information for '%s'" msgstr "" -#: neutron/agent/l3/agent.py:469 +#: neutron/agent/l3/agent.py:475 #, python-format msgid "Removing incompatible router '%s'" msgstr "" -#: neutron/agent/l3/agent.py:473 +#: neutron/agent/l3/agent.py:479 #, python-format msgid "Failed to process compatible router '%s'" msgstr "" -#: neutron/agent/l3/agent.py:525 +#: neutron/agent/l3/agent.py:531 msgid "Failed synchronizing routers due to RPC error" msgstr "" @@ -248,7 +241,7 @@ msgstr "" msgid "Pidfile %s already exist. Daemon already running?" msgstr "" -#: neutron/agent/linux/dhcp.py:881 +#: neutron/agent/linux/dhcp.py:885 #, python-format msgid "Error importing interface driver '%(driver)s': %(inner)s" msgstr "" @@ -276,36 +269,36 @@ msgid "" "identified by uuid %(uuid)s" msgstr "" -#: neutron/agent/linux/interface.py:158 -#, python-format -msgid "Failed deleting ingress connection state of floatingip %s" -msgstr "" - -#: neutron/agent/linux/interface.py:167 -#, python-format -msgid "Failed deleting egress connection state of floatingip %s" -msgstr "" - -#: neutron/agent/linux/interface.py:294 neutron/agent/linux/interface.py:331 -#: neutron/agent/linux/interface.py:389 neutron/agent/linux/interface.py:425 +#: neutron/agent/linux/interface.py:262 neutron/agent/linux/interface.py:299 +#: neutron/agent/linux/interface.py:357 neutron/agent/linux/interface.py:393 #, python-format msgid "Failed unplugging interface '%s'" msgstr "" -#: neutron/agent/linux/ip_lib.py:407 +#: neutron/agent/linux/ip_lib.py:237 +#, python-format +msgid "Failed deleting ingress connection state of floatingip %s" +msgstr "" + +#: neutron/agent/linux/ip_lib.py:246 +#, python-format +msgid "Failed deleting egress connection state of floatingip %s" +msgstr "" + +#: neutron/agent/linux/ip_lib.py:442 msgid "Address not present on interface" msgstr "" -#: neutron/agent/linux/ip_lib.py:412 +#: neutron/agent/linux/ip_lib.py:447 msgid "Duplicate adddress detected" msgstr "" -#: neutron/agent/linux/ip_lib.py:413 +#: neutron/agent/linux/ip_lib.py:448 #, python-format msgid "Exceeded %s second limit waiting for address to leave the tentative state." msgstr "" -#: neutron/agent/linux/ip_lib.py:718 +#: neutron/agent/linux/ip_lib.py:753 #, python-format msgid "Failed sending gratuitous ARP to %(addr)s on %(iface)s in namespace %(ns)s" msgstr "" @@ -322,11 +315,11 @@ msgstr "" msgid "Unable to parse route \"%s\"" msgstr "" -#: neutron/agent/linux/iptables_manager.py:403 +#: neutron/agent/linux/iptables_manager.py:404 msgid "Failure applying iptables rules" msgstr "" -#: neutron/agent/linux/iptables_manager.py:481 +#: neutron/agent/linux/iptables_manager.py:482 #, python-format msgid "" "IPTablesManager.apply failed to apply the following set of iptables " @@ -339,7 +332,7 @@ msgstr "" msgid "Error received from ovsdb monitor: %s" msgstr "" -#: neutron/agent/linux/utils.py:220 +#: neutron/agent/linux/utils.py:227 #, python-format msgid "Unable to convert value in %s" msgstr "" @@ -354,12 +347,12 @@ msgstr "" msgid "OVSDB Error: %s" msgstr "" -#: neutron/agent/ovsdb/impl_vsctl.py:68 +#: neutron/agent/ovsdb/impl_vsctl.py:67 #, python-format msgid "Unable to execute %(cmd)s." msgstr "" -#: neutron/agent/ovsdb/impl_vsctl.py:127 +#: neutron/agent/ovsdb/impl_vsctl.py:126 #, python-format msgid "Could not parse: %s" msgstr "" @@ -419,13 +412,13 @@ msgid "" "message %s" msgstr "" -#: neutron/api/rpc/handlers/l3_rpc.py:73 +#: neutron/api/rpc/handlers/l3_rpc.py:74 msgid "" "No plugin for L3 routing registered! Will reply to l3 agent with empty " "router dictionary." msgstr "" -#: neutron/api/v2/base.py:374 +#: neutron/api/v2/base.py:375 #, python-format msgid "Unable to undo add for %(resource)s %(id)s" msgstr "" @@ -540,19 +533,23 @@ msgstr "" msgid "Failed to schedule network %s" msgstr "" -#: neutron/db/agentschedulers_db.py:299 +#: neutron/db/agentschedulers_db.py:301 #, python-format msgid "" "Unexpected exception occurred while removing network %(net)s from agent " "%(agent)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:953 neutron/plugins/ml2/plugin.py:570 +#: neutron/db/agentschedulers_db.py:312 +msgid "Exception encountered during network rescheduling" +msgstr "" + +#: neutron/db/db_base_plugin_v2.py:359 neutron/plugins/ml2/plugin.py:566 #, python-format msgid "An exception occurred while creating the %(resource)s:%(item)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1821 +#: neutron/db/db_base_plugin_v2.py:1141 #, python-format msgid "Unable to generate mac address after %s attempts" msgstr "" @@ -567,16 +564,16 @@ msgstr "" msgid "Could not retrieve gateway port for subnet %s" msgstr "" -#: neutron/db/l3_agentschedulers_db.py:117 +#: neutron/db/l3_agentschedulers_db.py:118 #, python-format msgid "Failed to reschedule router %s" msgstr "" -#: neutron/db/l3_agentschedulers_db.py:122 +#: neutron/db/l3_agentschedulers_db.py:123 msgid "Exception encountered during router rescheduling." msgstr "" -#: neutron/db/l3_db.py:541 +#: neutron/db/l3_db.py:542 msgid "Cannot have multiple IPv4 subnets on router port" msgstr "" @@ -718,210 +715,210 @@ msgstr "" msgid "Delete floatingip failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:195 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:196 #, python-format msgid "" "Interface %(interface)s for physical network %(physical_network)s does " "not exist. Agent terminated!" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:255 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1658 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:256 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1688 #, python-format msgid "%s Agent terminated!" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:184 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:185 #, python-format msgid "Failed creating vxlan interface for %(segmentation_id)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:339 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:340 #, python-format msgid "Unable to add %(interface)s to %(bridge_name)s! Exception: %(e)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:352 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:353 #, python-format msgid "Unable to add vxlan interface for network %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:359 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:360 #, python-format msgid "No mapping for physical network %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:368 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:369 #, python-format msgid "Unknown network_type %(network_type)s for network %(network_id)s." msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:461 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:462 #, python-format msgid "Cannot delete bridge %s, does not exist" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:540 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:541 msgid "No valid Segmentation ID to perform UCAST test." msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:797 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:822 msgid "Unable to obtain MAC address for unique ID. Agent terminated!" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:994 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1019 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:270 #, python-format msgid "Error in agent loop. Devices info: %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1017 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1047 #: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:40 #, python-format msgid "Parsing physical_interface_mappings failed: %s. Agent terminated!" msgstr "" -#: neutron/plugins/ml2/db.py:241 neutron/plugins/ml2/db.py:325 +#: neutron/plugins/ml2/db.py:242 neutron/plugins/ml2/db.py:326 #: neutron/plugins/ml2/plugin.py:1341 #, python-format msgid "Multiple ports have port_id starting with %s" msgstr "" -#: neutron/plugins/ml2/managers.py:59 +#: neutron/plugins/ml2/managers.py:60 #, python-format msgid "" "Type driver '%(new_driver)s' ignored because type driver '%(old_driver)s'" " is already registered for type '%(type)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:75 +#: neutron/plugins/ml2/managers.py:76 #, python-format msgid "No type driver for tenant network_type: %s. Service terminated!" msgstr "" -#: neutron/plugins/ml2/managers.py:82 +#: neutron/plugins/ml2/managers.py:83 #, python-format msgid "No type driver for external network_type: %s. Service terminated!" msgstr "" -#: neutron/plugins/ml2/managers.py:151 +#: neutron/plugins/ml2/managers.py:152 #, python-format msgid "Network %s has no segments" msgstr "" -#: neutron/plugins/ml2/managers.py:250 neutron/plugins/ml2/managers.py:277 +#: neutron/plugins/ml2/managers.py:251 neutron/plugins/ml2/managers.py:278 #, python-format msgid "Failed to release segment '%s' because network type is not supported." msgstr "" -#: neutron/plugins/ml2/managers.py:352 +#: neutron/plugins/ml2/managers.py:353 #, python-format msgid "Mechanism driver '%(name)s' failed in %(method)s" msgstr "" -#: neutron/plugins/ml2/managers.py:638 neutron/plugins/ml2/managers.py:700 +#: neutron/plugins/ml2/managers.py:639 neutron/plugins/ml2/managers.py:701 #, python-format msgid "Failed to bind port %(port)s on host %(host)s" msgstr "" -#: neutron/plugins/ml2/managers.py:653 +#: neutron/plugins/ml2/managers.py:654 #, python-format msgid "" "Exceeded maximum binding levels attempting to bind port %(port)s on host " "%(host)s" msgstr "" -#: neutron/plugins/ml2/managers.py:696 +#: neutron/plugins/ml2/managers.py:697 #, python-format msgid "Mechanism driver %s failed in bind_port" msgstr "" -#: neutron/plugins/ml2/managers.py:767 +#: neutron/plugins/ml2/managers.py:768 #, python-format msgid "Extension driver '%(name)s' failed in %(method)s" msgstr "" -#: neutron/plugins/ml2/plugin.py:288 +#: neutron/plugins/ml2/plugin.py:284 #, python-format msgid "Failed to commit binding results for %(port)s after %(max)s tries" msgstr "" -#: neutron/plugins/ml2/plugin.py:450 +#: neutron/plugins/ml2/plugin.py:446 #, python-format msgid "Serialized vif_details DB value '%(value)s' for port %(port)s is invalid" msgstr "" -#: neutron/plugins/ml2/plugin.py:461 +#: neutron/plugins/ml2/plugin.py:457 #, python-format msgid "Serialized profile DB value '%(value)s' for port %(port)s is invalid" msgstr "" -#: neutron/plugins/ml2/plugin.py:547 +#: neutron/plugins/ml2/plugin.py:543 #, python-format msgid "Could not find %s to delete." msgstr "" -#: neutron/plugins/ml2/plugin.py:550 +#: neutron/plugins/ml2/plugin.py:546 #, python-format msgid "Could not delete %(res)s %(id)s." msgstr "" -#: neutron/plugins/ml2/plugin.py:583 +#: neutron/plugins/ml2/plugin.py:579 #, python-format msgid "" "mechanism_manager.create_%(res)s_postcommit failed for %(res)s: " "'%(failed_id)s'. Deleting %(res)ss %(resource_ids)s" msgstr "" -#: neutron/plugins/ml2/plugin.py:629 +#: neutron/plugins/ml2/plugin.py:625 #, python-format msgid "mechanism_manager.create_network_postcommit failed, deleting network '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:699 +#: neutron/plugins/ml2/plugin.py:695 #, python-format msgid "Exception auto-deleting port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:712 +#: neutron/plugins/ml2/plugin.py:708 #, python-format msgid "Exception auto-deleting subnet %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:794 +#: neutron/plugins/ml2/plugin.py:790 msgid "mechanism_manager.delete_network_postcommit failed" msgstr "" -#: neutron/plugins/ml2/plugin.py:815 +#: neutron/plugins/ml2/plugin.py:811 #, python-format msgid "mechanism_manager.create_subnet_postcommit failed, deleting subnet '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:938 +#: neutron/plugins/ml2/plugin.py:934 #, python-format msgid "Exception deleting fixed_ip from port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:947 +#: neutron/plugins/ml2/plugin.py:943 msgid "mechanism_manager.delete_subnet_postcommit failed" msgstr "" -#: neutron/plugins/ml2/plugin.py:1012 +#: neutron/plugins/ml2/plugin.py:1008 #, python-format msgid "mechanism_manager.create_port_postcommit failed, deleting port '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:1024 +#: neutron/plugins/ml2/plugin.py:1020 #, python-format msgid "_bind_port_if_needed failed, deleting port '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:1055 +#: neutron/plugins/ml2/plugin.py:1051 #, python-format msgid "_bind_port_if_needed failed. Deleting all ports from create bulk '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:1200 +#: neutron/plugins/ml2/plugin.py:1198 #, python-format msgid "No Host supplied to bind DVR Port %s" msgstr "" @@ -936,11 +933,11 @@ msgstr "" msgid "Binding info for DVR port %s not found" msgstr "" -#: neutron/plugins/ml2/drivers/type_gre.py:81 +#: neutron/plugins/ml2/drivers/type_gre.py:82 msgid "Failed to parse tunnel_id_ranges. Service terminated!" msgstr "" -#: neutron/plugins/ml2/drivers/type_gre.py:92 +#: neutron/plugins/ml2/drivers/type_gre.py:93 #, python-format msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" msgstr "" @@ -1098,110 +1095,110 @@ msgid "" "a different subnet %(orig_subnet)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:384 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:404 msgid "No tunnel_type specified, cannot create tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:387 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:410 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:407 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:430 #, python-format msgid "tunnel_type %s not supported by agent" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:403 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:423 msgid "No tunnel_ip specified, cannot delete tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:407 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:427 msgid "No tunnel_type specified, cannot delete tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:553 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:573 #, python-format msgid "No local VLAN available for net-id=%s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:584 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:604 #, python-format msgid "" "Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " "tunneling disabled" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:592 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:612 #, python-format msgid "" "Cannot provision flat network for net-id=%(net_uuid)s - no bridge for " "physical_network %(physical_network)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:602 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:622 #, python-format msgid "" "Cannot provision VLAN network for net-id=%(net_uuid)s - no bridge for " "physical_network %(physical_network)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:611 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:631 #, python-format msgid "" "Cannot provision unknown network type %(network_type)s for net-" "id=%(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:671 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:691 #, python-format msgid "" "Cannot reclaim unknown network type %(network_type)s for net-" "id=%(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:868 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:889 msgid "" "Failed to create OVS patch port. Cannot have tunneling enabled on this " "agent, since this version of OVS does not support tunnels or patch ports." " Agent terminated!" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:927 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:948 #, python-format msgid "" "Bridge %(bridge)s for physical network %(physical_network)s does not " "exist. Agent terminated!" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1121 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1142 #, python-format msgid "Failed to set-up %(type)s tunnel port to %(ip)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1310 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1331 #, python-format msgid "" "process_network_ports - iteration:%d - failure while retrieving port " "details from server" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1346 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1367 #, python-format msgid "" "process_ancillary_network_ports - iteration:%d - failure while retrieving" " port details from server" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1488 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1509 msgid "Error while synchronizing tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1563 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1585 msgid "Error while processing VIF ports" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1652 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1682 msgid "Agent failed to create agent config map" msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:48 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:49 #, python-format msgid "Failed to get devices for %s" msgstr "" diff --git a/neutron/locale/neutron-log-info.pot b/neutron/locale/neutron-log-info.pot index 056383ecbc4..215c34c4342 100644 --- a/neutron/locale/neutron-log-info.pot +++ b/neutron/locale/neutron-log-info.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 2015.2.0.dev485\n" +"Project-Id-Version: neutron 2015.2.0.dev464\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-05-29 06:16+0000\n" +"POT-Creation-Date: 2015-06-11 06:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,28 +17,21 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: neutron/manager.py:115 +#: neutron/manager.py:116 #, python-format msgid "Loading core plugin: %s" msgstr "" -#: neutron/manager.py:155 +#: neutron/manager.py:164 #, python-format msgid "Service %s is supported by the core plugin" msgstr "" -#: neutron/manager.py:173 +#: neutron/manager.py:182 #, python-format msgid "Loading Plugin: %s" msgstr "" -#: neutron/policy.py:114 -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated " -"policy:%(old_policy)s" -msgstr "" - #: neutron/quota.py:221 msgid "" "ConfDriver is used as quota_driver because the loaded plugin does not " @@ -50,27 +43,27 @@ msgstr "" msgid "Loaded quota_driver: %s." msgstr "" -#: neutron/service.py:179 +#: neutron/service.py:181 #, python-format msgid "Neutron service started, listening on %(host)s:%(port)s" msgstr "" -#: neutron/wsgi.py:781 +#: neutron/wsgi.py:792 #, python-format msgid "%(method)s %(url)s" msgstr "" -#: neutron/wsgi.py:798 +#: neutron/wsgi.py:809 #, python-format msgid "HTTP exception thrown: %s" msgstr "" -#: neutron/wsgi.py:814 +#: neutron/wsgi.py:825 #, python-format msgid "%(url)s returned with HTTP %(status)d" msgstr "" -#: neutron/wsgi.py:817 +#: neutron/wsgi.py:828 #, python-format msgid "%(url)s returned a fault: %(exception)s" msgstr "" @@ -122,12 +115,12 @@ msgstr "" msgid "No ports here to refresh firewall" msgstr "" -#: neutron/agent/common/ovs_lib.py:421 +#: neutron/agent/common/ovs_lib.py:423 #, python-format msgid "Port %(port_id)s not present in bridge %(br_name)s" msgstr "" -#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:594 +#: neutron/agent/dhcp/agent.py:93 neutron/agent/dhcp/agent.py:585 msgid "DHCP agent started" msgstr "" @@ -139,13 +132,13 @@ msgstr "" msgid "Synchronizing state complete" msgstr "" -#: neutron/agent/dhcp/agent.py:591 neutron/agent/l3/agent.py:619 +#: neutron/agent/dhcp/agent.py:582 neutron/agent/l3/agent.py:641 #: neutron/services/metering/agents/metering_agent.py:286 #, python-format msgid "agent_updated by server side %s!" msgstr "" -#: neutron/agent/l3/agent.py:550 +#: neutron/agent/l3/agent.py:563 neutron/agent/l3/agent.py:631 msgid "L3 agent started" msgstr "" @@ -166,24 +159,24 @@ msgstr "" msgid "Process runs with uid/gid: %(uid)s/%(gid)s" msgstr "" -#: neutron/agent/linux/dhcp.py:745 +#: neutron/agent/linux/dhcp.py:749 #, python-format msgid "" "Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is " "not in port's address IP versions" msgstr "" -#: neutron/agent/linux/interface.py:196 +#: neutron/agent/linux/interface.py:164 #, python-format msgid "Device %s already exists" msgstr "" -#: neutron/agent/linux/iptables_firewall.py:114 +#: neutron/agent/linux/iptables_firewall.py:115 #, python-format msgid "Attempted to update port filter which is not filtered %s" msgstr "" -#: neutron/agent/linux/iptables_firewall.py:125 +#: neutron/agent/linux/iptables_firewall.py:126 #, python-format msgid "Attempted to remove port filter which is not filtered %r" msgstr "" @@ -197,7 +190,7 @@ msgstr "" msgid "Loaded extension: %s" msgstr "" -#: neutron/api/v2/base.py:93 +#: neutron/api/v2/base.py:94 msgid "Allow sorting is enabled because native pagination requires native sorting" msgstr "" @@ -221,23 +214,23 @@ msgid "OVS cleanup completed successfully" msgstr "" #: neutron/cmd/eventlet/plugins/hyperv_neutron_agent.py:43 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:261 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1025 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1570 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:262 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1057 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1594 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:345 msgid "Agent initialized successfully, now running... " msgstr "" -#: neutron/common/config.py:204 +#: neutron/common/config.py:207 msgid "Logging enabled!" msgstr "" -#: neutron/common/config.py:205 +#: neutron/common/config.py:208 #, python-format msgid "%(prog)s version %(version)s" msgstr "" -#: neutron/common/config.py:224 +#: neutron/common/config.py:235 #, python-format msgid "Config paste file: %s" msgstr "" @@ -269,51 +262,51 @@ msgstr "" msgid "Adding network %(net)s to agent %(agent)s on host %(host)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:642 +#: neutron/db/db_base_plugin_v2.py:201 #, python-format msgid "" "Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " "%(subnet_id)s (CIDR: %(cidr)s)" msgstr "" -#: neutron/db/db_base_plugin_v2.py:679 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:686 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:690 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:695 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:719 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:1639 neutron/plugins/ml2/plugin.py:895 +#: neutron/db/db_base_plugin_v2.py:959 neutron/plugins/ml2/plugin.py:891 #, python-format msgid "" "Found port (%(port_id)s, %(ip)s) having IP allocation on subnet " "%(subnet)s, cannot delete" msgstr "" -#: neutron/db/l3_agentschedulers_db.py:78 +#: neutron/db/ipam_backend_mixin.py:103 +#, python-format +msgid "Found invalid IP address in pool: %(start)s - %(end)s:" +msgstr "" + +#: neutron/db/ipam_backend_mixin.py:110 +msgid "Specified IP addresses do not match the subnet IP version" +msgstr "" + +#: neutron/db/ipam_backend_mixin.py:114 +#, python-format +msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" +msgstr "" + +#: neutron/db/ipam_backend_mixin.py:119 +#, python-format +msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" +msgstr "" + +#: neutron/db/ipam_backend_mixin.py:143 +#, python-format +msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" +msgstr "" + +#: neutron/db/l3_agentschedulers_db.py:79 msgid "" "Skipping period L3 agent status check because automatic router " "rescheduling is disabled." msgstr "" -#: neutron/db/l3_db.py:1160 +#: neutron/db/l3_db.py:1161 #, python-format msgid "Skipping port %s as no IP is configure on it" msgstr "" @@ -536,204 +529,208 @@ msgstr "" msgid "Set the controller to a new controller: %s" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:189 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:190 #, python-format msgid "Mapping physical network %(physical_network)s to interface %(interface)s" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:220 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:221 #, python-format msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:234 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:235 #, python-format msgid "Controller IPs: %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:801 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:796 +msgid "Stopping linuxbridge agent." +msgstr "" + +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:826 #: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:89 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:99 #, python-format msgid "RPC agent_id: %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:871 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1187 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:896 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1210 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:209 #, python-format msgid "Port %(device)s updated. Details: %(details)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:904 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:929 #, python-format msgid "Device %s not defined on plugin" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:911 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1234 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1251 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:936 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1257 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1274 #, python-format msgid "Attachment %s removed" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:923 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1263 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:948 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1286 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:235 #, python-format msgid "Port %s updated." msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:976 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1001 msgid "LinuxBridge Agent RPC Daemon Started!" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:986 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1454 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1011 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1477 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:251 msgid "Agent out of sync with plugin!" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1020 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1050 #: neutron/plugins/ml2/drivers/mlnx/agent/eswitch_neutron_agent.py:43 #, python-format msgid "Interface mappings: %s" msgstr "" -#: neutron/plugins/ml2/db.py:59 +#: neutron/plugins/ml2/db.py:60 #, python-format msgid "Added segment %(id)s of type %(network_type)s for network %(network_id)s" msgstr "" -#: neutron/plugins/ml2/managers.py:45 +#: neutron/plugins/ml2/managers.py:46 #, python-format msgid "Configured type driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:50 +#: neutron/plugins/ml2/managers.py:51 #, python-format msgid "Loaded type driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:67 +#: neutron/plugins/ml2/managers.py:68 #, python-format msgid "Registered types: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:78 +#: neutron/plugins/ml2/managers.py:79 #, python-format msgid "Tenant network_types: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:168 +#: neutron/plugins/ml2/managers.py:169 #, python-format msgid "Initializing driver for type '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:293 +#: neutron/plugins/ml2/managers.py:294 #, python-format msgid "Configured mechanism driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:299 +#: neutron/plugins/ml2/managers.py:300 #, python-format msgid "Loaded mechanism driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:311 +#: neutron/plugins/ml2/managers.py:312 #, python-format msgid "Registered mechanism drivers: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:316 +#: neutron/plugins/ml2/managers.py:317 #, python-format msgid "Initializing mechanism driver '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:725 +#: neutron/plugins/ml2/managers.py:726 #, python-format msgid "Configured extension driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:731 +#: neutron/plugins/ml2/managers.py:732 #, python-format msgid "Loaded extension driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:742 +#: neutron/plugins/ml2/managers.py:743 #, python-format msgid "Registered extension drivers: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:748 +#: neutron/plugins/ml2/managers.py:749 #, python-format msgid "Initializing extension driver '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:756 +#: neutron/plugins/ml2/managers.py:757 #, python-format msgid "Got %(alias)s extension from driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:805 +#: neutron/plugins/ml2/managers.py:806 #, python-format msgid "Extended network dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:812 +#: neutron/plugins/ml2/managers.py:813 #, python-format msgid "Extended subnet dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:819 +#: neutron/plugins/ml2/managers.py:820 #, python-format msgid "Extended port dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:143 +#: neutron/plugins/ml2/plugin.py:139 msgid "Modular L2 Plugin initialization complete" msgstr "" -#: neutron/plugins/ml2/plugin.py:294 +#: neutron/plugins/ml2/plugin.py:290 #, python-format msgid "Attempt %(count)s to bind port %(port)s" msgstr "" -#: neutron/plugins/ml2/plugin.py:696 +#: neutron/plugins/ml2/plugin.py:692 #, python-format msgid "Port %s was deleted concurrently" msgstr "" -#: neutron/plugins/ml2/plugin.py:708 +#: neutron/plugins/ml2/plugin.py:704 #, python-format msgid "Subnet %s was deleted concurrently" msgstr "" -#: neutron/plugins/ml2/plugin.py:1366 +#: neutron/plugins/ml2/plugin.py:1367 #, python-format msgid "" "Binding info for port %s was not found, it might have been deleted " "already." msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:72 +#: neutron/plugins/ml2/drivers/type_flat.py:73 msgid "Arbitrary flat physical_network names allowed" msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:78 +#: neutron/plugins/ml2/drivers/type_flat.py:79 #, python-format msgid "Allowable flat physical_network names: %s" msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:85 +#: neutron/plugins/ml2/drivers/type_flat.py:86 msgid "ML2 FlatTypeDriver initialization complete" msgstr "" -#: neutron/plugins/ml2/drivers/type_local.py:37 +#: neutron/plugins/ml2/drivers/type_local.py:38 msgid "ML2 LocalTypeDriver initialization complete" msgstr "" -#: neutron/plugins/ml2/drivers/type_tunnel.py:116 +#: neutron/plugins/ml2/drivers/type_tunnel.py:113 #, python-format msgid "%(type)s ID ranges: %(range)s" msgstr "" @@ -816,64 +813,72 @@ msgstr "" msgid "L2 Agent operating in DVR Mode with MAC %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:560 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:582 #, python-format msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:624 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:646 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:743 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:765 #, python-format msgid "Configuration for device %s completed." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:750 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:772 #, python-format msgid "" "Skipping ARP spoofing rules for port '%s' because it has port security " "disabled" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:778 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:800 #, python-format msgid "port_unbound(): net_uuid %s not in local_vlan_map" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:843 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:866 #, python-format msgid "Adding %s to list of bridges." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:919 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:942 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1067 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1090 #, python-format msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1181 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1204 #, python-format msgid "" "Port %s was not found on the integration bridge and will therefore not be" " processed" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1222 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1245 #, python-format msgid "Ancillary Port %s added" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1482 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1505 msgid "Agent tunnel out of sync with plugin!" msgstr "" +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1604 +msgid "Agent caught SIGTERM, quitting daemon loop." +msgstr "" + +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1610 +msgid "Agent caught SIGHUP, resetting." +msgstr "" + #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:191 #, python-format msgid "No device with MAC %s defined on agent." diff --git a/neutron/locale/neutron-log-warning.pot b/neutron/locale/neutron-log-warning.pot index 0d10ecfd440..6fc2e6acec3 100644 --- a/neutron/locale/neutron-log-warning.pot +++ b/neutron/locale/neutron-log-warning.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 2015.2.0.dev422\n" +"Project-Id-Version: neutron 2015.2.0.dev464\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-05-25 06:15+0000\n" +"POT-Creation-Date: 2015-06-11 06:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,14 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: neutron/policy.py:102 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:160 +#: neutron/policy.py:115 #, python-format msgid "Unable to find data type descriptor for attribute %s" msgstr "" @@ -66,17 +59,17 @@ msgid "" "falling back to old security_group_rules_for_devices which scales worse." msgstr "" -#: neutron/agent/common/ovs_lib.py:361 +#: neutron/agent/common/ovs_lib.py:368 #, python-format msgid "Found not yet ready openvswitch port: %s" msgstr "" -#: neutron/agent/common/ovs_lib.py:364 +#: neutron/agent/common/ovs_lib.py:371 #, python-format msgid "Found failed openvswitch port: %s" msgstr "" -#: neutron/agent/common/ovs_lib.py:410 +#: neutron/agent/common/ovs_lib.py:417 #, python-format msgid "ofport: %(ofport)s for VIF: %(vif)s is not a positive integer" msgstr "" @@ -108,7 +101,7 @@ msgid "" "port %(port_id)s, for router %(router_id)s will be considered" msgstr "" -#: neutron/agent/dhcp/agent.py:576 neutron/agent/l3/agent.py:609 +#: neutron/agent/dhcp/agent.py:567 neutron/agent/l3/agent.py:622 #: neutron/agent/metadata/agent.py:306 #: neutron/services/metering/agents/metering_agent.py:278 msgid "" @@ -116,7 +109,7 @@ msgid "" " will be disabled." msgstr "" -#: neutron/agent/l3/agent.py:192 +#: neutron/agent/l3/agent.py:193 #, python-format msgid "" "l3-agent cannot check service plugins enabled at the neutron server when " @@ -125,29 +118,29 @@ msgid "" "warning. Detail message: %s" msgstr "" -#: neutron/agent/l3/agent.py:204 +#: neutron/agent/l3/agent.py:205 #, python-format msgid "" "l3-agent cannot check service plugins enabled on the neutron server. " "Retrying. Detail message: %s" msgstr "" -#: neutron/agent/l3/agent.py:334 +#: neutron/agent/l3/agent.py:337 #, python-format msgid "Info for router %s was not found. Skipping router removal" msgstr "" -#: neutron/agent/l3/router_info.py:206 +#: neutron/agent/l3/router_info.py:208 #, python-format msgid "Unable to configure IP address for floating IP: %s" msgstr "" -#: neutron/agent/linux/dhcp.py:227 +#: neutron/agent/linux/dhcp.py:228 #, python-format msgid "Failed trying to delete interface: %s" msgstr "" -#: neutron/agent/linux/dhcp.py:235 +#: neutron/agent/linux/dhcp.py:236 #, python-format msgid "Failed trying to delete namespace: %s" msgstr "" @@ -158,14 +151,14 @@ msgid "Attempted to remove chain %s which does not exist" msgstr "" #: neutron/agent/linux/ebtables_manager.py:237 -#: neutron/agent/linux/iptables_manager.py:247 +#: neutron/agent/linux/iptables_manager.py:249 #, python-format msgid "" "Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r " "%(top)r" msgstr "" -#: neutron/agent/linux/iptables_manager.py:696 +#: neutron/agent/linux/iptables_manager.py:702 #, python-format msgid "Attempted to get traffic counters of chain %s which does not exist" msgstr "" @@ -180,7 +173,7 @@ msgid "" "usually occurs when shared secrets do not match." msgstr "" -#: neutron/api/api_common.py:102 +#: neutron/api/api_common.py:103 #, python-format msgid "" "Invalid value for pagination_max_limit: %s. It should be an integer " @@ -222,20 +215,19 @@ msgid "" "inactive agents." msgstr "" -#: neutron/api/rpc/handlers/dhcp_rpc.py:94 +#: neutron/api/rpc/handlers/dhcp_rpc.py:100 #, python-format msgid "" "Action %(action)s for network %(net_id)s could not complete successfully:" " %(reason)s" msgstr "" -#: neutron/api/rpc/handlers/dhcp_rpc.py:146 -#: neutron/api/rpc/handlers/dhcp_rpc.py:210 +#: neutron/api/rpc/handlers/dhcp_rpc.py:152 #, python-format msgid "Network %s could not be found, it might have been deleted concurrently." msgstr "" -#: neutron/api/rpc/handlers/dhcp_rpc.py:279 +#: neutron/api/rpc/handlers/dhcp_rpc.py:203 #, python-format msgid "Updating lease expiration is now deprecated. Issued from host %s." msgstr "" @@ -271,14 +263,14 @@ msgid "" "in case there was a clock adjustment." msgstr "" -#: neutron/db/agentschedulers_db.py:274 +#: neutron/db/agentschedulers_db.py:275 #, python-format msgid "" "Removing network %(network)s from agent %(agent)s because the agent did " "not report to the server in the last %(dead_time)s seconds." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:104 +#: neutron/db/l3_agentschedulers_db.py:105 #, python-format msgid "" "Rescheduling router %(router)s from agent %(agent)s because the agent did" @@ -289,7 +281,7 @@ msgstr "" msgid "No active L3 agents found for SNAT" msgstr "" -#: neutron/db/securitygroups_rpc_base.py:372 +#: neutron/db/securitygroups_rpc_base.py:383 #, python-format msgid "No valid gateway port on subnet %s is found for IPv6 RA" msgstr "" @@ -363,36 +355,36 @@ msgstr "" msgid "Ignoring admin_state_up=False for router=%r. Overriding with True" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:84 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:85 msgid "VXLAN is enabled, a valid local_ip must be provided" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:98 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:99 msgid "Invalid Network ID, will lead to incorrect bridge name" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:105 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:106 msgid "Invalid VLAN ID, will lead to incorrect subinterface name" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:112 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:113 msgid "Invalid Interface ID, will lead to incorrect tap device name" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:121 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:122 #, python-format msgid "Invalid Segmentation ID: %s, will lead to incorrect vxlan device name" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:526 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:562 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:527 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:563 #, python-format msgid "" "Option \"%(option)s\" must be supported by command \"%(command)s\" to " "enable %(mode)s mode" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:556 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:557 msgid "" "VXLAN muticast group must be provided in vxlan_group option to enable " "VXLAN MCAST mode" @@ -403,23 +395,23 @@ msgstr "" msgid "Could not expand segment %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:532 +#: neutron/plugins/ml2/plugin.py:527 #, python-format msgid "" "In _notify_port_updated(), no bound segment for port %(port_id)s on " "network %(network_id)s" msgstr "" -#: neutron/plugins/ml2/plugin.py:783 +#: neutron/plugins/ml2/plugin.py:778 msgid "A concurrent port creation has occurred" msgstr "" -#: neutron/plugins/ml2/plugin.py:1391 +#: neutron/plugins/ml2/plugin.py:1396 #, python-format msgid "Port %(port)s updated up by agent not found" msgstr "" -#: neutron/plugins/ml2/plugin.py:1423 +#: neutron/plugins/ml2/plugin.py:1428 #, python-format msgid "Port %s not found during update" msgstr "" @@ -442,35 +434,30 @@ msgstr "" msgid "Attempting to bind with dead agent: %s" msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:134 +#: neutron/plugins/ml2/drivers/type_flat.py:135 #, python-format msgid "No flat network found on physical network %s" msgstr "" -#: neutron/plugins/ml2/drivers/type_gre.py:106 +#: neutron/plugins/ml2/drivers/type_gre.py:107 msgid "Gre allocations were already created." msgstr "" -#: neutron/plugins/ml2/drivers/type_gre.py:160 -#, python-format -msgid "Gre endpoint with ip %s already exists" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:182 +#: neutron/plugins/ml2/drivers/type_tunnel.py:179 #, python-format msgid "%(type)s tunnel %(id)s not found" msgstr "" +#: neutron/plugins/ml2/drivers/type_tunnel.py:236 +#, python-format +msgid "Endpoint with ip %s already exists" +msgstr "" + #: neutron/plugins/ml2/drivers/type_vlan.py:257 #, python-format msgid "No vlan_id %(vlan_id)s found on physical network %(physical_network)s" msgstr "" -#: neutron/plugins/ml2/drivers/type_vxlan.py:168 -#, python-format -msgid "Vxlan endpoint with ip %s already exists" -msgstr "" - #: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:67 #, python-format msgid "Create network postcommit failed for network %s" @@ -529,57 +516,57 @@ msgid "" " %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:189 +#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:190 #, python-format msgid "" "L2 agent could not get DVR MAC address from server. Retrying. Detailed " "message: %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:516 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:525 #, python-format msgid "Action %s not supported" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1010 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:920 #, python-format msgid "" "Creating an interface named %(name)s exceeds the %(limit)d character " "limitation. It was shortened to %(new_name)s to fit." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1211 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1120 #, python-format msgid "VIF port: %s has no ofport configured, and might not be able to transmit" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1323 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1228 #, python-format msgid "Device %s not defined on plugin" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1483 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1388 #, python-format msgid "Invalid remote IP: %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1526 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1431 msgid "OVS is restarted. OVSNeutronAgent will reset bridges and recover ports." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1530 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1434 msgid "" "OVS is dead. OVSNeutronAgent will keep running and checking OVS status " "periodically." msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:147 -#: neutron/plugins/sriovnicagent/eswitch_manager.py:160 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:148 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:161 #, python-format msgid "Cannot find vf index for pci slot %s" msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:283 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:284 #, python-format msgid "device pci mismatch: %(device_mac)s - %(pci_slot)s" msgstr "" diff --git a/neutron/locale/neutron.pot b/neutron/locale/neutron.pot index abd550bbcf3..07a84488698 100644 --- a/neutron/locale/neutron.pot +++ b/neutron/locale/neutron.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 2015.2.0.dev533\n" +"Project-Id-Version: neutron 2015.2.0.dev464\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-06-02 06:15+0000\n" +"POT-Creation-Date: 2015-06-11 06:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,42 +17,42 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: neutron/context.py:102 +#: neutron/context.py:97 #, python-format msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" msgstr "" -#: neutron/manager.py:74 +#: neutron/manager.py:75 #, python-format msgid "dhcp_agents_per_network must be >= 1. '%s' is invalid." msgstr "" -#: neutron/manager.py:86 +#: neutron/manager.py:87 msgid "Neutron core_plugin not configured!" msgstr "" -#: neutron/manager.py:134 neutron/manager.py:146 +#: neutron/manager.py:135 neutron/manager.py:147 msgid "Plugin not found." msgstr "" -#: neutron/manager.py:189 +#: neutron/manager.py:190 #, python-format msgid "Multiple plugins for service %s were configured" msgstr "" -#: neutron/policy.py:246 +#: neutron/policy.py:201 #, python-format msgid "" "Unable to identify a target field from:%s. Match should be in the form " "%%()s" msgstr "" -#: neutron/policy.py:276 +#: neutron/policy.py:231 #, python-format msgid "Unable to find resource name in %s" msgstr "" -#: neutron/policy.py:285 +#: neutron/policy.py:240 #, python-format msgid "" "Unable to verify match:%(match)s as the parent resource: %(res)s was not " @@ -91,59 +91,59 @@ msgstr "" msgid "Access to this resource was denied." msgstr "" -#: neutron/service.py:42 +#: neutron/service.py:41 msgid "Seconds between running periodic tasks" msgstr "" -#: neutron/service.py:45 +#: neutron/service.py:44 msgid "Number of separate API worker processes for service" msgstr "" -#: neutron/service.py:48 +#: neutron/service.py:47 msgid "Number of RPC worker processes for service" msgstr "" -#: neutron/service.py:51 +#: neutron/service.py:50 msgid "" "Range of seconds to randomly delay when starting the periodic task " "scheduler to reduce stampeding. (Disable by setting to 0)" msgstr "" -#: neutron/wsgi.py:49 +#: neutron/wsgi.py:51 msgid "Number of backlog requests to configure the socket with" msgstr "" -#: neutron/wsgi.py:53 +#: neutron/wsgi.py:55 msgid "" "Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not " "supported on OS X." msgstr "" -#: neutron/wsgi.py:57 +#: neutron/wsgi.py:59 msgid "Number of seconds to keep retrying to listen" msgstr "" -#: neutron/wsgi.py:60 +#: neutron/wsgi.py:62 msgid "Max header line to accommodate large tokens" msgstr "" -#: neutron/wsgi.py:63 +#: neutron/wsgi.py:65 msgid "Enable SSL on the API server" msgstr "" -#: neutron/wsgi.py:65 +#: neutron/wsgi.py:67 msgid "CA certificate file to use to verify connecting clients" msgstr "" -#: neutron/wsgi.py:68 +#: neutron/wsgi.py:70 msgid "Certificate file to use when starting the server securely" msgstr "" -#: neutron/wsgi.py:71 +#: neutron/wsgi.py:73 msgid "Private key file to use when starting the server securely" msgstr "" -#: neutron/wsgi.py:75 +#: neutron/wsgi.py:77 msgid "" "Determines if connections are allowed to be held open by clients after a " "request is fulfilled. A value of False will ensure that the socket " @@ -151,62 +151,62 @@ msgid "" " client." msgstr "" -#: neutron/wsgi.py:81 +#: neutron/wsgi.py:83 msgid "" "Timeout for client connections socket operations. If an incoming " "connection is idle for this number of seconds it will be closed. A value " "of '0' means wait forever." msgstr "" -#: neutron/wsgi.py:169 +#: neutron/wsgi.py:176 #, python-format msgid "Could not bind to %(host)s:%(port)s after trying for %(time)d seconds" msgstr "" -#: neutron/wsgi.py:189 +#: neutron/wsgi.py:196 #, python-format msgid "Unable to find ssl_cert_file : %s" msgstr "" -#: neutron/wsgi.py:195 +#: neutron/wsgi.py:202 #, python-format msgid "Unable to find ssl_key_file : %s" msgstr "" -#: neutron/wsgi.py:200 +#: neutron/wsgi.py:207 #, python-format msgid "Unable to find ssl_ca_file : %s" msgstr "" -#: neutron/wsgi.py:484 +#: neutron/wsgi.py:495 msgid "Cannot understand JSON" msgstr "" -#: neutron/wsgi.py:650 +#: neutron/wsgi.py:661 msgid "You must implement __call__" msgstr "" -#: neutron/wsgi.py:738 neutron/api/v2/base.py:195 neutron/api/v2/base.py:343 -#: neutron/api/v2/base.py:486 neutron/api/v2/base.py:546 +#: neutron/wsgi.py:749 neutron/api/v2/base.py:196 neutron/api/v2/base.py:344 +#: neutron/api/v2/base.py:487 neutron/api/v2/base.py:547 #: neutron/extensions/l3agentscheduler.py:51 #: neutron/extensions/l3agentscheduler.py:94 msgid "The resource could not be found." msgstr "" -#: neutron/wsgi.py:787 +#: neutron/wsgi.py:798 msgid "Unsupported Content-Type" msgstr "" -#: neutron/wsgi.py:791 +#: neutron/wsgi.py:802 msgid "Malformed request body" msgstr "" -#: neutron/wsgi.py:928 +#: neutron/wsgi.py:939 #, python-format msgid "The requested content type %s is invalid." msgstr "" -#: neutron/wsgi.py:981 +#: neutron/wsgi.py:992 msgid "Could not deserialize data" msgstr "" @@ -275,20 +275,20 @@ msgstr "" msgid "Timeout in seconds for ovs-vsctl commands" msgstr "" -#: neutron/agent/common/ovs_lib.py:440 +#: neutron/agent/common/ovs_lib.py:441 #, python-format msgid "Unable to determine mac address for %s" msgstr "" -#: neutron/agent/common/ovs_lib.py:548 +#: neutron/agent/common/ovs_lib.py:549 msgid "Cannot match priority on flow deletion or modification" msgstr "" -#: neutron/agent/common/ovs_lib.py:553 +#: neutron/agent/common/ovs_lib.py:554 msgid "Must specify one or more actions on flow addition or modification" msgstr "" -#: neutron/agent/dhcp/agent.py:589 +#: neutron/agent/dhcp/agent.py:580 #, python-format msgid "Agent updated: %(payload)s" msgstr "" @@ -343,7 +343,7 @@ msgstr "" msgid "Use broadcast in DHCP replies" msgstr "" -#: neutron/agent/l3/agent.py:278 +#: neutron/agent/l3/agent.py:279 msgid "" "The 'gateway_external_network_id' option must be configured for this " "agent as Neutron has more than one external network." @@ -537,7 +537,7 @@ msgid "Location of temporary ebtables table files." msgstr "" #: neutron/agent/linux/ebtables_manager.py:210 -#: neutron/agent/linux/iptables_manager.py:211 +#: neutron/agent/linux/iptables_manager.py:212 #, python-format msgid "Unknown chain: %r" msgstr "" @@ -586,7 +586,7 @@ msgid "Authentication URL" msgstr "" #: neutron/agent/linux/interface.py:60 neutron/agent/metadata/config.py:63 -#: neutron/common/config.py:49 neutron/plugins/metaplugin/common/config.py:72 +#: neutron/common/config.py:50 neutron/plugins/metaplugin/common/config.py:72 msgid "The type of authentication to use" msgstr "" @@ -641,7 +641,7 @@ msgstr "" msgid "Location to store IPv6 RA config files" msgstr "" -#: neutron/agent/linux/utils.py:119 +#: neutron/agent/linux/utils.py:120 msgid "" "\n" "Command: {cmd}\n" @@ -796,7 +796,7 @@ msgid "" " log file." msgstr "" -#: neutron/agent/ovsdb/api.py:30 +#: neutron/agent/ovsdb/api.py:32 msgid "The interface for interacting with the OVSDB" msgstr "" @@ -833,33 +833,33 @@ msgid "" "Stderr: %(stderr)s" msgstr "" -#: neutron/api/api_common.py:116 +#: neutron/api/api_common.py:117 #, python-format msgid "Limit must be an integer 0 or greater and not '%d'" msgstr "" -#: neutron/api/api_common.py:133 +#: neutron/api/api_common.py:134 msgid "The number of sort_keys and sort_dirs must be same" msgstr "" -#: neutron/api/api_common.py:138 +#: neutron/api/api_common.py:139 #, python-format msgid "%s is invalid attribute for sort_keys" msgstr "" -#: neutron/api/api_common.py:142 +#: neutron/api/api_common.py:143 #, python-format msgid "" "%(invalid_dirs)s is invalid value for sort_dirs, valid value is '%(asc)s'" " and '%(desc)s'" msgstr "" -#: neutron/api/api_common.py:316 neutron/api/v2/base.py:617 +#: neutron/api/api_common.py:317 neutron/api/v2/base.py:618 #, python-format msgid "Unable to find '%s' in request body" msgstr "" -#: neutron/api/api_common.py:323 +#: neutron/api/api_common.py:324 #, python-format msgid "Failed to parse request. Parameter '%s' not specified" msgstr "" @@ -877,7 +877,7 @@ msgstr "" msgid "Unknown API version specified" msgstr "" -#: neutron/api/rpc/handlers/dhcp_rpc.py:77 +#: neutron/api/rpc/handlers/dhcp_rpc.py:83 msgid "Unrecognized action" msgstr "" @@ -1055,68 +1055,68 @@ msgstr "" msgid "'%s' is not of the form =[value]" msgstr "" -#: neutron/api/v2/base.py:90 +#: neutron/api/v2/base.py:91 msgid "Native pagination depend on native sorting" msgstr "" -#: neutron/api/v2/base.py:507 +#: neutron/api/v2/base.py:508 #, python-format msgid "Invalid format: %s" msgstr "" -#: neutron/api/v2/base.py:569 +#: neutron/api/v2/base.py:570 msgid "" "Specifying 'tenant_id' other than authenticated tenant in request " "requires admin privileges" msgstr "" -#: neutron/api/v2/base.py:577 +#: neutron/api/v2/base.py:578 msgid "Running without keystone AuthN requires that tenant_id is specified" msgstr "" -#: neutron/api/v2/base.py:595 +#: neutron/api/v2/base.py:596 msgid "Resource body required" msgstr "" -#: neutron/api/v2/base.py:601 +#: neutron/api/v2/base.py:602 msgid "Bulk operation not supported" msgstr "" -#: neutron/api/v2/base.py:604 +#: neutron/api/v2/base.py:605 msgid "Resources required" msgstr "" -#: neutron/api/v2/base.py:614 +#: neutron/api/v2/base.py:615 msgid "Body contains invalid data" msgstr "" -#: neutron/api/v2/base.py:628 +#: neutron/api/v2/base.py:629 #, python-format msgid "Failed to parse request. Required attribute '%s' not specified" msgstr "" -#: neutron/api/v2/base.py:635 +#: neutron/api/v2/base.py:636 #, python-format msgid "Attribute '%s' not allowed in POST" msgstr "" -#: neutron/api/v2/base.py:640 +#: neutron/api/v2/base.py:641 #, python-format msgid "Cannot update read-only attribute %s" msgstr "" -#: neutron/api/v2/base.py:658 +#: neutron/api/v2/base.py:659 #, python-format msgid "Invalid input for %(attr)s. Reason: %(reason)s." msgstr "" -#: neutron/api/v2/base.py:667 neutron/extensions/allowedaddresspairs.py:75 +#: neutron/api/v2/base.py:668 neutron/extensions/allowedaddresspairs.py:75 #: neutron/extensions/multiprovidernet.py:45 #, python-format msgid "Unrecognized attribute(s) '%s'" msgstr "" -#: neutron/api/v2/base.py:686 +#: neutron/api/v2/base.py:687 #, python-format msgid "Tenant %(tenant_id)s not allowed to create %(resource)s on this network" msgstr "" @@ -1185,191 +1185,191 @@ msgstr "" msgid "Check ebtables installation" msgstr "" -#: neutron/common/config.py:41 +#: neutron/common/config.py:42 msgid "The host IP to bind to" msgstr "" -#: neutron/common/config.py:43 +#: neutron/common/config.py:44 msgid "The port to bind to" msgstr "" -#: neutron/common/config.py:45 +#: neutron/common/config.py:46 msgid "The API paste config file to use" msgstr "" -#: neutron/common/config.py:47 +#: neutron/common/config.py:48 msgid "The path for API extensions" msgstr "" -#: neutron/common/config.py:51 +#: neutron/common/config.py:52 msgid "The core plugin Neutron will use" msgstr "" -#: neutron/common/config.py:53 neutron/db/migration/cli.py:40 +#: neutron/common/config.py:54 neutron/db/migration/cli.py:40 msgid "The service plugins Neutron will use" msgstr "" -#: neutron/common/config.py:55 +#: neutron/common/config.py:56 msgid "The base MAC address Neutron will use for VIFs" msgstr "" -#: neutron/common/config.py:57 +#: neutron/common/config.py:58 msgid "How many times Neutron will retry MAC generation" msgstr "" -#: neutron/common/config.py:59 +#: neutron/common/config.py:60 msgid "Allow the usage of the bulk API" msgstr "" -#: neutron/common/config.py:61 +#: neutron/common/config.py:62 msgid "Allow the usage of the pagination" msgstr "" -#: neutron/common/config.py:63 +#: neutron/common/config.py:64 msgid "Allow the usage of the sorting" msgstr "" -#: neutron/common/config.py:65 +#: neutron/common/config.py:66 msgid "" "The maximum number of items returned in a single response, value was " "'infinite' or negative integer means no limit" msgstr "" -#: neutron/common/config.py:69 +#: neutron/common/config.py:70 msgid "Maximum number of DNS nameservers" msgstr "" -#: neutron/common/config.py:71 +#: neutron/common/config.py:72 msgid "Maximum number of host routes per subnet" msgstr "" -#: neutron/common/config.py:73 +#: neutron/common/config.py:74 msgid "Maximum number of fixed ips per port" msgstr "" -#: neutron/common/config.py:75 +#: neutron/common/config.py:76 msgid "Default IPv4 subnet-pool to be used for automatic subnet CIDR allocation" msgstr "" -#: neutron/common/config.py:78 +#: neutron/common/config.py:79 msgid "Default IPv6 subnet-pool to be used for automatic subnet CIDR allocation" msgstr "" -#: neutron/common/config.py:82 +#: neutron/common/config.py:83 msgid "" "DHCP lease duration (in seconds). Use -1 to tell dnsmasq to use infinite " "lease times." msgstr "" -#: neutron/common/config.py:85 +#: neutron/common/config.py:86 msgid "Allow sending resource operation notification to DHCP agent" msgstr "" -#: neutron/common/config.py:88 +#: neutron/common/config.py:89 msgid "Allow overlapping IP support in Neutron" msgstr "" -#: neutron/common/config.py:90 +#: neutron/common/config.py:91 msgid "" "Hostname to be used by the neutron server, agents and services running on" " this machine. All the agents and services running on this machine must " "use the same host value." msgstr "" -#: neutron/common/config.py:95 +#: neutron/common/config.py:96 msgid "" "Ensure that configured gateway is on subnet. For IPv6, validate only if " "gateway is not a link local address. Deprecated, to be removed during the" " K release, at which point the check will be mandatory." msgstr "" -#: neutron/common/config.py:101 +#: neutron/common/config.py:102 msgid "Send notification to nova when port status changes" msgstr "" -#: neutron/common/config.py:103 +#: neutron/common/config.py:104 msgid "" "Send notification to nova when port data (fixed_ips/floatingip) changes " "so nova can update its cache." msgstr "" -#: neutron/common/config.py:107 +#: neutron/common/config.py:108 msgid "" "URL for connection to nova. Deprecated in favour of an auth plugin in " "[nova]." msgstr "" -#: neutron/common/config.py:110 +#: neutron/common/config.py:111 msgid "" "Username for connecting to nova in admin context. Deprecated in favour of" " an auth plugin in [nova]." msgstr "" -#: neutron/common/config.py:113 +#: neutron/common/config.py:114 msgid "" "Password for connection to nova in admin context. Deprecated in favour of" " an auth plugin in [nova]." msgstr "" -#: neutron/common/config.py:117 +#: neutron/common/config.py:118 msgid "" "The uuid of the admin nova tenant. Deprecated in favour of an auth plugin" " in [nova]." msgstr "" -#: neutron/common/config.py:120 +#: neutron/common/config.py:121 msgid "" "The name of the admin nova tenant. Deprecated in favour of an auth plugin" " in [nova]." msgstr "" -#: neutron/common/config.py:124 +#: neutron/common/config.py:125 msgid "" "Authorization URL for connecting to nova in admin context. Deprecated in " "favour of an auth plugin in [nova]." msgstr "" -#: neutron/common/config.py:128 +#: neutron/common/config.py:129 msgid "" "Number of seconds between sending events to nova if there are any events " "to send." msgstr "" -#: neutron/common/config.py:131 +#: neutron/common/config.py:132 msgid "" "If True, effort is made to advertise MTU settings to VMs via network " "methods (DHCP and RA MTU options) when the network's preferred MTU is " "known." msgstr "" -#: neutron/common/config.py:135 +#: neutron/common/config.py:136 msgid "IPAM driver to use." msgstr "" -#: neutron/common/config.py:137 +#: neutron/common/config.py:138 msgid "" "If True, then allow plugins that support it to create VLAN transparent " "networks." msgstr "" -#: neutron/common/config.py:144 +#: neutron/common/config.py:145 msgid "" "Where to store Neutron state files. This directory must be writable by " "the agent." msgstr "" -#: neutron/common/config.py:176 +#: neutron/common/config.py:177 msgid "" "Name of nova region to use. Useful if keystone manages more than one " "region." msgstr "" -#: neutron/common/config.py:198 +#: neutron/common/config.py:199 #, python-format msgid "Base MAC: %s" msgstr "" -#: neutron/common/config.py:231 +#: neutron/common/config.py:240 #, python-format msgid "Unable to load %(app_name)s from configuration file %(config_path)s." msgstr "" @@ -1831,34 +1831,34 @@ msgstr "" msgid "Bad prefix type for generate IPv6 address by EUI-64: %s" msgstr "" -#: neutron/common/utils.py:202 +#: neutron/common/utils.py:203 #: neutron/plugins/sriovnicagent/common/config.py:36 #, python-format msgid "Invalid mapping: '%s'" msgstr "" -#: neutron/common/utils.py:205 +#: neutron/common/utils.py:206 #: neutron/plugins/sriovnicagent/common/config.py:39 #, python-format msgid "Missing key in mapping: '%s'" msgstr "" -#: neutron/common/utils.py:208 +#: neutron/common/utils.py:209 #, python-format msgid "Missing value in mapping: '%s'" msgstr "" -#: neutron/common/utils.py:210 +#: neutron/common/utils.py:211 #, python-format msgid "Key %(key)s in mapping: '%(mapping)s' not unique" msgstr "" -#: neutron/common/utils.py:213 +#: neutron/common/utils.py:214 #, python-format msgid "Value %(value)s in mapping: '%(mapping)s' not unique" msgstr "" -#: neutron/common/utils.py:407 +#: neutron/common/utils.py:408 msgid "Illegal IP version number" msgstr "" @@ -1912,57 +1912,40 @@ msgid "" "such agents is available if this option is True." msgstr "" -#: neutron/db/common_db_mixin.py:123 +#: neutron/db/common_db_mixin.py:138 msgid "Cannot create resource for another tenant" msgstr "" -#: neutron/db/db_base_plugin_v2.py:393 -msgid "IP allocation requires subnet_id or ip_address" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:410 -#, python-format -msgid "" -"Failed to create port on network %(network_id)s, because fixed_ips " -"included invalid subnet %(subnet_id)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:436 -#, python-format -msgid "" -"IPv6 address %(address)s can not be directly assigned to a port on subnet" -" %(id)s since the subnet is configured for automatic addresses" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:455 neutron/db/db_base_plugin_v2.py:503 +#: neutron/db/db_base_plugin_v2.py:134 +#: neutron/db/ipam_non_pluggable_backend.py:263 #: neutron/plugins/opencontrail/contrail_plugin.py:390 msgid "Exceeded maximim amount of fixed ips per port" msgstr "" -#: neutron/db/db_base_plugin_v2.py:627 +#: neutron/db/db_base_plugin_v2.py:186 msgid "0 is not allowed as CIDR prefix length" msgstr "" -#: neutron/db/db_base_plugin_v2.py:637 +#: neutron/db/db_base_plugin_v2.py:196 #, python-format msgid "" "Requested subnet with cidr: %(cidr)s for network: %(network_id)s overlaps" " with another subnet" msgstr "" -#: neutron/db/db_base_plugin_v2.py:732 neutron/db/db_base_plugin_v2.py:736 +#: neutron/db/db_base_plugin_v2.py:224 neutron/db/db_base_plugin_v2.py:228 #, python-format msgid "Invalid route: %s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:814 +#: neutron/db/db_base_plugin_v2.py:306 #, python-format msgid "" "Invalid CIDR %s for IPv6 address mode. OpenStack uses the EUI-64 address " "format, which requires the prefix to be /64." msgstr "" -#: neutron/db/db_base_plugin_v2.py:822 +#: neutron/db/db_base_plugin_v2.py:314 #, python-format msgid "" "ipv6_ra_mode set to '%(ra_mode)s' with ipv6_address_mode set to " @@ -1970,77 +1953,77 @@ msgid "" "the same value" msgstr "" -#: neutron/db/db_base_plugin_v2.py:830 +#: neutron/db/db_base_plugin_v2.py:322 msgid "" "ipv6_ra_mode or ipv6_address_mode cannot be set when enable_dhcp is set " "to False." msgstr "" -#: neutron/db/db_base_plugin_v2.py:836 +#: neutron/db/db_base_plugin_v2.py:328 msgid "Cannot disable enable_dhcp with ipv6 attributes set" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1052 +#: neutron/db/db_base_plugin_v2.py:458 #, python-format msgid "%(name)s '%(addr)s' does not match the ip_version '%(ip_version)s'" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1079 +#: neutron/db/db_base_plugin_v2.py:485 msgid "Subnet has a prefix length that is incompatible with DHCP service enabled." msgstr "" -#: neutron/db/db_base_plugin_v2.py:1100 +#: neutron/db/db_base_plugin_v2.py:506 msgid "Gateway is not valid on subnet" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1120 neutron/db/db_base_plugin_v2.py:1134 +#: neutron/db/db_base_plugin_v2.py:526 neutron/db/db_base_plugin_v2.py:540 #: neutron/plugins/opencontrail/contrail_plugin.py:313 msgid "new subnet" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1127 +#: neutron/db/db_base_plugin_v2.py:533 #, python-format msgid "Error parsing dns address %s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1143 +#: neutron/db/db_base_plugin_v2.py:549 msgid "ipv6_ra_mode is not valid when ip_version is 4" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1147 +#: neutron/db/db_base_plugin_v2.py:553 msgid "ipv6_address_mode is not valid when ip_version is 4" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1296 +#: neutron/db/db_base_plugin_v2.py:668 msgid "allocation_pools allowed only for specific subnet requests." msgstr "" -#: neutron/db/db_base_plugin_v2.py:1307 +#: neutron/db/db_base_plugin_v2.py:679 #, python-format msgid "Cannot allocate IPv%(req_ver)s subnet from IPv%(pool_ver)s subnet pool" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1385 +#: neutron/db/db_base_plugin_v2.py:757 msgid "ip_version must be specified in the absence of cidr and subnetpool_id" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1402 +#: neutron/db/db_base_plugin_v2.py:774 msgid "cidr and prefixlen must not be supplied together" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1413 +#: neutron/db/db_base_plugin_v2.py:785 msgid "A cidr must be specified in the absence of a subnet pool" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1717 +#: neutron/db/db_base_plugin_v2.py:1037 msgid "Existing prefixes must be a subset of the new prefixes" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1784 +#: neutron/db/db_base_plugin_v2.py:1104 msgid "Subnet pool has existing allocations" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1791 +#: neutron/db/db_base_plugin_v2.py:1111 msgid "mac address update" msgstr "" @@ -2060,56 +2043,74 @@ msgstr "" msgid "the nexthop is used by router" msgstr "" -#: neutron/db/l3_agentschedulers_db.py:44 +#: neutron/db/ipam_non_pluggable_backend.py:201 +msgid "IP allocation requires subnet_id or ip_address" +msgstr "" + +#: neutron/db/ipam_non_pluggable_backend.py:218 +#, python-format +msgid "" +"Failed to create port on network %(network_id)s, because fixed_ips " +"included invalid subnet %(subnet_id)s" +msgstr "" + +#: neutron/db/ipam_non_pluggable_backend.py:244 +#, python-format +msgid "" +"IPv6 address %(address)s can not be directly assigned to a port on subnet" +" %(id)s since the subnet is configured for automatic addresses" +msgstr "" + +#: neutron/db/l3_agentschedulers_db.py:45 msgid "Driver to use for scheduling router to a default L3 agent" msgstr "" -#: neutron/db/l3_agentschedulers_db.py:47 +#: neutron/db/l3_agentschedulers_db.py:48 msgid "Allow auto scheduling of routers to L3 agent." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:49 +#: neutron/db/l3_agentschedulers_db.py:50 msgid "" "Automatically reschedule routers from offline L3 agents to online L3 " "agents." msgstr "" -#: neutron/db/l3_db.py:271 +#: neutron/db/l3_db.py:272 #, python-format msgid "No eligible l3 agent associated with external network %s found" msgstr "" -#: neutron/db/l3_db.py:309 +#: neutron/db/l3_db.py:310 #, python-format msgid "Network %s is not an external network" msgstr "" -#: neutron/db/l3_db.py:319 +#: neutron/db/l3_db.py:320 #, python-format msgid "External IP %s is the same as the gateway IP" msgstr "" -#: neutron/db/l3_db.py:469 +#: neutron/db/l3_db.py:470 #, python-format msgid "Router already has a port on subnet %s" msgstr "" -#: neutron/db/l3_db.py:483 +#: neutron/db/l3_db.py:484 #, python-format msgid "" "Cidr %(subnet_cidr)s of subnet %(subnet_id)s overlaps with cidr %(cidr)s " "of subnet %(sub_id)s" msgstr "" -#: neutron/db/l3_db.py:499 neutron/plugins/opencontrail/contrail_plugin.py:501 +#: neutron/db/l3_db.py:500 neutron/plugins/opencontrail/contrail_plugin.py:501 msgid "Either subnet_id or port_id must be specified" msgstr "" -#: neutron/db/l3_db.py:503 neutron/plugins/opencontrail/contrail_plugin.py:511 +#: neutron/db/l3_db.py:504 neutron/plugins/opencontrail/contrail_plugin.py:511 msgid "Cannot specify both subnet-id and port-id" msgstr "" -#: neutron/db/l3_db.py:520 +#: neutron/db/l3_db.py:521 #, python-format msgid "" "Cannot have multiple router ports with the same network id if both " @@ -2117,63 +2118,63 @@ msgid "" "id %(nid)s" msgstr "" -#: neutron/db/l3_db.py:562 +#: neutron/db/l3_db.py:563 msgid "Subnet for router interface must have a gateway IP" msgstr "" -#: neutron/db/l3_db.py:566 +#: neutron/db/l3_db.py:567 #, python-format msgid "" "IPv6 subnet %s configured to receive RAs from an external router cannot " "be added to Neutron Router." msgstr "" -#: neutron/db/l3_db.py:778 +#: neutron/db/l3_db.py:779 #, python-format msgid "Cannot add floating IP to port on subnet %s which has no gateway_ip" msgstr "" -#: neutron/db/l3_db.py:819 +#: neutron/db/l3_db.py:820 #, python-format msgid "" "Port %(port_id)s is associated with a different tenant than Floating IP " "%(floatingip_id)s and therefore cannot be bound." msgstr "" -#: neutron/db/l3_db.py:823 +#: neutron/db/l3_db.py:824 #, python-format msgid "" "Cannot create floating IP and bind it to Port %s, since that port is " "owned by a different tenant." msgstr "" -#: neutron/db/l3_db.py:835 +#: neutron/db/l3_db.py:836 #, python-format msgid "Port %(id)s does not have fixed ip %(address)s" msgstr "" -#: neutron/db/l3_db.py:842 +#: neutron/db/l3_db.py:843 #, python-format msgid "Cannot add floating IP to port %s that has no fixed IP addresses" msgstr "" -#: neutron/db/l3_db.py:846 +#: neutron/db/l3_db.py:847 #, python-format msgid "" "Port %s has multiple fixed IPs. Must provide a specific IP when " "assigning a floating IP" msgstr "" -#: neutron/db/l3_db.py:875 +#: neutron/db/l3_db.py:876 msgid "fixed_ip_address cannot be specified without a port_id" msgstr "" -#: neutron/db/l3_db.py:915 +#: neutron/db/l3_db.py:916 #, python-format msgid "Network %s is not a valid external network" msgstr "" -#: neutron/db/l3_db.py:1059 +#: neutron/db/l3_db.py:1060 #, python-format msgid "has device owner %s" msgstr "" @@ -2360,7 +2361,7 @@ msgid "" "implemented" msgstr "" -#: neutron/db/migration/alembic_migrations/versions/14be42f3d0a5_default_sec_group_table.py:44 +#: neutron/db/migration/alembic_migrations/versions/14be42f3d0a5_default_sec_group_table.py:45 #, python-format msgid "" "Some tenants have more than one security group named 'default': " @@ -2966,40 +2967,6 @@ msgstr "" msgid "Rules must be an instance of dict or Rules, got %s instead" msgstr "" -#: neutron/openstack/common/versionutils.py:108 -#, python-format -msgid "" -"%(what)s is deprecated as of %(as_of)s in favor of %(in_favor_of)s and " -"may be removed in %(remove_in)s." -msgstr "" - -#: neutron/openstack/common/versionutils.py:112 -#, python-format -msgid "" -"%(what)s is deprecated as of %(as_of)s and may be removed in " -"%(remove_in)s. It will not be superseded." -msgstr "" - -#: neutron/openstack/common/versionutils.py:116 -#, python-format -msgid "%(what)s is deprecated as of %(as_of)s in favor of %(in_favor_of)s." -msgstr "" - -#: neutron/openstack/common/versionutils.py:119 -#, python-format -msgid "%(what)s is deprecated as of %(as_of)s. It will not be superseded." -msgstr "" - -#: neutron/openstack/common/versionutils.py:241 -#, python-format -msgid "Deprecated: %s" -msgstr "" - -#: neutron/openstack/common/versionutils.py:259 -#, python-format -msgid "Fatal call to deprecated config: %(msg)s" -msgstr "" - #: neutron/plugins/brocade/NeutronPlugin.py:62 #: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:22 #: neutron/services/l3_router/brocade/l3_router_plugin.py:23 @@ -3964,6 +3931,13 @@ msgstr "" msgid "Enable server RPC compatibility with old agents" msgstr "" +#: neutron/plugins/linuxbridge/common/config.py:66 +#: neutron/plugins/openvswitch/common/config.py:96 +msgid "" +"Set new timeout in seconds for new rpc calls after agent receives " +"SIGTERM. If value is set to 0, rpc timeout won't be changed" +msgstr "" + #: neutron/plugins/metaplugin/common/config.py:23 msgid "" "Comma separated list of flavor:neutron_plugin for plugins to load. " @@ -4072,16 +4046,16 @@ msgid "" "configured in type_drivers config option." msgstr "" -#: neutron/plugins/ml2/managers.py:98 +#: neutron/plugins/ml2/managers.py:99 msgid "network_type required" msgstr "" -#: neutron/plugins/ml2/managers.py:205 neutron/plugins/ml2/managers.py:214 +#: neutron/plugins/ml2/managers.py:206 neutron/plugins/ml2/managers.py:215 #, python-format msgid "network_type value '%s' not supported" msgstr "" -#: neutron/plugins/ml2/plugin.py:232 +#: neutron/plugins/ml2/plugin.py:228 msgid "binding:profile value too large" msgstr "" @@ -4090,26 +4064,26 @@ msgstr "" msgid "%(method)s failed." msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:33 +#: neutron/plugins/ml2/drivers/type_flat.py:34 msgid "" "List of physical_network names with which flat networks can be created. " "Use * to allow flat networks with arbitrary physical_network names." msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:75 +#: neutron/plugins/ml2/drivers/type_flat.py:76 msgid "physical network name is empty" msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:93 +#: neutron/plugins/ml2/drivers/type_flat.py:94 msgid "physical_network required for flat provider network" msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:96 +#: neutron/plugins/ml2/drivers/type_flat.py:97 #, python-format msgid "physical_network '%s' unknown for flat provider network" msgstr "" -#: neutron/plugins/ml2/drivers/type_flat.py:103 +#: neutron/plugins/ml2/drivers/type_flat.py:104 #, python-format msgid "%s prohibited for flat provider network" msgstr "" @@ -4120,35 +4094,35 @@ msgid "" "GRE tunnel IDs that are available for tenant network allocation" msgstr "" -#: neutron/plugins/ml2/drivers/type_local.py:51 +#: neutron/plugins/ml2/drivers/type_local.py:52 #, python-format msgid "%s prohibited for local provider network" msgstr "" -#: neutron/plugins/ml2/drivers/type_tunnel.py:125 +#: neutron/plugins/ml2/drivers/type_tunnel.py:122 #, python-format msgid "provider:physical_network specified for %s network" msgstr "" -#: neutron/plugins/ml2/drivers/type_tunnel.py:132 +#: neutron/plugins/ml2/drivers/type_tunnel.py:129 #, python-format msgid "%(key)s prohibited for %(tunnel)s provider network" msgstr "" -#: neutron/plugins/ml2/drivers/type_tunnel.py:213 +#: neutron/plugins/ml2/drivers/type_tunnel.py:254 msgid "Tunnel IP value needed by the ML2 plugin" msgstr "" -#: neutron/plugins/ml2/drivers/type_tunnel.py:218 +#: neutron/plugins/ml2/drivers/type_tunnel.py:259 msgid "Network type value needed by the ML2 plugin" msgstr "" -#: neutron/plugins/ml2/drivers/type_tunnel.py:245 +#: neutron/plugins/ml2/drivers/type_tunnel.py:286 #, python-format msgid "Tunnel IP %(ip)s in use with host %(host)s" msgstr "" -#: neutron/plugins/ml2/drivers/type_tunnel.py:264 +#: neutron/plugins/ml2/drivers/type_tunnel.py:305 #, python-format msgid "Network type value '%s' not supported" msgstr "" @@ -4180,13 +4154,13 @@ msgstr "" msgid "%s prohibited for VLAN provider network" msgstr "" -#: neutron/plugins/ml2/drivers/type_vxlan.py:35 +#: neutron/plugins/ml2/drivers/type_vxlan.py:34 msgid "" "Comma-separated list of : tuples enumerating ranges of " "VXLAN VNI IDs that are available for tenant network allocation" msgstr "" -#: neutron/plugins/ml2/drivers/type_vxlan.py:39 +#: neutron/plugins/ml2/drivers/type_vxlan.py:38 msgid "Multicast group for VXLAN. If unset, disables VXLAN multicast mode." msgstr "" @@ -4383,25 +4357,6 @@ msgstr "" msgid "Add new policy profile attribute to port resource." msgstr "" -#: neutron/plugins/ml2/drivers/cisco/ncs/driver.py:29 -msgid "HTTP URL of Tail-f NCS REST interface." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/ncs/driver.py:31 -#: neutron/plugins/ml2/drivers/opendaylight/driver.py:32 -msgid "HTTP username for authentication" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/ncs/driver.py:33 -#: neutron/plugins/ml2/drivers/opendaylight/driver.py:34 -msgid "HTTP password for authentication" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/ncs/driver.py:35 -#: neutron/plugins/ml2/drivers/opendaylight/driver.py:36 -msgid "HTTP timeout in seconds." -msgstr "" - #: neutron/plugins/ml2/drivers/freescale/config.py:28 msgid "CRD service Username." msgstr "" @@ -4499,6 +4454,18 @@ msgstr "" msgid "HTTP URL of OpenDaylight REST interface." msgstr "" +#: neutron/plugins/ml2/drivers/opendaylight/driver.py:32 +msgid "HTTP username for authentication" +msgstr "" + +#: neutron/plugins/ml2/drivers/opendaylight/driver.py:34 +msgid "HTTP password for authentication" +msgstr "" + +#: neutron/plugins/ml2/drivers/opendaylight/driver.py:36 +msgid "HTTP timeout in seconds." +msgstr "" + #: neutron/plugins/ml2/drivers/opendaylight/driver.py:38 msgid "Tomcat session timeout in minutes." msgstr "" @@ -4688,30 +4655,30 @@ msgstr "" msgid "Unable to connect to NVSD controller. Exiting after %(retries)s attempts" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:60 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:63 #, python-format msgid "" "Unable to retrieve port details for devices: %(devices)s because of " "error: %(error)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1594 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1624 msgid "" "DVR deployments for VXLAN/GRE underlays require L2-pop to be enabled, in " "both the Agent and Server side." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1608 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1638 #, python-format msgid "Parsing bridge_mappings failed: %s." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1630 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1660 #, python-format msgid "Invalid tunnel type specified: %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1633 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1663 msgid "Tunneling cannot be enabled without a valid local_ip." msgstr "" @@ -4798,17 +4765,11 @@ msgstr "" msgid "Make the l2 agent run in DVR mode." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:96 -msgid "" -"Set new timeout in seconds for new rpc calls after agent receives " -"SIGTERM. If value is set to 0, rpc timeout won't be changed" -msgstr "" - -#: neutron/plugins/sriovnicagent/eswitch_manager.py:50 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:51 msgid "Device not found" msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:64 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:65 msgid "Device has no virtual functions" msgstr "" @@ -5105,7 +5066,7 @@ msgstr "" msgid "An interface driver must be specified" msgstr "" -#: neutron/tests/base.py:108 +#: neutron/tests/base.py:109 #, python-format msgid "Unknown attribute '%s'." msgstr "" @@ -5144,12 +5105,12 @@ msgid "" "operation." msgstr "" -#: neutron/tests/unit/plugins/ml2/test_plugin.py:423 +#: neutron/tests/unit/plugins/ml2/test_plugin.py:443 #, python-format msgid "Deleting port %s" msgstr "" -#: neutron/tests/unit/plugins/ml2/test_plugin.py:424 +#: neutron/tests/unit/plugins/ml2/test_plugin.py:444 #, python-format msgid "The port '%s' was deleted" msgstr "" @@ -5183,8 +5144,8 @@ msgstr "" msgid "Adds test attributes to core resources." msgstr "" -#: neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py:881 -#: neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py:898 +#: neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py:893 +#: neutron/tests/unit/plugins/openvswitch/agent/test_ovs_neutron_agent.py:910 #, python-format msgid "Failed to set-up %(type)s tunnel port to %(ip)s" msgstr "" diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po index 81e426efea8..c9334cb8360 100644 --- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Neutron\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-05-29 06:16+0000\n" -"PO-Revision-Date: 2015-05-28 20:54+0000\n" +"POT-Creation-Date: 2015-06-11 06:02+0000\n" +"PO-Revision-Date: 2015-06-10 23:52+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "neutron/language/pt_BR/)\n" @@ -185,13 +185,6 @@ msgstr "Inicializando o Extension Manager." msgid "Initializing mechanism driver '%s'" msgstr "Inicializando driver de mecanismo '%s'" -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "" -"Inserindo política: %(new_policy)s no lugar de política deprecada: " -"%(old_policy)s" - #, python-format msgid "Interface mappings: %s" msgstr "Mapeamentos da interface: %s" diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po index 9d896ed214e..f85f32f3d16 100644 --- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: Neutron\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-05-29 06:16+0000\n" -"PO-Revision-Date: 2015-05-28 20:54+0000\n" +"POT-Creation-Date: 2015-06-11 06:02+0000\n" +"PO-Revision-Date: 2015-06-10 23:52+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/neutron/" "language/zh_CN/)\n" @@ -209,11 +209,6 @@ msgstr "初始化扩展驱动 '%s'" msgid "Initializing extension manager." msgstr "正在初始化扩展管理员。" -#, python-format -msgid "" -"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" -msgstr "在被废弃的策略:%(old_policy)s位置上插入策略:%(new_policy)s " - #, python-format msgid "Interface mappings: %s" msgstr "接口映射:%s" From 1552f311532fdbd03a79ecfc1fae488b072c5a14 Mon Sep 17 00:00:00 2001 From: Ann Kamyshnikova Date: Tue, 9 Jun 2015 11:30:06 +0300 Subject: [PATCH 063/161] Fix Enum usage in 589f9237ca0e_cisco_n1kv_ml2_driver_tables PostgreSQL is more sensitive with types than MySQL, it creates a separate type when a Enum is created. In migration 589f9237ca0e type profile_type is trying to be created, but the type with such name was already created in havana_initial migration. The solution for this is not to create type in 589f9237ca0e migration when dialect is PostgreSQL and use already created. Closes-bug: #1463301 Change-Id: I66e74d50cc70673de8635616076779cc20cde113 --- .../589f9237ca0e_cisco_n1kv_ml2_driver_tables.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/neutron/db/migration/alembic_migrations/versions/589f9237ca0e_cisco_n1kv_ml2_driver_tables.py b/neutron/db/migration/alembic_migrations/versions/589f9237ca0e_cisco_n1kv_ml2_driver_tables.py index 6c091ce5d27..c1f4422bdda 100644 --- a/neutron/db/migration/alembic_migrations/versions/589f9237ca0e_cisco_n1kv_ml2_driver_tables.py +++ b/neutron/db/migration/alembic_migrations/versions/589f9237ca0e_cisco_n1kv_ml2_driver_tables.py @@ -31,7 +31,6 @@ import sqlalchemy as sa network_profile_type = sa.Enum('vlan', 'vxlan', name='network_profile_type') -profile_type = sa.Enum('network', 'policy', name='profile_type') def upgrade(): @@ -103,7 +102,15 @@ def upgrade(): ondelete='CASCADE'), sa.PrimaryKeyConstraint('physical_network', 'vlan_id') ) - + # Bugfix for 1463301: PostgreSQL creates type when Enum assigned to column, + # but type profile_type was already created in cisco_init_opts, so it needs + # to be reused. MySQL do not create type for Enums. + if op.get_context().dialect.name == 'postgresql': + profile_type = sa.dialects.postgresql.ENUM('network', 'policy', + name='profile_type', + create_type=False) + else: + profile_type = sa.Enum('network', 'policy', name='profile_type') op.create_table( 'cisco_ml2_n1kv_profile_bindings', sa.Column('profile_type', profile_type, nullable=True), From 5ff082bcfe12647036e5b033bfc2bac514acdb42 Mon Sep 17 00:00:00 2001 From: Dane LeBlanc Date: Tue, 24 Feb 2015 15:47:01 -0500 Subject: [PATCH 064/161] Stop sending gratuitous arp when ip version is 6 This fix prevents calls to the arping utility for IPv6 addresses, thereby eliminating errors reported by arping for IPv6 addresses. The assumption is that NDP, DAD, and RAs are sufficient for address resolution and duplicate address detection for IPv6, and that unsolicited Neighbor Advertisements (NAs) are not required for OpenStack services. If this turns out not to be the case for some service/feature, then a separate bug should be filed to add support for unsolicited NAs for that service. Change-Id: I14f869b7d488d7e691f7316eafcab3064e12cda6 Closes-Bug: 1357068 --- neutron/agent/l3/dvr_fip_ns.py | 8 ++--- neutron/agent/l3/dvr_router.py | 8 ++--- neutron/agent/l3/legacy_router.py | 8 ++--- neutron/agent/l3/router_info.py | 16 +++++----- neutron/agent/linux/ip_lib.py | 16 ++++++++-- neutron/tests/unit/agent/l3/test_agent.py | 31 ++++++++++--------- .../tests/unit/agent/l3/test_dvr_fip_ns.py | 13 ++++---- .../tests/unit/agent/l3/test_dvr_router.py | 4 +-- .../tests/unit/agent/l3/test_legacy_router.py | 13 ++++---- neutron/tests/unit/agent/linux/test_ip_lib.py | 28 +++++++++++------ 10 files changed, 83 insertions(+), 62 deletions(-) diff --git a/neutron/agent/l3/dvr_fip_ns.py b/neutron/agent/l3/dvr_fip_ns.py index 9b7eee99a88..90e24d129d9 100644 --- a/neutron/agent/l3/dvr_fip_ns.py +++ b/neutron/agent/l3/dvr_fip_ns.py @@ -107,10 +107,10 @@ class FipNamespace(namespaces.Namespace): clean_connections=True) for fixed_ip in ex_gw_port['fixed_ips']: - ip_lib.send_gratuitous_arp(ns_name, - interface_name, - fixed_ip['ip_address'], - self.agent_conf.send_arp_for_ha) + ip_lib.send_ip_addr_adv_notif(ns_name, + interface_name, + fixed_ip['ip_address'], + self.agent_conf) for subnet in ex_gw_port['subnets']: gw_ip = subnet.get('gateway_ip') diff --git a/neutron/agent/l3/dvr_router.py b/neutron/agent/l3/dvr_router.py index 8c1313acc9f..df3d465e4d6 100755 --- a/neutron/agent/l3/dvr_router.py +++ b/neutron/agent/l3/dvr_router.py @@ -100,10 +100,10 @@ class DvrRouter(router.RouterInfo): interface_name = ( self.fip_ns.get_ext_device_name( self.fip_ns.agent_gateway_port['id'])) - ip_lib.send_gratuitous_arp(fip_ns_name, - interface_name, - floating_ip, - self.agent_conf.send_arp_for_ha) + ip_lib.send_ip_addr_adv_notif(fip_ns_name, + interface_name, + floating_ip, + self.agent_conf) # update internal structures self.dist_fip_count = self.dist_fip_count + 1 diff --git a/neutron/agent/l3/legacy_router.py b/neutron/agent/l3/legacy_router.py index 9c7c5bdc7e9..2b8ccdbaa96 100644 --- a/neutron/agent/l3/legacy_router.py +++ b/neutron/agent/l3/legacy_router.py @@ -24,8 +24,8 @@ class LegacyRouter(router.RouterInfo): # As GARP is processed in a distinct thread the call below # won't raise an exception to be handled. - ip_lib.send_gratuitous_arp(self.ns_name, - interface_name, - fip['floating_ip_address'], - self.agent_conf.send_arp_for_ha) + ip_lib.send_ip_addr_adv_notif(self.ns_name, + interface_name, + fip['floating_ip_address'], + self.agent_conf) return l3_constants.FLOATINGIP_STATUS_ACTIVE diff --git a/neutron/agent/l3/router_info.py b/neutron/agent/l3/router_info.py index 0dfbc13ef58..f698a94d61c 100644 --- a/neutron/agent/l3/router_info.py +++ b/neutron/agent/l3/router_info.py @@ -293,10 +293,10 @@ class RouterInfo(object): ip_cidrs = common_utils.fixed_ip_cidrs(fixed_ips) self.driver.init_l3(interface_name, ip_cidrs, namespace=ns_name) for fixed_ip in fixed_ips: - ip_lib.send_gratuitous_arp(ns_name, - interface_name, - fixed_ip['ip_address'], - self.agent_conf.send_arp_for_ha) + ip_lib.send_ip_addr_adv_notif(ns_name, + interface_name, + fixed_ip['ip_address'], + self.agent_conf) def internal_network_added(self, port): network_id = port['network_id'] @@ -465,10 +465,10 @@ class RouterInfo(object): enable_ra_on_gw=enable_ra_on_gw, clean_connections=True) for fixed_ip in ex_gw_port['fixed_ips']: - ip_lib.send_gratuitous_arp(ns_name, - interface_name, - fixed_ip['ip_address'], - self.agent_conf.send_arp_for_ha) + ip_lib.send_ip_addr_adv_notif(ns_name, + interface_name, + fixed_ip['ip_address'], + self.agent_conf) def is_v6_gateway_set(self, gateway_ips): """Check to see if list of gateway_ips has an IPv6 gateway. diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index 32fe1f9ac84..f04152cf538 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -757,13 +757,23 @@ def _arping(ns_name, iface_name, address, count): 'ns': ns_name}) -def send_gratuitous_arp(ns_name, iface_name, address, count): - """Send a gratuitous arp using given namespace, interface, and address.""" +def send_ip_addr_adv_notif(ns_name, iface_name, address, config): + """Send advance notification of an IP address assignment. + + If the address is in the IPv4 family, send gratuitous ARP. + + If the address is in the IPv6 family, no advance notification is + necessary, since the Neighbor Discovery Protocol (NDP), Duplicate + Address Discovery (DAD), and (for stateless addresses) router + advertisements (RAs) are sufficient for address resolution and + duplicate address detection. + """ + count = config.send_arp_for_ha def arping(): _arping(ns_name, iface_name, address, count) - if count > 0: + if count > 0 and netaddr.IPAddress(address).version == 4: eventlet.spawn_n(arping) diff --git a/neutron/tests/unit/agent/l3/test_agent.py b/neutron/tests/unit/agent/l3/test_agent.py index aeec5c6f1c2..143c659dd12 100644 --- a/neutron/tests/unit/agent/l3/test_agent.py +++ b/neutron/tests/unit/agent/l3/test_agent.py @@ -323,9 +323,9 @@ class BasicRouterOperationsFramework(base.BaseTestCase): self.process_monitor = mock.patch( 'neutron.agent.linux.external_process.ProcessMonitor').start() - self.send_arp_p = mock.patch( - 'neutron.agent.linux.ip_lib.send_gratuitous_arp') - self.send_arp = self.send_arp_p.start() + self.send_adv_notif_p = mock.patch( + 'neutron.agent.linux.ip_lib.send_ip_addr_adv_notif') + self.send_adv_notif = self.send_adv_notif_p.start() self.dvr_cls_p = mock.patch('neutron.agent.linux.interface.NullDriver') driver_cls = self.dvr_cls_p.start() @@ -510,8 +510,9 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): ri.internal_network_added(port) self.assertEqual(self.mock_driver.plug.call_count, 1) self.assertEqual(self.mock_driver.init_l3.call_count, 1) - self.send_arp.assert_called_once_with(ri.ns_name, interface_name, - '99.0.1.9', mock.ANY) + self.send_adv_notif.assert_called_once_with(ri.ns_name, + interface_name, + '99.0.1.9', mock.ANY) elif action == 'remove': self.device_exists.return_value = True ri.internal_network_removed(port) @@ -622,7 +623,7 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): self.assertEqual(self.mock_driver.plug.call_count, 1) self.assertEqual(self.mock_driver.init_l3.call_count, 1) if no_subnet and not dual_stack: - self.assertEqual(self.send_arp.call_count, 0) + self.assertEqual(self.send_adv_notif.call_count, 0) ip_cidrs = [] gateway_ips = [] if no_sub_gw: @@ -640,7 +641,7 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): exp_arp_calls += [mock.call(ri.ns_name, interface_name, '2001:192:168:100::2', mock.ANY)] - self.send_arp.assert_has_calls(exp_arp_calls) + self.send_adv_notif.assert_has_calls(exp_arp_calls) ip_cidrs = ['20.0.0.30/24'] gateway_ips = ['20.0.0.1'] if dual_stack: @@ -811,7 +812,7 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): ri.use_ipv6 = True exp_arp_calls += [mock.call(ri.ns_name, interface_name, '2001:192:168:100::2', mock.ANY)] - self.send_arp.assert_has_calls(exp_arp_calls) + self.send_adv_notif.assert_has_calls(exp_arp_calls) ip_cidrs = ['20.0.0.30/24'] gateway_ips = ['20.0.0.1'] if dual_stack: @@ -1148,7 +1149,7 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): del router[l3_constants.INTERFACE_KEY] del router['gw_port'] ri.process(agent) - self.assertEqual(self.send_arp.call_count, 1) + self.assertEqual(self.send_adv_notif.call_count, 1) distributed = ri.router.get('distributed', False) self.assertEqual(ri.process_floating_ip_addresses.called, distributed) @@ -1385,7 +1386,7 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): self.assertEqual(len(mangle_rules_delta), 1) self._verify_snat_mangle_rules(nat_rules_delta, mangle_rules_delta, router) - self.assertEqual(self.send_arp.call_count, 1) + self.assertEqual(self.send_adv_notif.call_count, 1) def test_process_router_snat_enabled(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) @@ -1412,7 +1413,7 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): self.assertEqual(len(mangle_rules_delta), 1) self._verify_snat_mangle_rules(nat_rules_delta, mangle_rules_delta, router) - self.assertEqual(self.send_arp.call_count, 1) + self.assertEqual(self.send_adv_notif.call_count, 1) def test_process_router_interface_added(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) @@ -1426,8 +1427,8 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): # Reassign the router object to RouterInfo ri.router = router ri.process(agent) - # send_arp is called both times process is called - self.assertEqual(self.send_arp.call_count, 2) + # send_ip_addr_adv_notif is called both times process is called + self.assertEqual(self.send_adv_notif.call_count, 2) def _test_process_ipv6_only_or_dual_stack_gw(self, dual_stack=False): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) @@ -1617,8 +1618,8 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework): # Reassign the router object to RouterInfo ri.router = router ri.process(agent) - # send_arp is called both times process is called - self.assertEqual(self.send_arp.call_count, 2) + # send_ip_addr_adv_notif is called both times process is called + self.assertEqual(self.send_adv_notif.call_count, 2) def test_process_router_ipv6_interface_removed(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) diff --git a/neutron/tests/unit/agent/l3/test_dvr_fip_ns.py b/neutron/tests/unit/agent/l3/test_dvr_fip_ns.py index 47b8c45e2d0..b6ee852ad83 100644 --- a/neutron/tests/unit/agent/l3/test_dvr_fip_ns.py +++ b/neutron/tests/unit/agent/l3/test_dvr_fip_ns.py @@ -67,9 +67,10 @@ class TestDvrFipNs(base.BaseTestCase): @mock.patch.object(ip_lib, 'IPWrapper') @mock.patch.object(ip_lib, 'IPDevice') - @mock.patch.object(ip_lib, 'send_gratuitous_arp') + @mock.patch.object(ip_lib, 'send_ip_addr_adv_notif') @mock.patch.object(ip_lib, 'device_exists') - def test_gateway_added(self, device_exists, send_arp, IPDevice, IPWrapper): + def test_gateway_added(self, device_exists, send_adv_notif, + IPDevice, IPWrapper): subnet_id = _uuid() agent_gw_port = {'fixed_ips': [{'ip_address': '20.0.0.30', 'prefixlen': 24, @@ -86,10 +87,10 @@ class TestDvrFipNs(base.BaseTestCase): mock.sentinel.interface_name) self.assertEqual(self.driver.plug.call_count, 1) self.assertEqual(self.driver.init_l3.call_count, 1) - send_arp.assert_called_once_with(self.fip_ns.get_name(), - mock.sentinel.interface_name, - '20.0.0.30', - mock.ANY) + send_adv_notif.assert_called_once_with(self.fip_ns.get_name(), + mock.sentinel.interface_name, + '20.0.0.30', + mock.ANY) @mock.patch.object(ip_lib, 'IPWrapper') def test_destroy(self, IPWrapper): diff --git a/neutron/tests/unit/agent/l3/test_dvr_router.py b/neutron/tests/unit/agent/l3/test_dvr_router.py index fbbf08c43a6..8b68478c1be 100644 --- a/neutron/tests/unit/agent/l3/test_dvr_router.py +++ b/neutron/tests/unit/agent/l3/test_dvr_router.py @@ -56,10 +56,10 @@ class TestDvrRouterOperations(base.BaseTestCase): self.assertEqual([{'host': mock.sentinel.myhost}], fips) - @mock.patch.object(ip_lib, 'send_gratuitous_arp') + @mock.patch.object(ip_lib, 'send_ip_addr_adv_notif') @mock.patch.object(ip_lib, 'IPDevice') @mock.patch.object(ip_lib, 'IPRule') - def test_floating_ip_added_dist(self, mIPRule, mIPDevice, mock_arp): + def test_floating_ip_added_dist(self, mIPRule, mIPDevice, mock_adv_notif): router = mock.MagicMock() ri = self._create_router(router) ext_net_id = _uuid() diff --git a/neutron/tests/unit/agent/l3/test_legacy_router.py b/neutron/tests/unit/agent/l3/test_legacy_router.py index 2bf4f303515..b34b3cc540a 100644 --- a/neutron/tests/unit/agent/l3/test_legacy_router.py +++ b/neutron/tests/unit/agent/l3/test_legacy_router.py @@ -49,28 +49,27 @@ class TestBasicRouterOperations(BasicRouterTestCaseFramework): device.delete_addr_and_conntrack_state.assert_called_once_with(cidr) -@mock.patch.object(ip_lib, 'send_gratuitous_arp') +@mock.patch.object(ip_lib, 'send_ip_addr_adv_notif') class TestAddFloatingIpWithMockGarp(BasicRouterTestCaseFramework): - def test_add_floating_ip(self, send_gratuitous_arp): + def test_add_floating_ip(self, send_ip_addr_adv_notif): ri = self._create_router() ri._add_fip_addr_to_device = mock.Mock(return_value=True) - self.agent_conf.send_arp_for_ha = mock.sentinel.arp_count ip = '15.1.2.3' result = ri.add_floating_ip({'floating_ip_address': ip}, mock.sentinel.interface_name, mock.sentinel.device) - ip_lib.send_gratuitous_arp.assert_called_once_with( + ip_lib.send_ip_addr_adv_notif.assert_called_once_with( ri.ns_name, mock.sentinel.interface_name, ip, - mock.sentinel.arp_count) + self.agent_conf) self.assertEqual(l3_constants.FLOATINGIP_STATUS_ACTIVE, result) - def test_add_floating_ip_error(self, send_gratuitous_arp): + def test_add_floating_ip_error(self, send_ip_addr_adv_notif): ri = self._create_router() ri._add_fip_addr_to_device = mock.Mock(return_value=False) result = ri.add_floating_ip({'floating_ip_address': '15.1.2.3'}, mock.sentinel.interface_name, mock.sentinel.device) - self.assertFalse(ip_lib.send_gratuitous_arp.called) + self.assertFalse(ip_lib.send_ip_addr_adv_notif.called) self.assertEqual(l3_constants.FLOATINGIP_STATUS_ERROR, result) diff --git a/neutron/tests/unit/agent/linux/test_ip_lib.py b/neutron/tests/unit/agent/linux/test_ip_lib.py index 01ddf39997b..51ac34cfe95 100644 --- a/neutron/tests/unit/agent/linux/test_ip_lib.py +++ b/neutron/tests/unit/agent/linux/test_ip_lib.py @@ -1013,13 +1013,18 @@ class TestIpNeighCommand(TestIPCmdBase): class TestArpPing(TestIPCmdBase): - def _test_arping(self, function, address, spawn_n, mIPWrapper): + @mock.patch.object(ip_lib, 'IPWrapper') + @mock.patch('eventlet.spawn_n') + def test_send_ipv4_addr_adv_notif(self, spawn_n, mIPWrapper): spawn_n.side_effect = lambda f: f() ARPING_COUNT = 3 - function(mock.sentinel.ns_name, - mock.sentinel.iface_name, - address, - ARPING_COUNT) + address = '20.0.0.1' + config = mock.Mock() + config.send_arp_for_ha = ARPING_COUNT + ip_lib.send_ip_addr_adv_notif(mock.sentinel.ns_name, + mock.sentinel.iface_name, + address, + config) self.assertTrue(spawn_n.called) mIPWrapper.assert_called_once_with(namespace=mock.sentinel.ns_name) @@ -1035,11 +1040,16 @@ class TestArpPing(TestIPCmdBase): ip_wrapper.netns.execute.assert_any_call(arping_cmd, check_exit_code=True) - @mock.patch.object(ip_lib, 'IPWrapper') @mock.patch('eventlet.spawn_n') - def test_send_gratuitous_arp(self, spawn_n, mIPWrapper): - self._test_arping( - ip_lib.send_gratuitous_arp, '20.0.0.1', spawn_n, mIPWrapper) + def test_no_ipv6_addr_notif(self, spawn_n): + ipv6_addr = 'fd00::1' + config = mock.Mock() + config.send_arp_for_ha = 3 + ip_lib.send_ip_addr_adv_notif(mock.sentinel.ns_name, + mock.sentinel.iface_name, + ipv6_addr, + config) + self.assertFalse(spawn_n.called) class TestAddNamespaceToCmd(base.BaseTestCase): From 7e0222409dab6223579efea34ba0d3ccf93e11d3 Mon Sep 17 00:00:00 2001 From: Pavel Bondar Date: Thu, 11 Jun 2015 17:23:41 +0300 Subject: [PATCH 065/161] Refactor _update_subnet_allocation_pools Moved _update_subnet_allocation_pools to ipam_backend_mixin.py. Call _rebuild_availability_ranges with self to make it overridable on upper level (from non-pluggable backend). Partially-Implements: blueprint neutron-ipam Change-Id: If7b1e720f88a2f0177b6772a015ae216f19ee22d --- neutron/db/db_base_plugin_v2.py | 15 --------------- neutron/db/ipam_backend_mixin.py | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 9147fd88996..8dcd27554a4 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -781,21 +781,6 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNonPluggableBackend, LOG.debug("Port %s was deleted while updating it with an " "IPv6 auto-address. Ignoring.", port['id']) - def _update_subnet_allocation_pools(self, context, id, s): - context.session.query(models_v2.IPAllocationPool).filter_by( - subnet_id=id).delete() - new_pools = [models_v2.IPAllocationPool( - first_ip=p['start'], last_ip=p['end'], - subnet_id=id) for p in s['allocation_pools']] - context.session.add_all(new_pools) - NeutronDbPluginV2._rebuild_availability_ranges(context, [s]) - #Gather new pools for result: - result_pools = [{'start': pool['start'], - 'end': pool['end']} - for pool in s['allocation_pools']] - del s['allocation_pools'] - return result_pools - def update_subnet(self, context, id, subnet): """Update the subnet with new info. diff --git a/neutron/db/ipam_backend_mixin.py b/neutron/db/ipam_backend_mixin.py index e38b49549be..74853bd619e 100644 --- a/neutron/db/ipam_backend_mixin.py +++ b/neutron/db/ipam_backend_mixin.py @@ -37,6 +37,12 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): # Tracks changes in ip allocation for port using namedtuple Changes = collections.namedtuple('Changes', 'add original remove') + @staticmethod + def _rebuild_availability_ranges(context, subnets): + """Should be redefined for non-ipam backend only + """ + pass + def _update_db_port(self, context, db_port, new_port, network_id, new_mac): # Remove all attributes in new_port which are not in the port DB model # and then update the port @@ -99,6 +105,24 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): del s["dns_nameservers"] return new_dns + def _update_subnet_allocation_pools(self, context, id, s): + context.session.query(models_v2.IPAllocationPool).filter_by( + subnet_id=id).delete() + new_pools = [models_v2.IPAllocationPool(first_ip=p['start'], + last_ip=p['end'], + subnet_id=id) + for p in s['allocation_pools']] + context.session.add_all(new_pools) + # Call static method with self to redefine in child + # (non-pluggable backend) + self._rebuild_availability_ranges(context, [s]) + # Gather new pools for result: + result_pools = [{'start': pool['start'], + 'end': pool['end']} + for pool in s['allocation_pools']] + del s['allocation_pools'] + return result_pools + def _validate_allocation_pools(self, ip_pools, subnet_cidr): """Validate IP allocation pools. From 89a83bf199e7ea75c04f3205ff77987feed13184 Mon Sep 17 00:00:00 2001 From: rossella Date: Thu, 11 Jun 2015 10:43:36 +0200 Subject: [PATCH 066/161] OVSNeutronAgent pass the config as parameter Instead of using the global cfg.CONF, pass the config as parameter. This is very useful to test the agent without having to override the global config. Change-Id: I45534d79e044da9f2be4d596a58310fb28b7bf22 --- .../openvswitch/agent/ovs_neutron_agent.py | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py index 36e8851fdf5..8e5a5c18ced 100644 --- a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py @@ -134,7 +134,8 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, arp_responder=False, prevent_arp_spoofing=True, use_veth_interconnection=False, - quitting_rpc_timeout=None): + quitting_rpc_timeout=None, + conf=None): '''Constructor. :param bridge_classes: a dict for bridge classes. @@ -163,6 +164,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, interconnect the integration bridge to physical bridges. :param quitting_rpc_timeout: timeout in seconds for rpc calls after SIGTERM is received + :param conf: an instance of ConfigOpts ''' super(OVSNeutronAgent, self).__init__() self.br_int_cls = bridge_classes['br_int'] @@ -180,9 +182,11 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, self.enable_distributed_routing = enable_distributed_routing self.arp_responder_enabled = arp_responder and self.l2_pop self.prevent_arp_spoofing = prevent_arp_spoofing + self.conf = conf or cfg.CONF + self.agent_state = { 'binary': 'neutron-openvswitch-agent', - 'host': cfg.CONF.host, + 'host': self.conf.host, 'topic': q_const.L2_AGENT_TOPIC, 'configurations': {'bridge_mappings': bridge_mappings, 'tunnel_types': self.tunnel_types, @@ -226,8 +230,8 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, self.ovsdb_monitor_respawn_interval = ovsdb_monitor_respawn_interval self.local_ip = local_ip self.tunnel_count = 0 - self.vxlan_udp_port = cfg.CONF.AGENT.vxlan_udp_port - self.dont_fragment = cfg.CONF.AGENT.dont_fragment + self.vxlan_udp_port = self.conf.AGENT.vxlan_udp_port + self.dont_fragment = self.conf.AGENT.dont_fragment self.tun_br = None self.patch_int_ofport = constants.OFPORT_INVALID self.patch_tun_ofport = constants.OFPORT_INVALID @@ -247,11 +251,11 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, self.phys_ofports, self.patch_int_ofport, self.patch_tun_ofport, - cfg.CONF.host, + self.conf.host, self.enable_tunneling, self.enable_distributed_routing) - report_interval = cfg.CONF.AGENT.report_interval + report_interval = self.conf.AGENT.report_interval if report_interval: heartbeat = loopingcall.FixedIntervalLoopingCall( self._report_state) @@ -317,7 +321,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, local_vlan) def setup_rpc(self): - self.agent_id = 'ovs-agent-%s' % cfg.CONF.host + self.agent_id = 'ovs-agent-%s' % self.conf.host self.topic = topics.AGENT self.plugin_rpc = OVSPluginApi(topics.PLUGIN) self.sg_plugin_rpc = sg_rpc.SecurityGroupServerRpcApi(topics.PLUGIN) @@ -338,7 +342,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, [topics.DVR, topics.UPDATE]] if self.l2_pop: consumers.append([topics.L2POPULATION, - topics.UPDATE, cfg.CONF.host]) + topics.UPDATE, self.conf.host]) self.connection = agent_rpc.create_consumers(self.endpoints, self.topic, consumers, @@ -757,11 +761,11 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, if port_detail.get('admin_state_up'): LOG.debug("Setting status for %s to UP", device) self.plugin_rpc.update_device_up( - self.context, device, self.agent_id, cfg.CONF.host) + self.context, device, self.agent_id, self.conf.host) else: LOG.debug("Setting status for %s to DOWN", device) self.plugin_rpc.update_device_down( - self.context, device, self.agent_id, cfg.CONF.host) + self.context, device, self.agent_id, self.conf.host) LOG.info(_LI("Configuration for device %s completed."), device) @staticmethod @@ -835,9 +839,9 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, # which does nothing if bridge already exists. self.int_br.create() self.int_br.set_secure_mode() - self.int_br.setup_controllers(cfg.CONF) + self.int_br.setup_controllers(self.conf) - self.int_br.delete_port(cfg.CONF.OVS.int_peer_patch_port) + self.int_br.delete_port(self.conf.OVS.int_peer_patch_port) self.int_br.setup_default_table() @@ -879,11 +883,13 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, self.tun_br = self.br_tun_cls(tun_br_name) self.tun_br.reset_bridge(secure_mode=True) - self.tun_br.setup_controllers(cfg.CONF) + self.tun_br.setup_controllers(self.conf) self.patch_tun_ofport = self.int_br.add_patch_port( - cfg.CONF.OVS.int_peer_patch_port, cfg.CONF.OVS.tun_peer_patch_port) + self.conf.OVS.int_peer_patch_port, + self.conf.OVS.tun_peer_patch_port) self.patch_int_ofport = self.tun_br.add_patch_port( - cfg.CONF.OVS.tun_peer_patch_port, cfg.CONF.OVS.int_peer_patch_port) + self.conf.OVS.tun_peer_patch_port, + self.conf.OVS.int_peer_patch_port) if ovs_lib.INVALID_OFPORT in (self.patch_tun_ofport, self.patch_int_ofport): LOG.error(_LE("Failed to create OVS patch port. Cannot have " @@ -952,7 +958,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, 'bridge': bridge}) sys.exit(1) br = self.br_phys_cls(bridge) - br.setup_controllers(cfg.CONF) + br.setup_controllers(self.conf) br.setup_default_table() self.phys_brs[physical_network] = br @@ -1192,7 +1198,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, self.context, devices, self.agent_id, - cfg.CONF.host) + self.conf.host) except Exception as e: raise DeviceListRetrievalError(devices=devices, error=e) for details in devices_details_list: @@ -1236,7 +1242,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, self.context, devices, self.agent_id, - cfg.CONF.host) + self.conf.host) except Exception as e: raise DeviceListRetrievalError(devices=devices, error=e) @@ -1248,7 +1254,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, self.plugin_rpc.update_device_up(self.context, device, self.agent_id, - cfg.CONF.host) + self.conf.host) def treat_devices_removed(self, devices): resync = False @@ -1259,7 +1265,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, self.plugin_rpc.update_device_down(self.context, device, self.agent_id, - cfg.CONF.host) + self.conf.host) except Exception as e: LOG.debug("port_removed failed for %(device)s: %(e)s", {'device': device, 'e': e}) @@ -1276,7 +1282,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, details = self.plugin_rpc.update_device_down(self.context, device, self.agent_id, - cfg.CONF.host) + self.conf.host) except Exception as e: LOG.debug("port_removed failed for %(device)s: %(e)s", {'device': device, 'e': e}) @@ -1394,7 +1400,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, details = self.plugin_rpc.tunnel_sync(self.context, self.local_ip, tunnel_type, - cfg.CONF.host) + self.conf.host) if not self.l2_pop: tunnels = details['tunnels'] for tunnel in tunnels: @@ -1608,10 +1614,10 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, def _handle_sighup(self, signum, frame): LOG.info(_LI("Agent caught SIGHUP, resetting.")) - cfg.CONF.reload_config_files() + self.conf.reload_config_files() config.setup_logging() LOG.debug('Full set of CONF:') - cfg.CONF.log_opt_values(LOG, std_logging.DEBUG) + self.conf.log_opt_values(LOG, std_logging.DEBUG) def set_rpc_timeout(self, timeout): for rpc_api in (self.plugin_rpc, self.sg_plugin_rpc, From ba2c44ef000221f8a18274a9569838d8c26014c0 Mon Sep 17 00:00:00 2001 From: armando-migliaccio Date: Fri, 12 Jun 2015 08:58:05 -0700 Subject: [PATCH 067/161] Revert "Revert "Set default of api_workers to number of CPUs"" This reverts commit 12a564cf03e612dda36df26df8d28dfc75f1af6e. We should re-enable this feature on a controlled basis so that we can flush out any outstanding issue we may have. Related-bug: #1432189 Change-Id: I2cfd93fdb032b461022b729347390ff8636ccdeb --- etc/neutron.conf | 8 +++--- neutron/service.py | 15 +++++++++--- neutron/tests/functional/test_service.py | 31 ++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 neutron/tests/functional/test_service.py diff --git a/etc/neutron.conf b/etc/neutron.conf index 7a11b939fb5..f5a6da62767 100755 --- a/etc/neutron.conf +++ b/etc/neutron.conf @@ -287,10 +287,12 @@ # ========== end of items for VLAN trunking networks ========== # =========== WSGI parameters related to the API server ============== -# Number of separate worker processes to spawn. The default, 0, runs the +# Number of separate worker processes to spawn. A value of 0 runs the # worker thread in the current process. Greater than 0 launches that number of -# child processes as workers. The parent process manages them. -# api_workers = 0 +# child processes as workers. The parent process manages them. If not +# specified, the default value is equal to the number of CPUs available to +# achieve best performance. +# api_workers = # Number of separate RPC worker processes to spawn. The default, 0, runs the # worker thread in the current process. Greater than 0 launches that number of diff --git a/neutron/service.py b/neutron/service.py index e27dd5cdc2f..76b0fd90d2e 100644 --- a/neutron/service.py +++ b/neutron/service.py @@ -18,6 +18,7 @@ import logging as std_logging import os import random +from oslo_concurrency import processutils from oslo_config import cfg from oslo_log import log as logging from oslo_messaging import server as rpc_server @@ -40,8 +41,9 @@ service_opts = [ default=40, help=_('Seconds between running periodic tasks')), cfg.IntOpt('api_workers', - default=0, - help=_('Number of separate API worker processes for service')), + help=_('Number of separate API worker processes for service. ' + 'If not specified, the default is equal to the number ' + 'of CPUs available for best performance.')), cfg.IntOpt('rpc_workers', default=0, help=_('Number of RPC worker processes for service')), @@ -168,6 +170,13 @@ def serve_rpc(): 'details.')) +def _get_api_workers(): + workers = cfg.CONF.api_workers + if workers is None: + workers = processutils.get_worker_count() + return workers + + def _run_wsgi(app_name): app = config.load_paste_app(app_name) if not app: @@ -175,7 +184,7 @@ def _run_wsgi(app_name): return server = wsgi.Server("Neutron") server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host, - workers=cfg.CONF.api_workers) + workers=_get_api_workers()) # Dump all option values here after all options are parsed cfg.CONF.log_opt_values(LOG, std_logging.DEBUG) LOG.info(_LI("Neutron service started, listening on %(host)s:%(port)s"), diff --git a/neutron/tests/functional/test_service.py b/neutron/tests/functional/test_service.py new file mode 100644 index 00000000000..d3bed3ee048 --- /dev/null +++ b/neutron/tests/functional/test_service.py @@ -0,0 +1,31 @@ +# Copyright 2014 Red Hat, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslo_concurrency import processutils +from oslo_config import cfg + +from neutron import service +from neutron.tests import base + + +class TestService(base.BaseTestCase): + + def test_api_workers_default(self): + self.assertEqual(processutils.get_worker_count(), + service._get_api_workers()) + + def test_api_workers_from_config(self): + cfg.CONF.set_override('api_workers', 1234) + self.assertEqual(1234, + service._get_api_workers()) From 901e6ae6fb05d65ccfc4a6602de4160c3a34031e Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Sat, 13 Jun 2015 02:14:17 +0900 Subject: [PATCH 068/161] Remove meaningless no_delete from L3 test no_delete parameter was removed in Kilo and it no longer has any effect. Change-Id: Idf0f3ac24b3978392222efbf465cc9e6cfd5d346 --- neutron/tests/unit/extensions/test_l3.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/neutron/tests/unit/extensions/test_l3.py b/neutron/tests/unit/extensions/test_l3.py index fd6fff85bb4..52503d7d8de 100644 --- a/neutron/tests/unit/extensions/test_l3.py +++ b/neutron/tests/unit/extensions/test_l3.py @@ -2213,8 +2213,8 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): self._set_net_external(network_ex_id2) r2i_fixed_ips = [{'ip_address': '12.0.0.2'}] - with self.router(no_delete=True) as r1,\ - self.router(no_delete=True) as r2,\ + with self.router() as r1,\ + self.router() as r2,\ self.port(subnet=ins1, fixed_ips=r2i_fixed_ips) as r2i_port: self._add_external_gateway_to_router( From a5bf502fab57453a1aedd3a53ce89eaf464e1cd9 Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Fri, 12 Jun 2015 21:11:02 +0200 Subject: [PATCH 069/161] Remove duplicate tunnel id check in sync_allocations Currently, gre/vxlan sync_allocations and _parse_tunnel_ranges both check tunnel id values. This change removes the check in gre/vxlan sync_allocations as they duplicate _parse_tunnel_ranges check and is less fine. Change-Id: I5827468aeaec5d6c79d469132b129aeb7da171e2 --- neutron/plugins/ml2/drivers/type_gre.py | 7 +------ neutron/plugins/ml2/drivers/type_vxlan.py | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/neutron/plugins/ml2/drivers/type_gre.py b/neutron/plugins/ml2/drivers/type_gre.py index 18d7040f79a..5db7074c73c 100644 --- a/neutron/plugins/ml2/drivers/type_gre.py +++ b/neutron/plugins/ml2/drivers/type_gre.py @@ -89,12 +89,7 @@ class GreTypeDriver(type_tunnel.EndpointTunnelTypeDriver): gre_ids = set() for gre_id_range in self.tunnel_ranges: tun_min, tun_max = gre_id_range - if tun_max + 1 - tun_min > 1000000: - LOG.error(_LE("Skipping unreasonable gre ID range " - "%(tun_min)s:%(tun_max)s"), - {'tun_min': tun_min, 'tun_max': tun_max}) - else: - gre_ids |= set(moves.range(tun_min, tun_max + 1)) + gre_ids |= set(moves.range(tun_min, tun_max + 1)) session = db_api.get_session() try: diff --git a/neutron/plugins/ml2/drivers/type_vxlan.py b/neutron/plugins/ml2/drivers/type_vxlan.py index b8cdb003c33..52e5f7eaee7 100644 --- a/neutron/plugins/ml2/drivers/type_vxlan.py +++ b/neutron/plugins/ml2/drivers/type_vxlan.py @@ -91,12 +91,7 @@ class VxlanTypeDriver(type_tunnel.EndpointTunnelTypeDriver): # determine current configured allocatable vnis vxlan_vnis = set() for tun_min, tun_max in self.tunnel_ranges: - if tun_max + 1 - tun_min > p_const.MAX_VXLAN_VNI: - LOG.error(_LE("Skipping unreasonable VXLAN VNI range " - "%(tun_min)s:%(tun_max)s"), - {'tun_min': tun_min, 'tun_max': tun_max}) - else: - vxlan_vnis |= set(moves.range(tun_min, tun_max + 1)) + vxlan_vnis |= set(moves.range(tun_min, tun_max + 1)) session = db_api.get_session() with session.begin(subtransactions=True): From 9952abaab182f3ec701aad2397d6f3fcc0bacc7f Mon Sep 17 00:00:00 2001 From: Pavel Bondar Date: Mon, 8 Jun 2015 14:15:30 +0300 Subject: [PATCH 070/161] Decompose db_base_plugin_v2.py with changes This commit is a preparation step for using pluggable IPAM. 1. Moved get_subnets functionality to db_base_plugin_common to make it accessible by ipam backends. 2. Reworked update_subnet routine: - moved db part into update_db_subnet; Partially-Implements: blueprint neutron-ipam Change-Id: Idb8f54d9fccaad1137222d156590c37d86aa576b --- neutron/db/db_base_plugin_common.py | 12 ++++++ neutron/db/db_base_plugin_v2.py | 37 ++----------------- neutron/db/ipam_backend_mixin.py | 26 +++++++++++-- neutron/db/ipam_non_pluggable_backend.py | 4 +- .../tests/unit/db/test_db_base_plugin_v2.py | 2 +- 5 files changed, 42 insertions(+), 39 deletions(-) diff --git a/neutron/db/db_base_plugin_common.py b/neutron/db/db_base_plugin_common.py index d6a136c1db3..c69c543e9f8 100644 --- a/neutron/db/db_base_plugin_common.py +++ b/neutron/db/db_base_plugin_common.py @@ -203,6 +203,18 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin): # a lot of stress on the db. Consider adding a cache layer return context.session.query(models_v2.Subnet).all() + def _get_subnets(self, context, filters=None, fields=None, + sorts=None, limit=None, marker=None, + page_reverse=False): + marker_obj = self._get_marker_obj(context, 'subnet', limit, marker) + return self._get_collection(context, models_v2.Subnet, + self._make_subnet_dict, + filters=filters, fields=fields, + sorts=sorts, + limit=limit, + marker_obj=marker_obj, + page_reverse=page_reverse) + def _make_network_dict(self, network, fields=None, process_extensions=True): res = {'id': network['id'], diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 8dcd27554a4..0ff7e653d29 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -788,9 +788,6 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNonPluggableBackend, dns lease or we support gratuitous DHCP offers """ s = subnet['subnet'] - changed_host_routes = False - changed_dns = False - changed_allocation_pools = False db_subnet = self._get_subnet(context, id) # Fill 'ip_version' and 'allocation_pools' fields with the current # value since _validate_subnet() expects subnet spec has 'ip_version' @@ -806,30 +803,10 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNonPluggableBackend, self._validate_gw_out_of_pools(s["gateway_ip"], allocation_pools) with context.session.begin(subtransactions=True): - if "dns_nameservers" in s: - changed_dns = True - new_dns = self._update_subnet_dns_nameservers(context, id, s) - - if "host_routes" in s: - changed_host_routes = True - new_routes = self._update_subnet_host_routes(context, id, s) - - if "allocation_pools" in s: - self._validate_allocation_pools(s['allocation_pools'], - s['cidr']) - changed_allocation_pools = True - new_pools = self._update_subnet_allocation_pools(context, - id, s) - subnet = self._get_subnet(context, id) - subnet.update(s) + subnet, changes = self._update_db_subnet(context, id, s) result = self._make_subnet_dict(subnet) # Keep up with fields that changed - if changed_dns: - result['dns_nameservers'] = new_dns - if changed_host_routes: - result['host_routes'] = new_routes - if changed_allocation_pools: - result['allocation_pools'] = new_pools + result.update(changes) return result def _subnet_check_ip_allocations(self, context, subnet_id): @@ -912,14 +889,8 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNonPluggableBackend, def get_subnets(self, context, filters=None, fields=None, sorts=None, limit=None, marker=None, page_reverse=False): - marker_obj = self._get_marker_obj(context, 'subnet', limit, marker) - return self._get_collection(context, models_v2.Subnet, - self._make_subnet_dict, - filters=filters, fields=fields, - sorts=sorts, - limit=limit, - marker_obj=marker_obj, - page_reverse=page_reverse) + return self._get_subnets(context, filters, fields, sorts, limit, + marker, page_reverse) def get_subnets_count(self, context, filters=None): return self._get_collection_count(context, models_v2.Subnet, diff --git a/neutron/db/ipam_backend_mixin.py b/neutron/db/ipam_backend_mixin.py index 74853bd619e..f7b231d12cd 100644 --- a/neutron/db/ipam_backend_mixin.py +++ b/neutron/db/ipam_backend_mixin.py @@ -105,12 +105,12 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): del s["dns_nameservers"] return new_dns - def _update_subnet_allocation_pools(self, context, id, s): + def _update_subnet_allocation_pools(self, context, subnet_id, s): context.session.query(models_v2.IPAllocationPool).filter_by( - subnet_id=id).delete() + subnet_id=subnet_id).delete() new_pools = [models_v2.IPAllocationPool(first_ip=p['start'], last_ip=p['end'], - subnet_id=id) + subnet_id=subnet_id) for p in s['allocation_pools']] context.session.add_all(new_pools) # Call static method with self to redefine in child @@ -123,6 +123,26 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): del s['allocation_pools'] return result_pools + def _update_db_subnet(self, context, subnet_id, s): + changes = {} + if "dns_nameservers" in s: + changes['dns_nameservers'] = ( + self._update_subnet_dns_nameservers(context, subnet_id, s)) + + if "host_routes" in s: + changes['host_routes'] = self._update_subnet_host_routes( + context, subnet_id, s) + + if "allocation_pools" in s: + self._validate_allocation_pools(s['allocation_pools'], + s['cidr']) + changes['allocation_pools'] = ( + self._update_subnet_allocation_pools(context, subnet_id, s)) + + subnet = self._get_subnet(context, subnet_id) + subnet.update(s) + return subnet, changes + def _validate_allocation_pools(self, ip_pools, subnet_cidr): """Validate IP allocation pools. diff --git a/neutron/db/ipam_non_pluggable_backend.py b/neutron/db/ipam_non_pluggable_backend.py index bb929975a6b..c1fb4bc9631 100644 --- a/neutron/db/ipam_non_pluggable_backend.py +++ b/neutron/db/ipam_non_pluggable_backend.py @@ -221,7 +221,7 @@ class IpamNonPluggableBackend(ipam_backend_mixin.IpamBackendMixin): raise n_exc.InvalidInput(error_message=msg) filter = {'network_id': [network_id]} - subnets = self.get_subnets(context, filters=filter) + subnets = self._get_subnets(context, filters=filter) for subnet in subnets: if ipam_utils.check_subnet_ip(subnet['cidr'], fixed['ip_address']): @@ -352,7 +352,7 @@ class IpamNonPluggableBackend(ipam_backend_mixin.IpamBackendMixin): ips = [] v6_stateless = [] net_id_filter = {'network_id': [p['network_id']]} - subnets = self.get_subnets(context, filters=net_id_filter) + subnets = self._get_subnets(context, filters=net_id_filter) is_router_port = ( p['device_owner'] in constants.ROUTER_INTERFACE_OWNERS or p['device_owner'] == constants.DEVICE_OWNER_ROUTER_SNAT) diff --git a/neutron/tests/unit/db/test_db_base_plugin_v2.py b/neutron/tests/unit/db/test_db_base_plugin_v2.py index a73753ce182..ba99aa62487 100644 --- a/neutron/tests/unit/db/test_db_base_plugin_v2.py +++ b/neutron/tests/unit/db/test_db_base_plugin_v2.py @@ -5422,7 +5422,7 @@ class TestNeutronDbPluginV2(base.BaseTestCase): def _test__allocate_ips_for_port(self, subnets, port, expected): plugin = db_base_plugin_v2.NeutronDbPluginV2() with mock.patch.object(db_base_plugin_v2.NeutronDbPluginV2, - 'get_subnets') as get_subnets: + '_get_subnets') as get_subnets: with mock.patch.object(db_base_plugin_v2.NeutronDbPluginV2, '_check_unique_ip') as check_unique: context = mock.Mock() From 1710f7c72f2c509d1009ee36ba4f66b298967fe9 Mon Sep 17 00:00:00 2001 From: Kobi Samoray Date: Thu, 4 Jun 2015 15:49:13 +0300 Subject: [PATCH 071/161] VMWare NSXv: Add distributed URL locking to ini NSXv plugin supports distributed locking using tooz library. This patch adds the required parameter to the ini file. DocImpact Depends-On: Icbcec938c1c5ae7a528350f2f283388b81fa66b7 Change-Id: I8a7c36d044c4be29b0dfa3fbb8e9379723cebd61 --- etc/neutron/plugins/vmware/nsx.ini | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/etc/neutron/plugins/vmware/nsx.ini b/etc/neutron/plugins/vmware/nsx.ini index 64c08f31cd5..2eef2254eca 100644 --- a/etc/neutron/plugins/vmware/nsx.ini +++ b/etc/neutron/plugins/vmware/nsx.ini @@ -150,6 +150,12 @@ # (Optional) Password to configure for Edge appliance login # edge_appliance_password = +# (Optional) URL for distributed locking coordination resource for lock manager +# This value is passed as a parameter to tooz coordinator. +# By default, value is None and oslo_concurrency is used for single-node +# lock management. +# locking_coordinator_url = + [nsx] # Maximum number of ports for each bridged logical switch # The recommended value for this parameter varies with NSX version From bb846c89ee120662eabdd4b0136fac82de076777 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Fri, 12 Jun 2015 21:26:37 -0400 Subject: [PATCH 072/161] Reflect project moves from stackforge to openstack. Several git repos were just moved from stackforge to openstack. Reflect the move in various places where the URL was in docs and comments. In passing, also change URLs to git.openstack.org instead of github, as that is the official home of all of these repos. Change-Id: I6c79a192d6604cef01e88d5b305fcc2b0f9c6b30 Co-Authored-By: Kyle Mestery Signed-off-by: Russell Bryant Signed-off-by: Kyle Mestery --- doc/source/devref/contribute.rst | 20 ++++---- doc/source/devref/security_group_api.rst | 14 +++--- doc/source/devref/sub_projects.rst | 50 +++++++++---------- .../plugins/ml2/drivers/opendaylight/README | 2 +- neutron/plugins/vmware/README | 4 +- .../plugins/vmware/extensions/networkgw.py | 2 +- 6 files changed, 46 insertions(+), 46 deletions(-) diff --git a/doc/source/devref/contribute.rst b/doc/source/devref/contribute.rst index 8f90e4d757d..b24366685f6 100644 --- a/doc/source/devref/contribute.rst +++ b/doc/source/devref/contribute.rst @@ -129,7 +129,7 @@ The testing process will be as follow: the vendor to choose what CI system they see fit to run them. There is no need or requirement to use OpenStack CI resources if they do not want to. Having said that, it may be useful to provide coverage for the shim layer in - the form of basic validation as done in `ODL `_ and `LBaaS A10 driver `_. + the form of basic validation as done in `ODL `_ and `LBaaS A10 driver `_. * 3rd Party CI will continue to validate vendor integration with Neutron via functional testing. 3rd Party CI is a communication mechanism. This objective @@ -227,7 +227,7 @@ library, and it leads to the greatest level of flexibility when dealing with Dev dev/test deployments. Having said that, most Neutron plugins developed in the past likely already have -integration with DevStack in the form of `neutron_plugins `_. +integration with DevStack in the form of `neutron_plugins `_. If the plugin is being decomposed in vendor integration plus vendor library, it would be necessary to adjust the instructions provided in the neutron_plugin file to pull the vendor library code as a new dependency. For instance, the instructions below: @@ -247,7 +247,7 @@ vendor library code as a new dependency. For instance, the instructions below: could be placed in 'neutron_plugin_configure_service', ahead of the service configuration. An alternative could be under the `third_party section -`_, +`_, if available. This solution can be similarly exploited for both monolithic plugins or ML2 mechanism drivers. The configuration of the plugin or driver itself can be done by leveraging the extensibility mechanisms provided by `local.conf `_. In fact, since the .ini file for the vendor plugin or driver lives @@ -270,9 +270,9 @@ is strongly encouraged to revise the existing DevStack integration, in order to in an extras.d hooks based approach. One final consideration is worth making for 3rd party CI setups: if `Devstack Gate -`_ is used, it does provide hook +`_ is used, it does provide hook functions that can be executed at specific times of the devstack-gate-wrap script run. -For example, the `Neutron Functional job `_ uses them. For more details see `devstack-vm-gate-wrap.sh `_. +For example, the `Neutron Functional job `_ uses them. For more details see `devstack-vm-gate-wrap.sh `_. Documentation Strategies ------------------------ @@ -291,12 +291,12 @@ The list of steps below are somewhat the tl;dr; version of what you can find on http://docs.openstack.org/infra/manual/creators.html. They are meant to be the bare minimum you have to complete in order to get you off the ground. -* Create a public repository: this can be a personal github.com repo or any - publicly available git repo, e.g. https://github.com/john-doe/foo.git. This +* Create a public repository: this can be a personal git.openstack.org repo or any + publicly available git repo, e.g. ``https://github.com/john-doe/foo.git``. This would be a temporary buffer to be used to feed the StackForge one. * Initialize the repository: if you are starting afresh, you may *optionally* want to use cookiecutter to get a skeleton project. You can learn how to use - cookiecutter on https://github.com/openstack-dev/cookiecutter. + cookiecutter on https://git.openstack.org/cgit/openstack-dev/cookiecutter. If you want to build the repository from an existing Neutron module, you may want to skip this step now, build the history first (next step), and come back here to initialize the remainder of the repository with other files being @@ -312,7 +312,7 @@ be the bare minimum you have to complete in order to get you off the ground. :: - git clone https://github.com/openstack/neutron.git + git clone https://git.openstack.org/openstack/neutron.git cd neutron ./tools/split.sh # Sit and wait for a while, or grab a cup of your favorite drink @@ -357,7 +357,7 @@ be the bare minimum you have to complete in order to get you off the ground. jobs that validate your patches when posted to Gerrit. For instance, one thing you would need to do is to define an entry point for your plugin or driver in your own setup.cfg similarly as to how it is done - `here `_. + `here `_. * Define an entry point for your plugin or driver in setup.cfg * Create 3rd Party CI account: if you do not already have one, follow instructions for diff --git a/doc/source/devref/security_group_api.rst b/doc/source/devref/security_group_api.rst index c1e87d3d0e2..750c744f362 100644 --- a/doc/source/devref/security_group_api.rst +++ b/doc/source/devref/security_group_api.rst @@ -10,7 +10,7 @@ API Extension The API extension is the 'front' end portion of the code, which handles defining a `REST-ful API`_, which is used by tenants. -.. _`REST-ful API`: https://github.com/openstack/neutron/blob/master/neutron/extensions/securitygroup.py +.. _`REST-ful API`: https://git.openstack.org/cgit/openstack/neutron/tree/neutron/extensions/securitygroup.py Database API @@ -18,7 +18,7 @@ Database API The Security Group API extension adds a number of `methods to the database layer`_ of Neutron -.. _`methods to the database layer`: https://github.com/openstack/neutron/blob/master/neutron/db/securitygroups_db.py +.. _`methods to the database layer`: https://git.openstack.org/cgit/openstack/neutron/tree/neutron/db/securitygroups_db.py Agent RPC --------- @@ -27,12 +27,12 @@ This portion of the code handles processing requests from tenants, after they ha running on the compute nodes, and modifying the IPTables rules on each hypervisor. -* `Plugin RPC classes `_ +* `Plugin RPC classes `_ - * `SecurityGroupServerRpcMixin `_ - defines the RPC API that the plugin uses to communicate with the agents running on the compute nodes + * `SecurityGroupServerRpcMixin `_ - defines the RPC API that the plugin uses to communicate with the agents running on the compute nodes * SecurityGroupServerRpcMixin - Defines the API methods used to fetch data from the database, in order to return responses to agents via the RPC API -* `Agent RPC classes `_ +* `Agent RPC classes `_ * The SecurityGroupServerRpcApi defines the API methods that can be called by agents, back to the plugin that runs on the Neutron controller * The SecurityGroupAgentRpcCallbackMixin defines methods that a plugin uses to call back to an agent after performing an action called by an agent. @@ -43,8 +43,8 @@ IPTables Driver * ``prepare_port_filter`` takes a ``port`` argument, which is a ``dictionary`` object that contains information about the port - including the ``security_group_rules`` -* ``prepare_port_filter`` `appends the port to an internal dictionary `_, ``filtered_ports`` which is used to track the internal state. +* ``prepare_port_filter`` `appends the port to an internal dictionary `_, ``filtered_ports`` which is used to track the internal state. * Each security group has a `chain `_ in Iptables. -* The ``IptablesFirewallDriver`` has a method to `convert security group rules into iptables statements `_ +* The ``IptablesFirewallDriver`` has a method to `convert security group rules into iptables statements `_ diff --git a/doc/source/devref/sub_projects.rst b/doc/source/devref/sub_projects.rst index 3a32d7a2614..768bc23f8e1 100644 --- a/doc/source/devref/sub_projects.rst +++ b/doc/source/devref/sub_projects.rst @@ -150,7 +150,7 @@ Functionality legend Arista ------ -* Git: https://github.com/stackforge/networking-arista +* Git: https://git.openstack.org/cgit/stackforge/networking-arista * Launchpad: https://launchpad.net/networking-arista * Pypi: https://pypi.python.org/pypi/networking-arista @@ -159,7 +159,7 @@ Arista BaGPipe ------- -* Git: https://github.com/stackforge/networking-bagpipe-l2 +* Git: https://git.openstack.org/cgit/stackforge/networking-bagpipe-l2 * Launchpad: https://launchpad.net/bagpipe-l2 * Pypi: https://pypi.python.org/pypi/bagpipe-l2 @@ -168,14 +168,14 @@ BaGPipe BGPVPN ------- -* Git: https://github.com/stackforge/networking-bgpvpn +* Git: https://git.openstack.org/cgit/openstack/networking-bgpvpn .. _networking-bigswitch: Big Switch Networks ------------------- -* Git: https://git.openstack.org/stackforge/networking-bigswitch +* Git: https://git.openstack.org/cgit/stackforge/networking-bigswitch * Pypi: https://pypi.python.org/pypi/bsnstacklib .. _networking-brocade: @@ -183,7 +183,7 @@ Big Switch Networks Brocade ------- -* Git: https://github.com/stackforge/networking-brocade +* Git: https://git.openstack.org/cgit/stackforge/networking-brocade * Launchpad: https://launchpad.net/networking-brocade * PyPI: https://pypi.python.org/pypi/networking-brocade @@ -192,7 +192,7 @@ Brocade Cisco ----- -* Git: https://github.com/stackforge/networking-cisco +* Git: https://git.openstack.org/cgit/stackforge/networking-cisco * Launchpad: https://launchpad.net/networking-cisco * PyPI: https://pypi.python.org/pypi/networking-cisco @@ -201,7 +201,7 @@ Cisco DragonFlow ---------- -* Git: https://github.com/stackforge/dragonflow +* Git: https://git.openstack.org/cgit/openstack/dragonflow * Launchpad: https://launchpad.net/dragonflow * PyPi: https://pypi.python.org/pypi/DragonFlow @@ -210,7 +210,7 @@ DragonFlow Edge VPN -------- -* Git: https://git.openstack.org/stackforge/networking-edge-vpn +* Git: https://git.openstack.org/cgit/stackforge/networking-edge-vpn * Launchpad: https://launchpad.net/edge-vpn .. _networking-hyperv: @@ -218,7 +218,7 @@ Edge VPN Hyper-V ------- -* Git: https://github.com/stackforge/networking-hyperv +* Git: https://git.openstack.org/cgit/stackforge/networking-hyperv * Launchpad: https://launchpad.net/networking-hyperv * PyPi: https://pypi.python.org/pypi/networking-hyperv @@ -227,7 +227,7 @@ Hyper-V Group Based Policy ------------------ -* Git: https://github.com/stackforge/group-based-policy +* Git: https://git.openstack.org/cgit/stackforge/group-based-policy * Launchpad: https://launchpad.net/group-based-policy * PyPi: https://pypi.python.org/pypi/group-based-policy @@ -236,7 +236,7 @@ Group Based Policy IBM SDNVE --------- -* Git: https://github.com/stackforge/networking-ibm +* Git: https://git.openstack.org/cgit/stackforge/networking-ibm * Launchpad: https://launchpad.net/networking-ibm .. _networking-l2gw: @@ -244,7 +244,7 @@ IBM SDNVE L2 Gateway ---------- -* Git: https://github.com/stackforge/networking-l2gw +* Git: https://git.openstack.org/cgit/openstack/networking-l2gw * Launchpad: https://launchpad.net/networking-l2gw .. _networking-metaplugin: @@ -259,7 +259,7 @@ Metaplugin MidoNet ------- -* Git: https://github.com/stackforge/networking-midonet +* Git: https://git.openstack.org/cgit/openstack/networking-midonet * Launchpad: https://launchpad.net/networking-midonet * PyPI: https://pypi.python.org/pypi/networking-midonet @@ -268,7 +268,7 @@ MidoNet Mellanox -------- -* Git: https://github.com/stackforge/networking-mlnx +* Git: https://git.openstack.org/cgit/stackforge/networking-mlnx * Launchpad: https://launchpad.net/networking-mlnx .. _networking-nec: @@ -276,7 +276,7 @@ Mellanox NEC --- -* Git: https://github.com/stackforge/networking-nec +* Git: https://git.openstack.org/cgit/stackforge/networking-nec * Launchpad: https://launchpad.net/networking-nec * PyPI: https://pypi.python.org/pypi/networking-nec @@ -292,7 +292,7 @@ Nuage OpenDayLight ------------ -* Git: https://github.com/stackforge/networking-odl +* Git: https://git.openstack.org/cgit/openstack/networking-odl * Launchpad: https://launchpad.net/networking-odl .. _networking-ofagent: @@ -300,7 +300,7 @@ OpenDayLight OpenFlow Agent (ofagent) ------------------------ -* Git: https://github.com/stackforge/networking-ofagent +* Git: https://git.openstack.org/cgit/openstack/networking-ofagent * Launchpad: https://launchpad.net/networking-ofagent * PyPI: https://pypi.python.org/pypi/networking-ofagent @@ -309,7 +309,7 @@ OpenFlow Agent (ofagent) Open Virtual Network -------------------- -* Git: https://github.com/stackforge/networking-ovn +* Git: https://git.openstack.org/cgit/openstack/networking-ovn * Launchpad: https://launchpad.net/networking-ovn * PyPI: https://pypi.python.org/pypi/networking-ovn @@ -318,7 +318,7 @@ Open Virtual Network Open DPDK --------- -* Git: https://github.com/stackforge/networking-ovs-dpdk +* Git: https://git.openstack.org/cgit/stackforge/networking-ovs-dpdk * Launchpad: https://launchpad.net/networking-ovs-dpdk .. _networking-plumgrid: @@ -326,7 +326,7 @@ Open DPDK PLUMgrid -------- -* Git: https://github.com/stackforge/networking-plumgrid +* Git: https://git.openstack.org/cgit/stackforge/networking-plumgrid * Launchpad: https://launchpad.net/networking-plumgrid * PyPI: https://pypi.python.org/pypi/networking-plumgrid @@ -335,7 +335,7 @@ PLUMgrid PowerVM ------- -* Git: https://github.com/stackforge/neutron-powervm +* Git: https://git.openstack.org/cgit/stackforge/neutron-powervm * Launchpad: https://launchpad.net/neutron-powervm * PyPI: https://pypi.python.org/pypi/neutron-powervm @@ -344,7 +344,7 @@ PowerVM PortForwarding -------------- -* Git: https://github.com/stackforge/networking-portforwarding +* Git: https://git.openstack.org/cgit/stackforge/networking-portforwarding * Launchpad: https://launchpad.net/networking-portforwarding .. _networking-vsphere: @@ -352,7 +352,7 @@ PortForwarding vSphere ------- -* Git: https://github.com/stackforge/networking-vsphere +* Git: https://git.openstack.org/cgit/stackforge/networking-vsphere * Launchpad: https://launchpad.net/networking-vsphere .. _vmware-nsx: @@ -360,7 +360,7 @@ vSphere VMware NSX ---------- -* Git: https://github.com/stackforge/vmware-nsx +* Git: https://git.openstack.org/cgit/openstack/vmware-nsx * Launchpad: https://launchpad.net/vmware-nsx * PyPI: https://pypi.python.org/pypi/vmware-nsx @@ -369,5 +369,5 @@ VMware NSX Octavia ------- -* Git: https://github.com/stackforge/octavia +* Git: https://git.openstack.org/cgit/openstack/octavia * Launchpad: https://launchpad.net/octavia diff --git a/neutron/plugins/ml2/drivers/opendaylight/README b/neutron/plugins/ml2/drivers/opendaylight/README index 1022db435c4..37e82d8d57d 100644 --- a/neutron/plugins/ml2/drivers/opendaylight/README +++ b/neutron/plugins/ml2/drivers/opendaylight/README @@ -9,7 +9,7 @@ contains more information on the capabilities OpenDaylight provides: The networking-odl project provides a thin layer sitting between this driver and OpenDaylight. The code can be downloaded from: - https://git.openstack.org/cgit/stackforge/networking-odl + https://git.openstack.org/cgit/openstack/networking-odl Theory of operation =================== diff --git a/neutron/plugins/vmware/README b/neutron/plugins/vmware/README index c636ee42cef..fac935450a2 100644 --- a/neutron/plugins/vmware/README +++ b/neutron/plugins/vmware/README @@ -8,7 +8,7 @@ Neutron plugins for VMware NSX family products https://wiki.openstack.org/wiki/Neutron/VMware_NSX_plugins * Full plugin code available at: - * http://git.openstack.org/cgit/stackforge/vmware-nsx - * https://github.com/stackforge/vmware-nsx + * http://git.openstack.org/cgit/openstack/vmware-nsx + * https://github.com/openstack/vmware-nsx * Pypi location: https://pypi.python.org/pypi/vmware-nsx diff --git a/neutron/plugins/vmware/extensions/networkgw.py b/neutron/plugins/vmware/extensions/networkgw.py index 1e9bc2ace6f..a9c5c2a86d3 100644 --- a/neutron/plugins/vmware/extensions/networkgw.py +++ b/neutron/plugins/vmware/extensions/networkgw.py @@ -31,7 +31,7 @@ IFACE_NAME_ATTR = 'interface_name' # TODO(salv-orlando): This type definition is duplicated into -# stackforge/vmware-nsx. This temporary duplication should be removed once the +# openstack/vmware-nsx. This temporary duplication should be removed once the # plugin decomposition is finished. # Allowed network types for the NSX Plugin class NetworkTypes(object): From 1318437a0caf38e695a819848832a955fef7d909 Mon Sep 17 00:00:00 2001 From: Eugene Nikanorov Date: Fri, 5 Jun 2015 01:46:22 +0400 Subject: [PATCH 073/161] Skip rescheduling networks if no DHCP agents available This eliminates the problem of unscheduled networks in case of communication failure between agents and servers which can occur if messaging queue service fails. Change-Id: Ied4fa301fc3d475bee25c47f3a01c2381ae9a01e Closes-Bug: #1461714 --- neutron/db/agentschedulers_db.py | 11 ++++++++++- .../unit/scheduler/test_dhcp_agent_scheduler.py | 14 ++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/neutron/db/agentschedulers_db.py b/neutron/db/agentschedulers_db.py index 61eff9b07cb..b9d9c11dbe5 100644 --- a/neutron/db/agentschedulers_db.py +++ b/neutron/db/agentschedulers_db.py @@ -271,7 +271,16 @@ class DhcpAgentSchedulerDbMixin(dhcpagentscheduler dhcp_notifier = self.agent_notifiers.get(constants.AGENT_TYPE_DHCP) try: - for binding in self._filter_bindings(context, down_bindings): + dead_bindings = [b for b in + self._filter_bindings(context, down_bindings)] + dead_agents = set([b.dhcp_agent_id for b in dead_bindings]) + agents = self.get_agents_db( + context, {'agent_type': [constants.AGENT_TYPE_DHCP]}) + if len(agents) == len(dead_agents): + LOG.warn(_LW("No DHCP agents available, " + "skipping rescheduling")) + return + for binding in dead_bindings: LOG.warn(_LW("Removing network %(network)s from agent " "%(agent)s because the agent did not report " "to the server in the last %(dead_time)s " diff --git a/neutron/tests/unit/scheduler/test_dhcp_agent_scheduler.py b/neutron/tests/unit/scheduler/test_dhcp_agent_scheduler.py index 5ee1adb16cd..260a5b01a8d 100644 --- a/neutron/tests/unit/scheduler/test_dhcp_agent_scheduler.py +++ b/neutron/tests/unit/scheduler/test_dhcp_agent_scheduler.py @@ -21,6 +21,7 @@ import testscenarios from neutron.common import constants from neutron import context from neutron.db import agentschedulers_db as sched_db +from neutron.db import common_db_mixin from neutron.db import models_v2 from neutron.extensions import dhcpagentscheduler from neutron.scheduler import dhcp_agent_scheduler @@ -177,7 +178,8 @@ class TestAutoScheduleNetworks(TestDhcpSchedulerBaseTestCase): class TestNetworksFailover(TestDhcpSchedulerBaseTestCase, - sched_db.DhcpAgentSchedulerDbMixin): + sched_db.DhcpAgentSchedulerDbMixin, + common_db_mixin.CommonDbMixin): def test_reschedule_network_from_down_agent(self): agents = self._create_and_set_agents_down(['host-a', 'host-b'], 1) self._test_schedule_bind_network([agents[0]], self.network_id) @@ -201,7 +203,7 @@ class TestNetworksFailover(TestDhcpSchedulerBaseTestCase, mock.ANY, self.network_id, agents[1].host) def _test_failed_rescheduling(self, rn_side_effect=None): - agents = self._create_and_set_agents_down(['host-a'], 1) + agents = self._create_and_set_agents_down(['host-a', 'host-b'], 1) self._test_schedule_bind_network([agents[0]], self.network_id) with mock.patch.object(self, 'remove_network_from_dhcp_agent', @@ -257,6 +259,14 @@ class TestNetworksFailover(TestDhcpSchedulerBaseTestCase, # just make sure that no exception is raised self.remove_networks_from_down_agents() + def test_reschedule_doesnt_occur_if_no_agents(self): + agents = self._create_and_set_agents_down(['host-a'], 1) + self._test_schedule_bind_network([agents[0]], self.network_id) + with mock.patch.object( + self, 'remove_network_from_dhcp_agent') as rn: + self.remove_networks_from_down_agents() + self.assertFalse(rn.called) + class DHCPAgentWeightSchedulerTestCase(TestDhcpSchedulerBaseTestCase): """Unit test scenarios for WeightScheduler.schedule.""" From 278a5fce29504c43d669feed210f7b3627616e22 Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Wed, 10 Jun 2015 22:35:11 +0200 Subject: [PATCH 074/161] Use PyMySQL in MySQL related functional/fullstack tests mysql-python driver has been replaced by PyMySQL driver[1] in neutron code but MySQL related functional/fullstack tests try to use mysql-python driver because of MySQLOpportunisticTestCase[2] and tests are skipped because mysql-python driver is no more available. This change provides a backend implementation for mysql+pymysql, a base base testcase MySQLTestCase[2] using mysql+pymysql implementation (currently oslo.db provides none of them but will in the future) and replaces MySQLOpportunisticTestCase with MySQLTestCase. [1] I73e0fdb6eca70e7d029a40a2f6f17a7c0797a21d [2] neutron.tests.common.base Closes-Bug: #1463980 Change-Id: Ic5c1d12ab75443e1cc290a7447eeb4b452b4a9dd --- neutron/tests/common/base.py | 45 +++++++++++++++++++ neutron/tests/fullstack/base.py | 11 ++--- neutron/tests/functional/db/test_ipam.py | 3 +- .../tests/functional/db/test_migrations.py | 3 +- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/neutron/tests/common/base.py b/neutron/tests/common/base.py index 11499e8050e..d1541a63901 100644 --- a/neutron/tests/common/base.py +++ b/neutron/tests/common/base.py @@ -14,6 +14,8 @@ import functools import unittest.case +from oslo_db.sqlalchemy import provision +from oslo_db.sqlalchemy import test_base import testtools.testcase from neutron.common import constants as n_const @@ -67,3 +69,46 @@ def no_skip_on_missing_deps(wrapped): 'is enabled, skip reason: %s' % (wrapped.__name__, e)) raise return wrapper + + +# NOTE(cbrandily): Define mysql+pymysql backend implementation +@provision.BackendImpl.impl.dispatch_for("mysql+pymysql") +class PyMySQLBackendImpl(provision.BackendImpl): + + default_engine_kwargs = {'mysql_sql_mode': 'TRADITIONAL'} + + def create_opportunistic_driver_url(self): + return "mysql+pymysql://openstack_citest:openstack_citest@localhost/" + + def create_named_database(self, engine, ident, conditional=False): + with engine.connect() as conn: + if not conditional or not self.database_exists(conn, ident): + conn.execute("CREATE DATABASE %s" % ident) + + def drop_named_database(self, engine, ident, conditional=False): + with engine.connect() as conn: + if not conditional or self.database_exists(conn, ident): + conn.execute("DROP DATABASE %s" % ident) + + def database_exists(self, engine, ident): + return bool(engine.scalar("SHOW DATABASES LIKE '%s'" % ident)) + + +impl = provision.BackendImpl.impl("mysql+pymysql") +url = impl.create_opportunistic_driver_url() +# NOTE(cbrandily): Declare mysql+pymysql backend implementation +provision.Backend("mysql+pymysql", url) + + +# NOTE(cbrandily): Define mysql+pymysql db fixture +class PyMySQLFixture(test_base.DbFixture): + DRIVER = 'mysql+pymysql' + + +# NOTE(cbrandily): Define mysql+pymysql base testcase +class MySQLTestCase(test_base.DbTestCase): + """Base test class for MySQL tests. + + Enforce the supported driver, which is PyMySQL. + """ + FIXTURE = PyMySQLFixture diff --git a/neutron/tests/fullstack/base.py b/neutron/tests/fullstack/base.py index c886bd5e790..87eb1880224 100644 --- a/neutron/tests/fullstack/base.py +++ b/neutron/tests/fullstack/base.py @@ -17,9 +17,10 @@ from oslo_db.sqlalchemy import test_base from neutron.db.migration.models import head # noqa from neutron.db import model_base +from neutron.tests.common import base -class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase): +class BaseFullStackTestCase(base.MySQLTestCase): """Base test class for full-stack tests.""" def __init__(self, environment, *args, **kwargs): @@ -42,10 +43,10 @@ class BaseFullStackTestCase(test_base.MySQLOpportunisticTestCase): def create_db_tables(self): """Populate the new database. - MySQLOpportunisticTestCase creates a new database for each test, but - these need to be populated with the appropriate tables. Before we can - do that, we must change the 'connection' option which the Neutron code - knows to look at. + MySQLTestCase creates a new database for each test, but these need to + be populated with the appropriate tables. Before we can do that, we + must change the 'connection' option which the Neutron code knows to + look at. Currently, the username and password options are hard-coded by oslo.db and neutron/tests/functional/contrib/gate_hook.sh. Also, diff --git a/neutron/tests/functional/db/test_ipam.py b/neutron/tests/functional/db/test_ipam.py index 3c3a9d163a4..c8cb98212a7 100644 --- a/neutron/tests/functional/db/test_ipam.py +++ b/neutron/tests/functional/db/test_ipam.py @@ -26,6 +26,7 @@ from neutron.db import db_base_plugin_v2 as base_plugin from neutron.db import model_base from neutron.db import models_v2 from neutron.tests import base +from neutron.tests.common import base as common_base def get_admin_test_context(db_url): @@ -205,7 +206,7 @@ class IpamTestCase(object): ip_avail_ranges_expected) -class TestIpamMySql(test_base.MySQLOpportunisticTestCase, base.BaseTestCase, +class TestIpamMySql(common_base.MySQLTestCase, base.BaseTestCase, IpamTestCase): def setUp(self): diff --git a/neutron/tests/functional/db/test_migrations.py b/neutron/tests/functional/db/test_migrations.py index a05bbb215e8..a7a9b386890 100644 --- a/neutron/tests/functional/db/test_migrations.py +++ b/neutron/tests/functional/db/test_migrations.py @@ -30,6 +30,7 @@ import sqlalchemy from neutron.db.migration.alembic_migrations import external from neutron.db.migration import cli as migration from neutron.db.migration.models import head as head_models +from neutron.tests.common import base LOG = logging.getLogger(__name__) @@ -208,7 +209,7 @@ class _TestModelsMigrations(test_migrations.ModelsMigrationsSync): class TestModelsMigrationsMysql(_TestModelsMigrations, - test_base.MySQLOpportunisticTestCase): + base.MySQLTestCase): pass From b370c69b75fe38cd285512f9516ce428e8a806dd Mon Sep 17 00:00:00 2001 From: Cedric Brandily Date: Tue, 9 Jun 2015 16:00:58 +0000 Subject: [PATCH 075/161] Ensure no "db" related functional/fullstack tests are skipped in the gate Currently neutron uses MySQLTestCase[1] and PostgreSQLOpportunisticTestCase[2] for functional and fullstack tests using a real MySQL/PostgreSQL database. These classes skip tests when the db is unavailable (db not installed/configured, missing packages, etc.) which is fine when tests are runned by developers but not when runned by the gate jobs. This change updates MySQLTestCase[1] and defines PostgreSQLTestCase[1] as PostgreSQL oslo.db test class wrapper: when the db is unavailable, these classes ensure tests will: * fail in the gate (dsvm-functional, dsvm-fullstack jobs), * be skipped by default otherwise (functional, fullstack jobs). [1] neutron.tests.common.base [2] oslo_db.sqlalchemy.test_base Closes-Bug: #1404093 Change-Id: I77b12e728ce9a7b0222c3df081842635f6375a3e --- neutron/tests/common/base.py | 12 ++++++++++++ neutron/tests/functional/db/test_ipam.py | 3 +-- neutron/tests/functional/db/test_migrations.py | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/neutron/tests/common/base.py b/neutron/tests/common/base.py index d1541a63901..8c89f9be76e 100644 --- a/neutron/tests/common/base.py +++ b/neutron/tests/common/base.py @@ -110,5 +110,17 @@ class MySQLTestCase(test_base.DbTestCase): """Base test class for MySQL tests. Enforce the supported driver, which is PyMySQL. + If the MySQL db is unavailable then this test is skipped, unless + OS_FAIL_ON_MISSING_DEPS is enabled. """ FIXTURE = PyMySQLFixture + SKIP_ON_UNAVAILABLE_DB = not base.bool_from_env('OS_FAIL_ON_MISSING_DEPS') + + +class PostgreSQLTestCase(test_base.PostgreSQLOpportunisticTestCase): + """Base test class for PostgreSQL tests. + + If the PostgreSQL db is unavailable then this test is skipped, unless + OS_FAIL_ON_MISSING_DEPS is enabled. + """ + SKIP_ON_UNAVAILABLE_DB = not base.bool_from_env('OS_FAIL_ON_MISSING_DEPS') diff --git a/neutron/tests/functional/db/test_ipam.py b/neutron/tests/functional/db/test_ipam.py index c8cb98212a7..02dcd20781f 100644 --- a/neutron/tests/functional/db/test_ipam.py +++ b/neutron/tests/functional/db/test_ipam.py @@ -15,7 +15,6 @@ from oslo_config import cfg from oslo_db.sqlalchemy import session -from oslo_db.sqlalchemy import test_base import testtools from neutron.api.v2 import attributes @@ -214,7 +213,7 @@ class TestIpamMySql(common_base.MySQLTestCase, base.BaseTestCase, self.configure_test() -class TestIpamPsql(test_base.PostgreSQLOpportunisticTestCase, +class TestIpamPsql(common_base.PostgreSQLTestCase, base.BaseTestCase, IpamTestCase): def setUp(self): diff --git a/neutron/tests/functional/db/test_migrations.py b/neutron/tests/functional/db/test_migrations.py index a7a9b386890..ad3fd859534 100644 --- a/neutron/tests/functional/db/test_migrations.py +++ b/neutron/tests/functional/db/test_migrations.py @@ -214,7 +214,7 @@ class TestModelsMigrationsMysql(_TestModelsMigrations, class TestModelsMigrationsPsql(_TestModelsMigrations, - test_base.PostgreSQLOpportunisticTestCase): + base.PostgreSQLTestCase): pass From ad1c7a35dec614a26de0a426950fa005df5f489d Mon Sep 17 00:00:00 2001 From: "Sean M. Collins" Date: Wed, 10 Jun 2015 10:23:44 -0400 Subject: [PATCH 076/161] Remove get_namespace from API extensions Based on the conversation on the ML. http://lists.openstack.org/pipermail/openstack-dev/2015-June/066219.html APIImpact DocImpact Closes-Bug: #1464023 Depends-On: 6f900fc429bf24cb31e0d2f149aa732055fd5956 Change-Id: I3c406910991c33cf959c5345d76153eabe3ace2d --- neutron/api/extensions.py | 21 ------------------- neutron/extensions/agent.py | 4 ---- neutron/extensions/allowedaddresspairs.py | 4 ---- neutron/extensions/dhcpagentscheduler.py | 4 ---- neutron/extensions/dvr.py | 5 ----- neutron/extensions/external_net.py | 8 ------- neutron/extensions/extra_dhcp_opt.py | 4 ---- neutron/extensions/extraroute.py | 4 ---- neutron/extensions/flavor.py | 4 ---- neutron/extensions/l3.py | 4 ---- neutron/extensions/l3_ext_gw_mode.py | 4 ---- neutron/extensions/l3_ext_ha_mode.py | 4 ---- neutron/extensions/l3agentscheduler.py | 4 ---- neutron/extensions/metering.py | 4 ---- neutron/extensions/multiprovidernet.py | 4 ---- neutron/extensions/netmtu.py | 4 ---- neutron/extensions/portbindings.py | 4 ---- neutron/extensions/portsecurity.py | 4 ---- neutron/extensions/providernet.py | 4 ---- neutron/extensions/quotasv2.py | 4 ---- neutron/extensions/routerservicetype.py | 4 ---- neutron/extensions/securitygroup.py | 5 ----- neutron/extensions/servicetype.py | 4 ---- neutron/extensions/subnetallocation.py | 5 ----- neutron/extensions/vlantransparent.py | 4 ---- .../plugins/cisco/extensions/credential.py | 5 ----- neutron/plugins/cisco/extensions/n1kv.py | 4 ---- .../cisco/extensions/network_profile.py | 4 ---- .../cisco/extensions/policy_profile.py | 4 ---- neutron/plugins/cisco/extensions/qos.py | 5 ----- .../ml2/drivers/cisco/n1kv/extensions/n1kv.py | 4 ---- .../plugins/nec/extensions/packetfilter.py | 4 ---- .../plugins/nec/extensions/router_provider.py | 4 ---- .../extensions/advancedserviceproviders.py | 6 ------ neutron/plugins/vmware/extensions/lsn.py | 4 ---- .../plugins/vmware/extensions/maclearning.py | 4 ---- .../plugins/vmware/extensions/networkgw.py | 4 ---- neutron/plugins/vmware/extensions/nvp_qos.py | 4 ---- neutron/plugins/vmware/extensions/qos.py | 4 ---- .../plugins/vmware/extensions/routertype.py | 4 ---- .../plugins/vmware/extensions/vnicindex.py | 4 ---- neutron/tests/api/test_extensions.py | 1 - neutron/tests/unit/api/test_extensions.py | 6 +----- neutron/tests/unit/dummy_plugin.py | 4 ---- neutron/tests/unit/extension_stubs.py | 3 --- .../unit/extensions/extendedattribute.py | 4 ---- .../unit/extensions/extensionattribute.py | 4 ---- neutron/tests/unit/extensions/foxinsocks.py | 3 --- neutron/tests/unit/extensions/v2attributes.py | 3 --- .../plugins/ml2/extensions/fake_extension.py | 5 ----- 50 files changed, 1 insertion(+), 224 deletions(-) diff --git a/neutron/api/extensions.py b/neutron/api/extensions.py index fa275bfe02f..396dc817cb7 100644 --- a/neutron/api/extensions.py +++ b/neutron/api/extensions.py @@ -91,13 +91,6 @@ class ExtensionDescriptor(object): """ raise NotImplementedError() - def get_namespace(self): - """The XML namespace for the extension. - - e.g. 'http://www.fox.in.socks/api/ext/pie/v1.0' - """ - raise NotImplementedError() - def get_updated(self): """The timestamp when the extension was last updated. @@ -175,18 +168,6 @@ class ExtensionDescriptor(object): if extended_attrs: attrs.update(extended_attrs) - def get_alias_namespace_compatibility_map(self): - """Returns mappings between extension aliases and XML namespaces. - - The mappings are XML namespaces that should, for backward compatibility - reasons, be added to the XML serialization of extended attributes. - This allows an established extended attribute to be provided by - another extension than the original one while keeping its old alias - in the name. - :return: A dictionary of extension_aliases and namespace strings. - """ - return {} - class ActionExtensionController(wsgi.Controller): @@ -235,7 +216,6 @@ class ExtensionController(wsgi.Controller): ext_data['name'] = ext.get_name() ext_data['alias'] = ext.get_alias() ext_data['description'] = ext.get_description() - ext_data['namespace'] = ext.get_namespace() ext_data['updated'] = ext.get_updated() ext_data['links'] = [] # TODO(dprince): implement extension links return ext_data @@ -503,7 +483,6 @@ class ExtensionManager(object): LOG.debug('Ext name: %s', extension.get_name()) LOG.debug('Ext alias: %s', extension.get_alias()) LOG.debug('Ext description: %s', extension.get_description()) - LOG.debug('Ext namespace: %s', extension.get_namespace()) LOG.debug('Ext updated: %s', extension.get_updated()) except AttributeError as ex: LOG.exception(_LE("Exception loading extension: %s"), unicode(ex)) diff --git a/neutron/extensions/agent.py b/neutron/extensions/agent.py index 4dee27c6ed7..2f67a3a7b57 100644 --- a/neutron/extensions/agent.py +++ b/neutron/extensions/agent.py @@ -86,10 +86,6 @@ class Agent(object): def get_description(cls): return "The agent management extension." - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/agent/api/v2.0" - @classmethod def get_updated(cls): return "2013-02-03T10:00:00-00:00" diff --git a/neutron/extensions/allowedaddresspairs.py b/neutron/extensions/allowedaddresspairs.py index 2e618eef249..807548a61cf 100644 --- a/neutron/extensions/allowedaddresspairs.py +++ b/neutron/extensions/allowedaddresspairs.py @@ -117,10 +117,6 @@ class Allowedaddresspairs(object): def get_description(cls): return "Provides allowed address pairs" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/allowedaddresspairs/api/v2.0" - @classmethod def get_updated(cls): return "2013-07-23T10:00:00-00:00" diff --git a/neutron/extensions/dhcpagentscheduler.py b/neutron/extensions/dhcpagentscheduler.py index 42817cd1fb1..ebd8ff55d70 100644 --- a/neutron/extensions/dhcpagentscheduler.py +++ b/neutron/extensions/dhcpagentscheduler.py @@ -91,10 +91,6 @@ class Dhcpagentscheduler(extensions.ExtensionDescriptor): def get_description(cls): return "Schedule networks among dhcp agents" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/dhcp_agent_scheduler/api/v1.0" - @classmethod def get_updated(cls): return "2013-02-07T10:00:00-00:00" diff --git a/neutron/extensions/dvr.py b/neutron/extensions/dvr.py index bb5720e9dad..811c92f649f 100644 --- a/neutron/extensions/dvr.py +++ b/neutron/extensions/dvr.py @@ -57,11 +57,6 @@ class Dvr(object): def get_description(cls): return "Enables configuration of Distributed Virtual Routers." - @classmethod - def get_namespace(cls): - return ("http://docs.openstack.org/ext/" - "%s/api/v1.0" % constants.L3_DISTRIBUTED_EXT_ALIAS) - @classmethod def get_updated(cls): return "2014-06-1T10:00:00-00:00" diff --git a/neutron/extensions/external_net.py b/neutron/extensions/external_net.py index 2a985f9d3ca..54b481092f6 100644 --- a/neutron/extensions/external_net.py +++ b/neutron/extensions/external_net.py @@ -16,7 +16,6 @@ from neutron.api import extensions from neutron.api.v2 import attributes as attr from neutron.common import exceptions as nexception -from neutron.extensions import l3 class ExternalNetworkInUse(nexception.InUse): @@ -50,10 +49,6 @@ class External_net(extensions.ExtensionDescriptor): def get_description(cls): return _("Adds external network attribute to network resource.") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/external_net/api/v1.0" - @classmethod def get_updated(cls): return "2013-01-14T10:00:00-00:00" @@ -63,6 +58,3 @@ class External_net(extensions.ExtensionDescriptor): return EXTENDED_ATTRIBUTES_2_0 else: return {} - - def get_alias_namespace_compatibility_map(self): - return {l3.L3.get_alias(): l3.L3.get_namespace()} diff --git a/neutron/extensions/extra_dhcp_opt.py b/neutron/extensions/extra_dhcp_opt.py index 0de062c7cd5..8d3063b22dd 100644 --- a/neutron/extensions/extra_dhcp_opt.py +++ b/neutron/extensions/extra_dhcp_opt.py @@ -84,10 +84,6 @@ class Extra_dhcp_opt(extensions.ExtensionDescriptor): "be specified (e.g. tftp-server, server-ip-address, " "bootfile-name)") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/extra_dhcp_opt/api/v1.0" - @classmethod def get_updated(cls): return "2013-03-17T12:00:00-00:00" diff --git a/neutron/extensions/extraroute.py b/neutron/extensions/extraroute.py index 2e6916c601a..feb3b4a9722 100644 --- a/neutron/extensions/extraroute.py +++ b/neutron/extensions/extraroute.py @@ -58,10 +58,6 @@ class Extraroute(object): def get_description(cls): return "Extra routes configuration for L3 router" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/extraroutes/api/v1.0" - @classmethod def get_updated(cls): return "2013-02-01T10:00:00-00:00" diff --git a/neutron/extensions/flavor.py b/neutron/extensions/flavor.py index 8679259bd31..9cafb13ef0a 100644 --- a/neutron/extensions/flavor.py +++ b/neutron/extensions/flavor.py @@ -53,10 +53,6 @@ class Flavor(extensions.ExtensionDescriptor): def get_description(cls): return "Flavor" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/flavor/api/v1.0" - @classmethod def get_updated(cls): return "2012-07-20T10:00:00-00:00" diff --git a/neutron/extensions/l3.py b/neutron/extensions/l3.py index b38d34907fa..bcbe15a62e4 100644 --- a/neutron/extensions/l3.py +++ b/neutron/extensions/l3.py @@ -175,10 +175,6 @@ class L3(extensions.ExtensionDescriptor): " between L2 Neutron networks and access to external" " networks via a NAT gateway.") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/router/api/v1.0" - @classmethod def get_updated(cls): return "2012-07-20T10:00:00-00:00" diff --git a/neutron/extensions/l3_ext_gw_mode.py b/neutron/extensions/l3_ext_gw_mode.py index ae0ab1d54b9..a9726a18c29 100644 --- a/neutron/extensions/l3_ext_gw_mode.py +++ b/neutron/extensions/l3_ext_gw_mode.py @@ -54,10 +54,6 @@ class L3_ext_gw_mode(extensions.ExtensionDescriptor): return ("Extension of the router abstraction for specifying whether " "SNAT should occur on the external gateway") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/ext-gw-mode/api/v1.0" - @classmethod def get_updated(cls): return "2013-03-28T10:00:00-00:00" diff --git a/neutron/extensions/l3_ext_ha_mode.py b/neutron/extensions/l3_ext_ha_mode.py index 006cd54d493..a2a3b859dbc 100644 --- a/neutron/extensions/l3_ext_ha_mode.py +++ b/neutron/extensions/l3_ext_ha_mode.py @@ -82,10 +82,6 @@ class L3_ext_ha_mode(extensions.ExtensionDescriptor): def get_description(cls): return "Add HA capability to routers." - @classmethod - def get_namespace(cls): - return "" - @classmethod def get_updated(cls): return "2014-04-26T00:00:00-00:00" diff --git a/neutron/extensions/l3agentscheduler.py b/neutron/extensions/l3agentscheduler.py index c786680a437..50a5e34c99b 100644 --- a/neutron/extensions/l3agentscheduler.py +++ b/neutron/extensions/l3agentscheduler.py @@ -120,10 +120,6 @@ class L3agentscheduler(extensions.ExtensionDescriptor): def get_description(cls): return "Schedule routers among l3 agents" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/l3_agent_scheduler/api/v1.0" - @classmethod def get_updated(cls): return "2013-02-07T10:00:00-00:00" diff --git a/neutron/extensions/metering.py b/neutron/extensions/metering.py index 8485fc40d85..177cf379df6 100644 --- a/neutron/extensions/metering.py +++ b/neutron/extensions/metering.py @@ -97,10 +97,6 @@ class Metering(extensions.ExtensionDescriptor): def get_description(cls): return "Neutron Metering extension." - @classmethod - def get_namespace(cls): - return "http://wiki.openstack.org/wiki/Neutron/Metering/Bandwidth#API" - @classmethod def get_updated(cls): return "2013-06-12T10:00:00-00:00" diff --git a/neutron/extensions/multiprovidernet.py b/neutron/extensions/multiprovidernet.py index 4fba23fbde0..18b769702df 100644 --- a/neutron/extensions/multiprovidernet.py +++ b/neutron/extensions/multiprovidernet.py @@ -107,10 +107,6 @@ class Multiprovidernet(extensions.ExtensionDescriptor): return ("Expose mapping of virtual networks to multiple physical " "networks") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/multi-provider/api/v1.0" - @classmethod def get_updated(cls): return "2013-06-27T10:00:00-00:00" diff --git a/neutron/extensions/netmtu.py b/neutron/extensions/netmtu.py index 55245fdf9a6..b4332511367 100644 --- a/neutron/extensions/netmtu.py +++ b/neutron/extensions/netmtu.py @@ -39,10 +39,6 @@ class Netmtu(extensions.ExtensionDescriptor): def get_description(cls): return "Provides MTU attribute for a network resource." - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/net_mtu/api/v1.0" - @classmethod def get_updated(cls): return "2015-03-25T10:00:00-00:00" diff --git a/neutron/extensions/portbindings.py b/neutron/extensions/portbindings.py index 63fca88ec09..3c50a4f2f8b 100644 --- a/neutron/extensions/portbindings.py +++ b/neutron/extensions/portbindings.py @@ -124,10 +124,6 @@ class Portbindings(extensions.ExtensionDescriptor): def get_description(cls): return "Expose port bindings of a virtual port to external application" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/binding/api/v1.0" - @classmethod def get_updated(cls): return "2014-02-03T10:00:00-00:00" diff --git a/neutron/extensions/portsecurity.py b/neutron/extensions/portsecurity.py index 68663f9e16c..573e04fc011 100644 --- a/neutron/extensions/portsecurity.py +++ b/neutron/extensions/portsecurity.py @@ -63,10 +63,6 @@ class Portsecurity(object): def get_description(cls): return "Provides port security" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/portsecurity/api/v1.0" - @classmethod def get_updated(cls): return "2012-07-23T10:00:00-00:00" diff --git a/neutron/extensions/providernet.py b/neutron/extensions/providernet.py index 6a60ca9a22d..1cc8865f233 100644 --- a/neutron/extensions/providernet.py +++ b/neutron/extensions/providernet.py @@ -85,10 +85,6 @@ class Providernet(extensions.ExtensionDescriptor): def get_description(cls): return "Expose mapping of virtual networks to physical networks" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/provider/api/v1.0" - @classmethod def get_updated(cls): return "2012-09-07T10:00:00-00:00" diff --git a/neutron/extensions/quotasv2.py b/neutron/extensions/quotasv2.py index bddad4fe5b4..b5f8d020d37 100644 --- a/neutron/extensions/quotasv2.py +++ b/neutron/extensions/quotasv2.py @@ -125,10 +125,6 @@ class Quotasv2(extensions.ExtensionDescriptor): description += ' per tenant' return description - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/network/ext/quotas-sets/api/v2.0" - @classmethod def get_updated(cls): return "2012-07-29T10:00:00-00:00" diff --git a/neutron/extensions/routerservicetype.py b/neutron/extensions/routerservicetype.py index cce9cf85d33..d81197a5f94 100644 --- a/neutron/extensions/routerservicetype.py +++ b/neutron/extensions/routerservicetype.py @@ -38,10 +38,6 @@ class Routerservicetype(object): def get_description(cls): return "Provides router service type" - @classmethod - def get_namespace(cls): - return "" - @classmethod def get_updated(cls): return "2013-01-29T00:00:00-00:00" diff --git a/neutron/extensions/securitygroup.py b/neutron/extensions/securitygroup.py index a772be5692f..fd3508a8b23 100644 --- a/neutron/extensions/securitygroup.py +++ b/neutron/extensions/securitygroup.py @@ -291,11 +291,6 @@ class Securitygroup(extensions.ExtensionDescriptor): def get_description(cls): return "The security groups extension." - @classmethod - def get_namespace(cls): - # todo - return "http://docs.openstack.org/ext/securitygroups/api/v2.0" - @classmethod def get_updated(cls): return "2012-10-05T10:00:00-00:00" diff --git a/neutron/extensions/servicetype.py b/neutron/extensions/servicetype.py index a972f6f45e9..3a257478014 100644 --- a/neutron/extensions/servicetype.py +++ b/neutron/extensions/servicetype.py @@ -58,10 +58,6 @@ class Servicetype(extensions.ExtensionDescriptor): return _("API for retrieving service providers for " "Neutron advanced services") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/service-type/api/v1.0" - @classmethod def get_updated(cls): return "2013-01-20T00:00:00-00:00" diff --git a/neutron/extensions/subnetallocation.py b/neutron/extensions/subnetallocation.py index fd8035c10a7..3a9712aa472 100644 --- a/neutron/extensions/subnetallocation.py +++ b/neutron/extensions/subnetallocation.py @@ -32,11 +32,6 @@ class Subnetallocation(extensions.ExtensionDescriptor): def get_description(cls): return "Enables allocation of subnets from a subnet pool" - @classmethod - def get_namespace(cls): - return ("http://docs.openstack.org/ext/" - "%s/api/v1.0" % constants.SUBNET_ALLOCATION_EXT_ALIAS) - @classmethod def get_updated(cls): return "2015-03-30T10:00:00-00:00" diff --git a/neutron/extensions/vlantransparent.py b/neutron/extensions/vlantransparent.py index 4c2d8f980d8..0e83fb51175 100644 --- a/neutron/extensions/vlantransparent.py +++ b/neutron/extensions/vlantransparent.py @@ -60,10 +60,6 @@ class Vlantransparent(object): def get_description(cls): return "Provides Vlan Transparent Networks" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/vlantransparent/api/v1.0" - @classmethod def get_updated(cls): return "2015-03-23T09:00:00-00:00" diff --git a/neutron/plugins/cisco/extensions/credential.py b/neutron/plugins/cisco/extensions/credential.py index 01749357bd3..f4d1f7f8f4f 100644 --- a/neutron/plugins/cisco/extensions/credential.py +++ b/neutron/plugins/cisco/extensions/credential.py @@ -55,11 +55,6 @@ class Credential(extensions.ExtensionDescriptor): """Returns Extended Resource Description.""" return "Credential include username and password" - @classmethod - def get_namespace(cls): - """Returns Extended Resource Namespace.""" - return "http://docs.ciscocloud.com/api/ext/credential/v2.0" - @classmethod def get_updated(cls): """Returns Extended Resource Update Time.""" diff --git a/neutron/plugins/cisco/extensions/n1kv.py b/neutron/plugins/cisco/extensions/n1kv.py index 59552ac3c8d..e754e0a2504 100644 --- a/neutron/plugins/cisco/extensions/n1kv.py +++ b/neutron/plugins/cisco/extensions/n1kv.py @@ -84,10 +84,6 @@ class N1kv(extensions.ExtensionDescriptor): def get_description(cls): return "Expose network profile" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/n1kv/api/v2.0" - @classmethod def get_updated(cls): return "2012-11-15T10:00:00-00:00" diff --git a/neutron/plugins/cisco/extensions/network_profile.py b/neutron/plugins/cisco/extensions/network_profile.py index b2752a06c2c..6a16cc2f058 100644 --- a/neutron/plugins/cisco/extensions/network_profile.py +++ b/neutron/plugins/cisco/extensions/network_profile.py @@ -75,10 +75,6 @@ class Network_profile(extensions.ExtensionDescriptor): def get_description(cls): return ("Profile includes the type of profile for N1kv") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/n1kv/network-profile/api/v2.0" - @classmethod def get_updated(cls): return "2012-07-20T10:00:00-00:00" diff --git a/neutron/plugins/cisco/extensions/policy_profile.py b/neutron/plugins/cisco/extensions/policy_profile.py index 9c028e76b6b..04515c20c3a 100644 --- a/neutron/plugins/cisco/extensions/policy_profile.py +++ b/neutron/plugins/cisco/extensions/policy_profile.py @@ -54,10 +54,6 @@ class Policy_profile(extensions.ExtensionDescriptor): def get_description(cls): return "Profile includes the type of profile for N1kv" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/n1kv/policy-profile/api/v2.0" - @classmethod def get_updated(cls): return "2012-07-20T10:00:00-00:00" diff --git a/neutron/plugins/cisco/extensions/qos.py b/neutron/plugins/cisco/extensions/qos.py index db642f1d4b7..b9428f23dad 100644 --- a/neutron/plugins/cisco/extensions/qos.py +++ b/neutron/plugins/cisco/extensions/qos.py @@ -42,11 +42,6 @@ class Qos(extensions.ExtensionDescriptor): """Returns Ext Resource Description.""" return "qos includes qos_name and qos_desc" - @classmethod - def get_namespace(cls): - """Returns Ext Resource Namespace.""" - return "http://docs.ciscocloud.com/api/ext/qos/v1.0" - @classmethod def get_updated(cls): """Returns Ext Resource update.""" diff --git a/neutron/plugins/ml2/drivers/cisco/n1kv/extensions/n1kv.py b/neutron/plugins/ml2/drivers/cisco/n1kv/extensions/n1kv.py index 7cd4f8cbd83..726779c9df2 100644 --- a/neutron/plugins/ml2/drivers/cisco/n1kv/extensions/n1kv.py +++ b/neutron/plugins/ml2/drivers/cisco/n1kv/extensions/n1kv.py @@ -42,10 +42,6 @@ class N1kv(extensions.ExtensionDescriptor): def get_description(cls): return _("Add new policy profile attribute to port resource.") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/n1kv/api/v2.0" - @classmethod def get_updated(cls): return "2014-11-23T13:33:25-00:00" diff --git a/neutron/plugins/nec/extensions/packetfilter.py b/neutron/plugins/nec/extensions/packetfilter.py index 3711995ea34..7c9971f8a96 100644 --- a/neutron/plugins/nec/extensions/packetfilter.py +++ b/neutron/plugins/nec/extensions/packetfilter.py @@ -174,10 +174,6 @@ class Packetfilter(extensions.ExtensionDescriptor): def get_description(cls): return "PacketFilters on OFC" - @classmethod - def get_namespace(cls): - return "http://www.nec.co.jp/api/ext/packet_filter/v2.0" - @classmethod def get_updated(cls): return "2013-07-16T00:00:00+09:00" diff --git a/neutron/plugins/nec/extensions/router_provider.py b/neutron/plugins/nec/extensions/router_provider.py index 5098a47fda0..e16e4ab9f7c 100644 --- a/neutron/plugins/nec/extensions/router_provider.py +++ b/neutron/plugins/nec/extensions/router_provider.py @@ -44,10 +44,6 @@ class Router_provider(object): def get_description(cls): return "Router Provider Support" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/router_provider/api/v1.0" - @classmethod def get_updated(cls): return "2013-08-20T10:00:00-00:00" diff --git a/neutron/plugins/vmware/extensions/advancedserviceproviders.py b/neutron/plugins/vmware/extensions/advancedserviceproviders.py index ba620363964..dc088eff292 100644 --- a/neutron/plugins/vmware/extensions/advancedserviceproviders.py +++ b/neutron/plugins/vmware/extensions/advancedserviceproviders.py @@ -39,12 +39,6 @@ class Advancedserviceproviders(object): def get_description(cls): return "Id of the advanced service providers attached to the subnet" - @classmethod - def get_namespace(cls): - return( - "http://docs.openstack.org/ext/neutron/" - "advanced_service_providers/api/v1.0") - @classmethod def get_updated(cls): return "2014-12-11T12:00:00-00:00" diff --git a/neutron/plugins/vmware/extensions/lsn.py b/neutron/plugins/vmware/extensions/lsn.py index 4a7d3ca3da5..a5b6a94ccf9 100644 --- a/neutron/plugins/vmware/extensions/lsn.py +++ b/neutron/plugins/vmware/extensions/lsn.py @@ -52,10 +52,6 @@ class Lsn(object): def get_description(cls): return "Enables configuration of NSX Logical Services Node." - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/%s/api/v2.0" % EXT_ALIAS - @classmethod def get_updated(cls): return "2013-10-05T10:00:00-00:00" diff --git a/neutron/plugins/vmware/extensions/maclearning.py b/neutron/plugins/vmware/extensions/maclearning.py index 21c66915085..f7b30f7cdd3 100644 --- a/neutron/plugins/vmware/extensions/maclearning.py +++ b/neutron/plugins/vmware/extensions/maclearning.py @@ -41,10 +41,6 @@ class Maclearning(object): def get_description(cls): return "Provides MAC learning capabilities." - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/maclearning/api/v1.0" - @classmethod def get_updated(cls): return "2013-05-1T10:00:00-00:00" diff --git a/neutron/plugins/vmware/extensions/networkgw.py b/neutron/plugins/vmware/extensions/networkgw.py index 1e9bc2ace6f..2fc18c0169e 100644 --- a/neutron/plugins/vmware/extensions/networkgw.py +++ b/neutron/plugins/vmware/extensions/networkgw.py @@ -173,10 +173,6 @@ class Networkgw(object): def get_description(cls): return "Connects Neutron networks with external networks at layer 2." - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/network-gateway/api/v1.0" - @classmethod def get_updated(cls): return "2014-01-01T00:00:00-00:00" diff --git a/neutron/plugins/vmware/extensions/nvp_qos.py b/neutron/plugins/vmware/extensions/nvp_qos.py index 470f267b5a2..14d30ce9eae 100644 --- a/neutron/plugins/vmware/extensions/nvp_qos.py +++ b/neutron/plugins/vmware/extensions/nvp_qos.py @@ -34,7 +34,3 @@ class Nvp_qos(qos.Qos): @classmethod def get_description(cls): return "NVP QoS extension (deprecated)." - - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/nvp-qos/api/v2.0" diff --git a/neutron/plugins/vmware/extensions/qos.py b/neutron/plugins/vmware/extensions/qos.py index 30e6f8c7d02..b2aeeb467c7 100644 --- a/neutron/plugins/vmware/extensions/qos.py +++ b/neutron/plugins/vmware/extensions/qos.py @@ -176,10 +176,6 @@ class Qos(object): def get_description(cls): return "NSX QoS extension." - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/qos-queue/api/v2.0" - @classmethod def get_updated(cls): return "2014-01-01T00:00:00-00:00" diff --git a/neutron/plugins/vmware/extensions/routertype.py b/neutron/plugins/vmware/extensions/routertype.py index ba7c831a23d..0705f02eb20 100644 --- a/neutron/plugins/vmware/extensions/routertype.py +++ b/neutron/plugins/vmware/extensions/routertype.py @@ -41,10 +41,6 @@ class Routertype(object): def get_description(cls): return "Enables configuration of NSXv router type." - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/router-type/api/v1.0" - @classmethod def get_updated(cls): return "2015-1-12T10:00:00-00:00" diff --git a/neutron/plugins/vmware/extensions/vnicindex.py b/neutron/plugins/vmware/extensions/vnicindex.py index 9b0e6d05ce6..27888fb4442 100644 --- a/neutron/plugins/vmware/extensions/vnicindex.py +++ b/neutron/plugins/vmware/extensions/vnicindex.py @@ -41,10 +41,6 @@ class Vnicindex(object): def get_description(cls): return ("Enable a port to be associated with a VNIC index") - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/vnic_index/api/v1.0" - @classmethod def get_updated(cls): return "2014-09-15T12:00:00-00:00" diff --git a/neutron/tests/api/test_extensions.py b/neutron/tests/api/test_extensions.py index 56be8189f7e..1e3d824c3bd 100644 --- a/neutron/tests/api/test_extensions.py +++ b/neutron/tests/api/test_extensions.py @@ -61,7 +61,6 @@ class ExtensionsTestJSON(base.BaseNetworkTest): self.assertIn('updated', ext_details.keys()) self.assertIn('name', ext_details.keys()) self.assertIn('description', ext_details.keys()) - self.assertIn('namespace', ext_details.keys()) self.assertIn('links', ext_details.keys()) self.assertIn('alias', ext_details.keys()) self.assertEqual(ext_details['name'], ext_name) diff --git a/neutron/tests/unit/api/test_extensions.py b/neutron/tests/unit/api/test_extensions.py index 9a32e865f94..38a99ea280a 100644 --- a/neutron/tests/unit/api/test_extensions.py +++ b/neutron/tests/unit/api/test_extensions.py @@ -474,7 +474,7 @@ class ExtensionManagerTest(base.BaseTestCase): """Invalid extension. This Extension doesn't implement extension methods : - get_name, get_description, get_namespace and get_updated + get_name, get_description and get_updated """ def get_alias(self): return "invalid_extension" @@ -621,16 +621,12 @@ class ExtensionControllerTest(testlib_api.WebTestCase): foxnsox = res_body["extensions"][0] self.assertEqual(foxnsox["alias"], "FOXNSOX") - self.assertEqual(foxnsox["namespace"], - "http://www.fox.in.socks/api/ext/pie/v1.0") def test_extension_can_be_accessed_by_alias(self): response = self.test_app.get("/extensions/FOXNSOX." + self.fmt) foxnsox_extension = self.deserialize(response) foxnsox_extension = foxnsox_extension['extension'] self.assertEqual(foxnsox_extension["alias"], "FOXNSOX") - self.assertEqual(foxnsox_extension["namespace"], - "http://www.fox.in.socks/api/ext/pie/v1.0") def test_show_returns_not_found_for_non_existent_extension(self): response = self.test_app.get("/extensions/non_existent" + self.fmt, diff --git a/neutron/tests/unit/dummy_plugin.py b/neutron/tests/unit/dummy_plugin.py index 0e7fcd98f4e..09d5ff658c0 100644 --- a/neutron/tests/unit/dummy_plugin.py +++ b/neutron/tests/unit/dummy_plugin.py @@ -63,10 +63,6 @@ class Dummy(object): def get_description(cls): return "Dummy stuff" - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/neutron/dummy/api/v1.0" - @classmethod def get_updated(cls): return "2012-11-20T10:00:00-00:00" diff --git a/neutron/tests/unit/extension_stubs.py b/neutron/tests/unit/extension_stubs.py index e8e23063f01..f98d2149186 100644 --- a/neutron/tests/unit/extension_stubs.py +++ b/neutron/tests/unit/extension_stubs.py @@ -33,9 +33,6 @@ class StubExtension(object): def get_description(self): return "" - def get_namespace(self): - return "" - def get_updated(self): return "" diff --git a/neutron/tests/unit/extensions/extendedattribute.py b/neutron/tests/unit/extensions/extendedattribute.py index 6754bffa0e4..2f2f2de1594 100644 --- a/neutron/tests/unit/extensions/extendedattribute.py +++ b/neutron/tests/unit/extensions/extendedattribute.py @@ -39,10 +39,6 @@ class Extendedattribute(extensions.ExtensionDescriptor): def get_description(cls): return "Provides extended_attr attribute to router" - @classmethod - def get_namespace(cls): - return "" - @classmethod def get_updated(cls): return "2013-02-05T00:00:00-00:00" diff --git a/neutron/tests/unit/extensions/extensionattribute.py b/neutron/tests/unit/extensions/extensionattribute.py index 22814fc80b5..f289c8b0625 100644 --- a/neutron/tests/unit/extensions/extensionattribute.py +++ b/neutron/tests/unit/extensions/extensionattribute.py @@ -52,10 +52,6 @@ class Extensionattribute(extensions.ExtensionDescriptor): def get_description(cls): return "Extension Test Resource" - @classmethod - def get_namespace(cls): - return "" - @classmethod def get_updated(cls): return "2013-02-05T10:00:00-00:00" diff --git a/neutron/tests/unit/extensions/foxinsocks.py b/neutron/tests/unit/extensions/foxinsocks.py index 4c8fc387c50..39d2bd829bb 100644 --- a/neutron/tests/unit/extensions/foxinsocks.py +++ b/neutron/tests/unit/extensions/foxinsocks.py @@ -51,9 +51,6 @@ class Foxinsocks(object): def get_description(self): return "The Fox In Socks Extension" - def get_namespace(self): - return "http://www.fox.in.socks/api/ext/pie/v1.0" - def get_updated(self): return "2011-01-22T13:25:27-06:00" diff --git a/neutron/tests/unit/extensions/v2attributes.py b/neutron/tests/unit/extensions/v2attributes.py index ab40f260af9..6259eb35659 100644 --- a/neutron/tests/unit/extensions/v2attributes.py +++ b/neutron/tests/unit/extensions/v2attributes.py @@ -35,9 +35,6 @@ class V2attributes(object): def get_description(self): return "Demonstrates extended attributes on V2 core resources" - def get_namespace(self): - return "http://docs.openstack.org/ext/examples/v2attributes/api/v1.0" - def get_updated(self): return "2012-07-18T10:00:00-00:00" diff --git a/neutron/tests/unit/plugins/ml2/extensions/fake_extension.py b/neutron/tests/unit/plugins/ml2/extensions/fake_extension.py index fdc94c12890..985e4ebc834 100644 --- a/neutron/tests/unit/plugins/ml2/extensions/fake_extension.py +++ b/neutron/tests/unit/plugins/ml2/extensions/fake_extension.py @@ -53,11 +53,6 @@ class Fake_extension(extensions.ExtensionDescriptor): def get_description(cls): return _("Adds test attributes to core resources.") - @classmethod - def get_namespace(cls): - return ("http://docs.openstack.org/ext/neutron/ml2/test/" - "fake_extension/api/v1.0") - @classmethod def get_updated(cls): return "2014-07-16T10:00:00-00:00" From 62faedddf2b0315484a04bd9092e96a3a828e46a Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Mon, 15 Jun 2015 16:15:11 +0200 Subject: [PATCH 077/161] Put output of docs job into doc/build/html This is the path where jenkins/scripts/run-docs.sh that is used by gate to generate project documentation expects to see the output. Change-Id: Id276fa59edb33f7789ab06055300b4dc2385472a --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 4203cf775e4..85914b40651 100644 --- a/tox.ini +++ b/tox.ini @@ -86,7 +86,7 @@ commands = commands = {posargs} [testenv:docs] -commands = sphinx-build -W -b html doc/source doc/build +commands = sphinx-build -W -b html doc/source doc/build/html [testenv:py34] commands = python -m testtools.run \ From a8619e9bd1247e8ec494c456aee9ee7163231f62 Mon Sep 17 00:00:00 2001 From: Cyril Roelandt Date: Mon, 15 Jun 2015 15:07:28 +0000 Subject: [PATCH 078/161] Python 3: use dict.values instead of dict.itervalues This works with both Python 2 and 3, and should not have any performance impact. Change-Id: I2a14945c60de513b91c6f022ff5dcc503ce2a8ad Blueprint: neutron-python3 --- neutron/api/extensions.py | 6 +++--- neutron/common/utils.py | 2 +- .../plugins/linuxbridge/agent/linuxbridge_neutron_agent.py | 2 +- neutron/plugins/ml2/drivers/type_vlan.py | 2 +- neutron/plugins/sriovnicagent/eswitch_manager.py | 2 +- neutron/plugins/sriovnicagent/sriov_nic_agent.py | 2 +- neutron/tests/tempest/common/isolated_creds.py | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/neutron/api/extensions.py b/neutron/api/extensions.py index f6b4601ba21..905d8ce81a9 100644 --- a/neutron/api/extensions.py +++ b/neutron/api/extensions.py @@ -411,7 +411,7 @@ class ExtensionManager(object): resources = [] resources.append(ResourceExtension('extensions', ExtensionController(self))) - for ext in self.extensions.itervalues(): + for ext in self.extensions.values(): try: resources.extend(ext.get_resources()) except AttributeError: @@ -423,7 +423,7 @@ class ExtensionManager(object): def get_actions(self): """Returns a list of ActionExtension objects.""" actions = [] - for ext in self.extensions.itervalues(): + for ext in self.extensions.values(): try: actions.extend(ext.get_actions()) except AttributeError: @@ -435,7 +435,7 @@ class ExtensionManager(object): def get_request_extensions(self): """Returns a list of RequestExtension objects.""" request_exts = [] - for ext in self.extensions.itervalues(): + for ext in self.extensions.values(): try: request_exts.extend(ext.get_request_extensions()) except AttributeError: diff --git a/neutron/common/utils.py b/neutron/common/utils.py index 53308908b30..f4b286015a4 100644 --- a/neutron/common/utils.py +++ b/neutron/common/utils.py @@ -210,7 +210,7 @@ def parse_mappings(mapping_list, unique_values=True): if key in mappings: raise ValueError(_("Key %(key)s in mapping: '%(mapping)s' not " "unique") % {'key': key, 'mapping': mapping}) - if unique_values and value in mappings.itervalues(): + if unique_values and value in mappings.values(): raise ValueError(_("Value %(value)s in mapping: '%(mapping)s' " "not unique") % {'value': value, 'mapping': mapping}) diff --git a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py index 2cf116619e2..aba3dee0bc0 100644 --- a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py +++ b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py @@ -436,7 +436,7 @@ class LinuxBridgeManager(object): self.delete_vxlan(interface) continue - for physical_interface in self.interface_mappings.itervalues(): + for physical_interface in self.interface_mappings.values(): if (interface.startswith(physical_interface)): ips, gateway = self.get_interface_details(bridge_name) if ips: diff --git a/neutron/plugins/ml2/drivers/type_vlan.py b/neutron/plugins/ml2/drivers/type_vlan.py index 451e80187ae..a8280a46053 100644 --- a/neutron/plugins/ml2/drivers/type_vlan.py +++ b/neutron/plugins/ml2/drivers/type_vlan.py @@ -146,7 +146,7 @@ class VlanTypeDriver(helpers.SegmentTypeDriver): # remove from table unallocated vlans for any unconfigured # physical networks - for allocs in allocations.itervalues(): + for allocs in allocations.values(): for alloc in allocs: if not alloc.allocated: LOG.debug("Removing vlan %(vlan_id)s on physical " diff --git a/neutron/plugins/sriovnicagent/eswitch_manager.py b/neutron/plugins/sriovnicagent/eswitch_manager.py index 760a0e52ca4..5d80576a7c0 100644 --- a/neutron/plugins/sriovnicagent/eswitch_manager.py +++ b/neutron/plugins/sriovnicagent/eswitch_manager.py @@ -130,7 +130,7 @@ class EmbSwitch(object): """ vf_list = [] assigned_macs = [] - for vf_index in self.pci_slot_map.itervalues(): + for vf_index in self.pci_slot_map.values(): if not PciOsWrapper.is_assigned_vf(self.dev_name, vf_index): continue vf_list.append(vf_index) diff --git a/neutron/plugins/sriovnicagent/sriov_nic_agent.py b/neutron/plugins/sriovnicagent/sriov_nic_agent.py index 7bb92c063f9..9e3a928f5e2 100644 --- a/neutron/plugins/sriovnicagent/sriov_nic_agent.py +++ b/neutron/plugins/sriovnicagent/sriov_nic_agent.py @@ -308,7 +308,7 @@ class SriovNicAgentConfigParser(object): Validate that network_device in excluded_device exists in device mappings """ - dev_net_set = set(self.device_mappings.itervalues()) + dev_net_set = set(self.device_mappings.values()) for dev_name in self.exclude_devices.iterkeys(): if dev_name not in dev_net_set: raise ValueError(_("Device name %(dev_name)s is missing from " diff --git a/neutron/tests/tempest/common/isolated_creds.py b/neutron/tests/tempest/common/isolated_creds.py index b4de93b6271..5da24a92264 100644 --- a/neutron/tests/tempest/common/isolated_creds.py +++ b/neutron/tests/tempest/common/isolated_creds.py @@ -369,7 +369,7 @@ class IsolatedCreds(cred_provider.CredentialProvider): if not self.isolated_creds: return self._clear_isolated_net_resources() - for creds in self.isolated_creds.itervalues(): + for creds in self.isolated_creds.values(): try: self._delete_user(creds.user_id) except lib_exc.NotFound: From a89f99c6b700b1c6f918fe359c7271ac25ed4bc4 Mon Sep 17 00:00:00 2001 From: Pavel Bondar Date: Wed, 10 Jun 2015 14:56:58 +0300 Subject: [PATCH 079/161] Refactor _update_ips_for_port This commit is a preparation step for using pluggable IPAM. _update_ips_for_port was refactored and split into two methods: - _get_changed_ips_for_port This method contains calculations common for pluggable and non-pluggable IPAM implementation, was moved to ipam_backend_mixin. - _update_ips_for_port This method is specific for non-pluggable IPAM implementation, so it was moved to ipam_non_pluggable_backend_common. Other changes: - _update_ips_for_port now returns namedtuple with added, removed, original ips (previously added and original ips were returned). List of removed ips is required by pluggable IPAM implementaion to apply rollback-on-failure logic; - removed unused port_id argument from _update_ips_for_port argument list; Partially-Implements: blueprint neutron-ipam Change-Id: Id50b6227c8c2d94c35473aece080a6f106a5dfd8 --- neutron/db/db_base_plugin_v2.py | 54 +------------ neutron/db/ipam_backend_mixin.py | 42 +++++++++- neutron/db/ipam_non_pluggable_backend.py | 23 ++++++ .../tests/unit/db/test_ipam_backend_mixin.py | 79 +++++++++++++++++++ 4 files changed, 147 insertions(+), 51 deletions(-) create mode 100644 neutron/tests/unit/db/test_ipam_backend_mixin.py diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 0395d2b3f2f..ca6de5cff76 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -122,52 +122,6 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNonPluggableBackend, return True return False - def _update_ips_for_port(self, context, network_id, port_id, original_ips, - new_ips, mac_address, device_owner): - """Add or remove IPs from the port.""" - ips = [] - # These ips are still on the port and haven't been removed - prev_ips = [] - - # the new_ips contain all of the fixed_ips that are to be updated - if len(new_ips) > cfg.CONF.max_fixed_ips_per_port: - msg = _('Exceeded maximim amount of fixed ips per port') - raise n_exc.InvalidInput(error_message=msg) - - # Remove all of the intersecting elements - for original_ip in original_ips[:]: - for new_ip in new_ips[:]: - if ('ip_address' in new_ip and - original_ip['ip_address'] == new_ip['ip_address']): - original_ips.remove(original_ip) - new_ips.remove(new_ip) - prev_ips.append(original_ip) - break - else: - # For ports that are not router ports, retain any automatic - # (non-optional, e.g. IPv6 SLAAC) addresses. - if device_owner not in constants.ROUTER_INTERFACE_OWNERS: - subnet = self._get_subnet(context, - original_ip['subnet_id']) - if (ipv6_utils.is_auto_address_subnet(subnet)): - original_ips.remove(original_ip) - prev_ips.append(original_ip) - - # Check if the IP's to add are OK - to_add = self._test_fixed_ips_for_port(context, network_id, new_ips, - device_owner) - for ip in original_ips: - LOG.debug("Port update. Hold %s", ip) - NeutronDbPluginV2._delete_ip_allocation(context, - network_id, - ip['subnet_id'], - ip['ip_address']) - - if to_add: - LOG.debug("Port update. Adding %s", to_add) - ips = self._allocate_fixed_ips(context, to_add, mac_address) - return ips, prev_ips - def _validate_subnet_cidr(self, context, network, new_subnet_cidr): """Validate the CIDR for a subnet. @@ -1211,13 +1165,13 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNonPluggableBackend, if 'fixed_ips' in p: changed_ips = True original = self._make_port_dict(port, process_extensions=False) - added_ips, prev_ips = self._update_ips_for_port( - context, network_id, id, + changes = self._update_ips_for_port( + context, network_id, original["fixed_ips"], p['fixed_ips'], original['mac_address'], port['device_owner']) # Update ips if necessary - for ip in added_ips: + for ip in changes.add: NeutronDbPluginV2._store_ip_allocation( context, ip['ip_address'], network_id, ip['subnet_id'], port.id) @@ -1232,7 +1186,7 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNonPluggableBackend, result = self._make_port_dict(port) # Keep up with fields that changed if changed_ips: - result['fixed_ips'] = prev_ips + added_ips + result['fixed_ips'] = changes.original + changes.add return result def delete_port(self, context, id): diff --git a/neutron/db/ipam_backend_mixin.py b/neutron/db/ipam_backend_mixin.py index 2330f1afb4d..63306a20722 100644 --- a/neutron/db/ipam_backend_mixin.py +++ b/neutron/db/ipam_backend_mixin.py @@ -13,11 +13,15 @@ # License for the specific language governing permissions and limitations # under the License. -import netaddr +import collections +import netaddr +from oslo_config import cfg from oslo_log import log as logging +from neutron.common import constants from neutron.common import exceptions as n_exc +from neutron.common import ipv6_utils from neutron.db import db_base_plugin_common from neutron.db import models_v2 from neutron.i18n import _LI @@ -29,6 +33,9 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): """Contains IPAM specific code which is common for both backends. """ + # Tracks changes in ip allocation for port using namedtuple + Changes = collections.namedtuple('Changes', 'add original remove') + def _update_subnet_host_routes(self, context, id, s): def _combine(ht): @@ -157,3 +164,36 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): raise n_exc.GatewayConflictWithAllocationPools( pool=pool_range, ip_address=gateway_ip) + + def _get_changed_ips_for_port(self, context, original_ips, + new_ips, device_owner): + """Calculate changes in IPs for the port.""" + # the new_ips contain all of the fixed_ips that are to be updated + if len(new_ips) > cfg.CONF.max_fixed_ips_per_port: + msg = _('Exceeded maximum amount of fixed ips per port') + raise n_exc.InvalidInput(error_message=msg) + + # These ips are still on the port and haven't been removed + prev_ips = [] + + # Remove all of the intersecting elements + for original_ip in original_ips[:]: + for new_ip in new_ips[:]: + if ('ip_address' in new_ip and + original_ip['ip_address'] == new_ip['ip_address']): + original_ips.remove(original_ip) + new_ips.remove(new_ip) + prev_ips.append(original_ip) + break + else: + # For ports that are not router ports, retain any automatic + # (non-optional, e.g. IPv6 SLAAC) addresses. + if device_owner not in constants.ROUTER_INTERFACE_OWNERS: + subnet = self._get_subnet(context, + original_ip['subnet_id']) + if (ipv6_utils.is_auto_address_subnet(subnet)): + original_ips.remove(original_ip) + prev_ips.append(original_ip) + return self.Changes(add=new_ips, + original=prev_ips, + remove=original_ips) diff --git a/neutron/db/ipam_non_pluggable_backend.py b/neutron/db/ipam_non_pluggable_backend.py index ee143667f3a..a6c57a37219 100644 --- a/neutron/db/ipam_non_pluggable_backend.py +++ b/neutron/db/ipam_non_pluggable_backend.py @@ -299,6 +299,29 @@ class IpamNonPluggableBackend(ipam_backend_mixin.IpamBackendMixin): 'subnet_id': result['subnet_id']}) return ips + def _update_ips_for_port(self, context, network_id, original_ips, + new_ips, mac_address, device_owner): + """Add or remove IPs from the port.""" + added = [] + changes = self._get_changed_ips_for_port(context, original_ips, + new_ips, device_owner) + # Check if the IP's to add are OK + to_add = self._test_fixed_ips_for_port(context, network_id, + changes.add, device_owner) + for ip in changes.remove: + LOG.debug("Port update. Hold %s", ip) + IpamNonPluggableBackend._delete_ip_allocation(context, + network_id, + ip['subnet_id'], + ip['ip_address']) + + if to_add: + LOG.debug("Port update. Adding %s", to_add) + added = self._allocate_fixed_ips(context, to_add, mac_address) + return self.Changes(add=added, + original=changes.original, + remove=changes.remove) + def _allocate_ips_for_port(self, context, port): """Allocate IP addresses for the port. diff --git a/neutron/tests/unit/db/test_ipam_backend_mixin.py b/neutron/tests/unit/db/test_ipam_backend_mixin.py new file mode 100644 index 00000000000..3488759dbd5 --- /dev/null +++ b/neutron/tests/unit/db/test_ipam_backend_mixin.py @@ -0,0 +1,79 @@ +# Copyright (c) 2015 Infoblox Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import mock + +from neutron.common import constants +from neutron.db import ipam_backend_mixin +from neutron.tests import base + + +class TestIpamBackendMixin(base.BaseTestCase): + + def setUp(self): + super(TestIpamBackendMixin, self).setUp() + self.mixin = ipam_backend_mixin.IpamBackendMixin() + self.ctx = mock.Mock() + self.default_new_ips = (('id-1', '192.168.1.1'), + ('id-2', '192.168.1.2')) + self.default_original_ips = (('id-1', '192.168.1.1'), + ('id-5', '172.20.16.5')) + + def _prepare_ips(self, ips): + return [{'ip_address': ip[1], + 'subnet_id': ip[0]} for ip in ips] + + def _test_get_changed_ips_for_port(self, expected_change, original_ips, + new_ips, owner): + change = self.mixin._get_changed_ips_for_port(self.ctx, + original_ips, + new_ips, + owner) + self.assertEqual(expected_change, change) + + def test__get_changed_ips_for_port(self): + owner_router = constants.DEVICE_OWNER_ROUTER_INTF + new_ips = self._prepare_ips(self.default_new_ips) + original_ips = self._prepare_ips(self.default_original_ips) + + # generate changes before calling _get_changed_ips_for_port + # because new_ips and original_ips are affected during call + expected_change = self.mixin.Changes(add=[new_ips[1]], + original=[original_ips[0]], + remove=[original_ips[1]]) + self._test_get_changed_ips_for_port(expected_change, original_ips, + new_ips, owner_router) + + def test__get_changed_ips_for_port_autoaddress(self): + owner_not_router = constants.DEVICE_OWNER_DHCP + new_ips = self._prepare_ips(self.default_new_ips) + + original = (('id-1', '192.168.1.1'), + ('id-5', '2000:1234:5678::12FF:FE34:5678')) + original_ips = self._prepare_ips(original) + + # mock to test auto address part + slaac_subnet = {'ipv6_address_mode': constants.IPV6_SLAAC, + 'ipv6_ra_mode': constants.IPV6_SLAAC} + self.mixin._get_subnet = mock.Mock(return_value=slaac_subnet) + + # make a copy of original_ips + # since it is changed by _get_changed_ips_for_port + expected_change = self.mixin.Changes(add=[new_ips[1]], + original=original_ips[:], + remove=[]) + + self._test_get_changed_ips_for_port(expected_change, original_ips, + new_ips, owner_not_router) From f88f3dc8d6f7240d6c0d9d5006345b3a797ae067 Mon Sep 17 00:00:00 2001 From: Pavel Bondar Date: Wed, 10 Jun 2015 16:18:40 +0300 Subject: [PATCH 080/161] Refactor update_port in db_base_plugin_v2 This commit is a preparation step for using pluggable IPAM. - moved validations into _validate_port_for_update; - updating ip addresses for port is backend specific, so moved into _update_port_with_ips in ipam_non_pluggable_backend; - writing port changes to db is common for both backends, so moved into _update_db_port in ipam_backend_mixin; - updated to use namedtuple to track add/original/remove ips; - added _make_fixed_ip_dict to exclude keys other than ip_address and subnet_id; Partially-Implements: blueprint neutron-ipam Change-Id: I1110e88f372b1d0cc7ec72049ba69a6d548da867 --- neutron/db/db_base_plugin_common.py | 6 +++ neutron/db/db_base_plugin_v2.py | 68 +++++++++--------------- neutron/db/ipam_backend_mixin.py | 11 ++++ neutron/db/ipam_non_pluggable_backend.py | 19 +++++++ 4 files changed, 61 insertions(+), 43 deletions(-) diff --git a/neutron/db/db_base_plugin_common.py b/neutron/db/db_base_plugin_common.py index f0a75ed1a86..d6a136c1db3 100644 --- a/neutron/db/db_base_plugin_common.py +++ b/neutron/db/db_base_plugin_common.py @@ -245,6 +245,12 @@ class DbBasePluginCommon(common_db_mixin.CommonDbMixin): args['ipv6_address_mode'] = subnet['ipv6_address_mode'] return args + def _make_fixed_ip_dict(self, ips): + # Excludes from dict all keys except subnet_id and ip_address + return [{'subnet_id': ip["subnet_id"], + 'ip_address': ip["ip_address"]} + for ip in ips] + def _gateway_ip_str(self, subnet, cidr_net): if subnet.get('gateway_ip') is attributes.ATTR_NOT_SPECIFIED: return str(cidr_net.network + 1) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index ca6de5cff76..9147fd88996 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -1139,54 +1139,36 @@ class NeutronDbPluginV2(ipam_non_pluggable_backend.IpamNonPluggableBackend, return self._make_port_dict(db_port, process_extensions=False) - def update_port(self, context, id, port): - p = port['port'] + def _validate_port_for_update(self, context, db_port, new_port, new_mac): + changed_owner = 'device_owner' in new_port + current_owner = (new_port.get('device_owner') or + db_port['device_owner']) + changed_device_id = new_port.get('device_id') != db_port['device_id'] + current_device_id = new_port.get('device_id') or db_port['device_id'] + + if current_owner and changed_device_id or changed_owner: + self._enforce_device_owner_not_router_intf_or_device_id( + context, current_owner, current_device_id, + db_port['tenant_id']) + + if new_mac and new_mac != db_port['mac_address']: + self._check_mac_addr_update(context, db_port, + new_mac, current_owner) + + def update_port(self, context, id, port): + new_port = port['port'] - changed_ips = False with context.session.begin(subtransactions=True): port = self._get_port(context, id) - changed_owner = 'device_owner' in p - current_owner = p.get('device_owner') or port['device_owner'] - changed_device_id = p.get('device_id') != port['device_id'] - current_device_id = p.get('device_id') or port['device_id'] - - if current_owner and changed_device_id or changed_owner: - self._enforce_device_owner_not_router_intf_or_device_id( - context, current_owner, current_device_id, - port['tenant_id']) - - new_mac = p.get('mac_address') - if new_mac and new_mac != port['mac_address']: - self._check_mac_addr_update( - context, port, new_mac, current_owner) - - # Check if the IPs need to be updated - network_id = port['network_id'] - if 'fixed_ips' in p: - changed_ips = True - original = self._make_port_dict(port, process_extensions=False) - changes = self._update_ips_for_port( - context, network_id, - original["fixed_ips"], p['fixed_ips'], - original['mac_address'], port['device_owner']) - - # Update ips if necessary - for ip in changes.add: - NeutronDbPluginV2._store_ip_allocation( - context, ip['ip_address'], network_id, - ip['subnet_id'], port.id) - # Remove all attributes in p which are not in the port DB model - # and then update the port - try: - port.update(self._filter_non_model_columns(p, models_v2.Port)) - context.session.flush() - except db_exc.DBDuplicateEntry: - raise n_exc.MacAddressInUse(net_id=network_id, mac=new_mac) - + new_mac = new_port.get('mac_address') + self._validate_port_for_update(context, port, new_port, new_mac) + changes = self._update_port_with_ips(context, port, + new_port, new_mac) result = self._make_port_dict(port) # Keep up with fields that changed - if changed_ips: - result['fixed_ips'] = changes.original + changes.add + if changes.original or changes.add or changes.remove: + result['fixed_ips'] = self._make_fixed_ip_dict( + changes.original + changes.add) return result def delete_port(self, context, id): diff --git a/neutron/db/ipam_backend_mixin.py b/neutron/db/ipam_backend_mixin.py index 63306a20722..e38b49549be 100644 --- a/neutron/db/ipam_backend_mixin.py +++ b/neutron/db/ipam_backend_mixin.py @@ -17,6 +17,7 @@ import collections import netaddr from oslo_config import cfg +from oslo_db import exception as db_exc from oslo_log import log as logging from neutron.common import constants @@ -36,6 +37,16 @@ class IpamBackendMixin(db_base_plugin_common.DbBasePluginCommon): # Tracks changes in ip allocation for port using namedtuple Changes = collections.namedtuple('Changes', 'add original remove') + def _update_db_port(self, context, db_port, new_port, network_id, new_mac): + # Remove all attributes in new_port which are not in the port DB model + # and then update the port + try: + db_port.update(self._filter_non_model_columns(new_port, + models_v2.Port)) + context.session.flush() + except db_exc.DBDuplicateEntry: + raise n_exc.MacAddressInUse(net_id=network_id, mac=new_mac) + def _update_subnet_host_routes(self, context, id, s): def _combine(ht): diff --git a/neutron/db/ipam_non_pluggable_backend.py b/neutron/db/ipam_non_pluggable_backend.py index a6c57a37219..bb929975a6b 100644 --- a/neutron/db/ipam_non_pluggable_backend.py +++ b/neutron/db/ipam_non_pluggable_backend.py @@ -182,6 +182,25 @@ class IpamNonPluggableBackend(ipam_backend_mixin.IpamBackendMixin): return True return False + def _update_port_with_ips(self, context, db_port, new_port, new_mac): + changes = self.Changes(add=[], original=[], remove=[]) + # Check if the IPs need to be updated + network_id = db_port['network_id'] + if 'fixed_ips' in new_port: + original = self._make_port_dict(db_port, process_extensions=False) + changes = self._update_ips_for_port( + context, network_id, + original["fixed_ips"], new_port['fixed_ips'], + original['mac_address'], db_port['device_owner']) + + # Update ips if necessary + for ip in changes.add: + IpamNonPluggableBackend._store_ip_allocation( + context, ip['ip_address'], network_id, + ip['subnet_id'], db_port.id) + self._update_db_port(context, db_port, new_port, network_id, new_mac) + return changes + def _test_fixed_ips_for_port(self, context, network_id, fixed_ips, device_owner): """Test fixed IPs for port. From 34aa030847ed24ad6ca7759459cbe9a6d0f43db3 Mon Sep 17 00:00:00 2001 From: Henry Gessau Date: Mon, 15 Jun 2015 14:47:21 -0400 Subject: [PATCH 081/161] Remove fossilized remains Clean up ancient stuff that hasn't been touched in over 3 years. Change-Id: I67fcd85027fb6614cafe8d92ddbf8c24aed58a4f --- doc/source/docbkx/docbkx-example/README | 14 - doc/source/docbkx/docbkx-example/pom.xml | 38 - .../docbkx-example/src/docbkx/example.xml | 318 --- .../src/docbkx/figures/example.sdx | 79 - .../src/docbkx/figures/example.svg | 523 ----- doc/source/docbkx/quantum-api-1.0/common.ent | 112 - .../quantum-api-1.0/figures/Arrow_east.svg | 70 - .../figures/Check_mark_23x20_02.svg | 60 - .../docbkx/quantum-api-1.0/js/shjs/sh_java.js | 337 --- .../quantum-api-1.0/js/shjs/sh_javascript.js | 347 --- .../docbkx/quantum-api-1.0/js/shjs/sh_main.js | 538 ----- .../docbkx/quantum-api-1.0/js/shjs/sh_xml.js | 115 - .../js/trc/schema/controller.js | 184 -- .../js/trc/schema/layoutManager.js | 137 -- .../js/trc/schema/sampleManager.js | 342 --- .../docbkx/quantum-api-1.0/js/trc/util.js | 564 ----- .../quantum-api-1.0/quantum-api-guide.xml | 2011 ----------------- .../samples/att-get-res-none.json | 3 - .../samples/att-get-res-none.xml | 1 - .../quantum-api-1.0/samples/att-get-res.json | 6 - .../quantum-api-1.0/samples/att-get-res.xml | 1 - .../quantum-api-1.0/samples/att-put-req.json | 6 - .../quantum-api-1.0/samples/att-put-req.xml | 2 - .../quantum-api-1.0/samples/extensions.json | 19 - .../quantum-api-1.0/samples/extensions.xml | 21 - .../docbkx/quantum-api-1.0/samples/fault.json | 7 - .../docbkx/quantum-api-1.0/samples/fault.xml | 8 - .../samples/network-get-detail-res.json | 22 - .../samples/network-get-detail-res.xml | 14 - .../samples/network-get-res.json | 7 - .../samples/network-get-res.xml | 3 - .../samples/network-post-req.json | 6 - .../samples/network-post-req.xml | 2 - .../samples/network-post-res.json | 6 - .../samples/network-post-res.xml | 2 - .../samples/networks-get-detail-res.json | 13 - .../samples/networks-get-detail-res.xml | 8 - .../samples/networks-get-res.json | 11 - .../samples/networks-get-res.xml | 4 - .../samples/networks-post-req.json | 5 - .../samples/networks-post-req.xml | 2 - .../samples/networks-post-res.json | 5 - .../samples/networks-post-res.xml | 2 - .../quantum-api-1.0/samples/notfound.json | 7 - .../quantum-api-1.0/samples/notfound.xml | 7 - .../samples/notimplemented.json | 7 - .../samples/notimplemented.xml | 5 - .../samples/port-get-detail-res.json | 12 - .../samples/port-get-detail-res.xml | 6 - .../quantum-api-1.0/samples/port-get-res.json | 8 - .../quantum-api-1.0/samples/port-get-res.xml | 3 - .../samples/port-post-req.json | 6 - .../quantum-api-1.0/samples/port-post-req.xml | 2 - .../samples/port-post-res.json | 6 - .../quantum-api-1.0/samples/port-post-res.xml | 2 - .../samples/ports-get-detail-res.json | 12 - .../samples/ports-get-detail-res.xml | 8 - .../samples/ports-get-res.json | 11 - .../quantum-api-1.0/samples/ports-get-res.xml | 6 - .../quantum-api-1.0/samples/private.json | 9 - .../quantum-api-1.0/samples/private.xml | 6 - .../quantum-api-1.0/samples/public.json | 11 - .../docbkx/quantum-api-1.0/samples/public.xml | 8 - .../quantum-api-1.0/samples/versions-atom.xml | 22 - .../quantum-api-1.0/samples/versions.json | 24 - .../quantum-api-1.0/samples/versions.xml | 12 - .../docbkx/quantum-api-1.0/style/schema.css | 82 - .../quantum-api-1.0/style/shjs/sh_acid.css | 151 -- .../style/shjs/sh_darkblue.css | 151 -- .../quantum-api-1.0/style/shjs/sh_emacs.css | 139 -- .../quantum-api-1.0/style/shjs/sh_night.css | 151 -- .../quantum-api-1.0/style/shjs/sh_pablo.css | 151 -- .../quantum-api-1.0/style/shjs/sh_print.css | 145 -- .../quantum-api-1.0/style/shjs/sh_style.css | 66 - .../style/shjs/sh_whitengrey.css | 139 -- .../docbkx/quantum-api-1.0/xsd/.htaccess | 6 - .../docbkx/quantum-api-1.0/xsd/actions.xsd | 439 ---- .../quantum-api-1.0/xsd/affinity-id.xjb | 11 - .../quantum-api-1.0/xsd/affinity-id.xsd | 39 - .../docbkx/quantum-api-1.0/xsd/api-common.xjb | 11 - .../docbkx/quantum-api-1.0/xsd/api-common.xsd | 66 - doc/source/docbkx/quantum-api-1.0/xsd/api.xjb | 21 - doc/source/docbkx/quantum-api-1.0/xsd/api.xsd | 103 - .../docbkx/quantum-api-1.0/xsd/atom.xjb | 11 - .../docbkx/quantum-api-1.0/xsd/atom/atom.xsd | 105 - .../docbkx/quantum-api-1.0/xsd/atom/xml.xsd | 294 --- .../docbkx/quantum-api-1.0/xsd/backup.xsd | 378 ---- .../docbkx/quantum-api-1.0/xsd/common.xsd | 156 -- .../quantum-api-1.0/xsd/ext/rax-dme/api.xsd | 38 - .../xsd/ext/rax-dme/rax-dme.xsd | 25 - .../docbkx/quantum-api-1.0/xsd/extensions.xsd | 203 -- .../docbkx/quantum-api-1.0/xsd/faults.xsd | 532 ----- .../docbkx/quantum-api-1.0/xsd/flavor.xsd | 244 -- .../docbkx/quantum-api-1.0/xsd/image.xsd | 443 ---- .../docbkx/quantum-api-1.0/xsd/ipgroup.xsd | 245 -- .../docbkx/quantum-api-1.0/xsd/limits.xsd | 315 --- .../docbkx/quantum-api-1.0/xsd/metadata.xsd | 89 - .../docbkx/quantum-api-1.0/xsd/server.xsd | 1013 --------- .../docbkx/quantum-api-1.0/xsd/shareip.xjb | 11 - .../docbkx/quantum-api-1.0/xsd/shareip.xsd | 83 - .../docbkx/quantum-api-1.0/xsd/txt.htaccess | 4 - .../docbkx/quantum-api-1.0/xsd/version.xsd | 355 --- .../docbkx/quantum-api-1.0/xslt/schema.xsl | 1342 ----------- 103 files changed, 13932 deletions(-) delete mode 100644 doc/source/docbkx/docbkx-example/README delete mode 100644 doc/source/docbkx/docbkx-example/pom.xml delete mode 100644 doc/source/docbkx/docbkx-example/src/docbkx/example.xml delete mode 100644 doc/source/docbkx/docbkx-example/src/docbkx/figures/example.sdx delete mode 100644 doc/source/docbkx/docbkx-example/src/docbkx/figures/example.svg delete mode 100644 doc/source/docbkx/quantum-api-1.0/common.ent delete mode 100644 doc/source/docbkx/quantum-api-1.0/figures/Arrow_east.svg delete mode 100644 doc/source/docbkx/quantum-api-1.0/figures/Check_mark_23x20_02.svg delete mode 100644 doc/source/docbkx/quantum-api-1.0/js/shjs/sh_java.js delete mode 100644 doc/source/docbkx/quantum-api-1.0/js/shjs/sh_javascript.js delete mode 100644 doc/source/docbkx/quantum-api-1.0/js/shjs/sh_main.js delete mode 100644 doc/source/docbkx/quantum-api-1.0/js/shjs/sh_xml.js delete mode 100644 doc/source/docbkx/quantum-api-1.0/js/trc/schema/controller.js delete mode 100644 doc/source/docbkx/quantum-api-1.0/js/trc/schema/layoutManager.js delete mode 100644 doc/source/docbkx/quantum-api-1.0/js/trc/schema/sampleManager.js delete mode 100644 doc/source/docbkx/quantum-api-1.0/js/trc/util.js delete mode 100644 doc/source/docbkx/quantum-api-1.0/quantum-api-guide.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/att-get-res-none.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/att-get-res-none.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/att-get-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/att-get-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/att-put-req.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/att-put-req.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/extensions.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/extensions.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/fault.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/fault.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/network-get-detail-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/network-get-detail-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/network-get-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/network-get-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/network-post-req.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/network-post-req.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/network-post-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/network-post-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/networks-get-detail-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/networks-get-detail-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/networks-get-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/networks-get-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/networks-post-req.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/networks-post-req.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/networks-post-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/networks-post-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/notfound.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/notfound.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/notimplemented.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/notimplemented.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/port-get-detail-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/port-get-detail-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/port-get-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/port-get-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/port-post-req.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/port-post-req.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/port-post-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/port-post-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/ports-get-detail-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/ports-get-detail-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/ports-get-res.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/ports-get-res.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/private.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/private.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/public.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/public.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/versions-atom.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/versions.json delete mode 100644 doc/source/docbkx/quantum-api-1.0/samples/versions.xml delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/schema.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/shjs/sh_acid.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/shjs/sh_darkblue.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/shjs/sh_emacs.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/shjs/sh_night.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/shjs/sh_pablo.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/shjs/sh_print.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/shjs/sh_style.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/style/shjs/sh_whitengrey.css delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/.htaccess delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/actions.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/affinity-id.xjb delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/affinity-id.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/api-common.xjb delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/api-common.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/api.xjb delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/api.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/atom.xjb delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/atom/atom.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/atom/xml.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/backup.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/common.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/ext/rax-dme/api.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/ext/rax-dme/rax-dme.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/extensions.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/faults.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/flavor.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/image.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/ipgroup.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/limits.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/metadata.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/server.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/shareip.xjb delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/shareip.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/txt.htaccess delete mode 100644 doc/source/docbkx/quantum-api-1.0/xsd/version.xsd delete mode 100644 doc/source/docbkx/quantum-api-1.0/xslt/schema.xsl diff --git a/doc/source/docbkx/docbkx-example/README b/doc/source/docbkx/docbkx-example/README deleted file mode 100644 index e1545671b31..00000000000 --- a/doc/source/docbkx/docbkx-example/README +++ /dev/null @@ -1,14 +0,0 @@ -README - -This docbkx-example folder is provided for those who want to use the maven mojo supplied with the project to build their own documents to PDF and HTML (webhelp) format. It's intended to be a template and model. - -You can edit the src/docbkx/example.xml file using vi, emacs, or another DocBook editor. At Rackspace we use Oxygen. Both Oxygen and XML Mind offer free licenses to those working on open source project documentation. - -To build the output, install Apache Maven (https://maven.apache.org/) and then run: - -mvn clean generate-sources - -in the directory containing the pom.xml file. - -Feel free to ask questions of the openstack-docs team at https://launchpad.net/~openstack-doc. - diff --git a/doc/source/docbkx/docbkx-example/pom.xml b/doc/source/docbkx/docbkx-example/pom.xml deleted file mode 100644 index f281971a5d5..00000000000 --- a/doc/source/docbkx/docbkx-example/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - 4.0.0 - my-groupid - my-guide - 1.0.0-SNAPSHOT - jar - OpenStack stand alone documentation examples - - - - - com.agilejava.docbkx - docbkx-maven-plugin - - - - generate-pdf - generate-webhelp - - generate-sources - - - - true - 100 - - - - - - - - - - - - - diff --git a/doc/source/docbkx/docbkx-example/src/docbkx/example.xml b/doc/source/docbkx/docbkx-example/src/docbkx/example.xml deleted file mode 100644 index 96f1c64c10c..00000000000 --- a/doc/source/docbkx/docbkx-example/src/docbkx/example.xml +++ /dev/null @@ -1,318 +0,0 @@ - - Maven Example Documentation - - - - - - - - Badges! We don't need any stinking badges! - - - - 2011 - Timothy D. Witham - - Example v0.1 - Product Name Doesn't Exist - it's an example!™ - 2011-01-01 - - - Copyright details are filled in by the template. Change the value of the role - attribute on the legalnotice element to change the license. - - - - This document is intended for individuals who whish to produce documentation using Maven and having - the same "feel" as the documentation that is produced by the mainline OpenStack projects. - - - - this is a placeholder for the front cover - - - this is a placeholder for the back cover - - - - Overview - Welcome to the getting started with Maven documentation. Congratulations you have - successfully downloaded and built the example. - - For more details on the Product Name service, please refer to http://www.rackspacecloud.com/cloud_hosting_products/product name - - We welcome feedback, comments, and bug reports at support@rackspacecloud.com. -
- Intended Audience - This guide is intended to individuals who want to develop standalone documentation - to use within an OpenStack deployment. Using this tool chain will give you the look and - feel of the mainline OpenStack documentation. - -
-
- Document Change History - This version of the Maven Getting Started Guide replaces and obsoletes all previous versions. The - most recent changes are described in the table below: - - - - Revision Date - Summary of Changes - - - - - July. 14, 2011 - - - - Initial document creation. - - - - - - -
-
- Additional Resources - - - - - Openstack - Cloud Software - - - - - - - Docbook Main Web Site - - - - - - - Docbook Quick Reference - - - - -
-
- - Concepts - - Need to put something here. - - - - How do I? - -
- Notes and including images - So I want an note and an image in this section ... - - This is an example of a note. - - - Here's a sample figure in svg and png formats: -
- Sample Image - - - - - - - - -
-
-
- Multiple Related Documents - - What you need to do in order to have multiple documents fit within the - build structure. - -
-
- Using multiple files for a document - - What you need to do in order to have a single document that is made up of multiple - files. - -
-
- Who, What, Where, When and Why of pom.xml - - You will of noticed the pom.xml file at the root directory. - This file is used to set the project parameters for the documentation. Including - what type of documentation to produce and any post processing that needs to happen. - If you want to know more about - - pom.xml - need a link - - then follow the link. - - For the pom.xmlfile that was included in this distribution we will - parse the individual lines and explaine the meaning. - - - - -
- <project> - - What is all of this stuff and why is it important? - -
-
- <modelVersion> - - What goes in here and why? - -
-
- <groupId> - - What goes in here and why? - -
-
- <artifactId> - - What goes in here and why? - -
-
- <version> - - What goes in here and why? - -
-
- <packaging> - - What goes in here and why? - -
-
- <name> - - Name of your document. - -
-
- <build> - - Make some documents. - -
- <plugin(s)> - - What does this do and why? - -
- <groupId> - - What goes in here and why? - -
-
- <artifactId> - - What goes in here and why? - -
-
- <execution(s)> - - What goes in here and why? - -
- <goal(s)> - - Different types of goals and why you use them. - -
-
- <phase> - - What does this section do? What phases can you specify. - -
-
-
- <configuration> - - What does this section do? - -
- <xincludeSupported> - - What does this do and why? - -
-
- <chunkSectionDepth> - - What does this do and why? - -
-
- <postprocess> - - What does this section do? What are possible pieces? - -
- <copy> - - What does this section do? What are possible pieces? - -
- <fileset> - - What does this section do? What are possible pieces? - -
- <include> - - What does this section do? What are possible pieces? - -
-
-
-
-
-
-
-
-
- Who, What, Where, When and Why of build.xml - - You will of noticed the build.xml file at the root directory. - This file is used to set the project parameters for the documentation. Including - what type of documentation to produce and any post processing that needs to happen. - If you want to know more about - - pom.xml - need a link - - then follow the link. - -
-
- - Troubleshooting - Sometimes things go wrong... - -
diff --git a/doc/source/docbkx/docbkx-example/src/docbkx/figures/example.sdx b/doc/source/docbkx/docbkx-example/src/docbkx/figures/example.sdx deleted file mode 100644 index 3f2d863669f..00000000000 --- a/doc/source/docbkx/docbkx-example/src/docbkx/figures/example.sdx +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/source/docbkx/docbkx-example/src/docbkx/figures/example.svg b/doc/source/docbkx/docbkx-example/src/docbkx/figures/example.svg deleted file mode 100644 index 58b98232d40..00000000000 --- a/doc/source/docbkx/docbkx-example/src/docbkx/figures/example.svg +++ /dev/null @@ -1,523 +0,0 @@ - - - - -Creator: Quick Sequence Diagram Editor Producer: org.freehep.graphicsio.svg.SVGGraphics2D Revision: 12753 Source: Date: Monday, May 2, 2011 2:44:33 PM CDT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/source/docbkx/quantum-api-1.0/common.ent b/doc/source/docbkx/quantum-api-1.0/common.ent deleted file mode 100644 index 67e512af571..00000000000 --- a/doc/source/docbkx/quantum-api-1.0/common.ent +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '> - - - - - - '> - - - - - - '> - - - - - - '> - - - - - - '> - - - - - - - - -