diff --git a/.pylintrc b/.pylintrc index 87fbcd3b3df..394adcb8b88 100644 --- a/.pylintrc +++ b/.pylintrc @@ -2,17 +2,97 @@ [MASTER] # Add to the black list. It should be a base name, not a # path. You may set this option multiple times. -ignore=test +# +# Note the 'openstack' below is intended to match only +# neutron.openstack.common. If we ever have another 'openstack' +# dirname, then we'll need to expand the ignore features in pylint :/ +ignore=.git,tests,openstack -[Messages Control] -# NOTE(justinsb): We might want to have a 2nd strict pylintrc in future -# C0111: Don't require docstrings on every method -# W0511: TODOs in code comments are fine. -# W0142: *args and **kwargs are fine. -# W0622: Redefining id is fine. -disable=C0111,W0511,W0142,W0622 +[MESSAGES CONTROL] +# NOTE(gus): This is a long list. A number of these are important and +# should be re-enabled once the offending code is fixed (or marked +# with a local disable) +disable= +# "F" Fatal errors that prevent further processing + import-error, +# "I" Informational noise + locally-disabled, +# "E" Error for important programming issues (likely bugs) + access-member-before-definition, + assignment-from-no-return, + bad-except-order, + bad-super-call, + maybe-no-member, + no-member, + no-method-argument, + no-name-in-module, + no-self-argument, + not-callable, + no-value-for-parameter, + super-on-old-class, + too-few-format-args, +# "W" Warnings for stylistic problems or minor programming issues + abstract-method, + anomalous-backslash-in-string, + anomalous-unicode-escape-in-string, + arguments-differ, + attribute-defined-outside-init, + bad-builtin, + bad-indentation, + broad-except, + dangerous-default-value, + deprecated-lambda, + duplicate-key, + expression-not-assigned, + fixme, + global-statement, + global-variable-not-assigned, + logging-not-lazy, + lost-exception, + no-init, + non-parent-init-called, + pointless-string-statement, + protected-access, + redefined-builtin, + redefined-outer-name, + redefine-in-handler, + signature-differs, + star-args, + super-init-not-called, + undefined-loop-variable, + unnecessary-lambda, + unnecessary-pass, + unpacking-non-sequence, + unreachable, + unused-argument, + unused-import, + unused-variable, + useless-else-on-loop, +# "C" Coding convention violations + bad-continuation, + invalid-name, + missing-docstring, + old-style-class, + superfluous-parens, +# "R" Refactor recommendations + abstract-class-little-used, + abstract-class-not-used, + cyclic-import, + duplicate-code, + interface-not-implemented, + no-self-use, + too-few-public-methods, + too-many-ancestors, + too-many-arguments, + too-many-branches, + too-many-instance-attributes, + too-many-lines, + too-many-locals, + too-many-public-methods, + too-many-return-statements, + too-many-statements -[Basic] +[BASIC] # Variable names can be 1 to 31 characters long, with lowercase and underscores variable-rgx=[a-z_][a-z0-9_]{0,30}$ @@ -21,7 +101,7 @@ argument-rgx=[a-z_][a-z0-9_]{1,30}$ # Method names should be at least 3 characters long # and be lowecased with underscores -method-rgx=([a-z_][a-z0-9_]{2,50}|setUp|tearDown)$ +method-rgx=([a-z_][a-z0-9_]{2,}|setUp|tearDown)$ # Module names matching neutron-* are ok (files in bin/) module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+)|(neutron-[a-z0-9_-]+))$ @@ -29,14 +109,26 @@ module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+)|(neutron-[a-z0-9_-]+))$ # Don't require docstrings on tests. no-docstring-rgx=((__.*__)|([tT]est.*)|setUp|tearDown)$ -[Design] -max-public-methods=100 -min-public-methods=0 -max-args=6 - -[Variables] +[FORMAT] +# Maximum number of characters on a single line. +max-line-length=79 +[VARIABLES] # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. # _ is used by our localization additional-builtins=_ + +[CLASSES] +# List of interface methods to ignore, separated by a comma. +ignore-iface-methods= + +[IMPORTS] +# Deprecated modules which should not be used, separated by a comma +deprecated-modules= +# should use openstack.common.jsonutils + json + +[REPORTS] +# Tells whether to display a full report or only the messages +reports=no diff --git a/HACKING.rst b/HACKING.rst index a0595952cae..b12291a1c02 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -12,6 +12,7 @@ Neutron Specific Commandments - [N321] Validate that jsonutils module is used instead of json - [N322] We do not use @authors tags in source files. We have git to track authorship. +- [N323] assert_called_once() is not a valid method Creating Unit Tests ------------------- diff --git a/doc/source/devref/db_layer.rst b/doc/source/devref/db_layer.rst index 54eff65b785..bacd7731600 100644 --- a/doc/source/devref/db_layer.rst +++ b/doc/source/devref/db_layer.rst @@ -1,2 +1,11 @@ Neutron Database Layer ====================== + + +Testing database and models sync +-------------------------------- + +.. automodule:: neutron.tests.unit.db.test_migration + +.. autoclass:: _TestModelsMigrations + :members: diff --git a/etc/neutron.conf b/etc/neutron.conf index a61afbd4714..24e788c7f85 100644 --- a/etc/neutron.conf +++ b/etc/neutron.conf @@ -251,6 +251,11 @@ lock_path = $state_path/lock # The uuid of the admin nova tenant # nova_admin_tenant_id = +# The name of the admin nova tenant. If the uuid of the admin nova tenant +# is set, this is optional. Useful for cases where the uuid of the admin +# nova tenant is not available when configuration is being done. +# nova_admin_tenant_name = + # Password for connection to nova in admin context. # nova_admin_password = @@ -555,6 +560,10 @@ lock_path = $state_path/lock # Change to "sudo" to skip the filtering and just run the comand directly # root_helper = sudo +# Set to true to add comments to generated iptables rules that describe +# each rule's purpose. (System must support the iptables comments module.) +# comment_iptables_rules = True + # =========== items for agent management extension ============= # seconds between nodes reporting state to server; should be less than # agent_down_time, best if it is half or less than agent_down_time diff --git a/etc/neutron/plugins/cisco/cisco_cfg_agent.ini b/etc/neutron/plugins/cisco/cisco_cfg_agent.ini new file mode 100644 index 00000000000..d99e8382785 --- /dev/null +++ b/etc/neutron/plugins/cisco/cisco_cfg_agent.ini @@ -0,0 +1,15 @@ +[cfg_agent] +# (IntOpt) Interval in seconds for processing of service updates. +# That is when the config agent's process_services() loop executes +# and it lets each service helper to process its service resources. +# rpc_loop_interval = 10 + +# (StrOpt) Period-separated module path to the routing service helper class. +# routing_svc_helper_class = neutron.plugins.cisco.cfg_agent.service_helpers.routing_svc_helper.RoutingServiceHelper + +# (IntOpt) Timeout value in seconds for connecting to a hosting device. +# device_connection_timeout = 30 + +# (IntOpt) The time in seconds until a backlogged hosting device is +# presumed dead or booted to an error state. +# hosting_device_dead_timeout = 300 diff --git a/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini b/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini index 9c8e6b58894..232ca71d368 100644 --- a/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini +++ b/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini @@ -1,52 +1,13 @@ [ovs] -# (StrOpt) Type of network to allocate for tenant networks. The -# default value 'local' is useful only for single-box testing and -# provides no connectivity between hosts. You MUST either change this -# to 'vlan' and configure network_vlan_ranges below or change this to -# 'gre' or 'vxlan' and configure tunnel_id_ranges below in order for -# tenant networks to provide connectivity between hosts. Set to 'none' -# to disable creation of tenant networks. -# -# tenant_network_type = local -# Example: tenant_network_type = gre -# Example: tenant_network_type = vxlan - -# (ListOpt) Comma-separated list of -# [::] tuples enumerating ranges -# of VLAN IDs on named physical networks that are available for -# allocation. All physical networks listed are available for flat and -# VLAN provider network creation. Specified ranges of VLAN IDs are -# available for tenant network allocation if tenant_network_type is -# 'vlan'. If empty, only gre, vxlan and local networks may be created. -# -# network_vlan_ranges = -# Example: network_vlan_ranges = physnet1:1000:2999 - # (BoolOpt) Set to True in the server and the agents to enable support # for GRE or VXLAN networks. Requires kernel support for OVS patch ports and # GRE or VXLAN tunneling. # # WARNING: This option will be deprecated in the Icehouse release, at which -# point setting tunnel_type below will be required to enable -# tunneling. +# point setting tunnel_types will be required to enable tunneling. # # enable_tunneling = False -# (StrOpt) The type of tunnel network, if any, supported by the plugin. If -# this is set, it will cause tunneling to be enabled. If this is not set and -# the option enable_tunneling is set, this will default to 'gre'. -# -# tunnel_type = -# Example: tunnel_type = gre -# Example: tunnel_type = vxlan - -# (ListOpt) Comma-separated list of : tuples -# enumerating ranges of GRE or VXLAN tunnel IDs that are available for -# tenant network allocation if tenant_network_type is 'gre' or 'vxlan'. -# -# tunnel_id_ranges = -# Example: tunnel_id_ranges = 1:1000 - # Do not change this parameter unless you have a good reason to. # This is the name of the OVS integration bridge. There is one per hypervisor. # The integration bridge acts as a virtual "patch bay". All VM VIFs are @@ -55,7 +16,7 @@ # # integration_bridge = br-int -# Only used for the agent if tunnel_id_ranges (above) is not empty for +# Only used for the agent if tunnel_id_ranges is not empty for # the server. In most cases, the default value should be fine. # # tunnel_bridge = br-tun @@ -66,7 +27,7 @@ # Peer patch port in tunnel bridge for integration bridge # tun_peer_patch_port = patch-int -# Uncomment this line for the agent if tunnel_id_ranges (above) is not +# Uncomment this line for the agent if tunnel_id_ranges is not # empty for the server. Set local-ip to be the local IP address of # this hypervisor. # @@ -77,8 +38,8 @@ # bridge names to be used for flat and VLAN networks. The length of # bridge names should be no more than 11. Each bridge must # exist, and should have a physical network interface configured as a -# port. All physical networks listed in network_vlan_ranges on the -# server should have mappings to appropriate bridges on each agent. +# port. All physical networks configured on the server should have +# mappings to appropriate bridges on each agent. # # bridge_mappings = # Example: bridge_mappings = physnet1:br-eth1 @@ -102,10 +63,8 @@ # (ListOpt) The types of tenant network tunnels supported by the agent. # Setting this will enable tunneling support in the agent. This can be set to # either 'gre' or 'vxlan'. If this is unset, it will default to [] and -# disable tunneling support in the agent. When running the agent with the OVS -# plugin, this value must be the same as "tunnel_type" in the "[ovs]" section. -# When running the agent with ML2, you can specify as many values here as -# your compute hosts supports. +# disable tunneling support in the agent. +# You can specify as many values here as your compute hosts supports. # # tunnel_types = # Example: tunnel_types = gre @@ -164,25 +123,17 @@ # # 1. With VLANs on eth1. # [ovs] -# network_vlan_ranges = default:2000:3999 -# tunnel_id_ranges = # integration_bridge = br-int # bridge_mappings = default:br-eth1 # # 2. With GRE tunneling. # [ovs] -# network_vlan_ranges = -# tunnel_id_ranges = 1:1000 # integration_bridge = br-int # tunnel_bridge = br-tun # local_ip = 10.0.0.3 # # 3. With VXLAN tunneling. # [ovs] -# network_vlan_ranges = -# tenant_network_type = vxlan -# tunnel_type = vxlan -# tunnel_id_ranges = 1:1000 # integration_bridge = br-int # tunnel_bridge = br-tun # local_ip = 10.0.0.3 diff --git a/etc/neutron/rootwrap.d/l3.filters b/etc/neutron/rootwrap.d/l3.filters index 65631698277..9a3031822a5 100644 --- a/etc/neutron/rootwrap.d/l3.filters +++ b/etc/neutron/rootwrap.d/l3.filters @@ -46,3 +46,6 @@ ip6tables-restore: CommandFilter, ip6tables-restore, root # Keepalived keepalived: CommandFilter, keepalived, root kill_keepalived: KillFilter, root, /usr/sbin/keepalived, -HUP, -15, -9 + +# l3 agent to delete floatingip's conntrack state +conntrack: CommandFilter, conntrack, root diff --git a/neutron/agent/__init__.py b/neutron/agent/__init__.py index bf3075ddd8b..e69de29bb2d 100644 --- a/neutron/agent/__init__.py +++ b/neutron/agent/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/agent/common/__init__.py b/neutron/agent/common/__init__.py index bf3075ddd8b..e69de29bb2d 100644 --- a/neutron/agent/common/__init__.py +++ b/neutron/agent/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/agent/common/config.py b/neutron/agent/common/config.py index d9395609038..3ee41dde851 100644 --- a/neutron/agent/common/config.py +++ b/neutron/agent/common/config.py @@ -46,6 +46,11 @@ USE_NAMESPACES_OPTS = [ help=_("Allow overlapping IP.")), ] +IPTABLES_OPTS = [ + cfg.BoolOpt('comment_iptables_rules', default=True, + help=_("Add comments to iptables rules.")), +] + def get_log_args(conf, log_file_name): cmd_args = [] @@ -92,6 +97,10 @@ def register_use_namespaces_opts_helper(conf): conf.register_opts(USE_NAMESPACES_OPTS) +def register_iptables_opts(conf): + conf.register_opts(IPTABLES_OPTS, 'AGENT') + + def get_root_helper(conf): root_helper = conf.AGENT.root_helper if root_helper != 'sudo': diff --git a/neutron/agent/firewall.py b/neutron/agent/firewall.py index 7ce1f992098..8ce8e7b16bf 100644 --- a/neutron/agent/firewall.py +++ b/neutron/agent/firewall.py @@ -105,6 +105,14 @@ class FirewallDriver(object): finally: self.filter_defer_apply_off() + def update_security_group_members(self, sg_id, ips): + """Update group members in a security group.""" + raise NotImplementedError() + + def update_security_group_rules(self, sg_id, rules): + """Update rules in a security group.""" + raise NotImplementedError() + class NoopFirewallDriver(FirewallDriver): """Noop Firewall Driver. @@ -134,3 +142,9 @@ class NoopFirewallDriver(FirewallDriver): @property def ports(self): return {} + + def update_security_group_members(self, sg_id, ips): + pass + + def update_security_group_rules(self, sg_id, rules): + pass diff --git a/neutron/agent/l2population_rpc.py b/neutron/agent/l2population_rpc.py index 737e2493efb..2798eee5e78 100644 --- a/neutron/agent/l2population_rpc.py +++ b/neutron/agent/l2population_rpc.py @@ -242,12 +242,12 @@ class L2populationRpcCallBackTunnelMixin(L2populationRpcCallBackMixin): if agent_ip == local_ip: continue - after = state.get('after') + after = state.get('after', []) for mac, ip in after: self.setup_entry_for_arp_reply(br, 'add', lvm.vlan, mac, ip) - before = state.get('before') + before = state.get('before', []) for mac, ip in before: self.setup_entry_for_arp_reply(br, 'remove', lvm.vlan, mac, ip) diff --git a/neutron/agent/l3_agent.py b/neutron/agent/l3_agent.py index 84953bc2e22..03f21d2bb74 100644 --- a/neutron/agent/l3_agent.py +++ b/neutron/agent/l3_agent.py @@ -22,6 +22,7 @@ eventlet.monkey_patch() import netaddr import os from oslo.config import cfg +from oslo import messaging import Queue from neutron.agent.common import config @@ -34,13 +35,15 @@ from neutron.agent.linux import ra from neutron.agent import rpc as agent_rpc from neutron.common import config as common_config from neutron.common import constants as l3_constants +from neutron.common import exceptions as n_exc from neutron.common import ipv6_utils from neutron.common import rpc as n_rpc from neutron.common import topics from neutron.common import utils as common_utils -from neutron import context +from neutron import context as n_context from neutron import manager from neutron.openstack.common import excutils +from neutron.openstack.common.gettextutils import _LE, _LW from neutron.openstack.common import importutils from neutron.openstack.common import log as logging from neutron.openstack.common import loopingcall @@ -241,7 +244,7 @@ class LinkLocalAllocator(object): class RouterInfo(l3_ha_agent.RouterMixin): def __init__(self, router_id, root_helper, use_namespaces, router, - use_ipv6=False): + use_ipv6=False, ns_name=None): self.router_id = router_id self.ex_gw_port = None self._snat_enabled = None @@ -254,7 +257,7 @@ class RouterInfo(l3_ha_agent.RouterMixin): self.use_namespaces = use_namespaces # Invoke the setter for establishing initial SNAT action self.router = router - self.ns_name = NS_PREFIX + router_id if use_namespaces else None + self.ns_name = ns_name self.iptables_manager = iptables_manager.IptablesManager( root_helper=root_helper, use_ipv6=use_ipv6, @@ -518,31 +521,47 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, LOG.error(msg) raise SystemExit(1) - self.context = context.get_admin_context_without_session() + self.context = n_context.get_admin_context_without_session() self.plugin_rpc = L3PluginApi(topics.L3PLUGIN, host) self.fullsync = True - self.updated_routers = set() - self.removed_routers = set() self.sync_progress = False # Get the list of service plugins from Neutron Server - try: - self.neutron_service_plugins = ( - self.plugin_rpc.get_service_plugin_list(self.context)) - except n_rpc.RemoteError as e: - LOG.warning(_('l3-agent cannot check service plugins ' - 'enabled at the neutron server when startup ' - 'due to RPC error. It happens when the server ' - 'does not support this RPC API. If the error ' - 'is UnsupportedVersion you can ignore ' - 'this warning. Detail message: %s'), e) - self.neutron_service_plugins = None + # This is the first place where we contact neutron-server on startup + # so retry in case its not ready to respond. + retry_count = 5 + while True: + retry_count = retry_count - 1 + try: + self.neutron_service_plugins = ( + self.plugin_rpc.get_service_plugin_list(self.context)) + except n_rpc.RemoteError as e: + with excutils.save_and_reraise_exception() as ctx: + ctx.reraise = False + LOG.warning(_LW('l3-agent cannot check service plugins ' + 'enabled at the neutron server when ' + 'startup due to RPC error. It happens ' + 'when the server does not support this ' + 'RPC API. If the error is ' + 'UnsupportedVersion you can ignore this ' + 'warning. Detail message: %s'), e) + self.neutron_service_plugins = None + except messaging.MessagingTimeout as e: + with excutils.save_and_reraise_exception() as ctx: + if retry_count > 0: + ctx.reraise = False + LOG.warning(_LW('l3-agent cannot check service ' + 'plugins enabled on the neutron ' + 'server. Retrying. ' + 'Detail message: %s'), e) + continue + break self._clean_stale_namespaces = self.conf.use_namespaces # dvr data self.agent_gateway_port = None - self.agent_fip_count = 0 + self.fip_ns_subscribers = set() self.local_subnets = LinkLocalAllocator( os.path.join(self.conf.state_path, 'fip-linklocal-networks'), FIP_LL_SUBNET) @@ -554,6 +573,15 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, self.target_ex_net_id = None self.use_ipv6 = ipv6_utils.is_enabled() + def _fip_ns_subscribe(self, router_id): + is_first = (len(self.fip_ns_subscribers) == 0) + self.fip_ns_subscribers.add(router_id) + return is_first + + def _fip_ns_unsubscribe(self, router_id): + self.fip_ns_subscribers.discard(router_id) + return len(self.fip_ns_subscribers) == 0 + def _check_config_params(self): """Check items in configuration files. @@ -588,16 +616,22 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, 'for namespace cleanup.')) return set() + def _get_routers_namespaces(self, router_ids): + namespaces = set(self.get_ns_name(rid) for rid in router_ids) + namespaces.update(self.get_snat_ns_name(rid) for rid in router_ids) + return namespaces + def _cleanup_namespaces(self, router_namespaces, router_ids): """Destroy stale router namespaces on host when L3 agent restarts - This routine is called when self._clean_stale_namespaces is True. + This routine is called when self._clean_stale_namespaces is True. The argument router_namespaces is the list of all routers namespaces The argument router_ids is the list of ids for known routers. """ - ns_to_ignore = set(NS_PREFIX + id for id in router_ids) - ns_to_ignore.update(SNAT_NS_PREFIX + id for id in router_ids) + # Don't destroy namespaces of routers this agent handles. + ns_to_ignore = self._get_routers_namespaces(router_ids) + ns_to_destroy = router_namespaces - ns_to_ignore self._destroy_stale_router_namespaces(ns_to_destroy) @@ -610,7 +644,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, one attempt will be made to delete them. """ for ns in router_namespaces: - ra.disable_ipv6_ra(ns[len(NS_PREFIX):], ns, self.root_helper) try: self._destroy_namespace(ns) except RuntimeError: @@ -620,8 +653,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, def _destroy_namespace(self, ns): if ns.startswith(NS_PREFIX): - if self.conf.enable_metadata_proxy: - self._destroy_metadata_proxy(ns[len(NS_PREFIX):], ns) self._destroy_router_namespace(ns) elif ns.startswith(FIP_NS_PREFIX): self._destroy_fip_namespace(ns) @@ -670,6 +701,10 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, self.agent_gateway_port = None def _destroy_router_namespace(self, ns): + router_id = ns[len(NS_PREFIX):] + ra.disable_ipv6_ra(router_id, ns, self.root_helper) + if self.conf.enable_metadata_proxy: + self._destroy_metadata_proxy(router_id, ns) ns_ip = ip_lib.IPWrapper(self.root_helper, namespace=ns) for d in ns_ip.get_devices(exclude_loopback=True): if d.name.startswith(INTERNAL_DEV_PREFIX): @@ -727,9 +762,14 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, raise Exception(msg) def _router_added(self, router_id, router): - ri = RouterInfo(router_id, self.root_helper, - self.conf.use_namespaces, router, - use_ipv6=self.use_ipv6) + ns_name = (self.get_ns_name(router_id) + if self.conf.use_namespaces else None) + ri = RouterInfo(router_id=router_id, + root_helper=self.root_helper, + use_namespaces=self.conf.use_namespaces, + router=router, + use_ipv6=self.use_ipv6, + ns_name=ns_name) self.router_info[router_id] = ri if self.conf.use_namespaces: self._create_router_namespace(ri) @@ -768,15 +808,13 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, for c, r in self.metadata_nat_rules(): ri.iptables_manager.ipv4['nat'].remove_rule(c, r) ri.iptables_manager.apply() - if self.conf.enable_metadata_proxy: - self._destroy_metadata_proxy(ri.router_id, ri.ns_name) del self.router_info[router_id] self._destroy_router_namespace(ri.ns_name) def _get_metadata_proxy_callback(self, router_id): def callback(pid_file): - metadata_proxy_socket = cfg.CONF.metadata_proxy_socket + metadata_proxy_socket = self.conf.metadata_proxy_socket proxy_cmd = ['neutron-ns-metadata-proxy', '--pid_file=%s' % pid_file, '--metadata_proxy_socket=%s' % metadata_proxy_socket, @@ -784,7 +822,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, '--state_path=%s' % self.conf.state_path, '--metadata_port=%s' % self.conf.metadata_port] proxy_cmd.extend(config.get_log_args( - cfg.CONF, 'neutron-ns-metadata-proxy-%s.log' % + self.conf, 'neutron-ns-metadata-proxy-%s.log' % router_id)) return proxy_cmd @@ -948,7 +986,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, # Process SNAT/DNAT rules for floating IPs fip_statuses = {} try: - if ex_gw_port or ri.ex_gw_port: + if ex_gw_port: existing_floating_ips = ri.floating_ips self.process_router_floating_ip_nat_rules(ri) ri.iptables_manager.defer_apply_off() @@ -962,7 +1000,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, for fip in ri.router.get(l3_constants.FLOATINGIP_KEY, []): fip_statuses[fip['id']] = l3_constants.FLOATINGIP_STATUS_ERROR - if ex_gw_port or ri.ex_gw_port: + if ex_gw_port: # Identify floating IPs which were disabled ri.floating_ips = set(fip_statuses.keys()) for fip_id in existing_floating_ips - ri.floating_ips: @@ -1066,9 +1104,11 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, if ri.router['distributed']: # filter out only FIPs for this host/agent floating_ips = [i for i in floating_ips if i['host'] == self.host] - if floating_ips and self.agent_gateway_port is None: - self._create_agent_gateway_port(ri, floating_ips[0] - ['floating_network_id']) + if floating_ips: + is_first = self._fip_ns_subscribe(ri.router_id) + if is_first: + self._create_agent_gateway_port(ri, floating_ips[0] + ['floating_network_id']) if self.agent_gateway_port: if floating_ips and ri.dist_fip_count == 0: @@ -1115,6 +1155,9 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, else: net = netaddr.IPNetwork(ip_cidr) device.addr.delete(net.version, ip_cidr) + self.driver.delete_conntrack_state(root_helper=self.root_helper, + namespace=ri.ns_name, + ip=ip_cidr) if ri.router['distributed']: self.floating_ip_removed_dist(ri, ip_cidr) @@ -1215,6 +1258,9 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, def get_fip_ns_name(self, ext_net_id): return (FIP_NS_PREFIX + ext_net_id) + def get_ns_name(self, router_id): + return (NS_PREFIX + router_id) + def get_snat_ns_name(self, router_id): return (SNAT_NS_PREFIX + router_id) @@ -1384,7 +1430,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, self._snat_redirect_remove(ri, p, internal_interface) if self.conf.agent_mode == 'dvr_snat' and ( - ex_gw_port['binding:host_id'] == self.host): + ri.router['gw_port_host'] == self.host): ns_name = self.get_snat_ns_name(ri.router['id']) else: # not hosting agent - no work to do @@ -1626,7 +1672,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, interface_name, floating_ip, distributed=True) # update internal structures - self.agent_fip_count = self.agent_fip_count + 1 ri.dist_fip_count = ri.dist_fip_count + 1 def floating_ip_removed_dist(self, ri, fip_cidr): @@ -1660,10 +1705,10 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, self.local_subnets.release(ri.router_id) ri.rtr_fip_subnet = None ns_ip.del_veth(fip_2_rtr_name) - # clean up fip-namespace if this is the last FIP - self.agent_fip_count = self.agent_fip_count - 1 - if self.agent_fip_count == 0: - self._destroy_fip_namespace(fip_ns_name) + is_last = self._fip_ns_unsubscribe(ri.router_id) + # clean up fip-namespace if this is the last FIP + if is_last: + self._destroy_fip_namespace(fip_ns_name) def floating_forward_rules(self, floating_ip, fixed_ip): return [('PREROUTING', '-d %s -j DNAT --to %s' % @@ -1742,51 +1787,38 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, LOG.debug(_('Got router added to agent :%r'), payload) self.routers_updated(context, payload) - def _process_routers(self, routers, all_routers=False): - pool = eventlet.GreenPool() + def _process_router_if_compatible(self, router): if (self.conf.external_network_bridge and not ip_lib.device_exists(self.conf.external_network_bridge)): LOG.error(_("The external network bridge '%s' does not exist"), self.conf.external_network_bridge) return + # If namespaces are disabled, only process the router associated + # with the configured agent id. + if (not self.conf.use_namespaces and + router['id'] != self.conf.router_id): + raise n_exc.RouterNotCompatibleWithAgent(router_id=router['id']) + + # Either ex_net_id or handle_internal_only_routers must be set + ex_net_id = (router['external_gateway_info'] or {}).get('network_id') + if not ex_net_id and not self.conf.handle_internal_only_routers: + raise n_exc.RouterNotCompatibleWithAgent(router_id=router['id']) + + # If target_ex_net_id and ex_net_id are set they must be equal target_ex_net_id = self._fetch_external_net_id() - # if routers are all the routers we have (They are from router sync on - # starting or when error occurs during running), we seek the - # routers which should be removed. - # If routers are from server side notification, we seek them - # from subset of incoming routers and ones we have now. - if all_routers: - prev_router_ids = set(self.router_info) - else: - prev_router_ids = set(self.router_info) & set( - [router['id'] for router in routers]) - cur_router_ids = set() - for r in routers: - # If namespaces are disabled, only process the router associated - # with the configured agent id. - if (not self.conf.use_namespaces and - r['id'] != self.conf.router_id): - continue - ex_net_id = (r['external_gateway_info'] or {}).get('network_id') - if not ex_net_id and not self.conf.handle_internal_only_routers: - continue - if (target_ex_net_id and ex_net_id and - ex_net_id != target_ex_net_id): - # Double check that our single external_net_id has not changed - # by forcing a check by RPC. - if (ex_net_id != self._fetch_external_net_id(force=True)): - continue - cur_router_ids.add(r['id']) - if r['id'] not in self.router_info: - self._router_added(r['id'], r) - ri = self.router_info[r['id']] - ri.router = r - pool.spawn_n(self.process_router, ri) - # identify and remove routers that no longer exist - for router_id in prev_router_ids - cur_router_ids: - pool.spawn_n(self._router_removed, router_id) - pool.waitall() + if (target_ex_net_id and ex_net_id and ex_net_id != target_ex_net_id): + # Double check that our single external_net_id has not changed + # by forcing a check by RPC. + if ex_net_id != self._fetch_external_net_id(force=True): + raise n_exc.RouterNotCompatibleWithAgent( + router_id=router['id']) + + if router['id'] not in self.router_info: + self._router_added(router['id'], router) + ri = self.router_info[router['id']] + ri.router = router + self.process_router(ri) def _process_router_update(self): for rp, update in self._queue.each_update_to_next_router(): @@ -1810,7 +1842,15 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, self._router_removed(update.id) continue - self._process_routers([router]) + try: + self._process_router_if_compatible(router) + except n_exc.RouterNotCompatibleWithAgent as e: + LOG.exception(e.msg) + # Was the router previously handled by this agent? + if router['id'] in self.router_info: + LOG.error(_LE("Removing incompatible router '%s'"), + router['id']) + self._router_removed(router['id']) LOG.debug("Finished a router update for %s", update.id) rp.fetched_and_processed(update.timestamp) @@ -1820,12 +1860,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, while True: pool.spawn_n(self._process_router_update) - def _process_router_delete(self): - current_removed_routers = list(self.removed_routers) - for router_id in current_removed_routers: - self._router_removed(router_id) - self.removed_routers.remove(router_id) - def _router_ids(self): if not self.conf.use_namespaces: return [self.conf.router_id] @@ -1851,8 +1885,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback, try: router_ids = self._router_ids() - self.updated_routers.clear() - self.removed_routers.clear() timestamp = timeutils.utcnow() routers = self.plugin_rpc.get_routers( context, router_ids) @@ -1946,7 +1978,7 @@ class L3NATAgentWithStateReport(L3NATAgent): 'interface_driver': self.conf.interface_driver}, 'start_flag': True, 'agent_type': l3_constants.AGENT_TYPE_L3} - report_interval = cfg.CONF.AGENT.report_interval + report_interval = self.conf.AGENT.report_interval self.use_call = True if report_interval: self.heartbeat = loopingcall.FixedIntervalLoopingCall( diff --git a/neutron/agent/linux/__init__.py b/neutron/agent/linux/__init__.py index bf3075ddd8b..e69de29bb2d 100644 --- a/neutron/agent/linux/__init__.py +++ b/neutron/agent/linux/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index aba75af5716..51e89913d48 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -730,7 +730,8 @@ class Dnsmasq(DhcpLocalProcess): subnets = dict((subnet.id, subnet) for subnet in network.subnets) for port in network.ports: - if port.device_owner != constants.DEVICE_OWNER_ROUTER_INTF: + if port.device_owner not in (constants.DEVICE_OWNER_ROUTER_INTF, + constants.DEVICE_OWNER_DVR_INTERFACE): continue for alloc in port.fixed_ips: if subnets[alloc.subnet_id].gateway_ip == alloc.ip_address: diff --git a/neutron/agent/linux/external_process.py b/neutron/agent/linux/external_process.py index b9d581210a5..ffea1247ac3 100644 --- a/neutron/agent/linux/external_process.py +++ b/neutron/agent/linux/external_process.py @@ -30,14 +30,12 @@ OPTS = [ cfg.StrOpt('external_pids', default='$state_path/external/pids', help=_('Location to store child pid files')), - cfg.BoolOpt('check_child_processes', default=False, - help=_("Periodically check child processes")), cfg.StrOpt('check_child_processes_action', default='respawn', choices=['respawn', 'exit'], help=_('Action to be executed when a child process dies')), - cfg.IntOpt('check_child_processes_interval', default=60, + cfg.IntOpt('check_child_processes_interval', default=0, help=_('Interval between checks of child process liveness ' - '(seconds)')), + '(seconds), use 0 to disable')), ] @@ -156,7 +154,7 @@ class ProcessMonitor(object): self._process_managers = {} - if self._config.check_child_processes: + if self._config.check_child_processes_interval: self._spawn_checking_thread() def enable(self, uuid, cmd_callback, namespace=None, service=None, diff --git a/neutron/agent/linux/interface.py b/neutron/agent/linux/interface.py index 77b8365c4b3..538527b07ce 100644 --- a/neutron/agent/linux/interface.py +++ b/neutron/agent/linux/interface.py @@ -23,8 +23,10 @@ from neutron.agent.common import config from neutron.agent.linux import ip_lib from neutron.agent.linux import ovs_lib from neutron.agent.linux import utils +from neutron.common import constants as n_const from neutron.common import exceptions from neutron.extensions import flavor +from neutron.openstack.common.gettextutils import _LE from neutron.openstack.common import importutils from neutron.openstack.common import log as logging @@ -71,7 +73,7 @@ class LinuxInterfaceDriver(object): # from linux IF_NAMESIZE DEV_NAME_LEN = 14 - DEV_NAME_PREFIX = 'tap' + DEV_NAME_PREFIX = n_const.TAP_DEVICE_PREFIX def __init__(self, conf): self.conf = conf @@ -110,6 +112,9 @@ class LinuxInterfaceDriver(object): for ip_cidr, ip_version in previous.items(): if ip_cidr not in preserve_ips: device.addr.delete(ip_version, ip_cidr) + self.delete_conntrack_state(root_helper=self.root_helper, + namespace=namespace, + ip=ip_cidr) if gateway: device.route.add_gateway(gateway) @@ -121,6 +126,43 @@ class LinuxInterfaceDriver(object): for route in existing_onlink_routes - new_onlink_routes: device.route.delete_onlink_route(route) + def delete_conntrack_state(self, root_helper, namespace, ip): + """Delete conntrack state associated with an IP address. + + This terminates any active connections through an IP. Call this soon + after removing the IP address from an interface so that new connections + cannot be created before the IP address is gone. + + root_helper: root_helper to gain root access to call conntrack + namespace: the name of the namespace where the IP has been configured + ip: the IP address for which state should be removed. This can be + passed as a string with or without /NN. A netaddr.IPAddress or + netaddr.Network representing the IP address can also be passed. + """ + ip_str = str(netaddr.IPNetwork(ip).ip) + ip_wrapper = ip_lib.IPWrapper(root_helper, namespace=namespace) + + # Delete conntrack state for ingress traffic + # If 0 flow entries have been deleted + # conntrack -D will return 1 + try: + ip_wrapper.netns.execute(["conntrack", "-D", "-d", ip_str], + check_exit_code=True, + extra_ok_codes=[1]) + + except RuntimeError: + LOG.exception(_LE("Failed deleting ingress connection state of" + " floatingip %s"), ip_str) + + # Delete conntrack state for egress traffic + try: + ip_wrapper.netns.execute(["conntrack", "-D", "-q", ip_str], + check_exit_code=True, + extra_ok_codes=[1]) + except RuntimeError: + LOG.exception(_LE("Failed deleting egress connection state of" + " floatingip %s"), ip_str) + def check_bridge_exists(self, bridge): if not ip_lib.device_exists(bridge): raise exceptions.BridgeDoesNotExist(bridge=bridge) @@ -150,7 +192,7 @@ class NullDriver(LinuxInterfaceDriver): class OVSInterfaceDriver(LinuxInterfaceDriver): """Driver for creating an internal interface on an OVS bridge.""" - DEV_NAME_PREFIX = 'tap' + DEV_NAME_PREFIX = n_const.TAP_DEVICE_PREFIX def __init__(self, conf): super(OVSInterfaceDriver, self).__init__(conf) @@ -159,7 +201,8 @@ class OVSInterfaceDriver(LinuxInterfaceDriver): def _get_tap_name(self, dev_name, prefix=None): if self.conf.ovs_use_veth: - dev_name = dev_name.replace(prefix or self.DEV_NAME_PREFIX, 'tap') + dev_name = dev_name.replace(prefix or self.DEV_NAME_PREFIX, + n_const.TAP_DEVICE_PREFIX) return dev_name def _ovs_add_port(self, bridge, device_name, port_id, mac_address, @@ -254,7 +297,8 @@ class MidonetInterfaceDriver(LinuxInterfaceDriver): self.root_helper, namespace=namespace): ip = ip_lib.IPWrapper(self.root_helper) - tap_name = device_name.replace(prefix or 'tap', 'tap') + tap_name = device_name.replace(prefix or n_const.TAP_DEVICE_PREFIX, + n_const.TAP_DEVICE_PREFIX) # Create ns_dev in a namespace if one is configured. root_dev, ns_dev = ip.add_veth(tap_name, device_name, @@ -293,14 +337,15 @@ class MidonetInterfaceDriver(LinuxInterfaceDriver): class IVSInterfaceDriver(LinuxInterfaceDriver): """Driver for creating an internal interface on an IVS bridge.""" - DEV_NAME_PREFIX = 'tap' + DEV_NAME_PREFIX = n_const.TAP_DEVICE_PREFIX def __init__(self, conf): super(IVSInterfaceDriver, self).__init__(conf) self.DEV_NAME_PREFIX = 'ns-' def _get_tap_name(self, dev_name, prefix=None): - dev_name = dev_name.replace(prefix or self.DEV_NAME_PREFIX, 'tap') + dev_name = dev_name.replace(prefix or self.DEV_NAME_PREFIX, + n_const.TAP_DEVICE_PREFIX) return dev_name def _ivs_add_port(self, device_name, port_id, mac_address): @@ -367,10 +412,8 @@ class BridgeInterfaceDriver(LinuxInterfaceDriver): ip = ip_lib.IPWrapper(self.root_helper) # Enable agent to define the prefix - if prefix: - tap_name = device_name.replace(prefix, 'tap') - else: - tap_name = device_name.replace(self.DEV_NAME_PREFIX, 'tap') + tap_name = device_name.replace(prefix or self.DEV_NAME_PREFIX, + n_const.TAP_DEVICE_PREFIX) # Create ns_veth in a namespace if one is configured. root_veth, ns_veth = ip.add_veth(tap_name, device_name, namespace2=namespace) diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index f085b4ded87..1d32a5497f8 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -532,7 +532,8 @@ class IpNetnsCommand(IpCommandBase): def delete(self, name): self._as_root('delete', name, use_root_namespace=True) - def execute(self, cmds, addl_env={}, check_exit_code=True): + def execute(self, cmds, addl_env={}, check_exit_code=True, + extra_ok_codes=None): ns_params = [] if self._parent.namespace: if not self._parent.root_helper: @@ -546,7 +547,7 @@ class IpNetnsCommand(IpCommandBase): return utils.execute( ns_params + env_params + list(cmds), root_helper=self._parent.root_helper, - check_exit_code=check_exit_code) + check_exit_code=check_exit_code, extra_ok_codes=extra_ok_codes) def exists(self, name): output = self._parent._execute('o', 'netns', ['list']) diff --git a/neutron/agent/linux/iptables_comments.py b/neutron/agent/linux/iptables_comments.py new file mode 100644 index 00000000000..641b2ef8652 --- /dev/null +++ b/neutron/agent/linux/iptables_comments.py @@ -0,0 +1,34 @@ +# Copyright 2014 OpenStack Foundation +# +# 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. + +"""iptables comments""" + +# Do not translate these comments. These comments cannot contain a quote or +# an escape character because they will end up in a call to iptables and +# could interfere with other parameters. + +SNAT_OUT = 'Perform source NAT on outgoing traffic.' +UNMATCH_DROP = 'Default drop rule for unmatched traffic.' +VM_INT_SG = 'Direct traffic from the VM interface to the security group chain.' +SG_TO_VM_SG = 'Jump to the VM specific chain.' +INPUT_TO_SG = 'Direct incoming traffic from VM to the security group chain.' +PAIR_ALLOW = 'Allow traffic from defined IP/MAC pairs.' +PAIR_DROP = 'Drop traffic without an IP/MAC allow rule.' +DHCP_CLIENT = 'Allow DHCP client traffic.' +DHCP_SPOOF = 'Prevent DHCP Spoofing by VM.' +UNMATCHED = 'Send unmatched traffic to the fallback chain.' +STATELESS_DROP = 'Drop packets that are not associated with a state.' +ALLOW_ASSOC = ('Direct packets associated with a known session to the RETURN ' + 'chain.') +IPV6_RA_ALLOW = 'Allow IPv6 ICMP traffic to allow RA packets.' diff --git a/neutron/agent/linux/iptables_firewall.py b/neutron/agent/linux/iptables_firewall.py index 5f050b91aa3..102e90634a4 100644 --- a/neutron/agent/linux/iptables_firewall.py +++ b/neutron/agent/linux/iptables_firewall.py @@ -18,6 +18,7 @@ from oslo.config import cfg 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.common import constants from neutron.common import ipv6_utils @@ -40,6 +41,7 @@ LINUX_DEV_LEN = 14 IPSET_CHAIN_LEN = 20 IPSET_CHANGE_BULK_THRESHOLD = 10 IPSET_ADD_BULK_THRESHOLD = 5 +comment_rule = iptables_manager.comment_rule class IptablesFirewallDriver(firewall.FirewallDriver): @@ -146,9 +148,11 @@ class IptablesFirewallDriver(firewall.FirewallDriver): def _add_fallback_chain_v4v6(self): self.iptables.ipv4['filter'].add_chain('sg-fallback') - self.iptables.ipv4['filter'].add_rule('sg-fallback', '-j DROP') + self.iptables.ipv4['filter'].add_rule('sg-fallback', '-j DROP', + comment=ic.UNMATCH_DROP) self.iptables.ipv6['filter'].add_chain('sg-fallback') - self.iptables.ipv6['filter'].add_rule('sg-fallback', '-j DROP') + self.iptables.ipv6['filter'].add_rule('sg-fallback', '-j DROP', + comment=ic.UNMATCH_DROP) def _add_chain_by_name_v4v6(self, chain_name): self.iptables.ipv6['filter'].add_chain(chain_name) @@ -158,12 +162,15 @@ class IptablesFirewallDriver(firewall.FirewallDriver): self.iptables.ipv4['filter'].ensure_remove_chain(chain_name) self.iptables.ipv6['filter'].ensure_remove_chain(chain_name) - def _add_rule_to_chain_v4v6(self, chain_name, ipv4_rules, ipv6_rules): + def _add_rule_to_chain_v4v6(self, chain_name, ipv4_rules, ipv6_rules, + comment=None): for rule in ipv4_rules: - self.iptables.ipv4['filter'].add_rule(chain_name, rule) + self.iptables.ipv4['filter'].add_rule(chain_name, rule, + comment=comment) for rule in ipv6_rules: - self.iptables.ipv6['filter'].add_rule(chain_name, rule) + self.iptables.ipv6['filter'].add_rule(chain_name, rule, + comment=comment) def _get_device_name(self, port): return port['device'] @@ -183,17 +190,20 @@ class IptablesFirewallDriver(firewall.FirewallDriver): '-j $%s' % (self.IPTABLES_DIRECTION[direction], device, SG_CHAIN)] - self._add_rule_to_chain_v4v6('FORWARD', jump_rule, jump_rule) + self._add_rule_to_chain_v4v6('FORWARD', jump_rule, jump_rule, + comment=ic.VM_INT_SG) # jump to the chain based on the device jump_rule = ['-m physdev --%s %s --physdev-is-bridged ' '-j $%s' % (self.IPTABLES_DIRECTION[direction], device, chain_name)] - self._add_rule_to_chain_v4v6(SG_CHAIN, jump_rule, jump_rule) + self._add_rule_to_chain_v4v6(SG_CHAIN, jump_rule, jump_rule, + comment=ic.SG_TO_VM_SG) if direction == EGRESS_DIRECTION: - self._add_rule_to_chain_v4v6('INPUT', jump_rule, jump_rule) + self._add_rule_to_chain_v4v6('INPUT', jump_rule, jump_rule, + comment=ic.INPUT_TO_SG) def _split_sgr_by_ethertype(self, security_group_rules): ipv4_sg_rules = [] @@ -222,12 +232,12 @@ class IptablesFirewallDriver(firewall.FirewallDriver): # of the list after the allowed_address_pair rules. table.add_rule(chain_name, '-m mac --mac-source %s -j RETURN' - % mac) + % mac, comment=ic.PAIR_ALLOW) else: table.add_rule(chain_name, '-m mac --mac-source %s -s %s -j RETURN' - % (mac, ip)) - table.add_rule(chain_name, '-j DROP') + % (mac, ip), comment=ic.PAIR_ALLOW) + table.add_rule(chain_name, '-j DROP', comment=ic.PAIR_DROP) rules.append('-j $%s' % chain_name) def _build_ipv4v6_mac_ip_list(self, mac, ip_address, mac_ipv4_pairs, @@ -239,9 +249,12 @@ class IptablesFirewallDriver(firewall.FirewallDriver): def _spoofing_rule(self, port, ipv4_rules, ipv6_rules): #Note(nati) allow dhcp or RA packet - ipv4_rules += ['-p udp -m udp --sport 68 --dport 67 -j RETURN'] - ipv6_rules += ['-p icmpv6 -j RETURN'] - ipv6_rules += ['-p udp -m udp --sport 546 --dport 547 -j RETURN'] + ipv4_rules += [comment_rule('-p udp -m udp --sport 68 --dport 67 ' + '-j RETURN', comment=ic.DHCP_CLIENT)] + ipv6_rules += [comment_rule('-p icmpv6 -j RETURN', + comment=ic.IPV6_RA_ALLOW)] + ipv6_rules += [comment_rule('-p udp -m udp --sport 546 --dport 547 ' + '-j RETURN', comment=None)] mac_ipv4_pairs = [] mac_ipv6_pairs = [] @@ -266,8 +279,10 @@ class IptablesFirewallDriver(firewall.FirewallDriver): def _drop_dhcp_rule(self, ipv4_rules, ipv6_rules): #Note(nati) Drop dhcp packet from VM - ipv4_rules += ['-p udp -m udp --sport 67 --dport 68 -j DROP'] - ipv6_rules += ['-p udp -m udp --sport 547 --dport 546 -j DROP'] + ipv4_rules += [comment_rule('-p udp -m udp --sport 67 --dport 68 ' + '-j DROP', comment=ic.DHCP_SPOOF)] + ipv6_rules += [comment_rule('-p udp -m udp --sport 547 --dport 546 ' + '-j DROP', comment=None)] def _accept_inbound_icmpv6(self): # Allow multicast listener, neighbor solicitation and @@ -454,18 +469,22 @@ class IptablesFirewallDriver(firewall.FirewallDriver): args += ['-j RETURN'] iptables_rules += [' '.join(args)] - iptables_rules += ['-j $sg-fallback'] + iptables_rules += [comment_rule('-j $sg-fallback', + comment=ic.UNMATCHED)] return iptables_rules def _drop_invalid_packets(self, iptables_rules): # Always drop invalid packets - iptables_rules += ['-m state --state ' 'INVALID -j DROP'] + iptables_rules += [comment_rule('-m state --state ' 'INVALID -j DROP', + comment=ic.STATELESS_DROP)] return iptables_rules def _allow_established(self, iptables_rules): # Allow established connections - iptables_rules += ['-m state --state RELATED,ESTABLISHED -j RETURN'] + iptables_rules += [comment_rule( + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=ic.ALLOW_ASSOC)] return iptables_rules def _protocol_arg(self, protocol): @@ -560,7 +579,7 @@ class IptablesFirewallDriver(firewall.FirewallDriver): class OVSHybridIptablesFirewallDriver(IptablesFirewallDriver): - OVS_HYBRID_TAP_PREFIX = 'tap' + OVS_HYBRID_TAP_PREFIX = constants.TAP_DEVICE_PREFIX def _port_chain_name(self, port, direction): return iptables_manager.get_chain_name( diff --git a/neutron/agent/linux/iptables_manager.py b/neutron/agent/linux/iptables_manager.py index 613a929cab6..6af69ad32ed 100644 --- a/neutron/agent/linux/iptables_manager.py +++ b/neutron/agent/linux/iptables_manager.py @@ -22,6 +22,10 @@ import inspect import os import re +from oslo.config import cfg + +from neutron.agent.common import config +from neutron.agent.linux import iptables_comments as ic from neutron.agent.linux import utils as linux_utils from neutron.common import utils from neutron.openstack.common import excutils @@ -51,6 +55,12 @@ MAX_CHAIN_LEN_NOWRAP = 28 IPTABLES_ERROR_LINES_OF_CONTEXT = 5 +def comment_rule(rule, comment): + if not cfg.CONF.AGENT.comment_iptables_rules or not comment: + return rule + return '%s -m comment --comment "%s"' % (rule, comment) + + def get_chain_name(chain_name, wrap=True): if wrap: return chain_name[:MAX_CHAIN_LEN_WRAP] @@ -67,13 +77,14 @@ class IptablesRule(object): """ def __init__(self, chain, rule, wrap=True, top=False, - binary_name=binary_name, tag=None): + binary_name=binary_name, tag=None, comment=None): self.chain = get_chain_name(chain, wrap) self.rule = rule self.wrap = wrap self.top = top self.wrap_name = binary_name[:16] self.tag = tag + self.comment = comment def __eq__(self, other): return ((self.chain == other.chain) and @@ -89,7 +100,7 @@ class IptablesRule(object): chain = '%s-%s' % (self.wrap_name, self.chain) else: chain = self.chain - return '-A %s %s' % (chain, self.rule) + return comment_rule('-A %s %s' % (chain, self.rule), self.comment) class IptablesTable(object): @@ -182,7 +193,8 @@ class IptablesTable(object): self.rules = [r for r in self.rules if jump_snippet not in r.rule] - def add_rule(self, chain, rule, wrap=True, top=False, tag=None): + def add_rule(self, chain, rule, wrap=True, top=False, tag=None, + comment=None): """Add a rule to the table. This is just like what you'd feed to iptables, just without @@ -202,7 +214,7 @@ class IptablesTable(object): self._wrap_target_chain(e, wrap) for e in rule.split(' ')) self.rules.append(IptablesRule(chain, rule, wrap, top, self.wrap_name, - tag)) + tag, comment)) def _wrap_target_chain(self, s, wrap): if s.startswith('$'): @@ -210,7 +222,7 @@ class IptablesTable(object): return s - def remove_rule(self, chain, rule, wrap=True, top=False): + def remove_rule(self, chain, rule, wrap=True, top=False, comment=None): """Remove a rule from a chain. Note: The rule must be exactly identical to the one that was added. @@ -225,10 +237,12 @@ class IptablesTable(object): self._wrap_target_chain(e, wrap) for e in rule.split(' ')) self.rules.remove(IptablesRule(chain, rule, wrap, top, - self.wrap_name)) + self.wrap_name, + comment=comment)) if not wrap: self.remove_rules.append(IptablesRule(chain, rule, wrap, top, - self.wrap_name)) + self.wrap_name, + comment=comment)) except ValueError: LOG.warn(_('Tried to remove rule that was not there:' ' %(chain)r %(rule)r %(wrap)r %(top)r'), @@ -288,6 +302,7 @@ class IptablesManager(object): else: self.execute = linux_utils.execute + config.register_iptables_opts(cfg.CONF) self.use_ipv6 = use_ipv6 self.root_helper = root_helper self.namespace = namespace @@ -351,7 +366,8 @@ class IptablesManager(object): # chain so that it's applied last. self.ipv4['nat'].add_chain('snat') self.ipv4['nat'].add_rule('neutron-postrouting-bottom', - '-j $snat', wrap=False) + '-j $snat', wrap=False, + comment=ic.SNAT_OUT) # And then we add a float-snat chain and jump to first thing in # the snat chain. diff --git a/neutron/agent/linux/ovs_lib.py b/neutron/agent/linux/ovs_lib.py index 2013ba170c6..64cf4eebbba 100644 --- a/neutron/agent/linux/ovs_lib.py +++ b/neutron/agent/linux/ovs_lib.py @@ -22,6 +22,7 @@ from neutron.agent.linux import ip_lib from neutron.agent.linux import utils from neutron.common import exceptions from neutron.openstack.common import excutils +from neutron.openstack.common.gettextutils import _LI, _LW from neutron.openstack.common import jsonutils from neutron.openstack.common import log as logging from neutron.plugins.common import constants @@ -401,29 +402,28 @@ class OVSBridge(BaseOVS): # an exeception which will be captured in this block. # We won't deal with the possibility of ovs-vsctl return multiple # rows since the interface identifier is unique - data = json_result['data'][0] - port_name = data[name_idx] - switch = get_bridge_for_iface(self.root_helper, port_name) - if switch != self.br_name: - LOG.info(_("Port: %(port_name)s is on %(switch)s," - " not on %(br_name)s"), {'port_name': port_name, - 'switch': switch, - 'br_name': self.br_name}) - return - ofport = data[ofport_idx] - # ofport must be integer otherwise return None - if not isinstance(ofport, int) or ofport == -1: - LOG.warn(_("ofport: %(ofport)s for VIF: %(vif)s is not a " - "positive integer"), {'ofport': ofport, - 'vif': port_id}) - return - # Find VIF's mac address in external ids - ext_id_dict = dict((item[0], item[1]) for item in - data[ext_ids_idx][1]) - vif_mac = ext_id_dict['attached-mac'] - return VifPort(port_name, ofport, port_id, vif_mac, self) - except Exception as e: - LOG.warn(_("Unable to parse interface details. Exception: %s"), e) + for data in json_result['data']: + port_name = data[name_idx] + switch = get_bridge_for_iface(self.root_helper, port_name) + if switch != self.br_name: + continue + ofport = data[ofport_idx] + # ofport must be integer otherwise return None + if not isinstance(ofport, int) or ofport == -1: + LOG.warn(_LW("ofport: %(ofport)s for VIF: %(vif)s is not a" + " positive integer"), {'ofport': ofport, + 'vif': port_id}) + return + # Find VIF's mac address in external ids + ext_id_dict = dict((item[0], item[1]) for item in + data[ext_ids_idx][1]) + vif_mac = ext_id_dict['attached-mac'] + return VifPort(port_name, ofport, port_id, vif_mac, self) + LOG.info(_LI("Port %(port_id)s not present in bridge %(br_name)s"), + {'port_id': port_id, 'br_name': self.br_name}) + except Exception as error: + LOG.warn(_LW("Unable to parse interface details. Exception: %s"), + error) return def delete_ports(self, all_ports=False): diff --git a/neutron/agent/linux/utils.py b/neutron/agent/linux/utils.py index e82a0d1496c..8243468919a 100644 --- a/neutron/agent/linux/utils.py +++ b/neutron/agent/linux/utils.py @@ -14,9 +14,9 @@ # under the License. import fcntl +import glob import os import shlex -import shutil import socket import struct import tempfile @@ -58,7 +58,8 @@ def create_process(cmd, root_helper=None, addl_env=None): def execute(cmd, root_helper=None, process_input=None, addl_env=None, - check_exit_code=True, return_stderr=False, log_fail_as_error=True): + check_exit_code=True, return_stderr=False, log_fail_as_error=True, + extra_ok_codes=None): try: obj, cmd = create_process(cmd, root_helper=root_helper, addl_env=addl_env) @@ -70,6 +71,10 @@ def execute(cmd, root_helper=None, process_input=None, addl_env=None, "Stderr: %(stderr)r") % {'cmd': cmd, 'code': obj.returncode, 'stdout': _stdout, 'stderr': _stderr} + extra_ok_codes = extra_ok_codes or [] + if obj.returncode and obj.returncode in extra_ok_codes: + obj.returncode = None + if obj.returncode and log_fail_as_error: LOG.error(m) else: @@ -129,19 +134,19 @@ def find_child_pids(pid): return [x.strip() for x in raw_pids.split('\n') if x.strip()] -def _get_conf_dir(cfg_root, uuid, ensure_conf_dir): - confs_dir = os.path.abspath(os.path.normpath(cfg_root)) - conf_dir = os.path.join(confs_dir, uuid) +def _get_conf_base(cfg_root, uuid, ensure_conf_dir): + conf_dir = os.path.abspath(os.path.normpath(cfg_root)) + conf_base = os.path.join(conf_dir, uuid) if ensure_conf_dir: if not os.path.isdir(conf_dir): os.makedirs(conf_dir, 0o755) - return conf_dir + return conf_base def get_conf_file_name(cfg_root, uuid, cfg_file, ensure_conf_dir=False): """Returns the file name for a given kind of config file.""" - conf_dir = _get_conf_dir(cfg_root, uuid, ensure_conf_dir) - return os.path.join(conf_dir, cfg_file) + conf_base = _get_conf_base(cfg_root, uuid, ensure_conf_dir) + return "%s.%s" % (conf_base, cfg_file) def get_value_from_conf_file(cfg_root, uuid, cfg_file, converter=None): @@ -163,15 +168,13 @@ def get_value_from_conf_file(cfg_root, uuid, cfg_file, converter=None): def remove_conf_files(cfg_root, uuid): - conf_dir = _get_conf_dir(cfg_root, uuid, False) - shutil.rmtree(conf_dir, ignore_errors=True) + conf_base = _get_conf_base(cfg_root, uuid, False) + for file_path in glob.iglob("%s.*" % conf_base): + os.unlink(file_path) def remove_conf_file(cfg_root, uuid, cfg_file): - """Remove a config file. Remove the directory if this is the last file.""" + """Remove a config file.""" conf_file = get_conf_file_name(cfg_root, uuid, cfg_file) if os.path.exists(conf_file): os.unlink(conf_file) - conf_dir = _get_conf_dir(cfg_root, uuid, False) - if not os.listdir(conf_dir): - shutil.rmtree(conf_dir, ignore_errors=True) diff --git a/neutron/agent/metadata/__init__.py b/neutron/agent/metadata/__init__.py index 20c9a03a026..e69de29bb2d 100644 --- a/neutron/agent/metadata/__init__.py +++ b/neutron/agent/metadata/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 New Dream Network, LLC (DreamHost) -# -# 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. diff --git a/neutron/agent/metadata/agent.py b/neutron/agent/metadata/agent.py index 5a943fd1356..4017057b3c3 100644 --- a/neutron/agent/metadata/agent.py +++ b/neutron/agent/metadata/agent.py @@ -38,7 +38,6 @@ from neutron.openstack.common.cache import cache from neutron.openstack.common import excutils from neutron.openstack.common import log as logging from neutron.openstack.common import loopingcall -from neutron.openstack.common import service from neutron import wsgi LOG = logging.getLogger(__name__) @@ -210,9 +209,10 @@ class MetadataProxyHandler(object): req.query_string, '')) - h = httplib2.Http(ca_certs=self.conf.auth_ca_cert, - disable_ssl_certificate_validation= - self.conf.nova_metadata_insecure) + h = httplib2.Http( + ca_certs=self.conf.auth_ca_cert, + disable_ssl_certificate_validation=self.conf.nova_metadata_insecure + ) if self.conf.nova_client_cert and self.conf.nova_client_priv_key: h.add_certificate(self.conf.nova_client_priv_key, self.conf.nova_client_cert, @@ -232,6 +232,8 @@ class MetadataProxyHandler(object): ) LOG.warn(msg) return webob.exc.HTTPForbidden() + elif resp.status == 400: + return webob.exc.HTTPBadRequest() elif resp.status == 404: return webob.exc.HTTPNotFound() elif resp.status == 409: @@ -278,16 +280,8 @@ class UnixDomainWSGIServer(wsgi.Server): self._socket = eventlet.listen(file_socket, family=socket.AF_UNIX, backlog=backlog) - if workers < 1: - # For the case where only one process is required. - self._server = self.pool.spawn_n(self._run, application, - self._socket) - else: - # Minimize the cost of checking for child exit by extending the - # wait interval past the default of 0.01s. - self._launcher = service.ProcessLauncher(wait_interval=1.0) - self._server = WorkerService(self, application) - self._launcher.launch_service(self._server, workers=workers) + + self._launch(application, workers=workers) def _run(self, application, socket): """Start a WSGI service in a new green thread.""" diff --git a/neutron/agent/metadata/namespace_proxy.py b/neutron/agent/metadata/namespace_proxy.py index 1c2f9cb0f0f..cfac4c4c3fb 100644 --- a/neutron/agent/metadata/namespace_proxy.py +++ b/neutron/agent/metadata/namespace_proxy.py @@ -110,6 +110,8 @@ class NetworkMetadataProxyHandler(object): response.headers['Content-Type'] = resp['content-type'] response.body = content return response + elif resp.status == 400: + return webob.exc.HTTPBadRequest() elif resp.status == 404: return webob.exc.HTTPNotFound() elif resp.status == 409: diff --git a/neutron/agent/securitygroups_rpc.py b/neutron/agent/securitygroups_rpc.py index 17b544502e6..3da4d347f00 100644 --- a/neutron/agent/securitygroups_rpc.py +++ b/neutron/agent/securitygroups_rpc.py @@ -14,11 +14,14 @@ # under the License. # +import functools + from oslo.config import cfg from oslo import messaging +from neutron.agent import firewall from neutron.common import topics -from neutron.openstack.common.gettextutils import _LW +from neutron.openstack.common.gettextutils import _LI, _LW from neutron.openstack.common import importutils from neutron.openstack.common import log as logging @@ -74,9 +77,9 @@ def _disable_extension(extension, aliases): def disable_security_group_extension_by_config(aliases): if not is_firewall_enabled(): - LOG.info(_('Disabled security-group extension.')) + LOG.info(_LI('Disabled security-group extension.')) _disable_extension('security-group', aliases) - LOG.info(_('Disabled allowed-address-pairs extension.')) + LOG.info(_LI('Disabled allowed-address-pairs extension.')) _disable_extension('allowed-address-pairs', aliases) @@ -187,10 +190,23 @@ class SecurityGroupAgentRpcMixin(object): return False return True + def skip_if_noopfirewall_or_firewall_disabled(func): + @functools.wraps(func) + def decorated_function(self, *args, **kwargs): + if (isinstance(self.firewall, firewall.NoopFirewallDriver) or + not is_firewall_enabled()): + LOG.info(_LI("Skipping method %s as firewall is disabled " + "or configured as NoopFirewallDriver."), + func.__name__) + else: + return func(self, *args, **kwargs) + return decorated_function + + @skip_if_noopfirewall_or_firewall_disabled def prepare_devices_filter(self, device_ids): if not device_ids: return - LOG.info(_("Preparing filters for devices %s"), device_ids) + LOG.info(_LI("Preparing filters for devices %s"), device_ids) if self.use_enhanced_rpc: devices_info = self.plugin_rpc.security_group_info_for_devices( self.context, list(device_ids)) @@ -220,15 +236,15 @@ class SecurityGroupAgentRpcMixin(object): remote_sg_id, member_ips) def security_groups_rule_updated(self, security_groups): - LOG.info(_("Security group " - "rule updated %r"), security_groups) + LOG.info(_LI("Security group " + "rule updated %r"), security_groups) self._security_group_updated( security_groups, 'security_groups') def security_groups_member_updated(self, security_groups): - LOG.info(_("Security group " - "member updated %r"), security_groups) + LOG.info(_LI("Security group " + "member updated %r"), security_groups) self._security_group_updated( security_groups, 'security_group_source_groups') @@ -249,7 +265,7 @@ class SecurityGroupAgentRpcMixin(object): self.refresh_firewall(devices) def security_groups_provider_updated(self): - LOG.info(_("Provider rule updated")) + 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 @@ -261,7 +277,7 @@ class SecurityGroupAgentRpcMixin(object): def remove_devices_filter(self, device_ids): if not device_ids: return - LOG.info(_("Remove device filter for %r"), device_ids) + LOG.info(_LI("Remove device filter for %r"), device_ids) with self.firewall.defer_apply(): for device_id in device_ids: device = self.firewall.ports.get(device_id) @@ -269,12 +285,13 @@ class SecurityGroupAgentRpcMixin(object): continue self.firewall.remove_port_filter(device) + @skip_if_noopfirewall_or_firewall_disabled def refresh_firewall(self, device_ids=None): - LOG.info(_("Refresh firewall rules")) + LOG.info(_LI("Refresh firewall rules")) if not device_ids: device_ids = self.firewall.ports.keys() if not device_ids: - LOG.info(_("No ports here to refresh firewall")) + LOG.info(_LI("No ports here to refresh firewall")) return if self.use_enhanced_rpc: devices_info = self.plugin_rpc.security_group_info_for_devices( diff --git a/neutron/api/rpc/handlers/dhcp_rpc.py b/neutron/api/rpc/handlers/dhcp_rpc.py index 56016be7086..58317eac4b6 100644 --- a/neutron/api/rpc/handlers/dhcp_rpc.py +++ b/neutron/api/rpc/handlers/dhcp_rpc.py @@ -60,7 +60,7 @@ class DhcpRpcCallback(n_rpc.RpcCallback): if action == 'create_port': return plugin.create_port(context, port) elif action == 'update_port': - return plugin.update_port(context, port['id'], port['port']) + return plugin.update_port(context, port['id'], port) else: msg = _('Unrecognized action') raise n_exc.Invalid(message=msg) @@ -282,13 +282,11 @@ class DhcpRpcCallback(n_rpc.RpcCallback): def update_dhcp_port(self, context, **kwargs): """Update the dhcp port.""" host = kwargs.get('host') - port_id = kwargs.get('port_id') port = kwargs.get('port') + port['id'] = kwargs.get('port_id') LOG.debug(_('Update dhcp port %(port)s ' 'from %(host)s.'), {'port': port, 'host': host}) plugin = manager.NeutronManager.get_plugin() - return self._port_action(plugin, context, - {'id': port_id, 'port': port}, - 'update_port') + return self._port_action(plugin, context, port, 'update_port') diff --git a/neutron/api/rpc/handlers/dvr_rpc.py b/neutron/api/rpc/handlers/dvr_rpc.py index f4d0233a56c..e9028cf6475 100644 --- a/neutron/api/rpc/handlers/dvr_rpc.py +++ b/neutron/api/rpc/handlers/dvr_rpc.py @@ -115,8 +115,6 @@ class DVRAgentRpcApiMixin(object): class DVRAgentRpcCallbackMixin(object): """Agent-side RPC (implementation) for plugin-to-agent interaction.""" - dvr_agent = None - def dvr_mac_address_update(self, context, **kwargs): """Callback for dvr_mac_addresses update. @@ -124,7 +122,4 @@ class DVRAgentRpcCallbackMixin(object): """ dvr_macs = kwargs.get('dvr_macs', []) LOG.debug("dvr_macs updated on remote: %s", dvr_macs) - if not self.dvr_agent: - LOG.warn(_("DVR agent binding currently not set.")) - return self.dvr_agent.dvr_mac_address_update(dvr_macs) diff --git a/neutron/api/v2/attributes.py b/neutron/api/v2/attributes.py index 0cf1816a420..83471f946e6 100644 --- a/neutron/api/v2/attributes.py +++ b/neutron/api/v2/attributes.py @@ -729,11 +729,11 @@ RESOURCE_ATTRIBUTE_MAP = { 'default': True, 'convert_to': convert_to_boolean, 'is_visible': True}, - 'ipv6_ra_mode': {'allow_post': True, 'allow_put': True, + 'ipv6_ra_mode': {'allow_post': True, 'allow_put': False, 'default': ATTR_NOT_SPECIFIED, 'validate': {'type:values': constants.IPV6_MODES}, 'is_visible': True}, - 'ipv6_address_mode': {'allow_post': True, 'allow_put': True, + 'ipv6_address_mode': {'allow_post': True, 'allow_put': False, 'default': ATTR_NOT_SPECIFIED, 'validate': {'type:values': constants.IPV6_MODES}, diff --git a/neutron/api/v2/base.py b/neutron/api/v2/base.py index a8bf20555e6..53c11b9d218 100644 --- a/neutron/api/v2/base.py +++ b/neutron/api/v2/base.py @@ -513,6 +513,10 @@ class Controller(object): parent_id=parent_id) orig_object_copy = copy.copy(orig_obj) orig_obj.update(body[self._resource]) + # Make a list of attributes to be updated to inform the policy engine + # which attributes are set explicitly so that it can distinguish them + # from the ones that are set to their default values. + orig_obj[const.ATTRIBUTES_TO_UPDATE] = body[self._resource].keys() try: policy.enforce(request.context, action, diff --git a/neutron/cmd/__init__.py b/neutron/cmd/__init__.py index e82932559d4..e69de29bb2d 100644 --- a/neutron/cmd/__init__.py +++ b/neutron/cmd/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/cmd/sanity_check.py b/neutron/cmd/sanity_check.py index 4b1be1bb708..e2d1e640dd6 100644 --- a/neutron/cmd/sanity_check.py +++ b/neutron/cmd/sanity_check.py @@ -104,11 +104,7 @@ def enable_tests_from_config(): def all_tests_passed(): - res = True - for opt in OPTS: - if cfg.CONF.get(opt.name): - res &= opt.callback() - return res + return all(opt.callback() for opt in OPTS if cfg.CONF.get(opt.name)) def main(): diff --git a/neutron/common/config.py b/neutron/common/config.py index cda8d0503bb..7f60851a607 100644 --- a/neutron/common/config.py +++ b/neutron/common/config.py @@ -101,6 +101,8 @@ core_opts = [ secret=True), cfg.StrOpt('nova_admin_tenant_id', help=_('The uuid of the admin nova tenant')), + cfg.StrOpt('nova_admin_tenant_name', + help=_('The name of the admin nova tenant')), cfg.StrOpt('nova_admin_auth_url', default='http://localhost:5000/v2.0', help=_('Authorization URL for connecting to nova in admin ' diff --git a/neutron/common/constants.py b/neutron/common/constants.py index 756a9bb8bec..59066903b11 100644 --- a/neutron/common/constants.py +++ b/neutron/common/constants.py @@ -147,3 +147,13 @@ IPV6_LLA_PREFIX = 'fe80::/64' # Linux interface max length DEVICE_NAME_MAX_LEN = 15 + +# Device names start with "tap" +TAP_DEVICE_PREFIX = 'tap' + +ATTRIBUTES_TO_UPDATE = 'attributes_to_update' + +# Maximum value integer can take in MySQL and PostgreSQL +# In SQLite integer can be stored in 1, 2, 3, 4, 6, or 8 bytes, +# but here it will be limited by this value for consistency. +DB_INTEGER_MAX_VALUE = 2 ** 31 - 1 diff --git a/neutron/common/exceptions.py b/neutron/common/exceptions.py index be62388aa6e..1fd83e46ee3 100644 --- a/neutron/common/exceptions.py +++ b/neutron/common/exceptions.py @@ -335,3 +335,7 @@ class DeviceIDNotOwnedByTenant(Conflict): class InvalidCIDR(BadRequest): message = _("Invalid CIDR %(input)s given as IP prefix") + + +class RouterNotCompatibleWithAgent(NeutronException): + message = _("Router '%(router_id)s' is not compatible with this agent") diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index c7e82d5bc41..efb6a61615c 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -449,7 +449,14 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, msg = _('IP address %s is not a valid IP for the defined ' 'subnet') % fixed['ip_address'] raise n_exc.InvalidInput(error_message=msg) - + if self._check_if_subnet_uses_eui64(subnet): + msg = (_("IPv6 address %(address)s can not be directly " + "assigned to a port on subnet %(id)s with " + "%(mode)s address mode") % + {'address': fixed['ip_address'], + 'id': subnet_id, + 'mode': subnet['ipv6_address_mode']}) + raise n_exc.InvalidInput(error_message=msg) fixed_ip_set.append({'subnet_id': subnet_id, 'ip_address': fixed['ip_address']}) else: @@ -459,7 +466,7 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, raise n_exc.InvalidInput(error_message=msg) return fixed_ip_set - def _allocate_fixed_ips(self, context, fixed_ips): + def _allocate_fixed_ips(self, context, fixed_ips, mac_address): """Allocate IP addresses according to the configured fixed_ips.""" ips = [] for fixed in fixed_ips: @@ -472,15 +479,24 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, # Only subnet ID is specified => need to generate IP # from subnet else: - subnets = [self._get_subnet(context, fixed['subnet_id'])] - # IP address allocation - result = self._generate_ip(context, subnets) - ips.append({'ip_address': result['ip_address'], - 'subnet_id': result['subnet_id']}) + subnet = self._get_subnet(context, fixed['subnet_id']) + if (subnet['ip_version'] == 6 and + self._check_if_subnet_uses_eui64(subnet)): + prefix = subnet['cidr'] + ip_address = ipv6_utils.get_ipv6_addr_by_EUI64( + prefix, mac_address) + ips.append({'ip_address': ip_address.format(), + 'subnet_id': subnet['id']}) + else: + subnets = [subnet] + # IP address allocation + result = self._generate_ip(context, subnets) + ips.append({'ip_address': result['ip_address'], + 'subnet_id': result['subnet_id']}) return ips def _update_ips_for_port(self, context, network_id, port_id, original_ips, - new_ips): + new_ips, mac_address): """Add or remove IPs from the port.""" ips = [] # These ips are still on the port and haven't been removed @@ -511,7 +527,7 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, if to_add: LOG.debug(_("Port update. Adding %s"), to_add) - ips = self._allocate_fixed_ips(context, to_add) + ips = self._allocate_fixed_ips(context, to_add, mac_address) return ips, prev_ips def _allocate_ips_for_port(self, context, port): @@ -529,7 +545,9 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, configured_ips = self._test_fixed_ips_for_port(context, p["network_id"], p['fixed_ips']) - ips = self._allocate_fixed_ips(context, configured_ips) + ips = self._allocate_fixed_ips(context, + configured_ips, + p['mac_address']) else: filter = {'network_id': [p['network_id']]} subnets = self.get_subnets(context, filters=filter) @@ -548,10 +566,9 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, # subnet from the array of subnets that will be passed # to the _generate_ip() function call, since we just # generated an IP. - mac = p['mac_address'] prefix = subnet['cidr'] ip_address = ipv6_utils.get_ipv6_addr_by_EUI64( - prefix, mac) + prefix, p['mac_address']) if not self._check_unique_ip( context, p['network_id'], subnet['id'], ip_address.format()): @@ -740,24 +757,32 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, raise n_exc.InvalidSharedSetting(network=original.name) def _validate_ipv6_attributes(self, subnet, cur_subnet): + if cur_subnet: + self._validate_ipv6_update_dhcp(subnet, cur_subnet) + return ra_mode_set = attributes.is_attr_set(subnet.get('ipv6_ra_mode')) address_mode_set = attributes.is_attr_set( subnet.get('ipv6_address_mode')) - if cur_subnet: - ra_mode = (subnet['ipv6_ra_mode'] if ra_mode_set - else cur_subnet['ipv6_ra_mode']) - addr_mode = (subnet['ipv6_address_mode'] if address_mode_set - else cur_subnet['ipv6_address_mode']) - if ra_mode_set or address_mode_set: - # Check that updated subnet ipv6 attributes do not conflict - self._validate_ipv6_combination(ra_mode, addr_mode) - self._validate_ipv6_update_dhcp(subnet, cur_subnet) - else: - self._validate_ipv6_dhcp(ra_mode_set, address_mode_set, - subnet['enable_dhcp']) - if ra_mode_set and address_mode_set: - self._validate_ipv6_combination(subnet['ipv6_ra_mode'], - subnet['ipv6_address_mode']) + self._validate_ipv6_dhcp(ra_mode_set, address_mode_set, + subnet['enable_dhcp']) + if ra_mode_set and address_mode_set: + self._validate_ipv6_combination(subnet['ipv6_ra_mode'], + subnet['ipv6_address_mode']) + if address_mode_set: + self._validate_eui64_applicable(subnet) + + def _validate_eui64_applicable(self, subnet): + # Per RFC 4862, section 5.5.3, prefix length and interface + # id together should be equal to 128. Currently neutron supports + # EUI64 interface id only, thus limiting the prefix + # length to be 64 only. + if self._check_if_subnet_uses_eui64(subnet): + if netaddr.IPNetwork(subnet['cidr']).prefixlen != 64: + msg = _('Invalid CIDR %s for IPv6 address mode. ' + 'OpenStack uses the EUI-64 address format, ' + 'which requires the prefix to be /64.') + raise n_exc.InvalidInput( + error_message=(msg % subnet['cidr'])) def _validate_ipv6_combination(self, ra_mode, address_mode): if ra_mode != address_mode: @@ -1369,8 +1394,9 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, changed_ips = True original = self._make_port_dict(port, process_extensions=False) added_ips, prev_ips = self._update_ips_for_port( - context, port["network_id"], id, original["fixed_ips"], - p['fixed_ips']) + context, port["network_id"], id, + original["fixed_ips"], p['fixed_ips'], + original['mac_address']) # Update ips if necessary for ip in added_ips: diff --git a/neutron/db/firewall/__init__.py b/neutron/db/firewall/__init__.py index f3d0cdefd35..e69de29bb2d 100644 --- a/neutron/db/firewall/__init__.py +++ b/neutron/db/firewall/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/db/firewall/firewall_db.py b/neutron/db/firewall/firewall_db.py index 2e7097d5517..f00905ee786 100644 --- a/neutron/db/firewall/firewall_db.py +++ b/neutron/db/firewall/firewall_db.py @@ -162,6 +162,13 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): 'enabled': firewall_rule['enabled']} return self._fields(res, fields) + def _check_firewall_rule_conflict(self, fwr_db, fwp_db): + if not fwr_db['shared']: + if fwr_db['tenant_id'] != fwp_db['tenant_id']: + raise firewall.FirewallRuleConflict( + firewall_rule_id=fwr_db['id'], + tenant_id=fwr_db['tenant_id']) + def _set_rules_for_policy(self, context, firewall_policy_db, fwp): rule_id_list = fwp['firewall_rules'] fwp_db = firewall_policy_db @@ -180,8 +187,8 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): # If we find an invalid rule in the list we # do not perform the update since this breaks # the integrity of this list. - raise firewall.FirewallRuleNotFound(firewall_rule_id= - fwrule_id) + raise firewall.FirewallRuleNotFound( + firewall_rule_id=fwrule_id) elif rules_dict[fwrule_id]['firewall_policy_id']: if (rules_dict[fwrule_id]['firewall_policy_id'] != fwp_db['id']): @@ -196,6 +203,8 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): raise firewall.FirewallRuleSharingConflict( firewall_rule_id=fwrule_id, firewall_policy_id=fwp_db['id']) + for fwr_db in rules_in_db: + self._check_firewall_rule_conflict(fwr_db, fwp_db) # New list of rules is valid so we will first reset the existing # list and then add each rule in order. # Note that the list could be empty in which case we interpret @@ -264,14 +273,14 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): status = (const.CREATED if cfg.CONF.router_distributed else const.PENDING_CREATE) with context.session.begin(subtransactions=True): - firewall_db = Firewall(id=uuidutils.generate_uuid(), - tenant_id=tenant_id, - name=fw['name'], - description=fw['description'], - firewall_policy_id= - fw['firewall_policy_id'], - admin_state_up=fw['admin_state_up'], - status=status) + firewall_db = Firewall( + id=uuidutils.generate_uuid(), + tenant_id=tenant_id, + name=fw['name'], + description=fw['description'], + firewall_policy_id=fw['firewall_policy_id'], + admin_state_up=fw['admin_state_up'], + status=status) context.session.add(firewall_db) return self._make_firewall_dict(firewall_db) @@ -329,6 +338,12 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): fwp = firewall_policy['firewall_policy'] with context.session.begin(subtransactions=True): fwp_db = self._get_firewall_policy(context, id) + # check tenant ids are same for fw and fwp or not + if not fwp.get('shared', True) and fwp_db.firewalls: + for fw in fwp_db['firewalls']: + if fwp_db['tenant_id'] != fw['tenant_id']: + raise firewall.FirewallPolicyInUse( + firewall_policy_id=id) # check any existing rules are not shared if 'shared' in fwp and 'firewall_rules' not in fwp: self._check_unshared_rules_for_policy(fwp_db, fwp) @@ -381,28 +396,35 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): dst_port_min, dst_port_max = self._get_min_max_ports_from_range( fwr['destination_port']) with context.session.begin(subtransactions=True): - fwr_db = FirewallRule(id=uuidutils.generate_uuid(), - tenant_id=tenant_id, - name=fwr['name'], - description=fwr['description'], - shared=fwr['shared'], - protocol=fwr['protocol'], - ip_version=fwr['ip_version'], - source_ip_address=fwr['source_ip_address'], - destination_ip_address= - fwr['destination_ip_address'], - source_port_range_min=src_port_min, - source_port_range_max=src_port_max, - destination_port_range_min=dst_port_min, - destination_port_range_max=dst_port_max, - action=fwr['action'], - enabled=fwr['enabled']) + fwr_db = FirewallRule( + id=uuidutils.generate_uuid(), + tenant_id=tenant_id, + name=fwr['name'], + description=fwr['description'], + shared=fwr['shared'], + protocol=fwr['protocol'], + ip_version=fwr['ip_version'], + source_ip_address=fwr['source_ip_address'], + destination_ip_address=fwr['destination_ip_address'], + source_port_range_min=src_port_min, + source_port_range_max=src_port_max, + destination_port_range_min=dst_port_min, + destination_port_range_max=dst_port_max, + action=fwr['action'], + enabled=fwr['enabled']) context.session.add(fwr_db) return self._make_firewall_rule_dict(fwr_db) def update_firewall_rule(self, context, id, firewall_rule): LOG.debug(_("update_firewall_rule() called")) fwr = firewall_rule['firewall_rule'] + fwr_db = self._get_firewall_rule(context, id) + if fwr_db.firewall_policy_id: + fwp_db = self._get_firewall_policy(context, + fwr_db.firewall_policy_id) + if 'shared' in fwr and not fwr['shared']: + if fwr_db['tenant_id'] != fwp_db['tenant_id']: + raise firewall.FirewallRuleInUse(firewall_rule_id=id) if 'source_port' in fwr: src_port_min, src_port_max = self._get_min_max_ports_from_range( fwr['source_port']) @@ -416,7 +438,6 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): fwr['destination_port_range_max'] = dst_port_max del fwr['destination_port'] with context.session.begin(subtransactions=True): - fwr_db = self._get_firewall_rule(context, id) protocol = fwr.get('protocol', fwr_db['protocol']) if not protocol: sport = fwr.get('source_port_range_min', @@ -427,8 +448,6 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): raise firewall.FirewallRuleWithPortWithoutProtocolInvalid() fwr_db.update(fwr) if fwr_db.firewall_policy_id: - fwp_db = self._get_firewall_policy(context, - fwr_db.firewall_policy_id) fwp_db.audited = False return self._make_firewall_rule_dict(fwr_db) @@ -476,8 +495,10 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin): insert_before = False with context.session.begin(subtransactions=True): fwr_db = self._get_firewall_rule(context, firewall_rule_id) + fwp_db = self._get_firewall_policy(context, id) if fwr_db.firewall_policy_id: raise firewall.FirewallRuleInUse(firewall_rule_id=fwr_db['id']) + self._check_firewall_rule_conflict(fwr_db, fwp_db) if ref_firewall_rule_id: # If reference_firewall_rule_id is set, the new rule # is inserted depending on the value of insert_before. diff --git a/neutron/db/l3_agentschedulers_db.py b/neutron/db/l3_agentschedulers_db.py index da827895073..bef3119765a 100644 --- a/neutron/db/l3_agentschedulers_db.py +++ b/neutron/db/l3_agentschedulers_db.py @@ -26,6 +26,7 @@ from sqlalchemy.orm import joinedload from sqlalchemy import sql from neutron.common import constants +from neutron.common import rpc as n_rpc from neutron.common import utils as n_utils from neutron import context as n_ctx from neutron.db import agents_db @@ -34,7 +35,7 @@ from neutron.db import l3_attrs_db from neutron.db import model_base from neutron.extensions import l3agentscheduler from neutron import manager -from neutron.openstack.common.gettextutils import _LI, _LW +from neutron.openstack.common.gettextutils import _LE, _LI, _LW from neutron.openstack.common import log as logging from neutron.openstack.common import loopingcall from neutron.openstack.common import timeutils @@ -122,15 +123,28 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase, RouterL3AgentBinding.router_id). filter(sa.or_(l3_attrs_db.RouterExtraAttributes.ha == sql.false(), l3_attrs_db.RouterExtraAttributes.ha == sql.null()))) - - for binding in down_bindings: - LOG.warn(_LW("Rescheduling router %(router)s from agent %(agent)s " - "because the agent did not report to the server in " - "the last %(dead_time)s seconds."), - {'router': binding.router_id, - 'agent': binding.l3_agent_id, - 'dead_time': agent_dead_limit}) - self.reschedule_router(context, binding.router_id) + try: + for binding in down_bindings: + LOG.warn(_LW( + "Rescheduling router %(router)s from agent %(agent)s " + "because the agent did not report to the server in " + "the last %(dead_time)s seconds."), + {'router': binding.router_id, + 'agent': binding.l3_agent_id, + 'dead_time': agent_dead_limit}) + try: + self.reschedule_router(context, binding.router_id) + except (l3agentscheduler.RouterReschedulingFailed, + n_rpc.RemoteError): + # Catch individual router rescheduling errors here + # so one broken one doesn't stop the iteration. + LOG.exception(_LE("Failed to reschedule router %s"), + binding.router_id) + except db_exc.DBError: + # Catch DB errors here so a transient DB connectivity issue + # doesn't stop the loopingcall. + LOG.exception(_LE("Exception encountered during router " + "rescheduling.")) def validate_agent_router_combination(self, context, agent, router): """Validate if the router can be correctly assigned to the agent. diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py index afc01a33bbd..69357afce4b 100644 --- a/neutron/db/l3_db.py +++ b/neutron/db/l3_db.py @@ -47,6 +47,26 @@ API_TO_DB_COLUMN_MAP = {'port_id': 'fixed_port_id'} CORE_ROUTER_ATTRS = ('id', 'name', 'tenant_id', 'admin_state_up', 'status') +class RouterPort(model_base.BASEV2): + router_id = sa.Column( + sa.String(36), + sa.ForeignKey('routers.id', ondelete="CASCADE"), + primary_key=True) + port_id = sa.Column( + sa.String(36), + sa.ForeignKey('ports.id', ondelete="CASCADE"), + primary_key=True) + # The port_type attribute is redundant as the port table already specifies + # it in DEVICE_OWNER.However, this redundancy enables more efficient + # queries on router ports, and also prevents potential error-prone + # conditions which might originate from users altering the DEVICE_OWNER + # property of router ports. + port_type = sa.Column(sa.String(255)) + port = orm.relationship( + models_v2.Port, + backref=orm.backref('routerport', uselist=False, cascade="all,delete")) + + class Router(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant): """Represents a v2 neutron router.""" @@ -55,6 +75,10 @@ class Router(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant): admin_state_up = sa.Column(sa.Boolean) gw_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id')) gw_port = orm.relationship(models_v2.Port, lazy='joined') + attached_ports = orm.relationship( + RouterPort, + backref='router', + lazy='dynamic') class FloatingIP(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant): @@ -76,6 +100,7 @@ class FloatingIP(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant): # aysnchronous backend is unavailable when the floating IP is disassociated last_known_router_id = sa.Column(sa.String(36)) status = sa.Column(sa.String(16)) + router = orm.relationship(Router, backref='floating_ips') class L3_NAT_dbonly_mixin(l3.RouterPluginBase): @@ -101,7 +126,11 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): def _make_router_dict(self, router, fields=None, process_extensions=True): res = dict((key, router[key]) for key in CORE_ROUTER_ATTRS) if router['gw_port_id']: - ext_gw_info = {'network_id': router.gw_port['network_id']} + ext_gw_info = { + 'network_id': router.gw_port['network_id'], + 'external_fixed_ips': [{'subnet_id': ip["subnet_id"], + 'ip_address': ip["ip_address"]} + for ip in router.gw_port['fixed_ips']]} else: ext_gw_info = None res.update({ @@ -255,7 +284,13 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): with context.session.begin(subtransactions=True): router.gw_port = self._core_plugin._get_port(context.elevated(), gw_port['id']) + router_port = RouterPort( + router_id=router.id, + port_id=gw_port['id'], + port_type=DEVICE_OWNER_ROUTER_GW + ) context.session.add(router) + context.session.add(router_port) def _validate_gw_info(self, context, gw_port, info): network_id = info['network_id'] if info else None @@ -277,11 +312,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): raise l3.RouterExternalGatewayInUseByFloatingIp( router_id=router_id, net_id=router.gw_port['network_id']) with context.session.begin(subtransactions=True): - gw_port_id = router.gw_port['id'] + gw_port = router.gw_port router.gw_port = None context.session.add(router) + context.session.expire(gw_port) + vpnservice = manager.NeutronManager.get_service_plugins().get( + constants.VPN) + if vpnservice: + vpnservice.check_router_in_use(context, router_id) self._core_plugin.delete_port( - admin_ctx, gw_port_id, l3_port_check=False) + admin_ctx, gw_port['id'], l3_port_check=False) def _create_gw_port(self, context, router_id, router, new_network): new_valid_gw_port_attachment = ( @@ -291,7 +331,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): subnets = self._core_plugin._get_subnets_by_network(context, new_network) for subnet in subnets: - self._check_for_dup_router_subnet(context, router_id, + self._check_for_dup_router_subnet(context, router, new_network, subnet['id'], subnet['cidr']) self._create_router_gw_port(context, router, new_network) @@ -313,11 +353,8 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): admin_ctx, filters={'router_id': [router_id]}): raise l3.RouterInUse(router_id=router_id) device_owner = self._get_device_owner(context, router) - device_filter = {'device_id': [router_id], - 'device_owner': [device_owner]} - port_count = self._core_plugin.get_ports_count( - admin_ctx, filters=device_filter) - if port_count: + if any(rp.port_type == device_owner + for rp in router.attached_ports.all()): raise l3.RouterInUse(router_id=router_id) return router @@ -331,18 +368,13 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): if vpnservice: vpnservice.check_router_in_use(context, id) + router_ports = router.attached_ports.all() + # Set the router's gw_port to None to avoid a constraint violation. + router.gw_port = None + for rp in router_ports: + self._core_plugin._delete_port(context.elevated(), rp.port.id) context.session.delete(router) - # Delete the gw port after the router has been removed to - # avoid a constraint violation. - device_filter = {'device_id': [id], - 'device_owner': [DEVICE_OWNER_ROUTER_GW]} - ports = self._core_plugin.get_ports(context.elevated(), - filters=device_filter) - if ports: - self._core_plugin._delete_port(context.elevated(), - ports[0]['id']) - def get_router(self, context, id, fields=None): router = self._get_router(context, id) return self._make_router_dict(router, fields) @@ -363,15 +395,13 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): return self._get_collection_count(context, Router, filters=filters) - def _check_for_dup_router_subnet(self, context, router_id, + def _check_for_dup_router_subnet(self, context, router, network_id, subnet_id, subnet_cidr): try: - rport_qry = context.session.query(models_v2.Port) - rports = rport_qry.filter_by(device_id=router_id) # It's possible these ports are on the same network, but # different subnets. new_ipnet = netaddr.IPNetwork(subnet_cidr) - for p in rports: + for p in (rp.port for rp in router.attached_ports): for ip in p['fixed_ips']: if ip['subnet_id'] == subnet_id: msg = (_("Router already has a port on subnet %s") @@ -411,7 +441,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): raise n_exc.BadRequest(resource='router', msg=msg) return port_id_specified, subnet_id_specified - def _add_interface_by_port(self, context, router_id, port_id, owner): + def _add_interface_by_port(self, context, router, port_id, owner): with context.session.begin(subtransactions=True): port = self._core_plugin._get_port(context, port_id) if port['device_id']: @@ -424,19 +454,19 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): raise n_exc.BadRequest(resource='router', msg=msg) subnet_id = fixed_ips[0]['subnet_id'] subnet = self._core_plugin._get_subnet(context, subnet_id) - self._check_for_dup_router_subnet(context, router_id, + self._check_for_dup_router_subnet(context, router, port['network_id'], subnet['id'], subnet['cidr']) - port.update({'device_id': router_id, 'device_owner': owner}) + port.update({'device_id': router.id, 'device_owner': owner}) return port - def _add_interface_by_subnet(self, context, router_id, subnet_id, owner): + def _add_interface_by_subnet(self, context, router, subnet_id, owner): subnet = self._core_plugin._get_subnet(context, subnet_id) if not subnet['gateway_ip']: msg = _('Subnet for router interface must have a gateway IP') raise n_exc.BadRequest(resource='router', msg=msg) - self._check_for_dup_router_subnet(context, router_id, + self._check_for_dup_router_subnet(context, router, subnet['network_id'], subnet_id, subnet['cidr']) @@ -449,7 +479,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): 'fixed_ips': [fixed_ip], 'mac_address': attributes.ATTR_NOT_SPECIFIED, 'admin_state_up': True, - 'device_id': router_id, + 'device_id': router.id, 'device_owner': owner, 'name': ''}}) @@ -464,18 +494,27 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): } def add_router_interface(self, context, router_id, interface_info): + router = self._get_router(context, router_id) add_by_port, add_by_sub = self._validate_interface_info(interface_info) device_owner = self._get_device_owner(context, router_id) if add_by_port: port = self._add_interface_by_port( - context, router_id, interface_info['port_id'], device_owner) + context, router, interface_info['port_id'], device_owner) elif add_by_sub: port = self._add_interface_by_subnet( - context, router_id, interface_info['subnet_id'], device_owner) + context, router, interface_info['subnet_id'], device_owner) + + with context.session.begin(subtransactions=True): + router_port = RouterPort( + port_id=port['id'], + router_id=router.id, + port_type=device_owner + ) + context.session.add(router_port) return self._make_router_interface_info( - router_id, port['tenant_id'], port['id'], + router.id, port['tenant_id'], port['id'], port['fixed_ips'][0]['subnet_id']) def _confirm_router_interface_not_in_use(self, context, router_id, @@ -483,6 +522,10 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): subnet_db = self._core_plugin._get_subnet(context, subnet_id) subnet_cidr = netaddr.IPNetwork(subnet_db['cidr']) fip_qry = context.session.query(FloatingIP) + vpnservice = manager.NeutronManager.get_service_plugins().get( + constants.VPN) + if vpnservice: + vpnservice.check_subnet_in_use(context, subnet_id) for fip_db in fip_qry.filter_by(router_id=router_id): if netaddr.IPAddress(fip_db['fixed_ip_address']) in subnet_cidr: raise l3.RouterInterfaceInUseByFloatingIP( @@ -490,9 +533,15 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): def _remove_interface_by_port(self, context, router_id, port_id, subnet_id, owner): - port_db = self._core_plugin._get_port(context, port_id) - if not (port_db['device_owner'] == owner and - port_db['device_id'] == router_id): + qry = context.session.query(RouterPort) + qry = qry.filter_by( + port_id=port_id, + router_id=router_id, + port_type=owner + ) + try: + port_db = qry.one().port + except exc.NoResultFound: raise l3.RouterInterfaceNotFound(router_id=router_id, port_id=port_id) port_subnet_id = port_db['fixed_ips'][0]['subnet_id'] @@ -513,11 +562,12 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): subnet = self._core_plugin._get_subnet(context, subnet_id) try: - rport_qry = context.session.query(models_v2.Port) - ports = rport_qry.filter_by( - device_id=router_id, - device_owner=owner, - network_id=subnet['network_id']) + rport_qry = context.session.query(models_v2.Port).join(RouterPort) + ports = rport_qry.filter( + RouterPort.router_id == router_id, + RouterPort.port_type == owner, + models_v2.Port.network_id == subnet['network_id'] + ) for p in ports: if p['fixed_ips'][0]['subnet_id'] == subnet_id: @@ -566,10 +616,12 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): return self._fields(res, fields) def _get_interface_ports_for_network(self, context, network_id): - router_intf_qry = context.session.query(models_v2.Port) - return router_intf_qry.filter_by( - network_id=network_id, - device_owner=DEVICE_OWNER_ROUTER_INTF) + router_intf_qry = context.session.query(RouterPort) + router_intf_qry = router_intf_qry.join(models_v2.Port) + return router_intf_qry.filter( + models_v2.Port.network_id == network_id, + RouterPort.port_type == DEVICE_OWNER_ROUTER_INTF + ) def _get_router_for_floatingip(self, context, internal_port, internal_subnet_id, @@ -584,16 +636,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): router_intf_ports = self._get_interface_ports_for_network( context, internal_port['network_id']) - for intf_p in router_intf_ports: - if intf_p['fixed_ips'][0]['subnet_id'] == internal_subnet_id: - router_id = intf_p['device_id'] - router_gw_qry = context.session.query(models_v2.Port) - has_gw_port = router_gw_qry.filter_by( - network_id=external_network_id, - device_id=router_id, - device_owner=DEVICE_OWNER_ROUTER_GW).count() - if has_gw_port: - return router_id + # This joins on port_id so is not a cross-join + routerport_qry = router_intf_ports.join(models_v2.IPAllocation) + routerport_qry = routerport_qry.filter( + models_v2.IPAllocation.subnet_id == internal_subnet_id + ) + + router_port = routerport_qry.first() + + if router_port and router_port.router.gw_port: + return router_port.router.id raise l3.ExternalGatewayForFloatingIPNotFound( subnet_id=internal_subnet_id, @@ -932,9 +984,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase): device_owners = device_owners or [DEVICE_OWNER_ROUTER_INTF] if not router_ids: return [] - filters = {'device_id': router_ids, - 'device_owner': device_owners} - interfaces = self._core_plugin.get_ports(context, filters) + qry = context.session.query(RouterPort) + qry = qry.filter( + Router.id.in_(router_ids), + RouterPort.port_type.in_(device_owners) + ) + + # TODO(markmcclain): This is suboptimal but was left to reduce + # changeset size since it is late in cycle + ports = [rp.port.id for rp in qry] + interfaces = self._core_plugin.get_ports(context, {'id': ports}) if interfaces: self._populate_subnet_for_ports(context, interfaces) return interfaces @@ -1037,10 +1096,10 @@ class L3RpcNotifierMixin(object): self._l3_rpc_notifier = value def notify_router_updated(self, context, router_id, - operation=None, data=None): + operation=None): if router_id: self.l3_rpc_notifier.routers_updated( - context, [router_id], operation, data) + context, [router_id], operation) def notify_routers_updated(self, context, router_ids, operation=None, data=None): @@ -1056,13 +1115,9 @@ class L3_NAT_db_mixin(L3_NAT_dbonly_mixin, L3RpcNotifierMixin): """Mixin class to add rpc notifier methods to db_base_plugin_v2.""" def update_router(self, context, id, router): - r = router['router'] - payload = {'gw_exists': - r.get(EXTERNAL_GW_INFO, attributes.ATTR_NOT_SPECIFIED) != - attributes.ATTR_NOT_SPECIFIED} router_dict = super(L3_NAT_db_mixin, self).update_router(context, id, router) - self.notify_router_updated(context, router_dict['id'], None, payload) + self.notify_router_updated(context, router_dict['id'], None) return router_dict def delete_router(self, context, id): @@ -1103,7 +1158,7 @@ class L3_NAT_db_mixin(L3_NAT_dbonly_mixin, L3RpcNotifierMixin): floatingip_dict = super(L3_NAT_db_mixin, self).create_floatingip( context, floatingip, initial_status) router_id = floatingip_dict['router_id'] - self.notify_router_updated(context, router_id, 'create_floatingip', {}) + self.notify_router_updated(context, router_id, 'create_floatingip') return floatingip_dict def update_floatingip(self, context, id, floatingip): @@ -1117,7 +1172,7 @@ class L3_NAT_db_mixin(L3_NAT_dbonly_mixin, L3RpcNotifierMixin): def delete_floatingip(self, context, id): router_id = self._delete_floatingip(context, id) - self.notify_router_updated(context, router_id, 'delete_floatingip', {}) + self.notify_router_updated(context, router_id, 'delete_floatingip') def disassociate_floatingips(self, context, port_id, do_notify=True): """Disassociate all floating IPs linked to specific port. diff --git a/neutron/db/l3_dvr_db.py b/neutron/db/l3_dvr_db.py index b346ef3f209..1b39d5bed76 100644 --- a/neutron/db/l3_dvr_db.py +++ b/neutron/db/l3_dvr_db.py @@ -81,13 +81,11 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, self, context, router_id, router_db, data, gw_info): """Update the model to support the dvr case of a router.""" if not attributes.is_attr_set(gw_info) and data.get('distributed'): - admin_ctx = context.elevated() - filters = {'device_id': [router_id], - 'device_owner': [l3_const.DEVICE_OWNER_ROUTER_INTF]} - ports = self._core_plugin.get_ports(admin_ctx, filters=filters) - for p in ports: - port_db = self._core_plugin._get_port(admin_ctx, p['id']) - port_db.update({'device_owner': DEVICE_OWNER_DVR_INTERFACE}) + old_owner = l3_const.DEVICE_OWNER_ROUTER_INTF + new_owner = DEVICE_OWNER_DVR_INTERFACE + for rp in router_db.attached_ports.filter_by(port_type=old_owner): + rp.port_type = new_owner + rp.port.device_owner = new_owner def _update_router_db(self, context, router_id, data, gw_info): with context.session.begin(subtransactions=True): @@ -119,7 +117,7 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, router, new_network) if router.extra_attributes.distributed and router.gw_port: snat_p_list = self.create_snat_intf_ports_if_not_exists( - context.elevated(), router['id']) + context.elevated(), router) if not snat_p_list: LOG.debug("SNAT interface ports not created: %s", snat_p_list) @@ -134,12 +132,15 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, self)._get_device_owner(context, router) def _get_interface_ports_for_network(self, context, network_id): - router_intf_qry = (context.session.query(models_v2.Port). - filter_by(network_id=network_id)) - return (router_intf_qry. - filter(models_v2.Port.device_owner.in_( - [l3_const.DEVICE_OWNER_ROUTER_INTF, - DEVICE_OWNER_DVR_INTERFACE]))) + router_intf_qry = context.session.query(l3_db.RouterPort) + router_intf_qry = router_intf_qry.join(models_v2.Port) + + return router_intf_qry.filter( + models_v2.Port.network_id == network_id, + l3_db.RouterPort.port_type.in_( + [l3_const.DEVICE_OWNER_ROUTER_INTF, DEVICE_OWNER_DVR_INTERFACE] + ) + ) def _update_fip_assoc(self, context, fip, floatingip_db, external_port): previous_router_id = floatingip_db.router_id @@ -208,14 +209,22 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, if add_by_port: port = self._add_interface_by_port( - context, router_id, interface_info['port_id'], device_owner) + context, router, interface_info['port_id'], device_owner) elif add_by_sub: port = self._add_interface_by_subnet( - context, router_id, interface_info['subnet_id'], device_owner) + context, router, interface_info['subnet_id'], device_owner) + + with context.session.begin(subtransactions=True): + router_port = l3_db.RouterPort( + port_id=port['id'], + router_id=router.id, + port_type=device_owner + ) + context.session.add(router_port) if router.extra_attributes.distributed and router.gw_port: self.add_csnat_router_interface_port( - context.elevated(), router_id, port['network_id'], + context.elevated(), router, port['network_id'], port['fixed_ips'][0]['subnet_id']) router_interface_info = self._make_router_interface_info( @@ -257,9 +266,16 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, """Query router interfaces that relate to list of router_ids.""" if not router_ids: return [] - filters = {'device_id': router_ids, - 'device_owner': [DEVICE_OWNER_DVR_SNAT]} - interfaces = self._core_plugin.get_ports(context, filters) + qry = context.session.query(l3_db.RouterPort) + qry = qry.filter( + l3_db.RouterPort.router_id.in_(router_ids), + l3_db.RouterPort.port_type == DEVICE_OWNER_DVR_SNAT + ) + + # TODO(markmcclain): This is suboptimal but was left to reduce + # changeset size since it is late in cycle + ports = [rp.port.id for rp in qry] + interfaces = self._core_plugin.get_ports(context, {'id': ports}) LOG.debug("Return the SNAT ports: %s", interfaces) if interfaces: self._populate_subnet_for_ports(context, interfaces) @@ -314,6 +330,9 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, floating_ip['host'] = self.get_vm_port_hostid( context, floating_ip['port_id']) LOG.debug("Floating IP host: %s", floating_ip['host']) + # if no VM there won't be an agent assigned + if not floating_ip['host']: + continue fip_agent = self._get_agent_by_type_and_host( context, l3_const.AGENT_TYPE_L3, floating_ip['host']) @@ -444,12 +463,19 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, def get_snat_interface_ports_for_router(self, context, router_id): """Return all existing snat_router_interface ports.""" - filters = {'device_id': [router_id], - 'device_owner': [DEVICE_OWNER_DVR_SNAT]} - return self._core_plugin.get_ports(context, filters) + # TODO(markmcclain): This is suboptimal but was left to reduce + # changeset size since it is late in cycle + qry = context.session.query(l3_db.RouterPort) + qry = qry.filter_by( + router_id=router_id, + port_type=DEVICE_OWNER_DVR_SNAT + ) + + ports = [rp.port.id for rp in qry] + return self._core_plugin.get_ports(context, {'id': ports}) def add_csnat_router_interface_port( - self, context, router_id, network_id, subnet_id, do_pop=True): + self, context, router, network_id, subnet_id, do_pop=True): """Add SNAT interface to the specified router and subnet.""" snat_port = self._core_plugin.create_port( context, @@ -457,19 +483,27 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, 'network_id': network_id, 'mac_address': attributes.ATTR_NOT_SPECIFIED, 'fixed_ips': [{'subnet_id': subnet_id}], - 'device_id': router_id, + 'device_id': router.id, 'device_owner': DEVICE_OWNER_DVR_SNAT, 'admin_state_up': True, 'name': ''}}) if not snat_port: msg = _("Unable to create the SNAT Interface Port") raise n_exc.BadRequest(resource='router', msg=msg) - elif do_pop: + + with context.session.begin(subtransactions=True): + router_port = l3_db.RouterPort( + port_id=snat_port['id'], + router_id=router.id, + port_type=DEVICE_OWNER_DVR_SNAT + ) + context.session.add(router_port) + + if do_pop: return self._populate_subnet_for_ports(context, [snat_port]) return snat_port - def create_snat_intf_ports_if_not_exists( - self, context, router_id): + def create_snat_intf_ports_if_not_exists(self, context, router): """Function to return the snat interface port list. This function will return the snat interface port list @@ -477,37 +511,39 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, new ports and then return the list. """ port_list = self.get_snat_interface_ports_for_router( - context, router_id) + context, router.id) if port_list: self._populate_subnet_for_ports(context, port_list) return port_list port_list = [] - filters = { - 'device_id': [router_id], - 'device_owner': [DEVICE_OWNER_DVR_INTERFACE]} - int_ports = self._core_plugin.get_ports(context, filters) + + int_ports = ( + rp.port for rp in + router.attached_ports.filter_by( + port_type=DEVICE_OWNER_DVR_INTERFACE + ) + ) LOG.info(_('SNAT interface port list does not exist,' ' so create one: %s'), port_list) for intf in int_ports: - if intf.get('fixed_ips'): + if intf.fixed_ips: # Passing the subnet for the port to make sure the IP's # are assigned on the right subnet if multiple subnet # exists snat_port = self.add_csnat_router_interface_port( - context, router_id, intf['network_id'], + context, router, intf['network_id'], intf['fixed_ips'][0]['subnet_id'], do_pop=False) port_list.append(snat_port) if port_list: self._populate_subnet_for_ports(context, port_list) return port_list - def dvr_vmarp_table_update(self, context, port_id, action): + def dvr_vmarp_table_update(self, context, port_dict, action): """Notify the L3 agent of VM ARP table changes. Provide the details of the VM ARP to the L3 agent when a Nova instance gets created or deleted. """ - port_dict = self._core_plugin._get_port(context, port_id) # Check this is a valid VM port if ("compute:" not in port_dict['device_owner'] or not port_dict['fixed_ips']): @@ -536,11 +572,18 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin, # Each csnat router interface port is associated # with a subnet, so we need to pass the subnet id to # delete the right ports. - device_filter = { - 'device_id': [router['id']], - 'device_owner': [DEVICE_OWNER_DVR_SNAT]} + + # TODO(markmcclain): This is suboptimal but was left to reduce + # changeset size since it is late in cycle + ports = ( + rp.port.id for rp in + router.attached_ports.filter_by(port_type=DEVICE_OWNER_DVR_SNAT) + ) + c_snat_ports = self._core_plugin.get_ports( - context, filters=device_filter) + context, + filters={'id': ports} + ) for p in c_snat_ports: if subnet_id is None: self._core_plugin.delete_port(context, diff --git a/neutron/db/l3_dvrscheduler_db.py b/neutron/db/l3_dvrscheduler_db.py index 2797c73a8c9..a8c9dae945d 100644 --- a/neutron/db/l3_dvrscheduler_db.py +++ b/neutron/db/l3_dvrscheduler_db.py @@ -110,7 +110,7 @@ class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin): break LOG.debug('DVR: dvr_update_router_addvm %s ', router_id) - def get_dvr_routers_by_vmportid(self, context, port_id): + def get_dvr_routers_by_portid(self, context, port_id): """Gets the dvr routers on vmport subnets.""" router_ids = set() port_dict = self._core_plugin.get_port(context, port_id) @@ -153,9 +153,9 @@ class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin): return True return False - def dvr_deletens_if_no_vm(self, context, port_id): - """Delete the DVR namespace if no VM exists.""" - router_ids = self.get_dvr_routers_by_vmportid(context, port_id) + def dvr_deletens_if_no_port(self, context, port_id): + """Delete the DVR namespace if no dvr serviced port exists.""" + router_ids = self.get_dvr_routers_by_portid(context, port_id) port_host = ml2_db.get_port_binding_host(port_id) if not router_ids: LOG.debug('No namespaces available for this DVR port %(port)s ' @@ -165,16 +165,16 @@ class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin): removed_router_info = [] for router_id in router_ids: subnet_ids = self.get_subnet_ids_on_router(context, router_id) - vm_exists_on_subnet = False + port_exists_on_subnet = False for subnet in subnet_ids: if self.check_ports_active_on_host_and_subnet(context, port_host, port_id, subnet): - vm_exists_on_subnet = True + port_exists_on_subnet = True break - if vm_exists_on_subnet: + if port_exists_on_subnet: continue filter_rtr = {'device_id': [router_id], 'device_owner': diff --git a/neutron/db/l3_gwmode_db.py b/neutron/db/l3_gwmode_db.py index dce6cafe90f..e9f081f6fce 100644 --- a/neutron/db/l3_gwmode_db.py +++ b/neutron/db/l3_gwmode_db.py @@ -43,7 +43,13 @@ class L3_NAT_dbonly_mixin(l3_db.L3_NAT_dbonly_mixin): nw_id = router_db.gw_port['network_id'] router_res[EXTERNAL_GW_INFO] = { 'network_id': nw_id, - 'enable_snat': router_db.enable_snat} + 'enable_snat': router_db.enable_snat, + 'external_fixed_ips': [ + {'subnet_id': ip["subnet_id"], + 'ip_address': ip["ip_address"]} + for ip in router_db.gw_port['fixed_ips'] + ] + } def _update_router_gw_info(self, context, router_id, info, router=None): # Load the router only if necessary diff --git a/neutron/db/l3_hamode_db.py b/neutron/db/l3_hamode_db.py index a0ed5808502..2aa78bdea9b 100644 --- a/neutron/db/l3_hamode_db.py +++ b/neutron/db/l3_hamode_db.py @@ -333,18 +333,19 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin): ha = cfg.CONF.l3_ha return ha - def _create_router_db(self, context, router, tenant_id): - router['ha'] = self._is_ha(router) + def create_router(self, context, router): + is_ha = self._is_ha(router['router']) - if router['ha'] and l3_dvr_db.is_distributed_router(router): + if is_ha and l3_dvr_db.is_distributed_router(router['router']): raise l3_ha.DistributedHARouterNotSupported() - with context.session.begin(subtransactions=True): - router_db = super(L3_HA_NAT_db_mixin, self)._create_router_db( - context, router, tenant_id) + router['router']['ha'] = is_ha + router_dict = super(L3_HA_NAT_db_mixin, + self).create_router(context, router) - if router['ha']: + if is_ha: try: + router_db = self._get_router(context, router_dict['id']) ha_network = self.get_ha_network(context, router_db.tenant_id) if not ha_network: @@ -356,9 +357,9 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin): self._notify_ha_interfaces_updated(context, router_db.id) except Exception: with excutils.save_and_reraise_exception(): - self.delete_router(context, router_db.id) - - return router_db + self.delete_router(context, router_dict['id']) + router_dict['ha_vr_id'] = router_db.extra_attributes.ha_vr_id + return router_dict def _update_router_db(self, context, router_id, data, gw_info): ha = data.pop('ha', None) diff --git a/neutron/db/loadbalancer/__init__.py b/neutron/db/loadbalancer/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/db/loadbalancer/__init__.py +++ b/neutron/db/loadbalancer/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/db/metering/__init__.py b/neutron/db/metering/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/db/metering/__init__.py +++ b/neutron/db/metering/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/db/metering/metering_db.py b/neutron/db/metering/metering_db.py index 0e414a5f6bc..99e448fc3d6 100644 --- a/neutron/db/metering/metering_db.py +++ b/neutron/db/metering/metering_db.py @@ -158,8 +158,8 @@ class MeteringDbMixin(metering.MeteringPluginBase, cidrs = [r['remote_ip_prefix'] for r in r_ips] new_cidr_ipset = netaddr.IPSet([remote_ip_prefix]) if (netaddr.IPSet(cidrs) & new_cidr_ipset): - raise metering.MeteringLabelRuleOverlaps(remote_ip_prefix= - remote_ip_prefix) + raise metering.MeteringLabelRuleOverlaps( + remote_ip_prefix=remote_ip_prefix) def create_metering_label_rule(self, context, metering_label_rule): m = metering_label_rule['metering_label_rule'] diff --git a/neutron/db/migration/alembic_migrations/env.py b/neutron/db/migration/alembic_migrations/env.py index 363667ff817..bd731b96f84 100644 --- a/neutron/db/migration/alembic_migrations/env.py +++ b/neutron/db/migration/alembic_migrations/env.py @@ -100,6 +100,7 @@ def run_migrations_online(): context.run_migrations() finally: connection.close() + engine.dispose() if context.is_offline_mode(): diff --git a/neutron/db/migration/alembic_migrations/versions/1f71e54a85e7_ml2_net_seg_model.py b/neutron/db/migration/alembic_migrations/versions/1f71e54a85e7_ml2_net_seg_model.py new file mode 100644 index 00000000000..f72fbf0efa7 --- /dev/null +++ b/neutron/db/migration/alembic_migrations/versions/1f71e54a85e7_ml2_net_seg_model.py @@ -0,0 +1,40 @@ +# Copyright 2014 OpenStack Foundation +# +# 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. +# + +"""ml2_network_segments models change for multi-segment network. + +Revision ID: 1f71e54a85e7 +Revises: 44621190bc02 +Create Date: 2014-10-15 18:30:51.395295 + +""" + +# revision identifiers, used by Alembic. +revision = '1f71e54a85e7' +down_revision = '44621190bc02' + + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column('ml2_network_segments', + sa.Column('segment_index', sa.Integer(), nullable=False, + server_default='0')) + + +def downgrade(): + op.drop_column('ml2_network_segments', 'segment_index') diff --git a/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py b/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py index 7deebe0edeb..0ba5f58be7d 100644 --- a/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py +++ b/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py @@ -27,6 +27,7 @@ down_revision = '37f322991f59' from alembic import op import sqlalchemy as sa +from sqlalchemy.engine import reflection TABLE_NAME = 'routerl3agentbindings' PK_NAME = 'pk_routerl3agentbindings' @@ -49,7 +50,7 @@ def upgrade(): # and all the duplicate records which violate the PK # constraint need to be removed. context = op.get_context() - if context.bind.dialect.name == 'postgresql': + if context.bind.dialect.name in ('postgresql', 'ibm_db_sa'): op.execute('DELETE FROM %(table)s WHERE id in (' 'SELECT %(table)s.id FROM %(table)s LEFT OUTER JOIN ' '(SELECT MIN(id) as id, router_id, l3_agent_id ' @@ -65,6 +66,19 @@ def upgrade(): op.drop_column(TABLE_NAME, 'id') + # DB2 doesn't support nullable column in primary key + if context.bind.dialect.name == 'ibm_db_sa': + op.alter_column( + table_name=TABLE_NAME, + column_name='router_id', + nullable=False + ) + op.alter_column( + table_name=TABLE_NAME, + column_name='l3_agent_id', + nullable=False + ) + op.create_primary_key( name=PK_NAME, table_name=TABLE_NAME, @@ -79,16 +93,32 @@ def downgrade(): # Drop the existed foreign key constraints # In order to perform primary key changes - op.drop_constraint( - name=fk_names[dialect]['l3_agent_id'], - table_name=TABLE_NAME, - type_='foreignkey' - ) - op.drop_constraint( - name=fk_names[dialect]['router_id'], - table_name=TABLE_NAME, - type_='foreignkey' - ) + db2fks = {} + if dialect == 'ibm_db_sa': + # NOTE(mriedem): In DB2 the foreign key names are randomly generated + # if you didn't originally explicitly name them, so the name is like + # SQLxxxxx where the suffix is a random integer. Therefore we go + # through and just drop all of the foreign keys and save them so we + # can re-create them later after the primary key is dropped. + inspector = reflection.Inspector.from_engine(op.get_bind().engine) + db2fks = inspector.get_foreign_keys(TABLE_NAME) + for fk in db2fks: + op.drop_constraint( + name=fk.get('name'), + table_name=TABLE_NAME, + type_='foreignkey' + ) + else: + op.drop_constraint( + name=fk_names[dialect]['l3_agent_id'], + table_name=TABLE_NAME, + type_='foreignkey' + ) + op.drop_constraint( + name=fk_names[dialect]['router_id'], + table_name=TABLE_NAME, + type_='foreignkey' + ) op.drop_constraint( name=PK_NAME, @@ -101,27 +131,46 @@ def downgrade(): sa.Column('id', sa.String(32)) ) - # Restore the foreign key constraints - op.create_foreign_key( - name=fk_names[dialect]['router_id'], - source=TABLE_NAME, - referent='routers', - local_cols=['router_id'], - remote_cols=['id'], - ondelete='CASCADE' - ) - - op.create_foreign_key( - name=fk_names[dialect]['l3_agent_id'], - source=TABLE_NAME, - referent='agents', - local_cols=['l3_agent_id'], - remote_cols=['id'], - ondelete='CASCADE' - ) + if dialect == 'ibm_db_sa': + # DB2 doesn't support nullable column in primary key + op.alter_column( + table_name=TABLE_NAME, + column_name='id', + nullable=False + ) op.create_primary_key( name=PK_NAME, table_name=TABLE_NAME, cols=['id'] ) + + # Restore the foreign key constraints + if dialect == 'ibm_db_sa': + for fk in db2fks: + op.create_foreign_key( + name=fk.get('name'), + source=TABLE_NAME, + referent=fk.get('referred_table'), + local_cols=fk.get('constrained_columns'), + remote_cols=fk.get('referred_columns'), + ondelete='CASCADE' + ) + else: + op.create_foreign_key( + name=fk_names[dialect]['router_id'], + source=TABLE_NAME, + referent='routers', + local_cols=['router_id'], + remote_cols=['id'], + ondelete='CASCADE' + ) + + op.create_foreign_key( + name=fk_names[dialect]['l3_agent_id'], + source=TABLE_NAME, + referent='agents', + local_cols=['l3_agent_id'], + remote_cols=['id'], + ondelete='CASCADE' + ) diff --git a/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py b/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py index 1dc8456aeb0..c4c8cf9db55 100644 --- a/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py +++ b/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py @@ -29,6 +29,7 @@ import sqlalchemy as sa def upgrade(): + context = op.get_context() op.create_table( 'router_extra_attributes', sa.Column('router_id', sa.String(length=36), nullable=False), @@ -38,8 +39,15 @@ def upgrade(): ['router_id'], ['routers.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('router_id') ) - op.execute("INSERT INTO router_extra_attributes SELECT id as router_id, " - "False as distributed from routers") + if context.bind.dialect.name == 'ibm_db_sa': + # NOTE(mriedem): DB2 stores booleans as 0 and 1. + op.execute("INSERT INTO router_extra_attributes " + "SELECT id as router_id, " + "0 as distributed from routers") + else: + op.execute("INSERT INTO router_extra_attributes " + "SELECT id as router_id, " + "False as distributed from routers") def downgrade(): diff --git a/neutron/db/migration/alembic_migrations/versions/44621190bc02_add_uniqueconstraint_ipavailability_ranges.py b/neutron/db/migration/alembic_migrations/versions/44621190bc02_add_uniqueconstraint_ipavailability_ranges.py new file mode 100644 index 00000000000..66b57c12ea2 --- /dev/null +++ b/neutron/db/migration/alembic_migrations/versions/44621190bc02_add_uniqueconstraint_ipavailability_ranges.py @@ -0,0 +1,61 @@ +# Copyright 2014 OpenStack Foundation +# +# 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. +# + +"""add_uniqueconstraint_ipavailability_ranges + +Revision ID: 44621190bc02 +Revises: juno +Create Date: 2014-09-23 15:14:15.051921 + +""" + +# revision identifiers, used by Alembic. +revision = '44621190bc02' +down_revision = 'juno' + +from alembic import op + + +TABLE_NAME = 'ipavailabilityranges' +UC_1_NAME = 'uniq_ipavailabilityranges0first_ip0allocation_pool_id' +UC_2_NAME = 'uniq_ipavailabilityranges0last_ip0allocation_pool_id' + + +def upgrade(): + op.create_unique_constraint( + name=UC_1_NAME, + source=TABLE_NAME, + local_cols=['first_ip', 'allocation_pool_id'] + ) + + op.create_unique_constraint( + name=UC_2_NAME, + source=TABLE_NAME, + local_cols=['last_ip', 'allocation_pool_id'] + ) + + +def downgrade(): + op.drop_constraint( + name=UC_1_NAME, + table_name=TABLE_NAME, + type_='unique' + ) + + op.drop_constraint( + name=UC_2_NAME, + table_name=TABLE_NAME, + type_='unique' + ) diff --git a/neutron/db/migration/alembic_migrations/versions/544673ac99ab_add_router_port_table.py b/neutron/db/migration/alembic_migrations/versions/544673ac99ab_add_router_port_table.py new file mode 100644 index 00000000000..cf3190bec22 --- /dev/null +++ b/neutron/db/migration/alembic_migrations/versions/544673ac99ab_add_router_port_table.py @@ -0,0 +1,65 @@ +# Copyright 2014 OpenStack Foundation +# +# 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. +# + +"""add router port relationship + +Revision ID: 544673ac99ab +Revises: 1680e1f0c4dc +Create Date: 2014-01-14 11:58:13.754747 + +""" + +# revision identifiers, used by Alembic. +revision = '544673ac99ab' +down_revision = '1680e1f0c4dc' + +from alembic import op +import sqlalchemy as sa + +SQL_STATEMENT = ( + "insert into routerports " + "select " + "p.device_id as router_id, p.id as port_id, p.device_owner as port_type " + "from ports p join routers r on (p.device_id=r.id) " + "where " + "(r.tenant_id=p.tenant_id AND p.device_owner='network:router_interface') " + "OR (p.tenant_id='' AND p.device_owner='network:router_gateway')" +) + + +def upgrade(): + op.create_table( + 'routerports', + sa.Column('router_id', sa.String(length=36), nullable=False), + sa.Column('port_id', sa.String(length=36), nullable=False), + sa.Column('port_type', sa.String(length=255)), + sa.PrimaryKeyConstraint('router_id', 'port_id'), + sa.ForeignKeyConstraint( + ['router_id'], + ['routers.id'], + ondelete='CASCADE' + ), + sa.ForeignKeyConstraint( + ['port_id'], + ['ports.id'], + ondelete='CASCADE' + ), + ) + + op.execute(SQL_STATEMENT) + + +def downgrade(): + op.drop_table('routerports') diff --git a/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py b/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py index 15e6e670d30..5b5846299e4 100644 --- a/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py +++ b/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py @@ -38,6 +38,13 @@ def _migrate_data(old_table, new_table): "FROM %(old_table)s old_t " "WHERE new_t.router_id = old_t.router_id") % {'new_table': new_table, 'old_table': old_table}) + elif engine.name == 'ibm_db_sa': + op.execute(("UPDATE %(new_table)s new_t " + "SET (distributed, service_router) = " + "(SELECT old_t.distributed, old_t.service_router " + "FROM %(old_table)s old_t " + "WHERE new_t.router_id = old_t.router_id)") % + {'new_table': new_table, 'old_table': old_table}) else: op.execute(("UPDATE %(new_table)s new_t " "INNER JOIN %(old_table)s as old_t " diff --git a/neutron/db/migration/alembic_migrations/versions/HEAD b/neutron/db/migration/alembic_migrations/versions/HEAD index aa8f506d6e6..daed716e185 100644 --- a/neutron/db/migration/alembic_migrations/versions/HEAD +++ b/neutron/db/migration/alembic_migrations/versions/HEAD @@ -1 +1 @@ -1680e1f0c4dc +1f71e54a85e7 diff --git a/neutron/db/migration/alembic_migrations/versions/juno_release.py b/neutron/db/migration/alembic_migrations/versions/juno_release.py new file mode 100644 index 00000000000..a8ce05df634 --- /dev/null +++ b/neutron/db/migration/alembic_migrations/versions/juno_release.py @@ -0,0 +1,36 @@ +# Copyright 2014 Yahoo! 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. +# + +"""juno + +Revision ID: juno +Revises: 544673ac99ab +Create Date: 2014-10-09 00:00:00.000000 + +""" + +# revision identifiers, used by Alembic. +revision = 'juno' +down_revision = '544673ac99ab' + + +def upgrade(): + """A no-op migration for marking the Juno release.""" + pass + + +def downgrade(): + """A no-op migration for marking the Juno release.""" + pass diff --git a/neutron/db/migration/cli.py b/neutron/db/migration/cli.py index ae47562cd26..ca83ecdf2ad 100644 --- a/neutron/db/migration/cli.py +++ b/neutron/db/migration/cli.py @@ -159,12 +159,16 @@ command_opt = cfg.SubCommandOpt('command', CONF.register_cli_opt(command_opt) -def main(): - config = alembic_config.Config( - os.path.join(os.path.dirname(__file__), 'alembic.ini') - ) +def get_alembic_config(): + config = alembic_config.Config(os.path.join(os.path.dirname(__file__), + 'alembic.ini')) config.set_main_option('script_location', 'neutron.db.migration:alembic_migrations') + return config + + +def main(): + config = get_alembic_config() # attach the Neutron conf to the Alembic conf config.neutron_config = CONF diff --git a/neutron/db/migration/migrate_to_ml2.py b/neutron/db/migration/migrate_to_ml2.py index 9c854582f14..fc5fa421674 100755 --- a/neutron/db/migration/migrate_to_ml2.py +++ b/neutron/db/migration/migrate_to_ml2.py @@ -75,9 +75,10 @@ OPENVSWITCH = 'openvswitch' # Releases ICEHOUSE = 'icehouse' +JUNO = 'juno' -SUPPORTED_SCHEMA_VERSIONS = [ICEHOUSE] +SUPPORTED_SCHEMA_VERSIONS = [ICEHOUSE, JUNO] def check_db_schema_version(engine, metadata): @@ -115,7 +116,7 @@ def interpret_vlan_id(vlan_id): return (p_const.TYPE_VLAN, vlan_id) -class BaseMigrateToMl2_Icehouse(object): +class BaseMigrateToMl2(object): def __init__(self, vif_type, driver_type, segment_table_name, vlan_allocation_table_name, old_tables): @@ -131,7 +132,8 @@ class BaseMigrateToMl2_Icehouse(object): metadata = sa.MetaData() check_db_schema_version(engine, metadata) - self.define_ml2_tables(metadata) + if hasattr(self, 'define_ml2_tables'): + self.define_ml2_tables(metadata) # Autoload the ports table to ensure that foreign keys to it and # the network table can be created for the new tables. @@ -144,7 +146,8 @@ class BaseMigrateToMl2_Icehouse(object): self.migrate_vlan_allocations(engine) self.migrate_port_bindings(engine, metadata) - self.drop_old_tables(engine, save_tables) + if hasattr(self, 'drop_old_tables'): + self.drop_old_tables(engine, save_tables) def migrate_segment_dict(self, binding): binding['id'] = uuidutils.generate_uuid() @@ -210,6 +213,13 @@ class BaseMigrateToMl2_Icehouse(object): ml2_port_bindings = metadata.tables['ml2_port_bindings'] engine.execute(ml2_port_bindings.insert(), ml2_bindings) + +class BaseMigrateToMl2_IcehouseMixin(object): + """A mixin to ensure ml2 database schema state for Icehouse. + + This classes the missing tables for Icehouse schema revisions. In Juno, + the schema state has been healed, so we do not need to run these. + """ def drop_old_tables(self, engine, save_tables=False): if save_tables: return @@ -351,10 +361,10 @@ class BaseMigrateToMl2_Icehouse(object): ) -class MigrateLinuxBridgeToMl2_Icehouse(BaseMigrateToMl2_Icehouse): +class MigrateLinuxBridgeToMl2_Juno(BaseMigrateToMl2): def __init__(self): - super(MigrateLinuxBridgeToMl2_Icehouse, self).__init__( + super(MigrateLinuxBridgeToMl2_Juno, self).__init__( vif_type=portbindings.VIF_TYPE_BRIDGE, driver_type=LINUXBRIDGE, segment_table_name='network_bindings', @@ -362,7 +372,7 @@ class MigrateLinuxBridgeToMl2_Icehouse(BaseMigrateToMl2_Icehouse): old_tables=['portbindingports']) def migrate_segment_dict(self, binding): - super(MigrateLinuxBridgeToMl2_Icehouse, self).migrate_segment_dict( + super(MigrateLinuxBridgeToMl2_Juno, self).migrate_segment_dict( binding) vlan_id = binding.pop('vlan_id') network_type, segmentation_id = interpret_vlan_id(vlan_id) @@ -370,10 +380,10 @@ class MigrateLinuxBridgeToMl2_Icehouse(BaseMigrateToMl2_Icehouse): binding['segmentation_id'] = segmentation_id -class MigrateOpenvswitchToMl2_Icehouse(BaseMigrateToMl2_Icehouse): +class MigrateOpenvswitchToMl2_Juno(BaseMigrateToMl2): def __init__(self): - super(MigrateOpenvswitchToMl2_Icehouse, self).__init__( + super(MigrateOpenvswitchToMl2_Juno, self).__init__( vif_type=portbindings.VIF_TYPE_OVS, driver_type=OPENVSWITCH, segment_table_name='ovs_network_bindings', @@ -415,11 +425,25 @@ class MigrateOpenvswitchToMl2_Icehouse(BaseMigrateToMl2_Icehouse): raise ValueError(_('Unknown tunnel type: %s') % tunnel_type) +class MigrateLinuxBridgeToMl2_Icehouse(MigrateLinuxBridgeToMl2_Juno, + BaseMigrateToMl2_IcehouseMixin): + pass + + +class MigrateOpenvswitchToMl2_Icehouse(MigrateOpenvswitchToMl2_Juno, + BaseMigrateToMl2_IcehouseMixin): + pass + + migrate_map = { ICEHOUSE: { OPENVSWITCH: MigrateOpenvswitchToMl2_Icehouse, LINUXBRIDGE: MigrateLinuxBridgeToMl2_Icehouse, }, + JUNO: { + OPENVSWITCH: MigrateOpenvswitchToMl2_Juno, + LINUXBRIDGE: MigrateLinuxBridgeToMl2_Juno, + }, } @@ -436,7 +460,7 @@ def main(): OPENVSWITCH) parser.add_argument('--vxlan-udp-port', default=None, type=int, help=_('The UDP port to use for VXLAN tunnels.')) - parser.add_argument('--release', default=ICEHOUSE, choices=[ICEHOUSE]) + parser.add_argument('--release', default=JUNO, choices=[ICEHOUSE, JUNO]) parser.add_argument('--save-tables', default=False, action='store_true', help=_("Retain the old plugin's tables")) #TODO(marun) Provide a verbose option diff --git a/neutron/db/models_v2.py b/neutron/db/models_v2.py index 53efc66926d..8def401e7dd 100644 --- a/neutron/db/models_v2.py +++ b/neutron/db/models_v2.py @@ -63,6 +63,13 @@ class IPAvailabilityRange(model_base.BASEV2): primary_key=True) first_ip = sa.Column(sa.String(64), nullable=False, primary_key=True) last_ip = sa.Column(sa.String(64), nullable=False, primary_key=True) + __table_args__ = ( + sa.UniqueConstraint( + first_ip, allocation_pool_id, + name='uniq_ipavailabilityranges0first_ip0allocation_pool_id'), + sa.UniqueConstraint( + last_ip, allocation_pool_id, + name='uniq_ipavailabilityranges0last_ip0allocation_pool_id')) def __repr__(self): return "%s - %s" % (self.first_ip, self.last_ip) @@ -177,10 +184,12 @@ class Subnet(model_base.BASEV2, HasId, HasTenant): enable_dhcp = sa.Column(sa.Boolean()) dns_nameservers = orm.relationship(DNSNameServer, backref='subnet', - cascade='all, delete, delete-orphan') + cascade='all, delete, delete-orphan', + lazy='joined') routes = orm.relationship(SubnetRoute, backref='subnet', - cascade='all, delete, delete-orphan') + cascade='all, delete, delete-orphan', + lazy='joined') shared = sa.Column(sa.Boolean) ipv6_ra_mode = sa.Column(sa.Enum(constants.IPV6_SLAAC, constants.DHCPV6_STATEFUL, diff --git a/neutron/db/securitygroups_db.py b/neutron/db/securitygroups_db.py index e10d29e6f32..23b5c80cb11 100644 --- a/neutron/db/securitygroups_db.py +++ b/neutron/db/securitygroups_db.py @@ -147,7 +147,12 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase): # because all the unit tests do not explicitly set the context on # GETS. TODO(arosen) context handling can probably be improved here. if not default_sg and context.tenant_id: - self._ensure_default_security_group(context, context.tenant_id) + tenant_id = filters.get('tenant_id') + if tenant_id: + tenant_id = tenant_id[0] + else: + tenant_id = context.tenant_id + self._ensure_default_security_group(context, tenant_id) marker_obj = self._get_marker_obj(context, 'security_group', limit, marker) return self._get_collection(context, @@ -518,9 +523,13 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase): return port_sg = p.get(ext_sg.SECURITYGROUPS, []) + filters = {'id': port_sg} + tenant_id = p.get('tenant_id') + if tenant_id: + filters['tenant_id'] = [tenant_id] valid_groups = set(g['id'] for g in self.get_security_groups(context, fields=['id'], - filters={'id': port_sg})) + filters=filters)) requested_groups = set(port_sg) port_sg_missing = requested_groups - valid_groups diff --git a/neutron/db/securitygroups_rpc_base.py b/neutron/db/securitygroups_rpc_base.py index 8f87a8c804f..bcbe32c5561 100644 --- a/neutron/db/securitygroups_rpc_base.py +++ b/neutron/db/securitygroups_rpc_base.py @@ -19,6 +19,7 @@ from sqlalchemy.orm import exc from neutron.common import constants as q_const from neutron.common import ipv6_utils as ipv6 from neutron.common import utils +from neutron.db import allowedaddresspairs_db as addr_pair from neutron.db import models_v2 from neutron.db import securitygroups_db as sg_db from neutron.extensions import securitygroup as ext_sg @@ -153,8 +154,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): 'sg_member_ips': {}} rules_in_db = self._select_rules_for_ports(context, ports) remote_security_group_info = {} - for (binding, rule_in_db) in rules_in_db: - port_id = binding['port_id'] + for (port_id, rule_in_db) in rules_in_db: remote_gid = rule_in_db.get('remote_group_id') security_group_id = rule_in_db.get('security_group_id') ethertype = rule_in_db['ethertype'] @@ -206,7 +206,8 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): for sg_id, member_ips in ips.items(): for ip in member_ips: ethertype = 'IPv%d' % netaddr.IPAddress(ip).version - if ip not in sg_info['sg_member_ips'][sg_id][ethertype]: + if (ethertype in sg_info['sg_member_ips'][sg_id] + and ip not in sg_info['sg_member_ips'][sg_id][ethertype]): sg_info['sg_member_ips'][sg_id][ethertype].append(ip) return sg_info @@ -218,7 +219,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): sgr_sgid = sg_db.SecurityGroupRule.security_group_id - query = context.session.query(sg_db.SecurityGroupPortBinding, + query = context.session.query(sg_binding_port, sg_db.SecurityGroupRule) query = query.join(sg_db.SecurityGroupRule, sgr_sgid == sg_binding_sgid) @@ -230,27 +231,32 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): if not remote_group_ids: return ips_by_group for remote_group_id in remote_group_ids: - ips_by_group[remote_group_id] = [] + ips_by_group[remote_group_id] = set() ip_port = models_v2.IPAllocation.port_id sg_binding_port = sg_db.SecurityGroupPortBinding.port_id sg_binding_sgid = sg_db.SecurityGroupPortBinding.security_group_id + # Join the security group binding table directly to the IP allocation + # table instead of via the Port table skip an unnecessary intermediary query = context.session.query(sg_binding_sgid, - models_v2.Port, - models_v2.IPAllocation.ip_address) + models_v2.IPAllocation.ip_address, + addr_pair.AllowedAddressPair.ip_address) query = query.join(models_v2.IPAllocation, ip_port == sg_binding_port) - query = query.join(models_v2.Port, - ip_port == models_v2.Port.id) + # Outerjoin because address pairs may be null and we still want the + # IP for the port. + query = query.outerjoin( + addr_pair.AllowedAddressPair, + sg_binding_port == addr_pair.AllowedAddressPair.port_id) query = query.filter(sg_binding_sgid.in_(remote_group_ids)) - for security_group_id, port, ip_address in query: - ips_by_group[security_group_id].append(ip_address) - # if there are allowed_address_pairs add them - if getattr(port, 'allowed_address_pairs', None): - for address_pair in port.allowed_address_pairs: - ips_by_group[security_group_id].append( - address_pair['ip_address']) + # Each allowed address pair IP record for a port beyond the 1st + # will have a duplicate regular IP in the query response since + # the relationship is 1-to-many. Dedup with a set + for security_group_id, ip_address, allowed_addr_ip in query: + ips_by_group[security_group_id].add(ip_address) + if allowed_addr_ip: + ips_by_group[security_group_id].add(allowed_addr_ip) return ips_by_group def _select_remote_group_ids(self, ports): @@ -268,7 +274,8 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): def _select_dhcp_ips_for_network_ids(self, context, network_ids): if not network_ids: return {} - query = context.session.query(models_v2.Port, + query = context.session.query(models_v2.Port.mac_address, + models_v2.Port.network_id, models_v2.IPAllocation.ip_address) query = query.join(models_v2.IPAllocation) query = query.filter(models_v2.Port.network_id.in_(network_ids)) @@ -279,14 +286,13 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): for network_id in network_ids: ips[network_id] = [] - for port, ip in query: + for mac_address, network_id, ip in query: if (netaddr.IPAddress(ip).version == 6 and not netaddr.IPAddress(ip).is_link_local()): - mac_address = port['mac_address'] ip = str(ipv6.get_ipv6_addr_by_EUI64(q_const.IPV6_LLA_PREFIX, mac_address)) - if ip not in ips[port['network_id']]: - ips[port['network_id']].append(ip) + if ip not in ips[network_id]: + ips[network_id].append(ip) return ips @@ -329,7 +335,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): return ips def _get_lla_gateway_ip_for_subnet(self, context, subnet): - query = context.session.query(models_v2.Port) + query = context.session.query(models_v2.Port.mac_address) query = query.join(models_v2.IPAllocation) query = query.filter( models_v2.IPAllocation.subnet_id == subnet['id']) @@ -338,12 +344,11 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): query = query.filter(models_v2.Port.device_owner == q_const.DEVICE_OWNER_ROUTER_INTF) try: - gateway_port = query.one() + mac_address = query.one()[0] except (exc.NoResultFound, exc.MultipleResultsFound): LOG.warn(_('No valid gateway port on subnet %s is ' 'found for IPv6 RA'), subnet['id']) return - mac_address = gateway_port['mac_address'] lla_ip = str(ipv6.get_ipv6_addr_by_EUI64( q_const.IPV6_LLA_PREFIX, mac_address)) @@ -416,8 +421,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin): def security_group_rules_for_ports(self, context, ports): rules_in_db = self._select_rules_for_ports(context, ports) - for (binding, rule_in_db) in rules_in_db: - port_id = binding['port_id'] + for (port_id, rule_in_db) in rules_in_db: port = ports[port_id] direction = rule_in_db['direction'] rule_dict = { diff --git a/neutron/db/vpn/__init__.py b/neutron/db/vpn/__init__.py index a15801e6a47..e69de29bb2d 100644 --- a/neutron/db/vpn/__init__.py +++ b/neutron/db/vpn/__init__.py @@ -1,14 +0,0 @@ -# (c) Copyright 2013 Hewlett-Packard Development Company, L.P. -# 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. diff --git a/neutron/db/vpn/vpn_db.py b/neutron/db/vpn/vpn_db.py index 6ff9b7c9650..67832002492 100644 --- a/neutron/db/vpn/vpn_db.py +++ b/neutron/db/vpn/vpn_db.py @@ -28,6 +28,7 @@ from neutron.db.vpn import vpn_validator from neutron.extensions import vpnaas from neutron import manager from neutron.openstack.common import excutils +from neutron.openstack.common.gettextutils import _LW from neutron.openstack.common import log as logging from neutron.openstack.common import uuidutils from neutron.plugins.common import constants @@ -601,6 +602,16 @@ class VPNPluginDb(vpnaas.VPNPluginBase, base_db.CommonDbMixin): router_id=router_id, vpnservice_id=vpnservices[0]['id']) + def check_subnet_in_use(self, context, subnet_id): + with context.session.begin(subtransactions=True): + vpnservices = context.session.query(VPNService).filter_by( + subnet_id=subnet_id + ).first() + if vpnservices: + raise vpnaas.SubnetInUseByVPNService( + subnet_id=subnet_id, + vpnservice_id=vpnservices['id']) + class VPNPluginRpcDbMixin(): def _get_agent_hosting_vpn_services(self, context, host): @@ -646,7 +657,7 @@ class VPNPluginRpcDbMixin(): vpnservice_db = self._get_vpnservice( context, vpnservice['id']) except vpnaas.VPNServiceNotFound: - LOG.warn(_('vpnservice %s in db is already deleted'), + LOG.warn(_LW('vpnservice %s in db is already deleted'), vpnservice['id']) continue diff --git a/neutron/debug/__init__.py b/neutron/debug/__init__.py index 404a825357f..e69de29bb2d 100644 --- a/neutron/debug/__init__.py +++ b/neutron/debug/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012, Nachi Ueno, NTT MCL, 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. diff --git a/neutron/extensions/firewall.py b/neutron/extensions/firewall.py index 89f8b0f0bf5..d7cbb1f0a41 100644 --- a/neutron/extensions/firewall.py +++ b/neutron/extensions/firewall.py @@ -127,6 +127,19 @@ class FirewallInternalDriverError(qexception.NeutronException): message = _("%(driver)s: Internal driver error.") +class FirewallRuleConflict(qexception.Conflict): + + """Firewall rule conflict exception. + + Occurs when admin policy tries to use another tenant's unshared + rule. + """ + + message = _("Operation cannot be performed since Firewall Rule " + "%(firewall_rule_id)s is not shared and belongs to " + "another tenant %(tenant_id)s") + + fw_valid_protocol_values = [None, constants.TCP, constants.UDP, constants.ICMP] fw_valid_action_values = [constants.FWAAS_ALLOW, constants.FWAAS_DENY] @@ -139,15 +152,15 @@ def convert_protocol(value): if 0 <= val <= 255: return val else: - raise FirewallRuleInvalidProtocol(protocol=value, - values= - fw_valid_protocol_values) + raise FirewallRuleInvalidProtocol( + protocol=value, + values=fw_valid_protocol_values) elif value.lower() in fw_valid_protocol_values: return value.lower() else: - raise FirewallRuleInvalidProtocol(protocol=value, - values= - fw_valid_protocol_values) + raise FirewallRuleInvalidProtocol( + protocol=value, + values=fw_valid_protocol_values) def convert_action_to_case_insensitive(value): diff --git a/neutron/extensions/l3.py b/neutron/extensions/l3.py index b02c9337b6d..1497d9fb45c 100644 --- a/neutron/extensions/l3.py +++ b/neutron/extensions/l3.py @@ -100,7 +100,20 @@ RESOURCE_ATTRIBUTE_MAP = { 'is_visible': True}, EXTERNAL_GW_INFO: {'allow_post': True, 'allow_put': True, 'is_visible': True, 'default': None, - 'enforce_policy': True} + 'enforce_policy': True, + 'validate': { + 'type:dict_or_nodata': { + 'network_id': {'type:uuid': None, + 'required': True}, + 'external_fixed_ips': { + 'convert_list_to': + attr.convert_kvp_list_to_dict, + 'type:fixed_ips': None, + 'default': None, + 'required': False, + } + } + }} }, 'floatingips': { 'id': {'allow_post': False, 'allow_put': False, @@ -174,6 +187,7 @@ class L3(extensions.ExtensionDescriptor): """Returns Ext Resources.""" plural_mappings = resource_helper.build_plural_mappings( {}, RESOURCE_ATTRIBUTE_MAP) + plural_mappings['external_fixed_ips'] = 'external_fixed_ip' attr.PLURALS.update(plural_mappings) action_map = {'router': {'add_router_interface': 'PUT', 'remove_router_interface': 'PUT'}} diff --git a/neutron/extensions/l3_ext_gw_mode.py b/neutron/extensions/l3_ext_gw_mode.py index 31c943a9c88..ae0ab1d54b9 100644 --- a/neutron/extensions/l3_ext_gw_mode.py +++ b/neutron/extensions/l3_ext_gw_mode.py @@ -29,7 +29,13 @@ EXTENDED_ATTRIBUTES_2_0 = { {'type:dict_or_nodata': {'network_id': {'type:uuid': None, 'required': True}, 'enable_snat': {'type:boolean': None, 'required': False, - 'convert_to': attrs.convert_to_boolean}} + 'convert_to': attrs.convert_to_boolean}, + 'external_fixed_ips': { + 'convert_list_to': attrs.convert_kvp_list_to_dict, + 'validate': {'type:fixed_ips': None}, + 'default': None, + 'required': False} + } }}}} diff --git a/neutron/extensions/l3_ext_ha_mode.py b/neutron/extensions/l3_ext_ha_mode.py index f8487bb5b9a..115a8db8140 100644 --- a/neutron/extensions/l3_ext_ha_mode.py +++ b/neutron/extensions/l3_ext_ha_mode.py @@ -21,7 +21,7 @@ from neutron.common import exceptions HA_INFO = 'ha' EXTENDED_ATTRIBUTES_2_0 = { 'routers': { - HA_INFO: {'allow_post': True, 'allow_put': True, + HA_INFO: {'allow_post': True, 'allow_put': False, 'default': attributes.ATTR_NOT_SPECIFIED, 'is_visible': True, 'enforce_policy': True, 'convert_to': attributes.convert_to_boolean_if_not_none} diff --git a/neutron/extensions/quotasv2.py b/neutron/extensions/quotasv2.py index 4fa9bf28056..19fa85dbff2 100644 --- a/neutron/extensions/quotasv2.py +++ b/neutron/extensions/quotasv2.py @@ -13,8 +13,6 @@ # License for the specific language governing permissions and limitations # under the License. -import sys - from oslo.config import cfg import webob @@ -22,6 +20,7 @@ from neutron.api import extensions from neutron.api.v2 import attributes from neutron.api.v2 import base from neutron.api.v2 import resource +from neutron.common import constants as const from neutron.common import exceptions as n_exc from neutron import manager from neutron.openstack.common import importutils @@ -55,7 +54,7 @@ class QuotaSetsController(wsgi.Controller): 'allow_post': False, 'allow_put': True, 'convert_to': attributes.convert_to_int, - 'validate': {'type:range': [-1, sys.maxsize]}, + 'validate': {'type:range': [-1, const.DB_INTEGER_MAX_VALUE]}, 'is_visible': True} self._update_extended_attributes = False diff --git a/neutron/extensions/vpnaas.py b/neutron/extensions/vpnaas.py index a1bf41876bc..fc32d2ace1f 100644 --- a/neutron/extensions/vpnaas.py +++ b/neutron/extensions/vpnaas.py @@ -64,6 +64,10 @@ class RouterInUseByVPNService(qexception.InUse): message = _("Router %(router_id)s is used by VPNService %(vpnservice_id)s") +class SubnetInUseByVPNService(qexception.InUse): + message = _("Subnet %(subnet_id)s is used by VPNService %(vpnservice_id)s") + + class VPNStateInvalidToUpdate(qexception.BadRequest): message = _("Invalid state %(state)s of vpnaas resource %(id)s" " for updating") diff --git a/neutron/hacking/checks.py b/neutron/hacking/checks.py index a170a0d4be8..ebb99f0d00f 100644 --- a/neutron/hacking/checks.py +++ b/neutron/hacking/checks.py @@ -79,7 +79,19 @@ def no_author_tags(physical_line): return pos, "N322: Don't use author tags" +def check_assert_called_once(logical_line, filename): + msg = ("N323: assert_called_once is a no-op. please use " + "assert_called_once_with to test with explicit parameters or an " + "assertEqual with call_count.") + + if 'neutron/tests/' in filename: + pos = logical_line.find('.assert_called_once(') + if pos != -1: + yield (pos, msg) + + def factory(register): register(validate_log_translations) register(use_jsonutils) register(no_author_tags) + register(check_assert_called_once) diff --git a/neutron/locale/de/LC_MESSAGES/neutron-log-error.po b/neutron/locale/de/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 46193aaf338..00000000000 --- a/neutron/locale/de/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,263 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 20:07+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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "Ursprüngliche Ausnahme wird gelöscht: %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "Unerwartete Ausnahme %d mal(e) aufgetreten... Neuversuch." - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "Fehler bei %(full_task_name)s: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "" - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "Nicht behandelte Ausnahme" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %s" -msgstr "" diff --git a/neutron/locale/de/LC_MESSAGES/neutron-log-info.po b/neutron/locale/de/LC_MESSAGES/neutron-log-info.po index b71ec7e2003..10219668b79 100644 --- a/neutron/locale/de/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/de/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-08-17 05:19+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: German (http://www.transifex.com/projects/p/neutron/language/" "de/)\n" @@ -20,17 +20,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "Sicherheitsgruppenerweiterung wurde inaktiviert." + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "Vorbereiten von Filtern für Geräte %s" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "Sicherheitsgruppenregel aktualisiert %r" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "Sicherheitsgruppenmitglied aktualisiert %r" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "Provider-Regel aktualisiert" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "Gerätefilter für %r entfernen" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "Firewallregeln aktualisieren" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -55,6 +107,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, 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/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "Sperrpfad erzeugt: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "Löschen der Datei %(file)s fehlgeschlagen" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -66,73 +133,78 @@ msgstr "" 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:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "%s abgefangen. Vorgang wird beendet" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "" "Übergeordneter Prozess wurde unerwartet abgebrochen. Vorgang wird beendet" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "Untergeordnetes Element %s abgefangen; Vorgang wird beendet" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Verzweigung zu schnell; im Ruhemodus" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "Untergeordnetes Element %d gestartet" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "Starten von %d Workers" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, 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:360 +#: neutron/openstack/common/service.py:352 #, 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:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "%s abgefangen, untergeordnete Elemente werden gestoppt" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "Warten aufgerufen nach dem der Thread abgebrochen wurde. Bereinige." -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "Warten auf Beenden von %d untergeordneten Elementen" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -142,68 +214,57 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "Agent nicht synchron mit Plug-in!" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " -msgstr "" +msgstr "Agent erfolgreich initialisiert, läuft jetzt... " #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, 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/ofagent/agent/ofa_neutron_agent.py:502 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" +msgstr "Zurückfordern von vlan = %(vlan_id)s von net-id = %(net_uuid)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "'port_unbound()' 'net_uuid' %s nicht in 'local_vlan_map'" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, 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/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -215,7 +276,7 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "Port %(device)s aktualisiert. Details: %(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format @@ -225,17 +286,53 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "Zusatzeinheit %s entfernt" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "Agententunnel nicht synchron mit Plug-in!" + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/de/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/de/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index 7cc4dd7afd3..00000000000 --- a/neutron/locale/de/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "PID %d nicht in Liste untergeordneter Elemente" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-error.po b/neutron/locale/en_AU/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 0319ce9f99f..00000000000 --- a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,263 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 20:07+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: English (Australia) (http://www.transifex.com/projects/p/" -"neutron/language/en_AU/)\n" -"Language: en_AU\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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "Original exception being dropped: %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "Unexpected exception occurred %d time(s)... retrying." - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "Error during %(full_task_name)s: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "Exception during rpc cleanup." - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "Unhandled exception" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %s" -msgstr "" diff --git a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-info.po b/neutron/locale/en_AU/LC_MESSAGES/neutron-log-info.po index f7dcf959c86..fd77cc90b5a 100644 --- a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/en_AU/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-07-18 20:49+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: English (Australia) (http://www.transifex.com/projects/p/" "neutron/language/en_AU/)\n" @@ -19,17 +19,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -54,6 +106,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "Eventlet backdoor listening on %(port)s for process %(pid)d" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "Created lock path: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -64,72 +131,77 @@ msgstr "Skipping periodic task %(task)s because its interval is negative" msgid "Skipping periodic task %(task)s because it is disabled" msgstr "Skipping periodic task %(task)s because it is disabled" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "Caught %s, exiting" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "Parent process has died unexpectedly, exiting" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Forking too fast, sleeping" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "Started child %d" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "Starting %d workers" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Child %(pid)d killed by signal %(sig)d" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Child %(pid)s exited with status %(code)d" -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "Caught %s, stopping children" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "" -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "Waiting on %d children to exit" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -139,41 +211,28 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" @@ -228,11 +287,47 @@ msgstr "" msgid "Agent tunnel out of sync with plugin!" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/en_AU/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index afc6e6ceed4..00000000000 --- a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: English (Australia) (http://www.transifex.com/projects/p/" -"neutron/language/en_AU/)\n" -"Language: en_AU\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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d not in child list" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-critical.po b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-critical.po deleted file mode 100644 index f738cbcf0dc..00000000000 --- a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-critical.po +++ /dev/null @@ -1,20 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-08-01 06:06+0000\n" -"PO-Revision-Date: 2014-05-30 06:24+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/" -"neutron/language/en_GB/)\n" -"Language: en_GB\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" diff --git a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-error.po b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 06b44c7a973..00000000000 --- a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,268 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Andi Chandler , 2014 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-08-12 21:24+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/" -"neutron/language/en_GB/)\n" -"Language: en_GB\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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "Policy check error while calling %s!" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "Original exception being dropped: %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "Unexpected exception occurred %d time(s)... retrying." - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "Error during %(full_task_name)s: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "Exception during rpc cleanup." - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "Unhandled exception" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %s" -msgstr "" diff --git a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-info.po b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-info.po index 00baf831e3f..c9843171015 100644 --- a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/en_GB/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-08-17 05:19+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/" "neutron/language/en_GB/)\n" @@ -20,18 +20,70 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -56,6 +108,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "Eventlet backdoor listening on %(port)s for process %(pid)d" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "Created lock path: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "Failed to remove file %(file)s" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -66,72 +133,77 @@ msgstr "Skipping periodic task %(task)s because its interval is negative" msgid "Skipping periodic task %(task)s because it is disabled" msgstr "Skipping periodic task %(task)s because it is disabled" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "Caught %s, exiting" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "Parent process has died unexpectedly, exiting" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "Child caught %s, exiting" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Forking too fast, sleeping" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "Started child %d" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "Starting %d workers" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Child %(pid)d killed by signal %(sig)d" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Child %(pid)s exited with status %(code)d" -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "Caught %s, stopping children" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "Wait called after thread killed. Cleaning up." -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "Waiting on %d children to exit" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -141,41 +213,28 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" @@ -230,11 +289,47 @@ msgstr "" msgid "Agent tunnel out of sync with plugin!" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index 22ab5a5db3e..00000000000 --- a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,159 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Andi Chandler , 2014 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-07-25 23:10+0000\n" -"Last-Translator: Andi Chandler \n" -"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/" -"neutron/language/en_GB/)\n" -"Language: en_GB\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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "Unable to find data type descriptor for attribute %s" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d not in child list" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/en_US/LC_MESSAGES/neutron.po b/neutron/locale/en_US/LC_MESSAGES/neutron.po deleted file mode 100644 index de8e8303af5..00000000000 --- a/neutron/locale/en_US/LC_MESSAGES/neutron.po +++ /dev/null @@ -1,16682 +0,0 @@ -# English (United States) translations for neutron. -# Copyright (C) 2013 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: 2014-09-15 06:10+0000\n" -"PO-Revision-Date: 2013-01-28 21:54+0000\n" -"Last-Translator: FULL NAME \n" -"Language-Team: English (United States) " -"(http://www.transifex.com/projects/p/openstack/language/en_US/)\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\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" - -#: neutron/auth.py:35 -msgid "X_USER_ID is not found in request" -msgstr "" - -#: neutron/context.py:82 -#, python-format -msgid "Arguments dropped when creating context: %s" -msgstr "" - -#: neutron/context.py:110 -#, python-format -msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r" -msgstr "" - -#: neutron/manager.py:71 -#, python-format -msgid "dhcp_agents_per_network must be >= 1. '%s' is invalid." -msgstr "" - -#: neutron/manager.py:83 -msgid "Neutron core_plugin not configured!" -msgstr "" - -#: neutron/manager.py:112 -#, python-format -msgid "Loading core plugin: %s" -msgstr "" - -#: neutron/manager.py:137 -#, python-format -msgid "Error loading plugin by name, %s" -msgstr "" - -#: neutron/manager.py:138 -#, python-format -msgid "Error loading plugin by class, %s" -msgstr "" - -#: neutron/manager.py:139 -msgid "Plugin not found." -msgstr "" - -#: neutron/manager.py:144 -msgid "Loading services supported by the core plugin" -msgstr "" - -#: neutron/manager.py:152 -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "" - -#: neutron/manager.py:165 -#, python-format -msgid "Loading service plugins: %s" -msgstr "" - -#: neutron/manager.py:170 -#, python-format -msgid "Loading Plugin: %s" -msgstr "" - -#: neutron/manager.py:178 -#, python-format -msgid "Multiple plugins for service %s were configured" -msgstr "" - -#: neutron/manager.py:190 -#, python-format -msgid "Successfully loaded %(type)s plugin. Description: %(desc)s" -msgstr "" - -#: neutron/policy.py:87 -#, python-format -msgid "Loading policies from file: %s" -msgstr "" - -#: neutron/policy.py:142 -#, python-format -msgid "" -"Attribute type descriptor is not a dict. Unable to generate any sub-attr " -"policy rule for %s." -msgstr "" - -#: neutron/policy.py:215 -#, python-format -msgid "" -"Unable to identify a target field from:%s.match should be in the form " -"%%()s" -msgstr "" - -#: neutron/policy.py:241 -#, python-format -msgid "Unable to find ':' as separator in %s." -msgstr "" - -#: neutron/policy.py:245 -#, python-format -msgid "Unable to find resource name in %s" -msgstr "" - -#: neutron/policy.py:254 -#, python-format -msgid "" -"Unable to verify match:%(match)s as the parent resource: %(res)s was not " -"found" -msgstr "" - -#: neutron/policy.py:312 -#, python-format -msgid "Unable to find requested field: %(field)s in target: %(target_dict)s" -msgstr "" - -#: neutron/policy.py:370 -#, python-format -msgid "Failed policy check for '%s'" -msgstr "" - -#: neutron/quota.py:34 -msgid "Resource name(s) that are supported in quota features" -msgstr "" - -#: neutron/quota.py:38 -msgid "" -"Default number of resource allowed per tenant. A negative value means " -"unlimited." -msgstr "" - -#: neutron/quota.py:42 -msgid "Number of networks allowed per tenant.A negative value means unlimited." -msgstr "" - -#: neutron/quota.py:46 -msgid "Number of subnets allowed per tenant, A negative value means unlimited." -msgstr "" - -#: neutron/quota.py:50 -msgid "Number of ports allowed per tenant. A negative value means unlimited." -msgstr "" - -#: neutron/quota.py:54 -msgid "Default driver to use for quota checks" -msgstr "" - -#: neutron/quota.py:148 neutron/quota.py:153 -msgid "Access to this resource was denied." -msgstr "" - -#: neutron/quota.py:226 -msgid "" -"ConfDriver is used as quota_driver because the loaded plugin does not " -"support 'quotas' table." -msgstr "" - -#: neutron/quota.py:231 -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "" - -#: neutron/quota.py:240 -#, python-format -msgid "%s is already registered." -msgstr "" - -#: neutron/service.py:40 -msgid "Seconds between running periodic tasks" -msgstr "" - -#: neutron/service.py:43 -msgid "Number of separate worker processes for service" -msgstr "" - -#: neutron/service.py:46 -msgid "Number of RPC worker processes for service" -msgstr "" - -#: neutron/service.py:49 -msgid "" -"Range of seconds to randomly delay when starting the periodic task " -"scheduler to reduce stampeding. (Disable by setting to 0)" -msgstr "" - -#: neutron/service.py:105 neutron/service.py:163 -msgid "Unrecoverable error: please check log for details." -msgstr "" - -#: neutron/service.py:144 -msgid "Active plugin doesn't implement start_rpc_listeners" -msgstr "" - -#: neutron/service.py:146 -#, python-format -msgid "'rpc_workers = %d' ignored because start_rpc_listeners is not implemented." -msgstr "" - -#: neutron/service.py:170 -msgid "No known API applications configured." -msgstr "" - -#: neutron/service.py:177 -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "" - -#: neutron/service.py:278 -msgid "Exception occurs when timer stops" -msgstr "" - -#: neutron/service.py:288 -msgid "Exception occurs when waiting for timer" -msgstr "" - -#: neutron/wsgi.py:51 -msgid "Number of backlog requests to configure the socket with" -msgstr "" - -#: 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:59 -msgid "Number of seconds to keep retrying to listen" -msgstr "" - -#: neutron/wsgi.py:62 -msgid "Max header line to accommodate large tokens" -msgstr "" - -#: neutron/wsgi.py:65 -msgid "Enable SSL on the API server" -msgstr "" - -#: neutron/wsgi.py:67 -msgid "CA certificate file to use to verify connecting clients" -msgstr "" - -#: neutron/wsgi.py:70 -msgid "Certificate file to use when starting the server securely" -msgstr "" - -#: neutron/wsgi.py:73 -msgid "Private key file to use when starting the server securely" -msgstr "" - -#: neutron/wsgi.py:132 -#, python-format -msgid "Unable to listen on %(host)s:%(port)s" -msgstr "" - -#: neutron/wsgi.py:138 -#, python-format -msgid "Unable to find ssl_cert_file : %s" -msgstr "" - -#: neutron/wsgi.py:144 -#, python-format -msgid "Unable to find ssl_key_file : %s" -msgstr "" - -#: neutron/wsgi.py:149 -#, python-format -msgid "Unable to find ssl_ca_file : %s" -msgstr "" - -#: neutron/wsgi.py:182 -#, python-format -msgid "Could not bind to %(host)s:%(port)s after trying for %(time)d seconds" -msgstr "" - -#: neutron/wsgi.py:342 -msgid "Missing Content-Type" -msgstr "" - -#: neutron/wsgi.py:531 -#, python-format -msgid "Data %(data)s type is %(type)s" -msgstr "" - -#: neutron/wsgi.py:614 -msgid "Cannot understand JSON" -msgstr "" - -#: neutron/wsgi.py:627 neutron/wsgi.py:630 -msgid "Inline DTD forbidden" -msgstr "" - -#: neutron/wsgi.py:711 -msgid "Cannot understand XML" -msgstr "" - -#: neutron/wsgi.py:820 -msgid "Unrecognized Content-Type provided in request" -msgstr "" - -#: neutron/wsgi.py:824 -msgid "No Content-Type provided in request" -msgstr "" - -#: neutron/wsgi.py:828 -msgid "Empty body provided in request" -msgstr "" - -#: neutron/wsgi.py:835 -msgid "Unable to deserialize body as provided Content-Type" -msgstr "" - -#: neutron/wsgi.py:931 -msgid "You must implement __call__" -msgstr "" - -#: neutron/wsgi.py:1024 neutron/api/v2/base.py:191 neutron/api/v2/base.py:332 -#: neutron/api/v2/base.py:472 neutron/api/v2/base.py:527 -#: neutron/extensions/l3agentscheduler.py:50 -#: neutron/extensions/l3agentscheduler.py:93 -msgid "The resource could not be found." -msgstr "" - -#: neutron/wsgi.py:1071 -#, python-format -msgid "%(method)s %(url)s" -msgstr "" - -#: neutron/wsgi.py:1077 -msgid "Unsupported Content-Type" -msgstr "" - -#: neutron/wsgi.py:1078 -#, python-format -msgid "InvalidContentType: %s" -msgstr "" - -#: neutron/wsgi.py:1082 -msgid "Malformed request body" -msgstr "" - -#: neutron/wsgi.py:1083 -#, python-format -msgid "MalformedRequestBody: %s" -msgstr "" - -#: neutron/wsgi.py:1090 -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "" - -#: neutron/wsgi.py:1095 -msgid "Internal error" -msgstr "" - -#: neutron/wsgi.py:1110 neutron/wsgi.py:1212 -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "" - -#: neutron/wsgi.py:1113 -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "" - -#: neutron/wsgi.py:1231 -#, python-format -msgid "The requested content type %s is invalid." -msgstr "" - -#: neutron/wsgi.py:1290 -msgid "Could not deserialize data" -msgstr "" - -#: neutron/agent/dhcp_agent.py:51 -msgid "Interval to resync." -msgstr "" - -#: neutron/agent/dhcp_agent.py:54 -msgid "The driver used to manage the DHCP server." -msgstr "" - -#: neutron/agent/dhcp_agent.py:56 -msgid "Support Metadata requests on isolated networks." -msgstr "" - -#: neutron/agent/dhcp_agent.py:58 -msgid "" -"Allows for serving metadata requests from a dedicated network. Requires " -"enable_isolated_metadata = True" -msgstr "" - -#: neutron/agent/dhcp_agent.py:62 -msgid "Number of threads to use during sync process." -msgstr "" - -#: neutron/agent/dhcp_agent.py:65 neutron/agent/l3_agent.py:496 -#: neutron/agent/metadata/namespace_proxy.py:165 -msgid "Location of Metadata Proxy UNIX domain socket" -msgstr "" - -#: neutron/agent/dhcp_agent.py:102 -#, python-format -msgid "" -"The '%s' DHCP-driver does not support retrieving of a list of existing " -"networks" -msgstr "" - -#: neutron/agent/dhcp_agent.py:109 neutron/agent/dhcp_agent.py:600 -msgid "DHCP agent started" -msgstr "" - -#: neutron/agent/dhcp_agent.py:118 -#, python-format -msgid "Calling driver for network: %(net)s action: %(action)s" -msgstr "" - -#: neutron/agent/dhcp_agent.py:134 -#, python-format -msgid "" -"Unable to %(action)s dhcp for %(net_id)s: there is a conflict with its " -"current state; please check that the network and/or its subnet(s) still " -"exist." -msgstr "" - -#: neutron/agent/dhcp_agent.py:143 neutron/agent/dhcp_agent.py:202 -#, python-format -msgid "Network %s has been deleted." -msgstr "" - -#: neutron/agent/dhcp_agent.py:145 -#, python-format -msgid "Unable to %(action)s dhcp for %(net_id)s." -msgstr "" - -#: neutron/agent/dhcp_agent.py:155 -msgid "Synchronizing state" -msgstr "" - -#: neutron/agent/dhcp_agent.py:167 -#, python-format -msgid "Unable to sync network state on deleted network %s" -msgstr "" - -#: neutron/agent/dhcp_agent.py:173 -msgid "Synchronizing state complete" -msgstr "" - -#: neutron/agent/dhcp_agent.py:177 -msgid "Unable to sync network state." -msgstr "" - -#: neutron/agent/dhcp_agent.py:190 -#, python-format -msgid "resync: %(reason)s" -msgstr "" - -#: neutron/agent/dhcp_agent.py:206 -#, python-format -msgid "Network %s info call failed." -msgstr "" - -#: neutron/agent/dhcp_agent.py:219 -#, python-format -msgid "" -"Network %s may have been deleted and its resources may have already been " -"disposed." -msgstr "" - -#: neutron/agent/dhcp_agent.py:351 -#, python-format -msgid "" -"%(port_num)d router ports found on the metadata access network. Only the " -"port %(port_id)s, for router %(router_id)s will be considered" -msgstr "" - -#: neutron/agent/dhcp_agent.py:582 neutron/agent/l3_agent.py:1984 -#: neutron/agent/metadata/agent.py:363 -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:328 -#: neutron/services/metering/agents/metering_agent.py:272 -msgid "" -"Neutron server does not support state report. State report for this agent" -" will be disabled." -msgstr "" - -#: neutron/agent/dhcp_agent.py:588 neutron/agent/l3_agent.py:1989 -#: neutron/agent/metadata/agent.py:368 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:110 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:795 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:216 -#: neutron/plugins/nec/agent/nec_neutron_agent.py:182 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:261 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:131 -#: neutron/services/loadbalancer/agent/agent_manager.py:121 -#: neutron/services/metering/agents/metering_agent.py:277 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/agent/dhcp_agent.py:595 -#, python-format -msgid "Agent updated: %(payload)s" -msgstr "" - -#: neutron/agent/dhcp_agent.py:597 neutron/agent/l3_agent.py:1994 -#: neutron/services/metering/agents/metering_agent.py:280 -#, python-format -msgid "agent_updated by server side %s!" -msgstr "" - -#: neutron/agent/l3_agent.py:214 -msgid "Cannot allocate link local address" -msgstr "" - -#: neutron/agent/l3_agent.py:457 -msgid "" -"The working mode for the agent. Allowed modes are: 'legacy' - this " -"preserves the existing behavior where the L3 agent is deployed on a " -"centralized networking node to provide L3 services like DNAT, and SNAT. " -"Use this mode if you do not want to adopt DVR. 'dvr' - this mode enables " -"DVR functionality and must be used for an L3 agent that runs on a compute" -" host. 'dvr_snat' - this enables centralized SNAT support in conjunction " -"with DVR. This mode must be used for an L3 agent running on a " -"centralized node (or in single-host deployments, e.g. devstack)" -msgstr "" - -#: neutron/agent/l3_agent.py:470 neutron/debug/debug_agent.py:41 -msgid "Name of bridge used for external network traffic." -msgstr "" - -#: neutron/agent/l3_agent.py:474 -msgid "TCP Port used by Neutron metadata namespace proxy." -msgstr "" - -#: neutron/agent/l3_agent.py:478 -msgid "" -"Send this many gratuitous ARPs for HA setup, if less than or equal to 0, " -"the feature is disabled" -msgstr "" - -#: neutron/agent/l3_agent.py:481 -msgid "" -"If namespaces is disabled, the l3 agent can only configure a router that " -"has the matching router ID." -msgstr "" - -#: neutron/agent/l3_agent.py:486 -msgid "Agent should implement routers with no gateway" -msgstr "" - -#: neutron/agent/l3_agent.py:488 -msgid "UUID of external network for routers implemented by the agents." -msgstr "" - -#: neutron/agent/l3_agent.py:491 -msgid "Allow running metadata proxy." -msgstr "" - -#: neutron/agent/l3_agent.py:493 -msgid "Delete namespace after removing a router." -msgstr "" - -#: neutron/agent/l3_agent.py:516 -#, python-format -msgid "Error importing interface driver '%s'" -msgstr "" - -#: neutron/agent/l3_agent.py:533 -#, python-format -msgid "" -"l3-agent cannot check service plugins enabled at the neutron server when " -"startup due to RPC error. It happens when the server does not support " -"this RPC API. If the error is UnsupportedVersion you can ignore this " -"warning. Detail message: %s" -msgstr "" - -#: neutron/agent/l3_agent.py:564 neutron/agent/linux/dhcp.py:785 -#: neutron/services/metering/drivers/iptables/iptables_driver.py:92 -msgid "An interface driver must be specified" -msgstr "" - -#: neutron/agent/l3_agent.py:569 -msgid "Router id is required if not using namespaces." -msgstr "" - -#: neutron/agent/l3_agent.py:587 -msgid "RuntimeError in obtaining router list for namespace cleanup." -msgstr "" - -#: neutron/agent/l3_agent.py:617 -#, python-format -msgid "Failed to destroy stale router namespace %s" -msgstr "" - -#: neutron/agent/l3_agent.py:635 neutron/agent/linux/dhcp.py:235 -#, python-format -msgid "Failed trying to delete namespace: %s" -msgstr "" - -#: neutron/agent/l3_agent.py:723 -msgid "" -"The 'gateway_external_network_id' option must be configured for this " -"agent as Neutron has more than one external network." -msgstr "" - -#: neutron/agent/l3_agent.py:755 -#, python-format -msgid "Info for router %s were not found. Skipping router removal" -msgstr "" - -#: neutron/agent/l3_agent.py:830 -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:635 -#: neutron/services/firewall/agents/varmour/varmour_router.py:103 -#, python-format -msgid "Router port %s has no IP address" -msgstr "" - -#: neutron/agent/l3_agent.py:832 neutron/db/l3_db.py:954 -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:637 -#: neutron/services/firewall/agents/varmour/varmour_router.py:106 -#, python-format -msgid "Ignoring multiple IPs on router port %s" -msgstr "" - -#: neutron/agent/l3_agent.py:893 -#, python-format -msgid "Deleting stale internal router device: %s" -msgstr "" - -#: neutron/agent/l3_agent.py:930 -#, python-format -msgid "Deleting stale external router device: %s" -msgstr "" - -#: neutron/agent/l3_agent.py:1098 -#, python-format -msgid "Unable to configure IP address for floating IP: %s" -msgstr "" - -#: neutron/agent/l3_agent.py:1178 -#, python-format -msgid "Failed sending gratuitous ARP: %s" -msgstr "" - -#: neutron/agent/l3_agent.py:1240 -msgid "DVR: no map match_port found!" -msgstr "" - -#: neutron/agent/l3_agent.py:1444 -msgid "DVR: error adding redirection logic" -msgstr "" - -#: neutron/agent/l3_agent.py:1456 -msgid "DVR: removed snat failed" -msgstr "" - -#: neutron/agent/l3_agent.py:1557 -msgid "Missing subnet/agent_gateway_port" -msgstr "" - -#: neutron/agent/l3_agent.py:1678 -#, python-format -msgid "Got router deleted notification for %s" -msgstr "" - -#: neutron/agent/l3_agent.py:1699 -msgid "DVR: Failed updating arp entry" -msgstr "" - -#: neutron/agent/l3_agent.py:1726 -#, python-format -msgid "Got routers updated notification :%s" -msgstr "" - -#: neutron/agent/l3_agent.py:1736 -#, python-format -msgid "Got router removed from agent :%r" -msgstr "" - -#: neutron/agent/l3_agent.py:1742 -#, python-format -msgid "Got router added to agent :%r" -msgstr "" - -#: neutron/agent/l3_agent.py:1749 -#, python-format -msgid "The external network bridge '%s' does not exist" -msgstr "" - -#: neutron/agent/l3_agent.py:1801 -#, python-format -msgid "Failed to fetch router information for '%s'" -msgstr "" - -#: neutron/agent/l3_agent.py:1840 -#, python-format -msgid "Starting _sync_routers_task - fullsync:%s" -msgstr "" - -#: neutron/agent/l3_agent.py:1860 -#, python-format -msgid "Processing :%r" -msgstr "" - -#: neutron/agent/l3_agent.py:1868 -msgid "_sync_routers_task successfully completed" -msgstr "" - -#: neutron/agent/l3_agent.py:1870 -msgid "Failed synchronizing routers due to RPC error" -msgstr "" - -#: neutron/agent/l3_agent.py:1873 -#: neutron/services/metering/agents/metering_agent.py:61 -msgid "Failed synchronizing routers" -msgstr "" - -#: neutron/agent/l3_agent.py:1896 -msgid "L3 agent started" -msgstr "" - -#: neutron/agent/l3_agent.py:1915 -#, python-format -msgid "Added route entry is '%s'" -msgstr "" - -#: neutron/agent/l3_agent.py:1923 -#, python-format -msgid "Removed route entry is '%s'" -msgstr "" - -#: neutron/agent/l3_agent.py:1957 -msgid "Report state task started" -msgstr "" - -#: neutron/agent/l3_agent.py:1981 -msgid "Report state task successfully completed" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:35 -msgid "Location to store keepalived/conntrackd config files" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:39 -msgid "VRRP authentication type AH/PASS" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:41 -msgid "VRRP authentication password" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:45 -msgid "The advertisement interval in seconds" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:56 -#, python-format -msgid "Router %s is not a HA router" -msgstr "" - -#: neutron/agent/netns_cleanup_util.py:59 -msgid "Delete the namespace by removing all devices." -msgstr "" - -#: neutron/agent/netns_cleanup_util.py:116 -#, python-format -msgid "Unable to find bridge for device: %s" -msgstr "" - -#: neutron/agent/netns_cleanup_util.py:140 -#, python-format -msgid "Error unable to destroy namespace: %s" -msgstr "" - -#: neutron/agent/ovs_cleanup_util.py:39 -msgid "" -"True to delete all ports on all the OpenvSwitch bridges. False to delete " -"ports created by Neutron on integration and external network bridges." -msgstr "" - -#: neutron/agent/ovs_cleanup_util.py:73 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:665 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:299 -#, python-format -msgid "Delete %s" -msgstr "" - -#: neutron/agent/ovs_cleanup_util.py:103 -#, python-format -msgid "Cleaning %s" -msgstr "" - -#: neutron/agent/ovs_cleanup_util.py:110 -msgid "OVS cleanup completed successfully" -msgstr "" - -#: neutron/agent/rpc.py:110 -msgid "DVR functionality requires a server upgrade." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:33 -msgid "Driver for security groups firewall in the L2 agent" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:37 -msgid "" -"Controls whether the neutron security group API is enabled in the server." -" It should be false when using no security groups or using the nova " -"security group API." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:44 -msgid "Use ipset to speed-up the iptables based security groups." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:64 -#: neutron/agent/securitygroups_rpc.py:156 -msgid "Driver configuration doesn't match with enable_security_group" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:77 -msgid "Disabled security-group extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:79 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:87 -#, python-format -msgid "Get security group rules for devices via rpc %r" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:111 -msgid "" -"Security group agent binding currently not set. This should be set by the" -" end of the init process." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:122 -#, python-format -msgid "Security group rule updated on remote: %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:134 -#, python-format -msgid "Security group member updated on remote: %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:141 -#: neutron/agent/securitygroups_rpc.py:252 -msgid "Provider rule updated" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:154 -#, python-format -msgid "Init firewall settings (driver=%s)" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:193 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:223 -#, python-format -msgid "Security group rule updated %r" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:230 -#, python-format -msgid "Security group member updated %r" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:244 -#, python-format -msgid "" -"Adding %s devices to the list of devices for which firewall needs to be " -"refreshed" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:264 -#, python-format -msgid "Remove device filter for %r" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:273 -msgid "Refresh firewall rules" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:277 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:291 -#, python-format -msgid "Update port filter for %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:314 -#, python-format -msgid "Preparing device filters for %d new devices" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:327 -msgid "Refreshing firewall for all filtered devices" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:335 -#, python-format -msgid "Refreshing firewall for %d devices" -msgstr "" - -#: neutron/agent/common/config.py:29 -msgid "Root helper application." -msgstr "" - -#: neutron/agent/common/config.py:34 -msgid "" -"Seconds between nodes reporting state to server; should be less than " -"agent_down_time, best if it is half or less than agent_down_time." -msgstr "" - -#: neutron/agent/common/config.py:41 -msgid "The driver used to manage the virtual interface." -msgstr "" - -#: neutron/agent/common/config.py:46 -msgid "Allow overlapping IP." -msgstr "" - -#: neutron/agent/common/config.py:102 -msgid "" -"DEFAULT.root_helper is deprecated! Please move root_helper configuration " -"to [AGENT] section." -msgstr "" - -#: neutron/agent/common/config.py:113 -msgid "Top-level directory for maintaining dhcp state" -msgstr "" - -#: neutron/agent/linux/async_process.py:66 -msgid "respawn_interval must be >= 0 if provided." -msgstr "" - -#: neutron/agent/linux/async_process.py:80 -msgid "Process is already started" -msgstr "" - -#: neutron/agent/linux/async_process.py:82 -#, python-format -msgid "Launching async process [%s]." -msgstr "" - -#: neutron/agent/linux/async_process.py:88 -#, python-format -msgid "Halting async process [%s]." -msgstr "" - -#: neutron/agent/linux/async_process.py:91 -msgid "Process is not running." -msgstr "" - -#: neutron/agent/linux/async_process.py:163 -#, python-format -msgid "An error occurred while killing [%s]." -msgstr "" - -#: neutron/agent/linux/async_process.py:170 -#, python-format -msgid "Halting async process [%s] in response to an error." -msgstr "" - -#: neutron/agent/linux/async_process.py:176 -#, python-format -msgid "Respawning async process [%s]." -msgstr "" - -#: neutron/agent/linux/async_process.py:185 -#, python-format -msgid "An error occurred while communicating with async process [%s]." -msgstr "" - -#: neutron/agent/linux/daemon.py:37 -#, python-format -msgid "Error while handling pidfile: %s" -msgstr "" - -#: neutron/agent/linux/daemon.py:45 -msgid "Unable to unlock pid file" -msgstr "" - -#: neutron/agent/linux/daemon.py:94 -msgid "Fork failed" -msgstr "" - -#: neutron/agent/linux/daemon.py:136 -#, python-format -msgid "Pidfile %s already exist. Daemon already running?" -msgstr "" - -#: neutron/agent/linux/dhcp.py:43 -msgid "Location to store DHCP server config files" -msgstr "" - -#: neutron/agent/linux/dhcp.py:46 neutron/plugins/vmware/dhcp_meta/nsx.py:44 -msgid "Domain to use for building the hostnames" -msgstr "" - -#: neutron/agent/linux/dhcp.py:49 -msgid "Override the default dnsmasq settings with this file" -msgstr "" - -#: neutron/agent/linux/dhcp.py:51 -msgid "Comma-separated list of the DNS servers which will be used as forwarders." -msgstr "" - -#: neutron/agent/linux/dhcp.py:55 -msgid "Delete namespace after removing a dhcp server." -msgstr "" - -#: neutron/agent/linux/dhcp.py:59 -msgid "Limit number of leases to prevent a denial-of-service." -msgstr "" - -#: neutron/agent/linux/dhcp.py:217 -#, python-format -msgid "" -"DHCP for %(net_id)s is stale, pid %(pid)d does not exist, performing " -"cleanup" -msgstr "" - -#: neutron/agent/linux/dhcp.py:224 -#, python-format -msgid "No DHCP started for %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:256 neutron/agent/linux/utils.py:152 -#, python-format -msgid "Error while reading %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:263 neutron/agent/linux/utils.py:159 -#, python-format -msgid "Unable to convert value in %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:265 neutron/agent/linux/utils.py:161 -#, python-format -msgid "Unable to access %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:326 -#, python-format -msgid "" -"FAILED VERSION REQUIREMENT FOR DNSMASQ. DHCP AGENT MAY NOT RUN CORRECTLY!" -" Please ensure that its version is %s or above!" -msgstr "" - -#: neutron/agent/linux/dhcp.py:332 -#, python-format -msgid "" -"Unable to determine dnsmasq version. Please ensure that its version is %s" -" or above!" -msgstr "" - -#: neutron/agent/linux/dhcp.py:434 -#, python-format -msgid "Killing dhcpmasq for network since all subnets have turned off DHCP: %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:446 -#, python-format -msgid "Pid %d is stale, relaunching dnsmasq" -msgstr "" - -#: neutron/agent/linux/dhcp.py:447 -#, python-format -msgid "Reloading allocations for network: %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:498 -#, python-format -msgid "Building host file: %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:507 -#, python-format -msgid "Adding %(mac)s : %(name)s : %(ip)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:520 -#, python-format -msgid "Done building host file %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:792 -#, python-format -msgid "Error importing interface driver '%(driver)s': %(inner)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:832 -#, python-format -msgid "Setting gateway for dhcp netns on net %(n)s to %(ip)s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:842 -#, python-format -msgid "Removing gateway for dhcp netns on net %s" -msgstr "" - -#: neutron/agent/linux/dhcp.py:886 -#, python-format -msgid "" -"DHCP port %(device_id)s on network %(network_id)s does not yet exist. " -"Checking for a reserved port." -msgstr "" - -#: neutron/agent/linux/dhcp.py:900 -#, python-format -msgid "DHCP port %(device_id)s on network %(network_id)s does not yet exist." -msgstr "" - -#: neutron/agent/linux/dhcp.py:935 neutron/debug/debug_agent.py:67 -#, python-format -msgid "Reusing existing device: %s." -msgstr "" - -#: neutron/agent/linux/external_process.py:33 -msgid "Location to store child pid files" -msgstr "" - -#: neutron/agent/linux/external_process.py:35 -msgid "Periodically check child processes" -msgstr "" - -#: neutron/agent/linux/external_process.py:38 -msgid "Action to be executed when a child process dies" -msgstr "" - -#: neutron/agent/linux/external_process.py:40 -msgid "Interval between checks of child process liveness (seconds)" -msgstr "" - -#: neutron/agent/linux/interface.py:37 -msgid "Name of Open vSwitch bridge to use" -msgstr "" - -#: neutron/agent/linux/interface.py:40 -msgid "Uses veth for an interface or not" -msgstr "" - -#: neutron/agent/linux/interface.py:42 -msgid "MTU setting for device." -msgstr "" - -#: neutron/agent/linux/interface.py:44 -msgid "Mapping between flavor and LinuxInterfaceDriver" -msgstr "" - -#: neutron/agent/linux/interface.py:46 -msgid "Admin username" -msgstr "" - -#: neutron/agent/linux/interface.py:48 neutron/agent/metadata/agent.py:54 -#: neutron/plugins/metaplugin/common/config.py:65 -msgid "Admin password" -msgstr "" - -#: neutron/agent/linux/interface.py:51 neutron/agent/metadata/agent.py:57 -#: neutron/plugins/metaplugin/common/config.py:68 -msgid "Admin tenant name" -msgstr "" - -#: neutron/agent/linux/interface.py:53 neutron/agent/metadata/agent.py:59 -#: neutron/plugins/metaplugin/common/config.py:70 -msgid "Authentication URL" -msgstr "" - -#: neutron/agent/linux/interface.py:55 neutron/agent/metadata/agent.py:61 -#: neutron/common/config.py:47 neutron/plugins/metaplugin/common/config.py:72 -msgid "The type of authentication to use" -msgstr "" - -#: neutron/agent/linux/interface.py:57 neutron/agent/metadata/agent.py:63 -#: neutron/plugins/metaplugin/common/config.py:74 -msgid "Authentication region" -msgstr "" - -#: neutron/agent/linux/interface.py:214 neutron/agent/linux/interface.py:268 -#: neutron/agent/linux/interface.py:330 neutron/agent/linux/interface.py:379 -#, python-format -msgid "Device %s already exists" -msgstr "" - -#: neutron/agent/linux/interface.py:232 neutron/agent/linux/interface.py:279 -#: neutron/agent/linux/interface.py:342 neutron/agent/linux/interface.py:386 -#, python-format -msgid "Unplugged interface '%s'" -msgstr "" - -#: neutron/agent/linux/interface.py:234 neutron/agent/linux/interface.py:278 -#: neutron/agent/linux/interface.py:344 neutron/agent/linux/interface.py:388 -#, python-format -msgid "Failed unplugging interface '%s'" -msgstr "" - -#: neutron/agent/linux/interface.py:446 -#, python-format -msgid "Driver location: %s" -msgstr "" - -#: neutron/agent/linux/ip_lib.py:26 -msgid "Force ip_lib calls to use the root helper" -msgstr "" - -#: neutron/agent/linux/iptables_firewall.py:85 -#, python-format -msgid "Preparing device (%s) filter" -msgstr "" - -#: neutron/agent/linux/iptables_firewall.py:93 -#, python-format -msgid "Updating device (%s) filter" -msgstr "" - -#: neutron/agent/linux/iptables_firewall.py:95 -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "" - -#: neutron/agent/linux/iptables_firewall.py:104 -#, python-format -msgid "Removing device (%s) filter" -msgstr "" - -#: neutron/agent/linux/iptables_firewall.py:106 -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "" - -#: neutron/agent/linux/iptables_manager.py:157 -#, python-format -msgid "Attempted to remove chain %s which does not exist" -msgstr "" - -#: neutron/agent/linux/iptables_manager.py:199 -#, python-format -msgid "Unknown chain: %r" -msgstr "" - -#: neutron/agent/linux/iptables_manager.py:234 -#, 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:389 -#, python-format -msgid "Got semaphore / lock \"%s\"" -msgstr "" - -#: neutron/agent/linux/iptables_manager.py:392 -#, python-format -msgid "Semaphore / lock released \"%s\"" -msgstr "" - -#: neutron/agent/linux/iptables_manager.py:443 -#: neutron/tests/unit/test_iptables_manager.py:753 -#: neutron/tests/unit/test_iptables_manager.py:787 -#, python-format -msgid "" -"IPTablesManager.apply failed to apply the following set of iptables " -"rules:\n" -"%s" -msgstr "" - -#: neutron/agent/linux/iptables_manager.py:446 -msgid "IPTablesManager.apply completed with success" -msgstr "" - -#: neutron/agent/linux/iptables_manager.py:456 -#, python-format -msgid "Unable to find table %s" -msgstr "" - -#: neutron/agent/linux/iptables_manager.py:660 -#, python-format -msgid "Attempted to get traffic counters of chain %s which does not exist" -msgstr "" - -#: neutron/agent/linux/keepalived.py:36 -#, python-format -msgid "Invalid instance state: %%(state)s, valid states are: %(valid_states)s" -msgstr "" - -#: neutron/agent/linux/keepalived.py:42 -#, python-format -msgid "" -"Invalid notify state: %%(state)s, valid states are: " -"%(valid_notify_states)s" -msgstr "" - -#: neutron/agent/linux/keepalived.py:48 -#, python-format -msgid "" -"Invalid authentication type: %%(auth_type)s, valid types are: " -"%(valid_auth_types)s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:38 -msgid "Timeout in seconds for ovs-vsctl commands" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:72 neutron/agent/linux/ovs_lib.py:170 -#: neutron/agent/linux/ovs_lib.py:290 -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:55 -#, python-format -msgid "Unable to execute %(cmd)s. Exception: %(exception)s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:241 -msgid "" -"Unable to create VXLAN tunnel port. Please ensure that an openvswitch " -"version that supports VXLAN is installed." -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:338 -#, python-format -msgid "Found not yet ready openvswitch port: %s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:353 -#, python-format -msgid "Found failed openvswitch port: %s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:408 -#, python-format -msgid "Port: %(port_name)s is on %(switch)s, not on %(br_name)s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:416 -#, python-format -msgid "ofport: %(ofport)s for VIF: %(vif)s is not a positive integer" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:426 -#, python-format -msgid "Unable to parse interface details. Exception: %s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:444 -#, python-format -msgid "Unable to determine mac address for %s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:522 -#, python-format -msgid "OVS flows could not be applied on bridge %s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:532 -#, python-format -msgid "Interface %s not found." -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:543 -#, python-format -msgid "Unable to retrieve bridges. Exception: %s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:552 -#, python-format -msgid "Bridge %s not found." -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:568 -msgid "Cannot match priority on flow deletion or modification" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:573 -msgid "Must specify one or more actions on flow addition or modification" -msgstr "" - -#: neutron/agent/linux/ovsdb_monitor.py:44 -#, python-format -msgid "Output received from ovsdb monitor: %s" -msgstr "" - -#: neutron/agent/linux/ovsdb_monitor.py:50 -#, python-format -msgid "Error received from ovsdb monitor: %s" -msgstr "" - -#: neutron/agent/linux/ra.py:31 -msgid "Location to store IPv6 RA config files" -msgstr "" - -#: neutron/agent/linux/utils.py:48 -#, python-format -msgid "Running command: %s" -msgstr "" - -#: neutron/agent/linux/utils.py:71 -#, python-format -msgid "" -"\n" -"Command: %(cmd)s\n" -"Exit code: %(code)s\n" -"Stdout: %(stdout)r\n" -"Stderr: %(stderr)r" -msgstr "" - -#: neutron/agent/metadata/agent.py:52 -#: neutron/plugins/metaplugin/common/config.py:63 -msgid "Admin user" -msgstr "" - -#: neutron/agent/metadata/agent.py:66 -msgid "Turn off verification of the certificate for ssl" -msgstr "" - -#: neutron/agent/metadata/agent.py:69 -msgid "Certificate Authority public key (CA cert) file for ssl" -msgstr "" - -#: neutron/agent/metadata/agent.py:73 -msgid "Network service endpoint type to pull from the keystone catalog" -msgstr "" - -#: neutron/agent/metadata/agent.py:76 -msgid "IP address used by Nova metadata server." -msgstr "" - -#: neutron/agent/metadata/agent.py:79 -msgid "TCP Port used by Nova metadata server." -msgstr "" - -#: neutron/agent/metadata/agent.py:82 -#: neutron/plugins/vmware/dhcp_meta/nsx.py:63 -msgid "Shared secret to sign instance-id request" -msgstr "" - -#: neutron/agent/metadata/agent.py:87 -msgid "Protocol to access nova metadata, http or https" -msgstr "" - -#: neutron/agent/metadata/agent.py:89 -msgid "Allow to perform insecure SSL (https) requests to nova metadata" -msgstr "" - -#: neutron/agent/metadata/agent.py:93 -msgid "Client certificate for nova metadata api server." -msgstr "" - -#: neutron/agent/metadata/agent.py:96 -msgid "Private key of client certificate." -msgstr "" - -#: neutron/agent/metadata/agent.py:126 -#: neutron/agent/metadata/namespace_proxy.py:68 -#, python-format -msgid "Request: %s" -msgstr "" - -#: neutron/agent/metadata/agent.py:135 -#: neutron/agent/metadata/namespace_proxy.py:76 -msgid "Unexpected error." -msgstr "" - -#: neutron/agent/metadata/agent.py:136 -#: neutron/agent/metadata/namespace_proxy.py:77 -msgid "An unknown error has occurred. Please try your request again." -msgstr "" - -#: neutron/agent/metadata/agent.py:182 -msgid "" -"Either one of parameter network_id or router_id must be passed to " -"_get_ports method." -msgstr "" - -#: neutron/agent/metadata/agent.py:231 -msgid "" -"The remote metadata server responded with Forbidden. This response " -"usually occurs when shared secrets do not match." -msgstr "" - -#: neutron/agent/metadata/agent.py:242 -#: neutron/agent/metadata/namespace_proxy.py:120 -msgid "Remote metadata server experienced an internal server error." -msgstr "" - -#: neutron/agent/metadata/agent.py:248 -#: neutron/agent/metadata/namespace_proxy.py:126 -#, python-format -msgid "Unexpected response code: %s" -msgstr "" - -#: neutron/agent/metadata/agent.py:308 -msgid "Location for Metadata Proxy UNIX domain socket" -msgstr "" - -#: neutron/agent/metadata/agent.py:311 -msgid "Number of separate worker processes for metadata server" -msgstr "" - -#: neutron/agent/metadata/agent.py:315 -msgid "Number of backlog requests to configure the metadata server socket with" -msgstr "" - -#: neutron/agent/metadata/namespace_proxy.py:63 -msgid "network_id and router_id are None. One must be provided." -msgstr "" - -#: neutron/agent/metadata/namespace_proxy.py:149 -msgid "Network that will have instance metadata proxied." -msgstr "" - -#: neutron/agent/metadata/namespace_proxy.py:152 -msgid "Router that will have connected instances' metadata proxied." -msgstr "" - -#: neutron/agent/metadata/namespace_proxy.py:155 -#: neutron/tests/functional/agent/linux/simple_daemon.py:42 -msgid "Location of pid file of this process." -msgstr "" - -#: neutron/agent/metadata/namespace_proxy.py:158 -msgid "Run as daemon." -msgstr "" - -#: neutron/agent/metadata/namespace_proxy.py:161 -msgid "TCP Port to listen for metadata server requests." -msgstr "" - -#: neutron/api/api_common.py:101 -#, python-format -msgid "" -"Invalid value for pagination_max_limit: %s. It should be an integer " -"greater to 0" -msgstr "" - -#: neutron/api/api_common.py:115 -#, python-format -msgid "Limit must be an integer 0 or greater and not '%d'" -msgstr "" - -#: neutron/api/api_common.py:132 -msgid "The number of sort_keys and sort_dirs must be same" -msgstr "" - -#: neutron/api/api_common.py:137 -#, python-format -msgid "%s is invalid attribute for sort_keys" -msgstr "" - -#: neutron/api/api_common.py:141 -#, 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:315 neutron/api/v2/base.py:597 -#, python-format -msgid "Unable to find '%s' in request body" -msgstr "" - -#: neutron/api/api_common.py:322 -#, python-format -msgid "Failed to parse request. Parameter '%s' not specified" -msgstr "" - -#: neutron/api/extensions.py:253 -#, python-format -msgid "Extension with alias %s does not exist" -msgstr "" - -#: neutron/api/extensions.py:257 neutron/api/extensions.py:261 -msgid "Resource not found." -msgstr "" - -#: neutron/api/extensions.py:283 -#, python-format -msgid "Extended resource: %s" -msgstr "" - -#: neutron/api/extensions.py:305 -#, python-format -msgid "Extended action: %s" -msgstr "" - -#: neutron/api/extensions.py:313 -#, python-format -msgid "Extended request: %s" -msgstr "" - -#: neutron/api/extensions.py:403 -msgid "Initializing extension manager." -msgstr "" - -#: neutron/api/extensions.py:486 -#, python-format -msgid "Error fetching extended attributes for extension '%s'" -msgstr "" - -#: neutron/api/extensions.py:492 -#, python-format -msgid "" -"Extension '%s' provides no backward compatibility map for extended " -"attributes" -msgstr "" - -#: neutron/api/extensions.py:502 -#, python-format -msgid "" -"It was impossible to process the following extensions: %s because of " -"missing requirements." -msgstr "" - -#: neutron/api/extensions.py:513 -#, python-format -msgid "Ext name: %s" -msgstr "" - -#: neutron/api/extensions.py:514 -#, python-format -msgid "Ext alias: %s" -msgstr "" - -#: neutron/api/extensions.py:515 -#, python-format -msgid "Ext description: %s" -msgstr "" - -#: neutron/api/extensions.py:516 -#, python-format -msgid "Ext namespace: %s" -msgstr "" - -#: neutron/api/extensions.py:517 -#, python-format -msgid "Ext updated: %s" -msgstr "" - -#: neutron/api/extensions.py:519 -#, python-format -msgid "Exception loading extension: %s" -msgstr "" - -#: neutron/api/extensions.py:537 -#, python-format -msgid "Extension path '%s' doesn't exist!" -msgstr "" - -#: neutron/api/extensions.py:545 -#, python-format -msgid "Loading extension file: %s" -msgstr "" - -#: neutron/api/extensions.py:553 -#, python-format -msgid "Did not find expected name \"%(ext_name)s\" in %(file)s" -msgstr "" - -#: neutron/api/extensions.py:561 -#, python-format -msgid "Extension file %(f)s wasn't loaded due to %(exception)s" -msgstr "" - -#: neutron/api/extensions.py:570 -#, python-format -msgid "Loaded extension: %s" -msgstr "" - -#: neutron/api/extensions.py:601 -#, python-format -msgid "Extension %s not supported by any of loaded plugins" -msgstr "" - -#: neutron/api/extensions.py:612 -#, python-format -msgid "Loaded plugins do not implement extension %s interface" -msgstr "" - -#: neutron/api/versions.py:45 -msgid "Unknown API version specified" -msgstr "" - -#: neutron/api/rpc/agentnotifiers/dhcp_rpc_agent_api.py:65 -#, python-format -msgid "" -"Unable to schedule network %s: no agents available; will retry on " -"subsequent port creation events." -msgstr "" - -#: neutron/api/rpc/agentnotifiers/dhcp_rpc_agent_api.py:78 -#, python-format -msgid "" -"Only %(active)d of %(total)d DHCP agents associated with network " -"'%(net_id)s' are marked as active, so notifications may be sent to " -"inactive agents." -msgstr "" - -#: neutron/api/rpc/agentnotifiers/dhcp_rpc_agent_api.py:90 -#, python-format -msgid "" -"Will not send event %(method)s for network %(net_id)s: no agent " -"available. Payload: %(payload)s" -msgstr "" - -#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:38 -#, python-format -msgid "Nofity agent at %(host)s the message %(method)s" -msgstr "" - -#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:57 -#, python-format -msgid "Notify agent at %(topic)s.%(host)s the message %(method)s" -msgstr "" - -#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:99 -#, python-format -msgid "" -"No plugin for L3 routing registered. Cannot notify agents with the " -"message %s" -msgstr "" - -#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:117 -#, python-format -msgid "" -"Fanout notify agent at %(topic)s the message %(method)s on router " -"%(router_id)s" -msgstr "" - -#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:49 -#, python-format -msgid "Notify metering agent at %(topic)s.%(host)s the message %(method)s" -msgstr "" - -#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:64 -#, python-format -msgid "" -"Fanout notify metering agent at %(topic)s the message %(method)s on " -"router %(router_id)s" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:65 -msgid "Unrecognized action" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:82 -#, 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:92 -#, python-format -msgid "get_active_networks requested from %s" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:99 -#, python-format -msgid "get_active_networks_info from %s" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:119 -#, python-format -msgid "Network %(network_id)s requested from %(host)s" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:126 -#: neutron/api/rpc/handlers/dhcp_rpc.py:190 -#, python-format -msgid "Network %s could not be found, it might have been deleted concurrently." -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:148 -#, python-format -msgid "Port %(device_id)s for %(network_id)s requested from %(host)s" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:182 -#, python-format -msgid "" -"DHCP port %(device_id)s on network %(network_id)s does not exist on " -"%(host)s" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:222 -#, python-format -msgid "DHCP port deletion for %(network_id)s request from %(host)s" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:235 -#, python-format -msgid "DHCP port remove fixed_ip for %(subnet_id)s request from %(host)s" -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:259 -#, python-format -msgid "Updating lease expiration is now deprecated. Issued from host %s." -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:270 -#, python-format -msgid "Create dhcp port %(port)s from %(host)s." -msgstr "" - -#: neutron/api/rpc/handlers/dhcp_rpc.py:287 -#, python-format -msgid "Update dhcp port %(port)s from %(host)s." -msgstr "" - -#: neutron/api/rpc/handlers/dvr_rpc.py:128 -msgid "DVR agent binding currently not set." -msgstr "" - -#: neutron/api/rpc/handlers/l3_rpc.py:70 -msgid "" -"No plugin for L3 routing registered! Will reply to l3 agent with empty " -"router dictionary." -msgstr "" - -#: neutron/api/rpc/handlers/l3_rpc.py:84 -#, python-format -msgid "" -"Routers returned to l3 agent:\n" -" %s" -msgstr "" - -#: neutron/api/rpc/handlers/l3_rpc.py:90 -#, python-format -msgid "Checking router: %(id)s for host: %(host)s" -msgstr "" - -#: neutron/api/rpc/handlers/l3_rpc.py:150 -#, python-format -msgid "External network ID returned to l3 agent: %s" -msgstr "" - -#: neutron/api/rpc/handlers/l3_rpc.py:162 -#, python-format -msgid "New status for floating IP %(floatingip_id)s: %(status)s" -msgstr "" - -#: neutron/api/rpc/handlers/l3_rpc.py:170 -#, python-format -msgid "Floating IP: %s no longer present." -msgstr "" - -#: neutron/api/v2/attributes.py:44 -#, python-format -msgid "" -"Invalid input. '%(target_dict)s' must be a dictionary with keys: " -"%(expected_keys)s" -msgstr "" - -#: neutron/api/v2/attributes.py:55 -#, python-format -msgid "" -"Validation of dictionary's keys failed.Expected keys: %(expected_keys)s " -"Provided keys: %(provided_keys)s" -msgstr "" - -#: neutron/api/v2/attributes.py:69 -#, python-format -msgid "'%(data)s' is not in %(valid_values)s" -msgstr "" - -#: neutron/api/v2/attributes.py:85 -#, python-format -msgid "'%s' Blank strings are not permitted" -msgstr "" - -#: neutron/api/v2/attributes.py:95 -#, python-format -msgid "'%s' is not a valid string" -msgstr "" - -#: neutron/api/v2/attributes.py:100 -#, python-format -msgid "'%(data)s' exceeds maximum length of %(max_len)s" -msgstr "" - -#: neutron/api/v2/attributes.py:110 -#, python-format -msgid "'%s' is not a valid boolean value" -msgstr "" - -#: neutron/api/v2/attributes.py:129 neutron/api/v2/attributes.py:454 -#, python-format -msgid "'%s' is not an integer" -msgstr "" - -#: neutron/api/v2/attributes.py:133 -#, python-format -msgid "'%(data)s' is too small - must be at least '%(limit)d'" -msgstr "" - -#: neutron/api/v2/attributes.py:138 -#, python-format -msgid "'%(data)s' is too large - must be no larger than '%(limit)d'" -msgstr "" - -#: neutron/api/v2/attributes.py:147 -#, python-format -msgid "'%s' contains whitespace" -msgstr "" - -#: neutron/api/v2/attributes.py:164 -#, python-format -msgid "'%s' is not a valid MAC address" -msgstr "" - -#: neutron/api/v2/attributes.py:179 -#, python-format -msgid "'%s' is not a valid IP address" -msgstr "" - -#: neutron/api/v2/attributes.py:190 -#, python-format -msgid "Invalid data format for IP pool: '%s'" -msgstr "" - -#: neutron/api/v2/attributes.py:209 neutron/api/v2/attributes.py:216 -#, python-format -msgid "Invalid data format for fixed IP: '%s'" -msgstr "" - -#: neutron/api/v2/attributes.py:224 -#, python-format -msgid "Duplicate IP address '%s'" -msgstr "" - -#: neutron/api/v2/attributes.py:240 -#, python-format -msgid "Invalid data format for nameserver: '%s'" -msgstr "" - -#: neutron/api/v2/attributes.py:251 -#, python-format -msgid "'%s' is not a valid nameserver" -msgstr "" - -#: neutron/api/v2/attributes.py:255 -#, python-format -msgid "Duplicate nameserver '%s'" -msgstr "" - -#: neutron/api/v2/attributes.py:263 -#, python-format -msgid "Invalid data format for hostroute: '%s'" -msgstr "" - -#: neutron/api/v2/attributes.py:283 -#, python-format -msgid "Duplicate hostroute '%s'" -msgstr "" - -#: neutron/api/v2/attributes.py:300 neutron/tests/unit/test_attributes.py:460 -#: neutron/tests/unit/test_attributes.py:474 -#: neutron/tests/unit/test_attributes.py:482 -#, python-format -msgid "'%(data)s' isn't a recognized IP subnet cidr, '%(cidr)s' is recommended" -msgstr "" - -#: neutron/api/v2/attributes.py:306 -#, python-format -msgid "'%s' is not a valid IP subnet" -msgstr "" - -#: neutron/api/v2/attributes.py:314 neutron/api/v2/attributes.py:367 -#, python-format -msgid "'%s' is not a list" -msgstr "" - -#: neutron/api/v2/attributes.py:319 neutron/api/v2/attributes.py:378 -#, python-format -msgid "Duplicate items in the list: '%s'" -msgstr "" - -#: neutron/api/v2/attributes.py:342 -#, python-format -msgid "'%s' is not a valid input" -msgstr "" - -#: neutron/api/v2/attributes.py:355 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:534 -#, python-format -msgid "'%s' is not a valid UUID" -msgstr "" - -#: neutron/api/v2/attributes.py:398 -#, python-format -msgid "Validator '%s' does not exist." -msgstr "" - -#: neutron/api/v2/attributes.py:408 -#, python-format -msgid "'%s' is not a dictionary" -msgstr "" - -#: neutron/api/v2/attributes.py:459 -#, python-format -msgid "'%s' should be non-negative" -msgstr "" - -#: neutron/api/v2/attributes.py:478 -#, python-format -msgid "'%s' cannot be converted to boolean" -msgstr "" - -#: neutron/api/v2/attributes.py:491 -#: neutron/plugins/nec/extensions/packetfilter.py:75 -#, python-format -msgid "'%s' is not a integer" -msgstr "" - -#: neutron/api/v2/attributes.py:504 -#, python-format -msgid "'%s' is not of the form =[value]" -msgstr "" - -#: neutron/api/v2/base.py:87 -msgid "Native pagination depend on native sorting" -msgstr "" - -#: neutron/api/v2/base.py:90 -msgid "Allow sorting is enabled because native pagination requires native sorting" -msgstr "" - -#: neutron/api/v2/base.py:361 -#, python-format -msgid "Unable to undo add for %(resource)s %(id)s" -msgstr "" - -#: neutron/api/v2/base.py:493 -#, python-format -msgid "Invalid format: %s" -msgstr "" - -#: neutron/api/v2/base.py:550 -msgid "" -"Specifying 'tenant_id' other than authenticated tenant in request " -"requires admin privileges" -msgstr "" - -#: neutron/api/v2/base.py:558 -msgid "Running without keystone AuthN requires that tenant_id is specified" -msgstr "" - -#: neutron/api/v2/base.py:576 -msgid "Resource body required" -msgstr "" - -#: neutron/api/v2/base.py:578 -#, python-format -msgid "Request body: %(body)s" -msgstr "" - -#: neutron/api/v2/base.py:588 -msgid "Bulk operation not supported" -msgstr "" - -#: neutron/api/v2/base.py:592 -msgid "Resources required" -msgstr "" - -#: neutron/api/v2/base.py:608 -#, python-format -msgid "Failed to parse request. Required attribute '%s' not specified" -msgstr "" - -#: neutron/api/v2/base.py:615 -#, python-format -msgid "Attribute '%s' not allowed in POST" -msgstr "" - -#: neutron/api/v2/base.py:620 -#, python-format -msgid "Cannot update read-only attribute %s" -msgstr "" - -#: neutron/api/v2/base.py:638 -#, python-format -msgid "Invalid input for %(attr)s. Reason: %(reason)s." -msgstr "" - -#: neutron/api/v2/base.py:647 neutron/extensions/allowedaddresspairs.py:75 -#: neutron/extensions/multiprovidernet.py:45 -#, python-format -msgid "Unrecognized attribute(s) '%s'" -msgstr "" - -#: neutron/api/v2/base.py:666 -#, python-format -msgid "Tenant %(tenant_id)s not allowed to create %(resource)s on this network" -msgstr "" - -#: neutron/api/v2/resource.py:97 -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "" - -#: neutron/api/v2/resource.py:100 neutron/api/v2/resource.py:108 -#: neutron/api/v2/resource.py:128 -#, python-format -msgid "%s failed" -msgstr "" - -#: neutron/api/v2/resource.py:130 -#: neutron/tests/unit/test_api_v2_resource.py:299 -msgid "Request Failed: internal server error while processing your request." -msgstr "" - -#: neutron/cmd/sanity_check.py:39 -msgid "" -"Check for Open vSwitch VXLAN support failed. Please ensure that the " -"version of openvswitch being used has VXLAN support." -msgstr "" - -#: neutron/cmd/sanity_check.py:48 -msgid "" -"Check for Open vSwitch patch port support failed. Please ensure that the " -"version of openvswitch being used has patch port support or disable " -"features requiring patch ports (gre/vxlan, etc.)." -msgstr "" - -#: neutron/cmd/sanity_check.py:68 -msgid "" -"Check for Open vSwitch ARP responder support failed. Please ensure that " -"the version of openvswitch being used has ARP flows support." -msgstr "" - -#: neutron/cmd/sanity_check.py:77 -msgid "Check for vxlan support" -msgstr "" - -#: neutron/cmd/sanity_check.py:79 -msgid "Check for patch port support" -msgstr "" - -#: neutron/cmd/sanity_check.py:81 -msgid "Check for nova notification support" -msgstr "" - -#: neutron/cmd/sanity_check.py:83 -msgid "Check for ARP responder support" -msgstr "" - -#: neutron/cmd/sanity/checks.py:72 -#, python-format -msgid "Unexpected exception while checking supported feature via command: %s" -msgstr "" - -#: neutron/common/config.py:37 -msgid "The host IP to bind to" -msgstr "" - -#: neutron/common/config.py:39 -msgid "The port to bind to" -msgstr "" - -#: neutron/common/config.py:41 -msgid "The API paste config file to use" -msgstr "" - -#: neutron/common/config.py:43 -msgid "The path for API extensions" -msgstr "" - -#: neutron/common/config.py:45 -msgid "The policy file to use" -msgstr "" - -#: neutron/common/config.py:49 -msgid "The core plugin Neutron will use" -msgstr "" - -#: neutron/common/config.py:51 neutron/db/migration/cli.py:35 -msgid "The service plugins Neutron will use" -msgstr "" - -#: neutron/common/config.py:53 -msgid "The base MAC address Neutron will use for VIFs" -msgstr "" - -#: neutron/common/config.py:55 -msgid "How many times Neutron will retry MAC generation" -msgstr "" - -#: neutron/common/config.py:57 -msgid "Allow the usage of the bulk API" -msgstr "" - -#: neutron/common/config.py:59 -msgid "Allow the usage of the pagination" -msgstr "" - -#: neutron/common/config.py:61 -msgid "Allow the usage of the sorting" -msgstr "" - -#: neutron/common/config.py:63 -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:67 -msgid "Maximum number of DNS nameservers" -msgstr "" - -#: neutron/common/config.py:69 -msgid "Maximum number of host routes per subnet" -msgstr "" - -#: neutron/common/config.py:71 -msgid "Maximum number of fixed ips per port" -msgstr "" - -#: neutron/common/config.py:74 -msgid "" -"DHCP lease duration (in seconds). Use -1 to tell dnsmasq to use infinite " -"lease times." -msgstr "" - -#: neutron/common/config.py:77 -msgid "Allow sending resource operation notification to DHCP agent" -msgstr "" - -#: neutron/common/config.py:80 -msgid "Allow overlapping IP support in Neutron" -msgstr "" - -#: neutron/common/config.py:82 -msgid "The hostname Neutron is running on" -msgstr "" - -#: neutron/common/config.py:84 -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:90 -msgid "Send notification to nova when port status changes" -msgstr "" - -#: neutron/common/config.py:92 -msgid "" -"Send notification to nova when port data (fixed_ips/floatingip) changes " -"so nova can update its cache." -msgstr "" - -#: neutron/common/config.py:96 -msgid "URL for connection to nova" -msgstr "" - -#: neutron/common/config.py:98 -msgid "Username for connecting to nova in admin context" -msgstr "" - -#: neutron/common/config.py:100 -msgid "Password for connection to nova in admin context" -msgstr "" - -#: neutron/common/config.py:103 -msgid "The uuid of the admin nova tenant" -msgstr "" - -#: neutron/common/config.py:106 -msgid "Authorization URL for connecting to nova in admin context" -msgstr "" - -#: neutron/common/config.py:109 -msgid "CA file for novaclient to verify server certificates" -msgstr "" - -#: neutron/common/config.py:111 -msgid "If True, ignore any SSL validation issues" -msgstr "" - -#: neutron/common/config.py:113 -msgid "" -"Name of nova region to use. Useful if keystone manages more than one " -"region." -msgstr "" - -#: neutron/common/config.py:116 -msgid "" -"Number of seconds between sending events to nova if there are any events " -"to send." -msgstr "" - -#: neutron/common/config.py:123 -msgid "" -"Where to store Neutron state files. This directory must be writable by " -"the agent." -msgstr "" - -#: neutron/common/config.py:156 -#, python-format -msgid "Base MAC: %s" -msgstr "" - -#: neutron/common/config.py:164 -msgid "Logging enabled!" -msgstr "" - -#: neutron/common/config.py:180 -#, python-format -msgid "Config paste file: %s" -msgstr "" - -#: neutron/common/config.py:185 -#, python-format -msgid "Unable to load %(app_name)s from configuration file %(config_path)s." -msgstr "" - -#: neutron/common/exceptions.py:30 -#: neutron/plugins/vmware/api_client/exception.py:27 -msgid "An unknown exception occurred." -msgstr "" - -#: neutron/common/exceptions.py:51 -#, python-format -msgid "Bad %(resource)s request: %(msg)s" -msgstr "" - -#: neutron/common/exceptions.py:63 -msgid "Not authorized." -msgstr "" - -#: neutron/common/exceptions.py:67 -msgid "The service is unavailable" -msgstr "" - -#: neutron/common/exceptions.py:71 -#, python-format -msgid "User does not have admin privileges: %(reason)s" -msgstr "" - -#: neutron/common/exceptions.py:75 -#, python-format -msgid "Policy doesn't allow %(action)s to be performed." -msgstr "" - -#: neutron/common/exceptions.py:79 -#, python-format -msgid "Network %(net_id)s could not be found" -msgstr "" - -#: neutron/common/exceptions.py:83 -#, python-format -msgid "Subnet %(subnet_id)s could not be found" -msgstr "" - -#: neutron/common/exceptions.py:87 -#, python-format -msgid "Port %(port_id)s could not be found" -msgstr "" - -#: neutron/common/exceptions.py:91 -#, python-format -msgid "Port %(port_id)s could not be found on network %(net_id)s" -msgstr "" - -#: neutron/common/exceptions.py:96 -msgid "Policy configuration policy.json could not be found" -msgstr "" - -#: neutron/common/exceptions.py:100 -#, python-format -msgid "Failed to init policy %(policy)s because %(reason)s" -msgstr "" - -#: neutron/common/exceptions.py:104 -#, python-format -msgid "Failed to check policy %(policy)s because %(reason)s" -msgstr "" - -#: neutron/common/exceptions.py:108 -#, python-format -msgid "Unsupported port state: %(port_state)s" -msgstr "" - -#: neutron/common/exceptions.py:112 -msgid "The resource is inuse" -msgstr "" - -#: neutron/common/exceptions.py:116 -#, python-format -msgid "" -"Unable to complete operation on network %(net_id)s. There are one or more" -" ports still in use on the network." -msgstr "" - -#: neutron/common/exceptions.py:121 -#, python-format -msgid "" -"Unable to complete operation on subnet %(subnet_id)s. One or more ports " -"have an IP allocation from this subnet." -msgstr "" - -#: neutron/common/exceptions.py:126 -#, python-format -msgid "" -"Unable to complete operation on port %(port_id)s for network %(net_id)s. " -"Port already has an attacheddevice %(device_id)s." -msgstr "" - -#: neutron/common/exceptions.py:132 -#, python-format -msgid "" -"Unable to complete operation for network %(net_id)s. The mac address " -"%(mac)s is in use." -msgstr "" - -#: neutron/common/exceptions.py:138 -#, python-format -msgid "" -"Unable to complete operation for %(subnet_id)s. The number of host routes" -" exceeds the limit %(quota)s." -msgstr "" - -#: neutron/common/exceptions.py:144 -#, python-format -msgid "" -"Unable to complete operation for %(subnet_id)s. The number of DNS " -"nameservers exceeds the limit %(quota)s." -msgstr "" - -#: neutron/common/exceptions.py:149 -#, python-format -msgid "" -"Unable to complete operation for network %(net_id)s. The IP address " -"%(ip_address)s is in use." -msgstr "" - -#: neutron/common/exceptions.py:154 -#, python-format -msgid "" -"Unable to create the network. The VLAN %(vlan_id)s on physical network " -"%(physical_network)s is in use." -msgstr "" - -#: neutron/common/exceptions.py:160 -#, python-format -msgid "" -"Unable to create the flat network. Physical network %(physical_network)s " -"is in use." -msgstr "" - -#: neutron/common/exceptions.py:165 -#, python-format -msgid "Unable to create the network. The tunnel ID %(tunnel_id)s is in use." -msgstr "" - -#: neutron/common/exceptions.py:170 -msgid "Tenant network creation is not enabled." -msgstr "" - -#: neutron/common/exceptions.py:178 -msgid "" -"Unable to create the network. No tenant network is available for " -"allocation." -msgstr "" - -#: neutron/common/exceptions.py:183 -msgid "" -"Unable to create the network. No available network found in maximum " -"allowed attempts." -msgstr "" - -#: neutron/common/exceptions.py:188 -#, python-format -msgid "" -"Subnet on port %(port_id)s does not match the requested subnet " -"%(subnet_id)s" -msgstr "" - -#: neutron/common/exceptions.py:193 -#, python-format -msgid "Malformed request body: %(reason)s" -msgstr "" - -#: neutron/common/exceptions.py:203 -#, python-format -msgid "Invalid input for operation: %(error_message)s." -msgstr "" - -#: neutron/common/exceptions.py:207 -#, python-format -msgid "The allocation pool %(pool)s is not valid." -msgstr "" - -#: neutron/common/exceptions.py:211 -#, python-format -msgid "" -"Found overlapping allocation pools:%(pool_1)s %(pool_2)s for subnet " -"%(subnet_cidr)s." -msgstr "" - -#: neutron/common/exceptions.py:216 -#, python-format -msgid "The allocation pool %(pool)s spans beyond the subnet cidr %(subnet_cidr)s." -msgstr "" - -#: neutron/common/exceptions.py:221 -#, python-format -msgid "Unable to generate unique mac on network %(net_id)s." -msgstr "" - -#: neutron/common/exceptions.py:225 -#, python-format -msgid "No more IP addresses available on network %(net_id)s." -msgstr "" - -#: neutron/common/exceptions.py:229 -#, python-format -msgid "Bridge %(bridge)s does not exist." -msgstr "" - -#: neutron/common/exceptions.py:233 -#, python-format -msgid "Creation failed. %(dev_name)s already exists." -msgstr "" - -#: neutron/common/exceptions.py:237 -msgid "Sudo privilege is required to run this command." -msgstr "" - -#: neutron/common/exceptions.py:241 -#, python-format -msgid "Unknown quota resources %(unknown)s." -msgstr "" - -#: neutron/common/exceptions.py:245 -#, python-format -msgid "Quota exceeded for resources: %(overs)s" -msgstr "" - -#: neutron/common/exceptions.py:249 -msgid "Tenant-id was missing from Quota request" -msgstr "" - -#: neutron/common/exceptions.py:253 -#, python-format -msgid "" -"Change would make usage less than 0 for the following resources: " -"%(unders)s" -msgstr "" - -#: neutron/common/exceptions.py:258 -#, python-format -msgid "" -"Unable to reconfigure sharing settings for network %(network)s. Multiple " -"tenants are using it" -msgstr "" - -#: neutron/common/exceptions.py:263 -#, python-format -msgid "Invalid extension environment: %(reason)s" -msgstr "" - -#: neutron/common/exceptions.py:267 -#, python-format -msgid "Extensions not found: %(extensions)s" -msgstr "" - -#: neutron/common/exceptions.py:271 -#, python-format -msgid "Invalid content type %(content_type)s" -msgstr "" - -#: neutron/common/exceptions.py:275 -#, python-format -msgid "Unable to find any IP address on external network %(net_id)s." -msgstr "" - -#: neutron/common/exceptions.py:280 -msgid "More than one external network exists" -msgstr "" - -#: neutron/common/exceptions.py:284 -#, python-format -msgid "An invalid value was provided for %(opt_name)s: %(opt_value)s" -msgstr "" - -#: neutron/common/exceptions.py:289 -#, python-format -msgid "Gateway ip %(ip_address)s conflicts with allocation pool %(pool)s" -msgstr "" - -#: neutron/common/exceptions.py:294 -#, python-format -msgid "" -"Current gateway ip %(ip_address)s already in use by port %(port_id)s. " -"Unable to update." -msgstr "" - -#: neutron/common/exceptions.py:299 -#, python-format -msgid "Invalid network VLAN range: '%(vlan_range)s' - '%(error)s'" -msgstr "" - -#: neutron/common/exceptions.py:309 -#, python-format -msgid "Invalid network VXLAN port range: '%(vxlan_range)s'" -msgstr "" - -#: neutron/common/exceptions.py:313 -msgid "VXLAN Network unsupported." -msgstr "" - -#: neutron/common/exceptions.py:317 -#, python-format -msgid "Found duplicate extension: %(alias)s" -msgstr "" - -#: neutron/common/exceptions.py:321 -#, python-format -msgid "" -"The following device_id %(device_id)s is not owned by your tenant or " -"matches another tenants router." -msgstr "" - -#: neutron/common/exceptions.py:326 -#, python-format -msgid "Invalid CIDR %(input)s given as IP prefix" -msgstr "" - -#: neutron/common/ipv6_utils.py:35 -msgid "Unable to generate IP address by EUI64 for IPv4 prefix" -msgstr "" - -#: neutron/common/ipv6_utils.py:42 -#, python-format -msgid "" -"Bad prefix or mac format for generating IPv6 address by EUI-64: " -"%(prefix)s, %(mac)s:" -msgstr "" - -#: neutron/common/ipv6_utils.py:46 -#, python-format -msgid "Bad prefix type for generate IPv6 address by EUI-64: %s" -msgstr "" - -#: neutron/common/utils.py:69 -#, python-format -msgid "" -"Method %(func_name)s cannot be cached due to unhashable parameters: args:" -" %(args)s, kwargs: %(kwargs)s" -msgstr "" - -#: neutron/common/utils.py:92 -#, python-format -msgid "" -"Instance of class %(module)s.%(class)s doesn't contain attribute _cache " -"therefore results cannot be cached for %(func_name)s." -msgstr "" - -#: neutron/common/utils.py:118 neutron/openstack/common/fileutils.py:63 -#, python-format -msgid "Reloading cached file %s" -msgstr "" - -#: neutron/common/utils.py:201 -#: neutron/plugins/sriovnicagent/common/config.py:36 -#, python-format -msgid "Invalid mapping: '%s'" -msgstr "" - -#: neutron/common/utils.py:204 -#: neutron/plugins/sriovnicagent/common/config.py:39 -#, python-format -msgid "Missing key in mapping: '%s'" -msgstr "" - -#: neutron/common/utils.py:207 -#, python-format -msgid "Missing value in mapping: '%s'" -msgstr "" - -#: neutron/common/utils.py:209 -#, python-format -msgid "Key %(key)s in mapping: '%(mapping)s' not unique" -msgstr "" - -#: neutron/common/utils.py:212 -#, python-format -msgid "Value %(value)s in mapping: '%(mapping)s' not unique" -msgstr "" - -#: neutron/db/agents_db.py:37 -msgid "" -"Seconds to regard the agent is down; should be at least twice " -"report_interval, to be sure the agent is down for good." -msgstr "" - -#: neutron/db/agents_db.py:98 -#, python-format -msgid "%(agent_type)s agent %(agent_id)s is not active" -msgstr "" - -#: neutron/db/agents_db.py:111 -#, python-format -msgid "Configuration for agent %(agent_type)s on host %(host)s is invalid." -msgstr "" - -#: neutron/db/agents_db.py:232 -msgid "Message with invalid timestamp received" -msgstr "" - -#: neutron/db/agentschedulers_db.py:37 -msgid "Driver to use for scheduling network to DHCP agent" -msgstr "" - -#: neutron/db/agentschedulers_db.py:39 -msgid "Allow auto scheduling networks to DHCP agent." -msgstr "" - -#: neutron/db/agentschedulers_db.py:41 -msgid "Number of DHCP agents scheduled to host a network." -msgstr "" - -#: neutron/db/common_db_mixin.py:117 -msgid "Cannot create resource for another tenant" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:141 -#, python-format -msgid "Generated mac for network %(network_id)s is %(mac_address)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:147 -#, python-format -msgid "Generated mac %(mac_address)s exists. Remaining attempts %(max_retries)s." -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:151 -#, python-format -msgid "Unable to generate mac address after %s attempts" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:169 -#, python-format -msgid "Delete allocated IP %(ip_address)s (%(network_id)s/%(subnet_id)s)" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:224 -#, python-format -msgid "All IPs from subnet %(subnet_id)s (%(cidr)s) allocated" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:229 -#, python-format -msgid "Allocated IP - %(ip_address)s from %(first_ip)s to %(last_ip)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:236 -msgid "No more free IP's in slice. Deleting allocation pool." -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:255 -#, python-format -msgid "Rebuilding availability ranges for subnet %s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:398 -msgid "IP allocation requires subnet_id or ip_address" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:410 -#, python-format -msgid "IP address %s is not a valid IP for the defined networks subnets" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:416 -#, 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 "IP address %s is not a valid IP for the defined subnet" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:445 neutron/db/db_base_plugin_v2.py:478 -#: neutron/plugins/opencontrail/contrail_plugin.py:388 -msgid "Exceeded maximim amount of fixed ips per port" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:493 -#, python-format -msgid "Port update. Hold %s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:500 -#, python-format -msgid "Port update. Adding %s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:574 -msgid "0 is not allowed as CIDR prefix length" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:584 -#, 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:589 -#, 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:609 -msgid "Performing IP validity checks on allocation pools" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:616 -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:623 -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:627 -#, python-format -msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:632 -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:645 -msgid "Checking for overlaps among allocation pools and gateway ip" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:656 -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:669 neutron/db/db_base_plugin_v2.py:673 -#, python-format -msgid "Invalid route: %s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:751 -#, python-format -msgid "" -"ipv6_ra_mode set to '%(ra_mode)s' with ipv6_address_mode set to " -"'%(addr_mode)s' is not valid. If both attributes are set, they must be " -"the same value" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:759 -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:765 -msgid "Cannot disable enable_dhcp with ipv6 attributes set" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:857 -#, python-format -msgid "An exception occurred while creating the %(resource)s:%(item)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:954 -#, python-format -msgid "%(name)s '%(addr)s' does not match the ip_version '%(ip_version)s'" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:978 -msgid "Gateway is not valid on subnet" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:998 neutron/db/db_base_plugin_v2.py:1012 -#: neutron/plugins/opencontrail/contrail_plugin.py:312 -msgid "new subnet" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:1005 -#, python-format -msgid "Error parsing dns address %s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:1021 -msgid "ipv6_ra_mode is not valid when ip_version is 4" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:1025 -msgid "ipv6_address_mode is not valid when ip_version is 4" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:1395 -#, python-format -msgid "" -"Ignoring PortNotFound when deleting port '%s'. The port has already been " -"deleted." -msgstr "" - -#: neutron/db/dvr_mac_db.py:36 -msgid "The base mac address used for unique DVR instances by Neutron" -msgstr "" - -#: neutron/db/dvr_mac_db.py:96 -#, python-format -msgid "MAC generation error after %s attempts" -msgstr "" - -#: neutron/db/dvr_mac_db.py:168 -#, python-format -msgid "Could not retrieve gateway port for subnet %s" -msgstr "" - -#: neutron/db/extraroute_db.py:36 -msgid "Maximum number of routes" -msgstr "" - -#: neutron/db/extraroute_db.py:91 -msgid "the nexthop is not connected with router" -msgstr "" - -#: neutron/db/extraroute_db.py:96 -msgid "the nexthop is used by router" -msgstr "" - -#: neutron/db/extraroute_db.py:125 -#, python-format -msgid "Added routes are %s" -msgstr "" - -#: neutron/db/extraroute_db.py:133 -#, python-format -msgid "Removed routes are %s" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:48 -msgid "Driver to use for scheduling router to a default L3 agent" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:51 -msgid "Allow auto scheduling of routers to L3 agent." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:53 -msgid "" -"Automatically reschedule routers from offline L3 agents to online L3 " -"agents." -msgstr "" - -#: neutron/db/l3_db.py:230 -#, python-format -msgid "No eligible l3 agent associated with external network %s found" -msgstr "" - -#: neutron/db/l3_db.py:251 -#, python-format -msgid "No IPs available for external network %s" -msgstr "" - -#: neutron/db/l3_db.py:265 -#, python-format -msgid "Network %s is not an external network" -msgstr "" - -#: neutron/db/l3_db.py:377 -#, python-format -msgid "Router already has a port on subnet %s" -msgstr "" - -#: neutron/db/l3_db.py:391 -#, 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:407 neutron/db/l3_db.py:534 neutron/db/l3_dvr_db.py:210 -#: neutron/plugins/bigswitch/l3_router_plugin.py:170 -#: neutron/plugins/bigswitch/l3_router_plugin.py:179 -#: neutron/plugins/opencontrail/contrail_plugin.py:499 -msgid "Either subnet_id or port_id must be specified" -msgstr "" - -#: neutron/db/l3_db.py:410 neutron/plugins/opencontrail/contrail_plugin.py:509 -msgid "Cannot specify both subnet-id and port-id" -msgstr "" - -#: neutron/db/l3_db.py:423 -msgid "Router port must have exactly one fixed IP" -msgstr "" - -#: neutron/db/l3_db.py:437 -msgid "Subnet for router interface must have a gateway IP" -msgstr "" - -#: neutron/db/l3_db.py:580 neutron/plugins/nec/nec_router.py:197 -#, python-format -msgid "Cannot add floating IP to port on subnet %s which has no gateway_ip" -msgstr "" - -#: neutron/db/l3_db.py:616 -#, 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:620 -#, 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:632 -#, python-format -msgid "Port %(id)s does not have fixed ip %(address)s" -msgstr "" - -#: neutron/db/l3_db.py:639 -#, python-format -msgid "Cannot add floating IP to port %s that hasno fixed IP addresses" -msgstr "" - -#: neutron/db/l3_db.py:643 -#, 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:673 neutron/plugins/vmware/plugins/base.py:1804 -msgid "fixed_ip_address cannot be specified without a port_id" -msgstr "" - -#: neutron/db/l3_db.py:713 -#, python-format -msgid "Network %s is not a valid external network" -msgstr "" - -#: neutron/db/l3_db.py:846 -#, python-format -msgid "" -"Port %(port_id)s has owner %(port_owner)s, but no IP address, so it can " -"be deleted" -msgstr "" - -#: neutron/db/l3_db.py:960 -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "" - -#: neutron/db/l3_dvr_db.py:42 -msgid "" -"System-wide flag to determine the type of router that tenants can create." -" Only admin can override." -msgstr "" - -#: neutron/db/l3_dvr_db.py:76 -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "" - -#: neutron/db/l3_dvr_db.py:404 -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvr_db.py:419 -msgid "Unable to create the Agent Gateway Port" -msgstr "" - -#: neutron/db/l3_dvr_db.py:445 -msgid "Unable to create the SNAT Interface Port" -msgstr "" - -#: neutron/db/l3_dvr_db.py:469 -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "" - -#: neutron/db/l3_dvrscheduler_db.py:307 -msgid "No active L3 agents found for SNAT" -msgstr "" - -#: neutron/db/l3_hamode_db.py:42 -msgid "Enable HA mode for virtual routers." -msgstr "" - -#: neutron/db/l3_hamode_db.py:45 -msgid "Maximum number of agents on which a router will be scheduled." -msgstr "" - -#: neutron/db/l3_hamode_db.py:49 -msgid "Minimum number of agents on which a router will be scheduled." -msgstr "" - -#: neutron/db/l3_hamode_db.py:53 -msgid "Subnet used for the l3 HA admin network." -msgstr "" - -#: neutron/db/routedserviceinsertion_db.py:36 -#, python-format -msgid "Resource type '%(resource_type)s' is longer than %(maxlen)d characters" -msgstr "" - -#: neutron/db/securitygroups_rpc_base.py:58 -#, python-format -msgid "%s must implement get_port_from_device." -msgstr "" - -#: neutron/db/securitygroups_rpc_base.py:338 -#, python-format -msgid "No valid gateway port on subnet %s is found for IPv6 RA" -msgstr "" - -#: neutron/db/sqlalchemyutils.py:73 -#, python-format -msgid "%s is invalid attribute for sort_key" -msgstr "" - -#: neutron/db/sqlalchemyutils.py:76 -#, python-format -msgid "" -"The attribute '%(attr)s' is reference to other resource, can't used by " -"sort '%(resource)s'" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:241 -#: neutron/plugins/vmware/plugins/service.py:907 -#: neutron/services/firewall/fwaas_plugin.py:218 -msgid "create_firewall() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:262 -#: neutron/plugins/vmware/plugins/service.py:941 -#: neutron/services/firewall/fwaas_plugin.py:232 -msgid "update_firewall() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:271 -#: neutron/plugins/vmware/plugins/service.py:967 -#: neutron/services/firewall/fwaas_plugin.py:247 -msgid "delete_firewall() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:280 -msgid "get_firewall() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:285 -msgid "get_firewalls() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:291 -msgid "get_firewalls_count() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:296 -msgid "create_firewall_policy() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:312 -#: neutron/plugins/vmware/plugins/service.py:1029 -#: neutron/services/firewall/fwaas_plugin.py:256 -msgid "update_firewall_policy() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:326 -msgid "delete_firewall_policy() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:338 -msgid "get_firewall_policy() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:343 -msgid "get_firewall_policies() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:349 -msgid "get_firewall_policies_count() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:354 -msgid "create_firewall_rule() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:386 -#: neutron/plugins/vmware/plugins/service.py:1003 -#: neutron/services/firewall/fwaas_plugin.py:264 -msgid "update_firewall_rule() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:418 -msgid "delete_firewall_rule() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:426 -msgid "get_firewall_rule() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:431 -msgid "get_firewall_rules() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:437 -msgid "get_firewall_rules_count() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:446 -#: neutron/plugins/vmware/plugins/service.py:1056 -#: neutron/services/firewall/fwaas_plugin.py:274 -msgid "insert_rule() called" -msgstr "" - -#: neutron/db/firewall/firewall_db.py:490 -#: neutron/plugins/vmware/plugins/service.py:1085 -#: neutron/services/firewall/fwaas_plugin.py:282 -msgid "remove_rule() called" -msgstr "" - -#: neutron/db/loadbalancer/loadbalancer_db.py:68 -#, python-format -msgid "The %(key)s field can not have negative value. Current value is %(value)d." -msgstr "" - -#: neutron/db/loadbalancer/loadbalancer_db.py:275 -msgid "'cookie_name' should be specified for this type of session persistence." -msgstr "" - -#: neutron/db/loadbalancer/loadbalancer_db.py:279 -msgid "'cookie_name' is not allowed for this type of session persistence" -msgstr "" - -#: neutron/db/metering/metering_rpc.py:46 -#, python-format -msgid "Unable to find agent %s." -msgstr "" - -#: neutron/db/migration/__init__.py:44 -#, python-format -msgid "%s cannot be called while in offline mode" -msgstr "" - -#: neutron/db/migration/cli.py:32 -msgid "Neutron plugin provider module" -msgstr "" - -#: neutron/db/migration/cli.py:41 -msgid "Neutron quota driver class" -msgstr "" - -#: neutron/db/migration/cli.py:49 -msgid "URL to database" -msgstr "" - -#: neutron/db/migration/cli.py:52 -msgid "Database engine" -msgstr "" - -#: neutron/db/migration/cli.py:75 -msgid "You must provide a revision or relative delta" -msgstr "" - -#: neutron/db/migration/cli.py:105 neutron/db/migration/cli.py:118 -msgid "Timeline branches unable to generate timeline" -msgstr "" - -#: neutron/db/migration/cli.py:112 -msgid "HEAD file does not match migration timeline head" -msgstr "" - -#: neutron/db/migration/cli.py:158 -msgid "Available commands" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:89 -msgid "Missing version in alembic_versions table" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:91 -#, python-format -msgid "Multiple versions in alembic_versions table: %s" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:95 -#, python-format -msgid "" -"Unsupported database schema %(current)s. Please migrate your database to " -"one of following versions: %(supported)s" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:415 -#, python-format -msgid "Unknown tunnel type: %s" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:429 -msgid "The plugin type whose database will be migrated" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:432 -msgid "The connection url for the target db" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:435 -#, python-format -msgid "The %s tunnel type to migrate from" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:438 -#: neutron/plugins/openvswitch/common/config.py:80 -msgid "The UDP port to use for VXLAN tunnels." -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:441 -msgid "Retain the old plugin's tables" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:447 -#, python-format -msgid "" -"Tunnel args (tunnel-type and vxlan-udp-port) are not valid for the %s " -"plugin" -msgstr "" - -#: neutron/db/migration/migrate_to_ml2.py:454 -#, python-format -msgid "" -"Support for migrating %(plugin)s for release %(release)s is not yet " -"implemented" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:228 -#, python-format -msgid "Detected removed foreign key %(fk)r on table %(table)r" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:232 -#, python-format -msgid "Detected added foreign key for column %(fk)r on table %(table)r" -msgstr "" - -#: neutron/db/migration/alembic_migrations/heal_script.py:253 -#, python-format -msgid "Table %(old_t)r was renamed to %(new_t)r" -msgstr "" - -#: neutron/db/vpn/vpn_db.py:651 -#, python-format -msgid "vpnservice %s in db is already deleted" -msgstr "" - -#: neutron/debug/commands.py:33 -msgid "Unimplemented commands" -msgstr "" - -#: neutron/debug/commands.py:45 -msgid "ID of network to probe" -msgstr "" - -#: neutron/debug/commands.py:49 -msgid "Owner type of the device: network/compute" -msgstr "" - -#: neutron/debug/commands.py:57 -#, python-format -msgid "Probe created : %s " -msgstr "" - -#: neutron/debug/commands.py:69 -msgid "ID of probe port to delete" -msgstr "" - -#: neutron/debug/commands.py:76 -#, python-format -msgid "Probe %s deleted" -msgstr "" - -#: neutron/debug/commands.py:119 -msgid "ID of probe port to execute command" -msgstr "" - -#: neutron/debug/commands.py:124 -msgid "Command to execute" -msgstr "" - -#: neutron/debug/commands.py:144 -msgid "Ping timeout" -msgstr "" - -#: neutron/debug/commands.py:148 -msgid "ID of network" -msgstr "" - -#: neutron/debug/debug_agent.py:122 -#, python-format -msgid "Failed to delete namespace %s" -msgstr "" - -#: neutron/debug/shell.py:61 -msgid "Config file for interface driver (You may also use l3_agent.ini)" -msgstr "" - -#: neutron/debug/shell.py:69 -msgid "" -"You must provide a config file for bridge - either --config-file or " -"env[NEUTRON_TEST_CONFIG_FILE]" -msgstr "" - -#: neutron/extensions/agent.py:61 -#, python-format -msgid "Agent %(id)s could not be found" -msgstr "" - -#: neutron/extensions/agent.py:65 -#, python-format -msgid "Agent with agent_type=%(agent_type)s and host=%(host)s could not be found" -msgstr "" - -#: neutron/extensions/agent.py:70 -#, python-format -msgid "Multiple agents with agent_type=%(agent_type)s and host=%(host)s found" -msgstr "" - -#: neutron/extensions/allowedaddresspairs.py:24 -msgid "Maximum number of allowed address pairs" -msgstr "" - -#: neutron/extensions/allowedaddresspairs.py:31 -msgid "AllowedAddressPair must contain ip_address" -msgstr "" - -#: neutron/extensions/allowedaddresspairs.py:35 -msgid "" -"Port Security must be enabled in order to have allowed address pairs on a" -" port." -msgstr "" - -#: neutron/extensions/allowedaddresspairs.py:40 -#, python-format -msgid "" -"Request contains duplicate address pair: mac_address %(mac_address)s " -"ip_address %(ip_address)s." -msgstr "" - -#: neutron/extensions/allowedaddresspairs.py:45 -#, python-format -msgid "The number of allowed address pair exceeds the maximum %(quota)s." -msgstr "" - -#: neutron/extensions/dhcpagentscheduler.py:127 -#, python-format -msgid "Agent %(id)s is not a valid DHCP Agent or has been disabled" -msgstr "" - -#: neutron/extensions/dhcpagentscheduler.py:131 -#, python-format -msgid "" -"The network %(network_id)s has been already hosted by the DHCP Agent " -"%(agent_id)s." -msgstr "" - -#: neutron/extensions/dhcpagentscheduler.py:136 -#, python-format -msgid "The network %(network_id)s is not hosted by the DHCP agent %(agent_id)s." -msgstr "" - -#: neutron/extensions/dvr.py:37 -#, python-format -msgid "Distributed Virtual Router Mac Address for host %(host)s does not exist." -msgstr "" - -#: neutron/extensions/dvr.py:42 -#, python-format -msgid "Unable to generate unique DVR mac for host %(host)s." -msgstr "" - -#: neutron/extensions/external_net.py:23 -#, python-format -msgid "" -"External network %(net_id)s cannot be updated to be made non-external, " -"since it has existing gateway ports" -msgstr "" - -#: neutron/extensions/external_net.py:51 -msgid "Adds external network attribute to network resource." -msgstr "" - -#: neutron/extensions/extra_dhcp_opt.py:25 -#, python-format -msgid "ExtraDhcpOpt %(id)s could not be found" -msgstr "" - -#: neutron/extensions/extra_dhcp_opt.py:29 -#, python-format -msgid "Invalid data format for extra-dhcp-opt: %(data)s" -msgstr "" - -#: neutron/extensions/extraroute.py:23 -#, python-format -msgid "Invalid format for routes: %(routes)s, %(reason)s" -msgstr "" - -#: neutron/extensions/extraroute.py:27 -#, python-format -msgid "" -"Router interface for subnet %(subnet_id)s on router %(router_id)s cannot " -"be deleted, as it is required by one or more routes." -msgstr "" - -#: neutron/extensions/extraroute.py:33 -#, python-format -msgid "" -"Unable to complete operation for %(router_id)s. The number of routes " -"exceeds the maximum %(quota)s." -msgstr "" - -#: neutron/extensions/firewall.py:37 -#, python-format -msgid "Firewall %(firewall_id)s could not be found." -msgstr "" - -#: neutron/extensions/firewall.py:41 -#, python-format -msgid "Firewall %(firewall_id)s is still active." -msgstr "" - -#: neutron/extensions/firewall.py:45 -#, python-format -msgid "" -"Operation cannot be performed since associated Firewall %(firewall_id)s " -"is in %(pending_state)s." -msgstr "" - -#: neutron/extensions/firewall.py:50 -#, python-format -msgid "Firewall Policy %(firewall_policy_id)s could not be found." -msgstr "" - -#: neutron/extensions/firewall.py:54 -#, python-format -msgid "Firewall Policy %(firewall_policy_id)s is being used." -msgstr "" - -#: neutron/extensions/firewall.py:58 -#, python-format -msgid "Firewall Rule %(firewall_rule_id)s could not be found." -msgstr "" - -#: neutron/extensions/firewall.py:62 -#, python-format -msgid "Firewall Rule %(firewall_rule_id)s is being used." -msgstr "" - -#: neutron/extensions/firewall.py:66 -#, python-format -msgid "" -"Firewall Rule %(firewall_rule_id)s is not associated with Firewall " -"Policy %(firewall_policy_id)s." -msgstr "" - -#: neutron/extensions/firewall.py:71 -#, python-format -msgid "" -"Firewall Rule protocol %(protocol)s is not supported. Only protocol " -"values %(values)s and their integer representation (0 to 255) are " -"supported." -msgstr "" - -#: neutron/extensions/firewall.py:77 -#, python-format -msgid "" -"Firewall rule action %(action)s is not supported. Only action values " -"%(values)s are supported." -msgstr "" - -#: neutron/extensions/firewall.py:82 -#, python-format -msgid "%(param)s are not allowed when protocol is set to ICMP." -msgstr "" - -#: neutron/extensions/firewall.py:87 -msgid "Source/destination port requires a protocol" -msgstr "" - -#: neutron/extensions/firewall.py:91 -#, python-format -msgid "Invalid value for port %(port)s." -msgstr "" - -#: neutron/extensions/firewall.py:95 -msgid "Missing rule info argument for insert/remove rule operation." -msgstr "" - -#: neutron/extensions/firewall.py:105 -#, python-format -msgid "%(driver)s: Internal driver error." -msgstr "" - -#: neutron/extensions/firewall.py:154 -#, python-format -msgid "Port '%s' is not a valid number" -msgstr "" - -#: neutron/extensions/firewall.py:158 -#, python-format -msgid "Invalid port '%s'" -msgstr "" - -#: neutron/extensions/firewall.py:172 -#, python-format -msgid "%(msg_ip)s and %(msg_subnet)s" -msgstr "" - -#: neutron/extensions/firewall.py:293 -msgid "Number of firewalls allowed per tenant. A negative value means unlimited." -msgstr "" - -#: neutron/extensions/firewall.py:297 -msgid "" -"Number of firewall policies allowed per tenant. A negative value means " -"unlimited." -msgstr "" - -#: neutron/extensions/firewall.py:301 -msgid "" -"Number of firewall rules allowed per tenant. A negative value means " -"unlimited." -msgstr "" - -#: neutron/extensions/l3.py:29 -#, python-format -msgid "Router %(router_id)s could not be found" -msgstr "" - -#: neutron/extensions/l3.py:33 -#, python-format -msgid "Router %(router_id)s still has ports" -msgstr "" - -#: neutron/extensions/l3.py:37 -#, python-format -msgid "Router %(router_id)s does not have an interface with id %(port_id)s" -msgstr "" - -#: neutron/extensions/l3.py:42 -#, python-format -msgid "Router %(router_id)s has no interface on subnet %(subnet_id)s" -msgstr "" - -#: neutron/extensions/l3.py:47 -#, python-format -msgid "" -"Router interface for subnet %(subnet_id)s on router %(router_id)s cannot " -"be deleted, as it is required by one or more floating IPs." -msgstr "" - -#: neutron/extensions/l3.py:53 -#, python-format -msgid "Floating IP %(floatingip_id)s could not be found" -msgstr "" - -#: neutron/extensions/l3.py:57 -#, python-format -msgid "" -"External network %(external_network_id)s is not reachable from subnet " -"%(subnet_id)s. Therefore, cannot associate Port %(port_id)s with a " -"Floating IP." -msgstr "" - -#: neutron/extensions/l3.py:63 -#, python-format -msgid "" -"Cannot associate floating IP %(floating_ip_address)s (%(fip_id)s) with " -"port %(port_id)s using fixed IP %(fixed_ip)s, as that fixed IP already " -"has a floating IP on external network %(net_id)s." -msgstr "" - -#: neutron/extensions/l3.py:70 -#, python-format -msgid "" -"Port %(port_id)s has owner %(device_owner)s and therefore cannot be " -"deleted directly via the port API." -msgstr "" - -#: neutron/extensions/l3.py:75 -#, python-format -msgid "" -"Gateway cannot be updated for router %(router_id)s, since a gateway to " -"external network %(net_id)s is required by one or more floating IPs." -msgstr "" - -#: neutron/extensions/l3.py:138 -msgid "Number of routers allowed per tenant. A negative value means unlimited." -msgstr "" - -#: neutron/extensions/l3.py:142 -msgid "" -"Number of floating IPs allowed per tenant. A negative value means " -"unlimited." -msgstr "" - -#: neutron/extensions/l3_ext_ha_mode.py:33 -msgid "Currenly distributed HA routers are not supported." -msgstr "" - -#: neutron/extensions/l3_ext_ha_mode.py:38 -#, python-format -msgid "" -"Failed to allocate a VRID in the network %(network_id)s for the router " -"%(router_id)s after %(max_tries)s tries." -msgstr "" - -#: neutron/extensions/l3_ext_ha_mode.py:43 -#, python-format -msgid "" -"No more Virtual Router Identifier (VRID) available when creating router " -"%(router_id)s. The limit of number of HA Routers per tenant is 254." -msgstr "" - -#: neutron/extensions/l3_ext_ha_mode.py:49 -#, python-format -msgid "" -"The HA Network CIDR specified in the configuration file isn't valid; " -"%(cidr)s." -msgstr "" - -#: neutron/extensions/l3_ext_ha_mode.py:54 -#, python-format -msgid "" -"Not enough l3 agents available to ensure HA. Minimum required " -"%(min_agents)s, available %(num_agents)s." -msgstr "" - -#: neutron/extensions/l3_ext_ha_mode.py:59 -#, python-format -msgid "" -"min_l3_agents_per_router config parameter is not valid. It has to be " -"equal to or more than %s for HA." -msgstr "" - -#: neutron/extensions/l3agentscheduler.py:48 -#: neutron/extensions/l3agentscheduler.py:91 -msgid "No plugin for L3 routing registered to handle router scheduling" -msgstr "" - -#: neutron/extensions/l3agentscheduler.py:157 -#, python-format -msgid "Agent %(id)s is not a L3 Agent or has been disabled" -msgstr "" - -#: neutron/extensions/l3agentscheduler.py:161 -#, python-format -msgid "" -"The router %(router_id)s has been already hosted by the L3 Agent " -"%(agent_id)s." -msgstr "" - -#: neutron/extensions/l3agentscheduler.py:166 -#, python-format -msgid "Failed scheduling router %(router_id)s to the L3 Agent %(agent_id)s." -msgstr "" - -#: neutron/extensions/l3agentscheduler.py:171 -#, python-format -msgid "Failed rescheduling router %(router_id)s: no eligible l3 agent found." -msgstr "" - -#: neutron/extensions/l3agentscheduler.py:176 -#, python-format -msgid "The router %(router_id)s is not hosted by L3 agent %(agent_id)s." -msgstr "" - -#: neutron/extensions/l3agentscheduler.py:181 -#, python-format -msgid "" -"Cannot host %(router_type)s router %(router_id)s on %(agent_mode)s L3 " -"agent %(agent_id)s." -msgstr "" - -#: neutron/extensions/lbaas_agentscheduler.py:116 -#, python-format -msgid "No eligible loadbalancer agent found for pool %(pool_id)s." -msgstr "" - -#: neutron/extensions/lbaas_agentscheduler.py:121 -#, python-format -msgid "No active loadbalancer agent found for pool %(pool_id)s." -msgstr "" - -#: neutron/extensions/loadbalancer.py:33 -msgid "Delay must be greater than or equal to timeout" -msgstr "" - -#: neutron/extensions/loadbalancer.py:37 -#, python-format -msgid "No eligible backend for pool %(pool_id)s" -msgstr "" - -#: neutron/extensions/loadbalancer.py:41 -#, python-format -msgid "Vip %(vip_id)s could not be found" -msgstr "" - -#: neutron/extensions/loadbalancer.py:45 -#, python-format -msgid "Another Vip already exists for pool %(pool_id)s" -msgstr "" - -#: neutron/extensions/loadbalancer.py:49 -#, python-format -msgid "Pool %(pool_id)s could not be found" -msgstr "" - -#: neutron/extensions/loadbalancer.py:53 -#, python-format -msgid "Member %(member_id)s could not be found" -msgstr "" - -#: neutron/extensions/loadbalancer.py:57 -#, python-format -msgid "Health_monitor %(monitor_id)s could not be found" -msgstr "" - -#: neutron/extensions/loadbalancer.py:61 -#, python-format -msgid "Monitor %(monitor_id)s is not associated with Pool %(pool_id)s" -msgstr "" - -#: neutron/extensions/loadbalancer.py:66 -#, python-format -msgid "health_monitor %(monitor_id)s is already associated with pool %(pool_id)s" -msgstr "" - -#: neutron/extensions/loadbalancer.py:71 -#, python-format -msgid "Invalid state %(state)s of Loadbalancer resource %(id)s" -msgstr "" - -#: neutron/extensions/loadbalancer.py:75 -#, python-format -msgid "Pool %(pool_id)s is still in use" -msgstr "" - -#: neutron/extensions/loadbalancer.py:79 -#, python-format -msgid "Health monitor %(monitor_id)s still has associations with pools" -msgstr "" - -#: neutron/extensions/loadbalancer.py:84 -#, python-format -msgid "Statistics of Pool %(pool_id)s could not be found" -msgstr "" - -#: neutron/extensions/loadbalancer.py:88 -#, python-format -msgid "Protocol %(vip_proto)s does not match pool protocol %(pool_proto)s" -msgstr "" - -#: neutron/extensions/loadbalancer.py:93 -#, python-format -msgid "" -"Member with address %(address)s and port %(port)s already present in pool" -" %(pool)s" -msgstr "" - -#: neutron/extensions/loadbalancer.py:309 -msgid "Number of vips allowed per tenant. A negative value means unlimited." -msgstr "" - -#: neutron/extensions/loadbalancer.py:313 -msgid "Number of pools allowed per tenant. A negative value means unlimited." -msgstr "" - -#: neutron/extensions/loadbalancer.py:317 -msgid "" -"Number of pool members allowed per tenant. A negative value means " -"unlimited." -msgstr "" - -#: neutron/extensions/loadbalancer.py:321 -msgid "" -"Number of health monitors allowed per tenant. A negative value means " -"unlimited." -msgstr "" - -#: neutron/extensions/metering.py:33 -#, python-format -msgid "Metering label %(label_id)s does not exist" -msgstr "" - -#: neutron/extensions/metering.py:37 -msgid "Duplicate Metering Rule in POST." -msgstr "" - -#: neutron/extensions/metering.py:41 -#, python-format -msgid "Metering label rule %(rule_id)s does not exist" -msgstr "" - -#: neutron/extensions/metering.py:45 -#, python-format -msgid "" -"Metering label rule with remote_ip_prefix %(remote_ip_prefix)s overlaps " -"another" -msgstr "" - -#: neutron/extensions/multiprovidernet.py:27 -msgid "Segments and provider values cannot both be set." -msgstr "" - -#: neutron/extensions/multiprovidernet.py:31 -msgid "Duplicate segment entry in request." -msgstr "" - -#: neutron/extensions/portsecurity.py:20 -msgid "" -"Port has security group associated. Cannot disable port security or ip " -"address until security group is removed" -msgstr "" - -#: neutron/extensions/portsecurity.py:25 -msgid "" -"Port security must be enabled and port must have an IP address in order " -"to use security groups." -msgstr "" - -#: neutron/extensions/portsecurity.py:30 -msgid "Port does not have port security binding." -msgstr "" - -#: neutron/extensions/providernet.py:54 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:272 -msgid "Plugin does not support updating provider attributes" -msgstr "" - -#: neutron/extensions/quotasv2.py:67 -msgid "POST requests are not supported on this resource." -msgstr "" - -#: neutron/extensions/quotasv2.py:86 -msgid "Only admin is authorized to access quotas for another tenant" -msgstr "" - -#: neutron/extensions/quotasv2.py:91 -msgid "Only admin can view or configure quota" -msgstr "" - -#: neutron/extensions/securitygroup.py:34 -msgid "For TCP/UDP protocols, port_range_min must be <= port_range_max" -msgstr "" - -#: neutron/extensions/securitygroup.py:39 -#, python-format -msgid "Invalid value for port %(port)s" -msgstr "" - -#: neutron/extensions/securitygroup.py:43 -#, python-format -msgid "" -"Invalid value for ICMP %(field)s (%(attr)s) %(value)s. It must be 0 to " -"255." -msgstr "" - -#: neutron/extensions/securitygroup.py:48 -#, python-format -msgid "" -"ICMP code (port-range-max) %(value)s is provided but ICMP type (port-" -"range-min) is missing." -msgstr "" - -#: neutron/extensions/securitygroup.py:53 -#, python-format -msgid "Security Group %(id)s in use." -msgstr "" - -#: neutron/extensions/securitygroup.py:57 -msgid "Removing default security group not allowed." -msgstr "" - -#: neutron/extensions/securitygroup.py:61 -msgid "Updating default security group not allowed." -msgstr "" - -#: neutron/extensions/securitygroup.py:65 -msgid "Default security group already exists." -msgstr "" - -#: neutron/extensions/securitygroup.py:69 -#, python-format -msgid "" -"Security group rule protocol %(protocol)s not supported. Only protocol " -"values %(values)s and their integer representation (0 to 255) are " -"supported." -msgstr "" - -#: neutron/extensions/securitygroup.py:75 -msgid "Multiple tenant_ids in bulk security group rule create not allowed" -msgstr "" - -#: neutron/extensions/securitygroup.py:80 -msgid "Only remote_ip_prefix or remote_group_id may be provided." -msgstr "" - -#: neutron/extensions/securitygroup.py:85 -msgid "Must also specifiy protocol if port range is given." -msgstr "" - -#: neutron/extensions/securitygroup.py:89 -msgid "Only allowed to update rules for one security profile at a time" -msgstr "" - -#: neutron/extensions/securitygroup.py:94 -#, python-format -msgid "Security group %(id)s does not exist" -msgstr "" - -#: neutron/extensions/securitygroup.py:98 -#, python-format -msgid "Security group rule %(id)s does not exist" -msgstr "" - -#: neutron/extensions/securitygroup.py:102 -msgid "Duplicate Security Group Rule in POST." -msgstr "" - -#: neutron/extensions/securitygroup.py:106 -#, python-format -msgid "Security group rule already exists. Rule id is %(id)s." -msgstr "" - -#: neutron/extensions/securitygroup.py:110 -#, python-format -msgid "Conflicting value ethertype %(ethertype)s for CIDR %(cidr)s" -msgstr "" - -#: neutron/extensions/securitygroup.py:158 -#, python-format -msgid "'%s' is not an integer or uuid" -msgstr "" - -#: neutron/extensions/securitygroup.py:247 -msgid "" -"Number of security groups allowed per tenant. A negative value means " -"unlimited." -msgstr "" - -#: neutron/extensions/securitygroup.py:251 -msgid "" -"Number of security rules allowed per tenant. A negative value means " -"unlimited." -msgstr "" - -#: neutron/extensions/servicetype.py:52 -msgid "Neutron Service Type Management" -msgstr "" - -#: neutron/extensions/servicetype.py:60 -msgid "API for retrieving service providers for Neutron advanced services" -msgstr "" - -#: neutron/extensions/vpnaas.py:31 -#, python-format -msgid "VPNService %(vpnservice_id)s could not be found" -msgstr "" - -#: neutron/extensions/vpnaas.py:35 -#, python-format -msgid "ipsec_site_connection %(ipsec_site_conn_id)s not found" -msgstr "" - -#: neutron/extensions/vpnaas.py:39 -#, python-format -msgid "ipsec_site_connection %(attr)s is equal to or less than dpd_interval" -msgstr "" - -#: neutron/extensions/vpnaas.py:44 -#, python-format -msgid "ipsec_site_connection MTU %(mtu)d is too small for ipv%(version)s" -msgstr "" - -#: neutron/extensions/vpnaas.py:49 -#, python-format -msgid "IKEPolicy %(ikepolicy_id)s could not be found" -msgstr "" - -#: neutron/extensions/vpnaas.py:53 -#, python-format -msgid "IPsecPolicy %(ipsecpolicy_id)s could not be found" -msgstr "" - -#: neutron/extensions/vpnaas.py:57 -#, python-format -msgid "" -"IKEPolicy %(ikepolicy_id)s is in use by existing IPsecSiteConnection and " -"can't be updated or deleted" -msgstr "" - -#: neutron/extensions/vpnaas.py:62 -#, python-format -msgid "VPNService %(vpnservice_id)s is still in use" -msgstr "" - -#: neutron/extensions/vpnaas.py:66 -#, python-format -msgid "Router %(router_id)s is used by VPNService %(vpnservice_id)s" -msgstr "" - -#: neutron/extensions/vpnaas.py:70 -#, python-format -msgid "Invalid state %(state)s of vpnaas resource %(id)s for updating" -msgstr "" - -#: neutron/extensions/vpnaas.py:75 -#, python-format -msgid "" -"IPsecPolicy %(ipsecpolicy_id)s is in use by existing IPsecSiteConnection " -"and can't be updated or deleted" -msgstr "" - -#: neutron/extensions/vpnaas.py:80 -#, python-format -msgid "Can not load driver :%(device_driver)s" -msgstr "" - -#: neutron/extensions/vpnaas.py:84 -#, python-format -msgid "Subnet %(subnet_id)s is not connected to Router %(router_id)s" -msgstr "" - -#: neutron/extensions/vpnaas.py:89 -#, python-format -msgid "Router %(router_id)s has no external network gateway set" -msgstr "" - -#: neutron/notifiers/nova.py:165 -msgid "device_id is not set on port yet." -msgstr "" - -#: neutron/notifiers/nova.py:169 -msgid "Port ID not set! Nova will not be notified of port status change." -msgstr "" - -#: neutron/notifiers/nova.py:194 -#, python-format -msgid "" -"Ignoring state change previous_port_status: %(pre_status)s " -"current_port_status: %(cur_status)s port_id %(id)s" -msgstr "" - -#: neutron/notifiers/nova.py:220 -#, python-format -msgid "Sending events: %s" -msgstr "" - -#: neutron/notifiers/nova.py:225 -#, python-format -msgid "Nova returned NotFound for event: %s" -msgstr "" - -#: neutron/notifiers/nova.py:228 -#, python-format -msgid "Failed to notify nova on events: %s" -msgstr "" - -#: neutron/notifiers/nova.py:232 neutron/notifiers/nova.py:248 -#, python-format -msgid "Error response returned from nova: %s" -msgstr "" - -#: neutron/notifiers/nova.py:243 -#, python-format -msgid "Nova event: %s returned with failed status" -msgstr "" - -#: neutron/notifiers/nova.py:246 -#, python-format -msgid "Nova event response: %s" -msgstr "" - -#: neutron/openstack/common/eventlet_backdoor.py:140 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "" - -#: neutron/openstack/common/gettextutils.py:320 -msgid "Message objects do not support addition." -msgstr "" - -#: neutron/openstack/common/gettextutils.py:330 -msgid "" -"Message objects do not support str() because they may contain non-ascii " -"characters. Please use unicode() or translate() instead." -msgstr "" - -#: neutron/openstack/common/lockutils.py:103 -#, python-format -msgid "Could not release the acquired lock `%s`" -msgstr "" - -#: neutron/openstack/common/lockutils.py:168 -#, python-format -msgid "Got semaphore \"%(lock)s\"" -msgstr "" - -#: neutron/openstack/common/lockutils.py:177 -#, python-format -msgid "Attempting to grab file lock \"%(lock)s\"" -msgstr "" - -#: neutron/openstack/common/lockutils.py:187 -#, python-format -msgid "Created lock path: %s" -msgstr "" - -#: neutron/openstack/common/lockutils.py:205 -#, python-format -msgid "Got file lock \"%(lock)s\" at %(path)s" -msgstr "" - -#: neutron/openstack/common/lockutils.py:209 -#, python-format -msgid "Released file lock \"%(lock)s\" at %(path)s" -msgstr "" - -#: neutron/openstack/common/lockutils.py:247 -#, python-format -msgid "Got semaphore / lock \"%(function)s\"" -msgstr "" - -#: neutron/openstack/common/lockutils.py:251 -#, python-format -msgid "Semaphore / lock released \"%(function)s\"" -msgstr "" - -#: neutron/openstack/common/log.py:327 -#, python-format -msgid "Deprecated: %s" -msgstr "" - -#: neutron/openstack/common/log.py:436 -#, python-format -msgid "Error loading logging config %(log_config)s: %(err_msg)s" -msgstr "" - -#: neutron/openstack/common/log.py:486 -#, python-format -msgid "syslog facility must be one of: %s" -msgstr "" - -#: neutron/openstack/common/log.py:729 -#, python-format -msgid "Fatal call to deprecated config: %(msg)s" -msgstr "" - -#: neutron/openstack/common/loopingcall.py:82 -#, python-format -msgid "task run outlasted interval by %s sec" -msgstr "" - -#: neutron/openstack/common/loopingcall.py:89 -msgid "in fixed duration looping call" -msgstr "" - -#: neutron/openstack/common/loopingcall.py:129 -#, python-format -msgid "Dynamic looping call sleeping for %.02f seconds" -msgstr "" - -#: neutron/openstack/common/loopingcall.py:136 -msgid "in dynamic looping call" -msgstr "" - -#: neutron/openstack/common/periodic_task.py:40 -#, python-format -msgid "Unexpected argument for periodic task creation: %(arg)s." -msgstr "" - -#: neutron/openstack/common/policy.py:395 -#, python-format -msgid "Failed to understand rule %(rule)s" -msgstr "" - -#: neutron/openstack/common/policy.py:405 -#, python-format -msgid "No handler for matches of kind %s" -msgstr "" - -#: neutron/openstack/common/policy.py:680 -#, python-format -msgid "Failed to understand rule %(rule)r" -msgstr "" - -#: neutron/openstack/common/processutils.py:130 -#, python-format -msgid "Got unknown keyword args to utils.execute: %r" -msgstr "" - -#: neutron/openstack/common/processutils.py:145 -#, python-format -msgid "Running cmd (subprocess): %s" -msgstr "" - -#: neutron/openstack/common/processutils.py:169 -#: neutron/openstack/common/processutils.py:241 -#, python-format -msgid "Result was %s" -msgstr "" - -#: neutron/openstack/common/processutils.py:181 -#, python-format -msgid "%r failed. Retrying." -msgstr "" - -#: neutron/openstack/common/processutils.py:220 -#, python-format -msgid "Running cmd (SSH): %s" -msgstr "" - -#: neutron/openstack/common/processutils.py:222 -msgid "Environment not supported over SSH" -msgstr "" - -#: neutron/openstack/common/processutils.py:226 -msgid "process_input not supported over SSH" -msgstr "" - -#: neutron/openstack/common/sslutils.py:50 -#, python-format -msgid "Unable to find cert_file : %s" -msgstr "" - -#: neutron/openstack/common/sslutils.py:53 -#, python-format -msgid "Unable to find ca_file : %s" -msgstr "" - -#: neutron/openstack/common/sslutils.py:56 -#, python-format -msgid "Unable to find key_file : %s" -msgstr "" - -#: neutron/openstack/common/sslutils.py:59 -msgid "" -"When running server in SSL mode, you must specify both a cert_file and " -"key_file option value in your configuration file" -msgstr "" - -#: neutron/openstack/common/sslutils.py:98 -#, python-format -msgid "Invalid SSL version : %s" -msgstr "" - -#: neutron/openstack/common/strutils.py:92 -#, python-format -msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" -msgstr "" - -#: neutron/openstack/common/strutils.py:197 -#, python-format -msgid "Invalid unit system: \"%s\"" -msgstr "" - -#: neutron/openstack/common/strutils.py:206 -#, python-format -msgid "Invalid string format: %s" -msgstr "" - -#: neutron/openstack/common/versionutils.py:69 -#, 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:73 -#, 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/middleware/catch_errors.py:40 -#, python-format -msgid "An error occurred during processing the request: %s" -msgstr "" - -#: neutron/openstack/common/middleware/sizelimit.py:55 -#: neutron/openstack/common/middleware/sizelimit.py:64 -#: neutron/openstack/common/middleware/sizelimit.py:75 -msgid "Request is too large." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:32 -msgid "" -"A comma separated list of Big Switch or Floodlight servers and port " -"numbers. The plugin proxies the requests to the Big Switch/Floodlight " -"server, which performs the networking configuration. Only oneserver is " -"needed per deployment, but you may wish todeploy multiple servers to " -"support failover." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:39 -msgid "" -"The username and password for authenticating against the Big Switch or " -"Floodlight controller." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:42 -msgid "" -"If True, Use SSL when connecting to the Big Switch or Floodlight " -"controller." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:45 -msgid "" -"Trust and store the first certificate received for each controller " -"address and use it to validate future connections to that address." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:49 -msgid "Disables SSL certificate validation for controllers" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:51 -msgid "Re-use HTTP/HTTPS connections to the controller." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:54 -msgid "Directory containing ca_certs and host_certs certificate directories." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:57 -msgid "Sync data on connect" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:59 -msgid "" -"If neutron fails to create a resource because the backend controller " -"doesn't know of a dependency, the plugin automatically triggers a full " -"data synchronization to the controller." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:64 -msgid "" -"Time between verifications that the backend controller database is " -"consistent with Neutron. (0 to disable)" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:67 -msgid "" -"Maximum number of seconds to wait for proxy request to connect and " -"complete." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:70 -msgid "" -"Maximum number of threads to spawn to handle large volumes of port " -"creations." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:74 -msgid "User defined identifier for this Neutron deployment" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:76 -msgid "" -"Flag to decide if a route to the metadata server should be injected into " -"the VM" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:81 -msgid "" -"The default router rules installed in new tenant routers. Repeat the " -"config option for each rule. Format is " -"::: Use an * to specify default for " -"all tenants." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:86 -msgid "Maximum number of router rules" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:90 -msgid "Virtual interface type to configure on Nova compute nodes" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:97 -#, python-format -msgid "Nova compute nodes to manually set VIF type to %s" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:104 -msgid "List of allowed vif_type values." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:108 -msgid "" -"Name of integration bridge on compute nodes used for security group " -"insertion." -msgstr "" - -#: neutron/plugins/bigswitch/config.py:111 -msgid "Seconds between agent checks for port changes" -msgstr "" - -#: neutron/plugins/bigswitch/config.py:113 -msgid "Virtual switch type." -msgstr "" - -#: neutron/plugins/bigswitch/l3_router_plugin.py:58 -msgid "L3 Router Service Plugin for Big Switch fabric" -msgstr "" - -#: neutron/plugins/bigswitch/l3_router_plugin.py:212 -#, python-format -msgid "NeutronRestProxyV2: Unable to create remote floating IP: %s" -msgstr "" - -#: neutron/plugins/bigswitch/l3_router_plugin.py:281 -msgid "NeutronRestProxyV2: too many external networks" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:93 -msgid "Syntax error in server config file, aborting plugin" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:127 neutron/plugins/ml2/db.py:212 -#, python-format -msgid "get_port_and_sgs() called for port_id %s" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:237 -#, python-format -msgid "Unable to update remote topology: %s" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:322 -#, python-format -msgid "" -"Setting admin_state_up=False is not supported in this plugin version. " -"Ignoring setting for resource: %s" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:328 -#, python-format -msgid "" -"Operational status is internally set by the plugin. Ignoring setting " -"status=%s." -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:353 -#, python-format -msgid "Unrecognized vif_type in configuration [%s]. Defaulting to ovs." -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:399 -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:106 -msgid "Iconsistency with backend controller triggering full synchronization." -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:416 -#, python-format -msgid "NeutronRestProxyV2: Unable to create port: %s" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:475 -#, python-format -msgid "NeutronRestProxy: Starting plugin. Version=%s" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:502 -msgid "NeutronRestProxyV2: initialization done" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:546 -msgid "NeutronRestProxyV2: create_network() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:589 -msgid "NeutronRestProxyV2.update_network() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:617 -msgid "NeutronRestProxyV2: delete_network() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:655 -msgid "NeutronRestProxyV2: create_port() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:747 -msgid "NeutronRestProxyV2: update_port() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:807 -msgid "NeutronRestProxyV2: delete_port() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:830 -msgid "NeutronRestProxyV2: create_subnet() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:847 -msgid "NeutronRestProxyV2: update_subnet() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:866 -msgid "NeutronRestProxyV2: delete_subnet() called" -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:890 -msgid "Adding host route: " -msgstr "" - -#: neutron/plugins/bigswitch/plugin.py:891 -#, python-format -msgid "Destination:%(dst)s nexthop:%(next)s" -msgstr "" - -#: neutron/plugins/bigswitch/routerrule_db.py:75 -msgid "No rules in router" -msgstr "" - -#: neutron/plugins/bigswitch/routerrule_db.py:89 -#, python-format -msgid "Updating router rules to %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:82 -#, python-format -msgid "Error in REST call to remote network controller: %(reason)s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:121 -msgid "Couldn't retrieve capabilities. Newer API calls won't be supported." -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:123 -#, python-format -msgid "The following capabilities were received for %(server)s: %(cap)s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:152 -#, python-format -msgid "ServerProxy: server=%(server)s, port=%(port)d, ssl=%(ssl)r" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:155 -#, python-format -msgid "" -"ServerProxy: resource=%(resource)s, data=%(data)r, headers=%(headers)r, " -"action=%(action)s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:176 -msgid "ServerProxy: Could not establish HTTPS connection" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:184 -msgid "ServerProxy: Could not establish HTTP connection" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:220 -#, python-format -msgid "ServerProxy: %(action)s failure, %(e)r" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:223 -#, python-format -msgid "" -"ServerProxy: status=%(status)d, reason=%(reason)r, ret=%(ret)s, " -"data=%(data)r" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:244 -msgid "ServerPool: initializing" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:267 -msgid "Servers not defined. Aborting server manager." -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:274 -#, python-format -msgid "Servers must be defined as :. Configuration was %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:283 -msgid "ServerPool: initialization done" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:333 -#, python-format -msgid "ssl_cert_directory [%s] does not exist. Create it or disable ssl." -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:350 -#, python-format -msgid "No certificates were found to verify controller %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:392 -#, python-format -msgid "" -"Could not retrieve initial certificate from controller %(server)s. Error " -"details: %(error)s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:397 -#, python-format -msgid "Storing to certificate for host %(server)s at %(path)s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:444 -msgid "Server requires synchronization, but no topology function was defined." -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:461 -#, python-format -msgid "" -"ServerProxy: %(action)s failure for servers: %(server)r Response: " -"%(response)s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:467 -#, python-format -msgid "" -"ServerProxy: Error details: status=%(status)d, reason=%(reason)r, " -"ret=%(ret)s, data=%(data)r" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:474 -#, python-format -msgid "ServerProxy: %(action)s failure for all servers: %(server)r" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:497 -#, python-format -msgid "" -"NeutronRestProxyV2: Received and ignored error code %(code)s on " -"%(action)s action to resource %(resource)s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:507 -#, python-format -msgid "Unable to create remote router: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:513 -#, python-format -msgid "Unable to update remote router: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:518 -#, python-format -msgid "Unable to delete remote router: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:524 -#, python-format -msgid "Unable to add router interface: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:529 -#, python-format -msgid "Unable to delete remote intf: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:535 -#, python-format -msgid "Unable to create remote network: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:541 -#: neutron/plugins/bigswitch/servermanager.py:546 -#, python-format -msgid "Unable to update remote network: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:555 -#, python-format -msgid "No device MAC attached to port %s. Skipping notification to controller." -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:560 -#, python-format -msgid "Unable to create remote port: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:565 -#, python-format -msgid "Unable to delete remote port: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:575 -#, python-format -msgid "Unable to create floating IP: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:580 -#, python-format -msgid "Unable to update floating IP: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:585 -#, python-format -msgid "Unable to delete floating IP: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:590 -#, python-format -msgid "Unable to retrieve switch: %s" -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:595 -msgid "Backend server(s) do not support automated consitency checks." -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:599 -#, python-format -msgid "Consistency watchdog disabled by polling interval setting of %s." -msgstr "" - -#: neutron/plugins/bigswitch/servermanager.py:611 -msgid "Encountered an error checking controller health." -msgstr "" - -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:116 -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:234 -msgid "Port update received" -msgstr "" - -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:120 -#, python-format -msgid "Port %s is not present on this host." -msgstr "" - -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:123 -#, python-format -msgid "Port %s found. Refreshing firewall." -msgstr "" - -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:151 -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:267 -msgid "Agent loop has new device" -msgstr "" - -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:155 -#: neutron/plugins/nec/agent/nec_neutron_agent.py:225 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:159 -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:271 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:161 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:225 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1458 -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:277 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:285 -#, python-format -msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" -msgstr "" - -#: neutron/plugins/bigswitch/db/consistency_db.py:69 -#, python-format -msgid "Consistency hash for group %(hash_id)s updated to %(hash)s" -msgstr "" - -#: neutron/plugins/bigswitch/db/porttracker_db.py:39 -msgid "No host_id in port request to track port location." -msgstr "" - -#: neutron/plugins/bigswitch/db/porttracker_db.py:42 -#, python-format -msgid "Received an empty port ID for host_id '%s'" -msgstr "" - -#: neutron/plugins/bigswitch/db/porttracker_db.py:45 -#, python-format -msgid "Received an empty host_id for port '%s'" -msgstr "" - -#: neutron/plugins/bigswitch/db/porttracker_db.py:47 -#, python-format -msgid "Logging port %(port)s on host_id %(host)s" -msgstr "" - -#: neutron/plugins/bigswitch/extensions/routerrule.py:28 -#, python-format -msgid "Invalid format for router rules: %(rule)s, %(reason)s" -msgstr "" - -#: neutron/plugins/bigswitch/extensions/routerrule.py:32 -#, python-format -msgid "" -"Unable to complete rules update for %(router_id)s. The number of rules " -"exceeds the maximum %(quota)s." -msgstr "" - -#: neutron/plugins/bigswitch/extensions/routerrule.py:49 -#, python-format -msgid "Invalid data format for router rule: '%s'" -msgstr "" - -#: neutron/plugins/bigswitch/extensions/routerrule.py:81 -#, python-format -msgid "Duplicate nexthop in rule '%s'" -msgstr "" - -#: neutron/plugins/bigswitch/extensions/routerrule.py:89 -#, python-format -msgid "Action must be either permit or deny. '%s' was provided" -msgstr "" - -#: neutron/plugins/bigswitch/extensions/routerrule.py:101 -#, python-format -msgid "Duplicate router rules (src,dst) found '%s'" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:64 -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:34 -#: neutron/services/l3_router/brocade/l3_router_plugin.py:36 -msgid "The address of the host to SSH to" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:66 -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:36 -#: neutron/services/l3_router/brocade/l3_router_plugin.py:38 -msgid "The SSH username to use" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:68 -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:38 -#: neutron/services/l3_router/brocade/l3_router_plugin.py:40 -msgid "The SSH password to use" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:70 -msgid "Currently unused" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:74 -msgid "The network interface to use when creatinga port" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:96 -#: neutron/plugins/hyperv/rpc_callbacks.py:42 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:71 -#: neutron/plugins/mlnx/rpc_callbacks.py:37 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:80 -#, python-format -msgid "Device %(device)s details requested from %(agent_id)s" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:110 -#: neutron/plugins/brocade/NeutronPlugin.py:137 -#: neutron/plugins/hyperv/rpc_callbacks.py:58 -#: neutron/plugins/hyperv/rpc_callbacks.py:87 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:95 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:132 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:155 -#: neutron/plugins/mlnx/rpc_callbacks.py:60 -#: neutron/plugins/mlnx/rpc_callbacks.py:90 -#: neutron/plugins/mlnx/rpc_callbacks.py:106 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:98 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:135 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:158 -#, python-format -msgid "%s can not be found in database" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:303 -#: neutron/plugins/brocade/NeutronPlugin.py:347 -#: neutron/plugins/brocade/NeutronPlugin.py:400 -#: neutron/plugins/brocade/NeutronPlugin.py:430 -msgid "Brocade NOS driver error" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:304 -#, python-format -msgid "Returning the allocated vlan (%d) to the pool" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#: neutron/plugins/brocade/NeutronPlugin.py:348 -#: neutron/plugins/brocade/NeutronPlugin.py:401 -#: neutron/plugins/brocade/NeutronPlugin.py:432 -msgid "Brocade plugin raised exception, check logs" -msgstr "" - -#: neutron/plugins/brocade/NeutronPlugin.py:313 -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "" - -#: neutron/plugins/brocade/nos/nosdriver.py:69 -#, python-format -msgid "Connect failed to switch: %s" -msgstr "" - -#: neutron/plugins/brocade/nos/nosdriver.py:71 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:90 -#, python-format -msgid "Connect success to host %(host)s:%(ssh_port)d" -msgstr "" - -#: neutron/plugins/brocade/nos/nosdriver.py:96 -#: neutron/plugins/brocade/nos/nosdriver.py:110 -#: neutron/plugins/brocade/nos/nosdriver.py:123 -#: neutron/plugins/brocade/nos/nosdriver.py:136 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:331 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:342 -#, python-format -msgid "NETCONF error: %s" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:89 -msgid "Plugin initialization complete" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:117 -#, python-format -msgid "'%(model)s' object has no attribute '%(name)s'" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:134 -#: neutron/plugins/cisco/db/network_db_v2.py:32 -msgid "get_all_qoss() called" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:140 -msgid "get_qos_details() called" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:145 -msgid "create_qos() called" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:151 -msgid "delete_qos() called" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:156 -msgid "rename_qos() called" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:161 -msgid "get_all_credentials() called" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:167 -msgid "get_credential_details() called" -msgstr "" - -#: neutron/plugins/cisco/network_plugin.py:172 -msgid "rename_credential() called" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:108 -msgid "" -"Interval when the process_services() loop executes in seconds. This is " -"when the config agent lets each service helper to process its neutron " -"resources." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:115 -msgid "Path of the routing service helper class." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:137 -#, python-format -msgid "" -"Error in loading routing service helper. Class specified is %(class)s. " -"Reason:%(reason)s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:148 -msgid "Cisco cfg agent started" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:208 -msgid "No routing service helper loaded" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:237 -#, python-format -msgid "" -"Invalid payload format for received RPC message " -"`hosting_devices_removed`. Error is %{error}s. Payload is %(payload)s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:281 -msgid "[Agent registration] Agent successfully registered" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:285 -#, python-format -msgid "" -"[Agent registration] Neutron server said that device manager was not " -"ready. Retrying in %0.2f seconds " -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:290 -msgid "" -"[Agent registration] Neutron server said that no device manager was " -"found. Cannot continue. Exiting!" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:294 -#, python-format -msgid "[Agent registration] %d unsuccessful registration attempts. Exiting!" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:333 -msgid "Failed sending agent report!" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:28 -msgid "" -"Critical device parameter missing. Failed initializing CSR1kv routing " -"driver." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:34 -#, python-format -msgid "" -"Failed connecting to CSR1kv. Reason: %(reason)s. Connection params are " -"User:%(user)s, Host:%(host)s, Port:%(port)s, Device timeout:%(timeout)s." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:41 -#, python-format -msgid "Error executing snippet:%(snippet)s. ErrorType:%(type)s ErrorTag:%(tag)s." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:47 -#, python-format -msgid "" -"Data in attribute: %(attribute)s does not correspond to expected value. " -"Value received is %(value)s. " -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:52 -#, python-format -msgid "Driver %(driver)s does not exist." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:56 -#, python-format -msgid "Driver not found for resource id:%(id)s." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:60 -#, python-format -msgid "Driver cannot be set for missing parameter:%(p)s." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_status.py:30 -msgid "Time in seconds for connecting to a hosting device" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_status.py:32 -msgid "" -"The time in seconds until a backlogged hosting device is presumed dead. " -"This value should be set up high enough to recover from a period of " -"connectivity loss or high load when the device may not be responding." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_status.py:59 -#, python-format -msgid "Cannot ping ip address: %s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_status.py:143 -#, python-format -msgid "" -"Hosting device: %(hd_id)s @ %(ip)s hasn't passed minimum boot time. " -"Skipping it. " -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_status.py:147 -#, python-format -msgid "Checking hosting device: %(hd_id)s @ %(ip)s for reachability." -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_status.py:154 -#, python-format -msgid "Hosting device: %(hd_id)s @ %(ip)s is now reachable. Adding it to response" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_status.py:158 -#, python-format -msgid "Hosting device: %(hd_id)s @ %(ip)s still not reachable " -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/driver_mgr.py:80 -#, python-format -msgid "" -"Error loading cfg agent driver %(driver)s for hosting device template " -"%(t_name)s(%(t_id)s)" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:64 -#, python-format -msgid "Missing device parameter:%s. Aborting CSR1kvRoutingDriver initialization" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:230 -#, python-format -msgid "Unknown route command %s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:322 -#, python-format -msgid "Interfaces:%s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:337 -#, python-format -msgid "IP Address:%s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:339 -#, python-format -msgid "Cannot find interface: %s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:374 -#, python-format -msgid "Enabled interface %s " -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:393 -#, python-format -msgid "VRFs:%s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:438 -#, python-format -msgid "Mismatch in ACL configuration for %s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:467 -#, python-format -msgid "VRF %s successfully created" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:469 -#, python-format -msgid "Failed creating VRF %s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:477 -#, python-format -msgid "VRF %s removed" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:479 -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:483 -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:496 -#, python-format -msgid "VRF %s not present" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:681 -#, python-format -msgid "%s successfully executed" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:229 -msgid "Failed processing routers" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:290 -msgid "RPC Error in fetching routers from plugin" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:377 -#, python-format -msgid "Router: %(id)s is on an unreachable hosting device. " -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:386 -#, python-format -msgid "Key Error, missing key: %s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:390 -#, python-format -msgid "Driver Exception on router:%(id)s. Error is %(e)s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:401 -#, python-format -msgid "Exception in processing routers on device:%s" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:544 -#, python-format -msgid "Info for router %s was not found. Skipping router removal" -msgstr "" - -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:559 -#, python-format -msgid "" -"Router remove for router_id: %s was incomplete. Adding the router to " -"removed_routers list" -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:25 -#, python-format -msgid "Segmentation ID for network %(net_id)s is not found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:30 -msgid "" -"Unable to complete operation. No more dynamic NICs are available in the " -"system." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:36 -#, python-format -msgid "" -"NetworkVlanBinding for %(vlan_id)s and network %(network_id)s already " -"exists." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:42 -#, python-format -msgid "Vlan ID %(vlan_id)s not found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:47 -msgid "" -"Unable to complete operation. VLAN ID exists outside of the configured " -"network segment range." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:53 -msgid "No Vlan ID available." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:58 -#, python-format -msgid "QoS level %(qos_id)s could not be found for tenant %(tenant_id)s." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:64 -#, python-format -msgid "QoS level with name %(qos_name)s already exists for tenant %(tenant_id)s." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:70 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:23 -#, python-format -msgid "Credential %(credential_id)s could not be found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:75 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:28 -#, python-format -msgid "Credential %(credential_name)s could not be found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:80 -#, python-format -msgid "Credential %(credential_name)s already exists." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:85 -#, python-format -msgid "Provider network %s already exists" -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:90 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:39 -#, python-format -msgid "Connection to %(host)s is not configured." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:95 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:44 -#, python-format -msgid "Unable to connect to Nexus %(nexus_host)s. Reason: %(exc)s." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:100 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:49 -#, python-format -msgid "Failed to configure Nexus: %(config)s. Reason: %(exc)s." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:105 -#, python-format -msgid "Nexus Port Binding (%(filters)s) is not present." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:114 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:69 -msgid "No usable Nexus switch found to create SVI interface." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:119 -#, python-format -msgid "PortVnic Binding %(port_id)s already exists." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:124 -#, python-format -msgid "PortVnic Binding %(port_id)s is not present." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:129 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:74 -msgid "No subnet_id specified for router gateway." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:134 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:79 -#, python-format -msgid "Subnet %(subnet_id)s has an interface on %(router_id)s." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:139 -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:84 -msgid "Nexus hardware router gateway only uses Subnet Ids." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:143 -#, python-format -msgid "" -"Unable to unplug the attachment %(att_id)s from port %(port_id)s for " -"network %(net_id)s. The attachment %(att_id)s does not exist." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:150 -#, python-format -msgid "Policy Profile %(profile_id)s already exists." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:156 -#, python-format -msgid "Policy Profile %(profile_id)s could not be found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:161 -#, python-format -msgid "Network Profile %(profile_id)s already exists." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:167 -#, python-format -msgid "Network Profile %(profile)s could not be found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:172 -#, python-format -msgid "" -"One or more network segments belonging to network profile %(profile)s is " -"in use." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:178 -#, python-format -msgid "" -"No more segments available in network segment pool " -"%(network_profile_name)s." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:184 -#, python-format -msgid "VM Network %(name)s could not be found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:189 -#, python-format -msgid "Unable to create the network. The VXLAN ID %(vxlan_id)s is in use." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:195 -#, python-format -msgid "Vxlan ID %(vxlan_id)s not found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:200 -msgid "" -"Unable to complete operation. VXLAN ID exists outside of the configured " -"network segment range." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:206 -#, python-format -msgid "Connection to VSM failed: %(reason)s." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:211 -#, python-format -msgid "Internal VSM Error: %(reason)s." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:216 -#, python-format -msgid "Network Binding for network %(network_id)s could not be found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:222 -#, python-format -msgid "Port Binding for port %(port_id)s could not be found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:228 -#, python-format -msgid "Profile-Tenant binding for profile %(profile_id)s could not be found." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_exceptions.py:234 -msgid "No service cluster found to perform multi-segment bridging." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:72 -msgid "Port not Found" -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:73 -msgid "Unable to find a port with the specified identifier." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:87 -msgid "Credential Not Found" -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:88 -msgid "Unable to find a Credential with the specified identifier." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:103 -msgid "QoS Not Found" -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:104 -msgid "Unable to find a QoS with the specified identifier." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:119 -msgid "Nova tenant Not Found" -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:120 -msgid "Unable to find a Novatenant with the specified identifier." -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:135 -msgid "Requested State Invalid" -msgstr "" - -#: neutron/plugins/cisco/common/cisco_faults.py:136 -msgid "Unable to update port state with specified value." -msgstr "" - -#: neutron/plugins/cisco/common/config.py:22 -#: neutron/plugins/ml2/drivers/cisco/nexus/config.py:21 -msgid "VLAN Name prefix" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:24 -msgid "VLAN Name prefix for provider vlans" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:26 -msgid "Provider VLANs are automatically created as needed on the Nexus switch" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:29 -msgid "" -"Provider VLANs are automatically trunked as needed on the ports of the " -"Nexus switch" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:32 -msgid "Enable L3 support on the Nexus switches" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:34 -#: neutron/plugins/ml2/drivers/cisco/nexus/config.py:23 -msgid "Distribute SVI interfaces over all switches" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:38 -msgid "Model Class" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:43 -msgid "N1K Integration Bridge" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:45 -msgid "N1K Enable Tunneling" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:47 -msgid "N1K Tunnel Bridge" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:49 -msgid "N1K Local IP" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:51 -msgid "N1K Tenant Network Type" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:53 -msgid "N1K Bridge Mappings" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:55 -msgid "N1K VXLAN ID Ranges" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:57 -msgid "N1K Network VLAN Ranges" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:59 -msgid "N1K default network profile" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:61 -msgid "N1K default policy profile" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:63 -msgid "N1K policy profile for network node" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:65 -msgid "N1K Policy profile polling duration in seconds" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:67 -msgid "Restrict the visibility of policy profiles to the tenants" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:70 -msgid "Number of threads to use to make HTTP requests" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:72 -msgid "N1K http timeout duration in seconds" -msgstr "" - -#: neutron/plugins/cisco/common/config.py:123 -#: neutron/plugins/ml2/drivers/cisco/nexus/config.py:58 -msgid "Some config files were not parsed properly" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:330 -#, python-format -msgid "seg_min %(seg_min)s, seg_max %(seg_max)s" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:561 -#, python-format -msgid "Reserving specific vlan %(vlan)s on physical network %(network)s from pool" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:586 -#, python-format -msgid "vlan_id %(vlan)s on physical network %(network)s not found" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:600 -#, python-format -msgid "Unreasonable vxlan ID range %(vxlan_min)s - %(vxlan_max)s" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:642 -#, python-format -msgid "Reserving specific vxlan %s from pool" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:663 -#, python-format -msgid "vxlan_id %s not found" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:772 -msgid "create_network_profile()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:794 -msgid "delete_network_profile()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:808 -msgid "update_network_profile()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:817 -msgid "get_network_profile()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:842 -msgid "create_policy_profile()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:853 -msgid "delete_policy_profile()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:862 -msgid "update_policy_profile()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:871 -msgid "get_policy_profile()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:890 -#: neutron/plugins/cisco/db/n1kv_db_v2.py:944 -msgid "Invalid profile type" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:908 -msgid "_profile_binding_exists()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:917 -msgid "get_profile_binding()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:927 -msgid "delete_profile_binding()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:934 -#, python-format -msgid "" -"Profile-Tenant binding missing for profile ID %(profile_id)s and tenant " -"ID %(tenant_id)s" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:965 -msgid "_get_profile_bindings()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1121 -msgid "segment_range not required for TRUNK" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1127 -msgid "multicast_ip_range not required" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1254 -msgid "Invalid segment range. example range: 500-550" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1267 -msgid "Invalid multicast ip address range. example range: 224.1.1.1-224.1.1.10" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1274 -#, python-format -msgid "%s is not a valid multicast ip address" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1278 -#, python-format -msgid "%s is reserved multicast ip address" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1282 -#, python-format -msgid "%s is not a valid ip address" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1286 -#, python-format -msgid "" -"Invalid multicast IP range '%(min_ip)s-%(max_ip)s': Range should be from " -"low address to high address" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1299 -msgid "Arguments segment_type missing for network profile" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1308 -msgid "segment_type should either be vlan, overlay, multi-segment or trunk" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1314 -msgid "Argument physical_network missing for network profile" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1320 -msgid "segment_range not required for trunk" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1326 -msgid "Argument sub_type missing for network profile" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1333 -msgid "Argument segment_range missing for network profile" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1344 -msgid "Argument multicast_ip_range missing for VXLAN multicast network profile" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1372 -#, python-format -msgid "Segment range is invalid, select from %(min)s-%(nmin)s, %(nmax)s-%(max)s" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1390 -#, python-format -msgid "segment range is invalid. Valid range is : %(min)s-%(max)s" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1404 -#, python-format -msgid "NetworkProfile name %s already exists" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1421 -msgid "Segment range overlaps with another profile" -msgstr "" - -#: neutron/plugins/cisco/db/network_db_v2.py:40 -msgid "get_qos() called" -msgstr "" - -#: neutron/plugins/cisco/db/network_db_v2.py:53 -msgid "add_qos() called" -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:44 -msgid "Name of the L3 admin tenant." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:46 -msgid "" -"Name of management network for device configuration. Default value is " -"osn_mgmt_nw" -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:49 -msgid "" -"Default security group applied on management port. Default value is " -"mgmt_sec_grp." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:52 -msgid "Seconds of no status update until a cfg agent is considered down." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:55 -msgid "Ensure that Nova is running before attempting to create any VM." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:61 -msgid "Name of Glance image for CSR1kv." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:63 -msgid "UUID of Nova flavor for CSR1kv." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:67 -msgid "Plugging driver for CSR1kv." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:71 -msgid "Hosting device driver for CSR1kv." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:75 -msgid "Config agent driver for CSR1kv." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:77 -msgid "Booting time in seconds before a CSR1kv becomes operational." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:80 -msgid "Username to use for CSR1kv configurations." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:82 -msgid "Password to use for CSR1kv configurations." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:124 -#, python-format -msgid "No tenant with a name or ID of %s exists." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:127 -#, python-format -msgid "Multiple tenants matches found for %s" -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:146 -msgid "The virtual management network has no subnet. Please assign one." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:150 -#, python-format -msgid "The virtual management network has %d subnets. The first one will be used." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:156 -msgid "" -"The virtual management network does not have unique name. Please ensure " -"that it is." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:160 -msgid "There is no virtual management network. Please create one." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:182 -msgid "" -"The security group for the virtual management network does not have " -"unique name. Please ensure that it is." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:187 -msgid "" -"There is no security group for the virtual management network. Please " -"create one." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:201 -msgid "Error loading hosting device driver" -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:214 -msgid "Error loading plugging driver" -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:330 -#, python-format -msgid "Cisco cfg agent %s is not alive" -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:367 -msgid "" -"Not all Nova services are up and running. Skipping this CSR1kv vm create " -"request." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:404 -msgid "Created a CSR1kv hosting device VM" -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:422 -#, python-format -msgid "Failed to delete hosting device %s service VM. Will un-register it anyway." -msgstr "" - -#: neutron/plugins/cisco/db/l3/device_handling_db.py:463 -msgid "There are no active Cisco cfg agents" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:45 -msgid "" -"Time in seconds between renewed scheduling attempts of non-scheduled " -"routers." -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:53 -msgid "Router could not be created due to internal error." -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:57 -msgid "Internal error during router processing." -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:61 -#, python-format -msgid "Could not get binding information for router %(router_id)s." -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:316 -#, python-format -msgid "Attempting to schedule router %s." -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:328 -#, python-format -msgid "Successfully scheduled router %(r_id)s to hosting device %(d_id)s" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:335 -#, python-format -msgid "Un-schedule router %s." -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:348 -#, python-format -msgid "Backlogging router %s for renewed scheduling attempt later" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:355 -#, python-format -msgid "Router %s removed from backlog" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:365 -msgid "Processing router (scheduling) backlog" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:385 -msgid "Synchronizing router (scheduling) backlog" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:408 -#, python-format -msgid "DB inconsistency: No type and hosting info associated with router %s" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:413 -#, python-format -msgid "DB inconsistency: Multiple type and hosting info associated with router %s" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:436 -#, python-format -msgid "DB inconsistency: No hosting info associated with router %s" -msgstr "" - -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:513 -#, python-format -msgid "Failed to allocate hosting port for port %s" -msgstr "" - -#: neutron/plugins/cisco/l3/service_vm_lib.py:34 -msgid "Path to templates for hosting devices." -msgstr "" - -#: neutron/plugins/cisco/l3/service_vm_lib.py:37 -msgid "Path to config drive files for service VM instances." -msgstr "" - -#: neutron/plugins/cisco/l3/service_vm_lib.py:71 -#, python-format -msgid "Failure determining running Nova services: %s" -msgstr "" - -#: neutron/plugins/cisco/l3/service_vm_lib.py:88 -#, python-format -msgid "Failed to get status of service VM instance %(id)s, due to %(err)s" -msgstr "" - -#: neutron/plugins/cisco/l3/service_vm_lib.py:104 -#, python-format -msgid "Failure finding needed Nova resource: %s" -msgstr "" - -#: neutron/plugins/cisco/l3/service_vm_lib.py:126 -#, python-format -msgid "Failed to create service VM instance: %s" -msgstr "" - -#: neutron/plugins/cisco/l3/service_vm_lib.py:142 -#, python-format -msgid "Failed to delete service VM instance %(id)s, due to %(err)s" -msgstr "" - -#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:34 -msgid "CSR1kv configdrive template file." -msgstr "" - -#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:68 -#, python-format -msgid "Failed to create config file: %s. Trying toclean up." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:42 -msgid "Name of N1kv port profile for management ports." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:44 -msgid "" -"Name of N1kv port profile for T1 ports (i.e., ports carrying traffic from" -" VXLAN segmented networks)." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:47 -msgid "" -"Name of N1kv port profile for T2 ports (i.e., ports carrying traffic from" -" VLAN segmented networks)." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:50 -msgid "" -"Name of N1kv network profile for T1 networks (i.e., trunk networks for " -"VXLAN segmented traffic)." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:53 -msgid "" -"Name of N1kv network profile for T2 networks (i.e., trunk networks for " -"VLAN segmented traffic)." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:109 -#, python-format -msgid "" -"The %(resource)s %(name)s does not have unique name. Please refer to " -"admin guide and create one." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:114 -#, python-format -msgid "" -"There is no %(resource)s %(name)s. Please refer to admin guide and create" -" one." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:214 -#, python-format -msgid "Error %s when creating service VM resources. Cleaning up." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:285 -#, python-format -msgid "Aborting resource deletion after %d unsuccessful attempts" -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:291 -#, python-format -msgid "Resource deletion attempt %d starting" -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:310 -msgid "Resource deletion succeeded" -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:321 -#, python-format -msgid "Failed to delete %(resource_name) %(net_id)s for service vm due to %(err)s" -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:413 -#, python-format -msgid "Updating trunk: %(action)s VLAN %(tag)d for network_id %(id)s" -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:453 -#, python-format -msgid "Hosting port DB inconsistency for hosting device %s" -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:460 -#, python-format -msgid "" -"Attempt %(attempt)d to find trunk ports for hosting device %(hd_id)s " -"failed. Trying again in %(time)d seconds." -msgstr "" - -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:506 -#, python-format -msgid "Port trunk pair DB inconsistency for port %s" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:79 -#, python-format -msgid "%(module)s.%(name)s init done" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:120 -#, python-format -msgid "No %s Plugin loaded" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:121 -#, python-format -msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:145 -msgid "create_network() called" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:158 -#, python-format -msgid "Provider network added to DB: %(network_id)s, %(vlan_id)s" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:169 -msgid "update_network() called" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:193 -#, python-format -msgid "Provider network removed from DB: %s" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:235 -msgid "create_port() called" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:261 -msgid "update_port() called" -msgstr "" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:273 -msgid "delete_port() called" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_client.py:226 -msgid "Logical network" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_client.py:251 -msgid "network_segment_pool" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_client.py:298 -msgid "Invalid input for CIDR" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_client.py:440 -#, python-format -msgid "req: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_client.py:450 -#, python-format -msgid "status_code %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_client.py:458 -#, python-format -msgid "VSM: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:129 -msgid "_setup_vsm" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:148 -msgid "_populate_policy_profiles" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:175 -msgid "No policy profile populated from VSM" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:212 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:342 -#: neutron/plugins/mlnx/mlnx_plugin.py:226 neutron/plugins/nuage/plugin.py:413 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:414 -msgid "provider:network_type required" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:216 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:230 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:352 -#: neutron/plugins/mlnx/mlnx_plugin.py:256 neutron/plugins/nuage/plugin.py:423 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:424 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:443 -msgid "provider:segmentation_id required" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:219 -msgid "provider:segmentation_id out of range (1 through 4094)" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:224 -msgid "provider:physical_network specified for Overlay network" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:233 -msgid "provider:segmentation_id out of range (5000+)" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:237 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:374 -#: neutron/plugins/mlnx/mlnx_plugin.py:242 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:459 -#, python-format -msgid "provider:network_type %s not supported" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:248 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:380 -#: neutron/plugins/mlnx/mlnx_plugin.py:282 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:465 -#, python-format -msgid "Unknown provider:physical_network %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:252 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:386 -#: neutron/plugins/mlnx/mlnx_plugin.py:288 neutron/plugins/nuage/plugin.py:420 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:471 -msgid "provider:physical_network required" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:430 -#, python-format -msgid "_populate_member_segments %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:469 -msgid "Invalid pairing supplied" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:474 -#, python-format -msgid "Invalid UUID supplied in %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:475 -msgid "Invalid UUID supplied" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:504 -#, python-format -msgid "Cannot add a trunk segment '%s' as a member of another trunk segment" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:509 -#, python-format -msgid "Cannot add vlan segment '%s' as a member of a vxlan trunk segment" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:515 -#, python-format -msgid "Network UUID '%s' belongs to a different physical network" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:520 -#, python-format -msgid "Cannot add vxlan segment '%s' as a member of a vlan trunk segment" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:525 -#, python-format -msgid "Vlan tag '%s' is out of range" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:528 -#, python-format -msgid "Vlan tag '%s' is not an integer value" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:533 -#, python-format -msgid "%s is not a valid uuid" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:580 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:583 -msgid "n1kv:profile_id does not exist" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:595 -msgid "_send_create_logical_network" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:618 -#, python-format -msgid "_send_create_network_profile_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:628 -#, python-format -msgid "_send_update_network_profile_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:638 -#, python-format -msgid "_send_delete_network_profile_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:653 -#, python-format -msgid "_send_create_network_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:685 -#, python-format -msgid "_send_update_network_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:707 -#, python-format -msgid "add_segments=%s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:708 -#, python-format -msgid "del_segments=%s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:732 -#, python-format -msgid "_send_delete_network_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:772 -#, python-format -msgid "_send_create_subnet_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:782 -#, python-format -msgid "_send_update_subnet_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:793 -#, python-format -msgid "_send_delete_subnet_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:819 -#, python-format -msgid "_send_create_port_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:836 -#, python-format -msgid "_send_update_port_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:852 -#, python-format -msgid "_send_delete_port_request: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:883 -#, python-format -msgid "Create network: profile_id=%s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:891 -#, python-format -msgid "" -"Physical_network %(phy_net)s, seg_type %(net_type)s, seg_id %(seg_id)s, " -"multicast_ip %(multicast_ip)s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:903 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:913 -#, python-format -msgid "Seg list %s " -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:954 -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:255 -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:198 -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:226 -#: neutron/plugins/mlnx/mlnx_plugin.py:369 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:519 -#, python-format -msgid "Created network: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1012 -#, python-format -msgid "Updated network: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1026 -#, python-format -msgid "Cannot delete network '%s', delete the associated subnet first" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1030 -#, python-format -msgid "Cannot delete network '%s' that is member of a trunk segment" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1034 -#, python-format -msgid "Cannot delete network '%s' that is a member of a multi-segment network" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1062 -#, python-format -msgid "Get network: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1084 -msgid "Get networks" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1135 -#, python-format -msgid "Create port: profile_id=%s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1182 -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:305 -#, python-format -msgid "Created port: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1193 -#, python-format -msgid "Update port: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1256 -#, python-format -msgid "Get port: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1276 -msgid "Get ports" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1292 -msgid "Create subnet" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1302 -#, python-format -msgid "Created subnet: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1317 -msgid "Update subnet" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1332 -#, python-format -msgid "Delete subnet: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1347 -#, python-format -msgid "Get subnet: %s" -msgstr "" - -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1367 -msgid "Get subnets" -msgstr "" - -#: neutron/plugins/common/utils.py:30 -#, python-format -msgid "%s is not a valid VLAN tag" -msgstr "" - -#: neutron/plugins/common/utils.py:34 -msgid "End of VLAN range is less than start of VLAN range" -msgstr "" - -#: neutron/plugins/embrane/base_plugin.py:107 -#: neutron/plugins/embrane/agent/dispatcher.py:132 -#: neutron/services/loadbalancer/drivers/embrane/poller.py:56 -#: neutron/services/loadbalancer/drivers/embrane/agent/dispatcher.py:108 -msgid "Unhandled exception occurred" -msgstr "" - -#: neutron/plugins/embrane/base_plugin.py:172 -#: neutron/plugins/embrane/base_plugin.py:191 -#, python-format -msgid "The following routers have not physical match: %s" -msgstr "" - -#: neutron/plugins/embrane/base_plugin.py:177 -#, python-format -msgid "Requested router: %s" -msgstr "" - -#: neutron/plugins/embrane/base_plugin.py:229 -#, python-format -msgid "Deleting router=%s" -msgstr "" - -#: neutron/plugins/embrane/agent/operations/router_operations.py:97 -#, python-format -msgid "The router %s had no physical representation,likely already deleted" -msgstr "" - -#: neutron/plugins/embrane/agent/operations/router_operations.py:126 -#, python-format -msgid "Interface %s not found in the heleos back-end,likely already deleted" -msgstr "" - -#: neutron/plugins/embrane/common/config.py:23 -#: neutron/services/loadbalancer/drivers/embrane/config.py:25 -msgid "ESM management root address" -msgstr "" - -#: neutron/plugins/embrane/common/config.py:25 -#: neutron/services/loadbalancer/drivers/embrane/config.py:27 -msgid "ESM admin username." -msgstr "" - -#: neutron/plugins/embrane/common/config.py:28 -#: neutron/services/loadbalancer/drivers/embrane/config.py:30 -msgid "ESM admin password." -msgstr "" - -#: neutron/plugins/embrane/common/config.py:30 -msgid "Router image id (Embrane FW/VPN)" -msgstr "" - -#: neutron/plugins/embrane/common/config.py:32 -msgid "In band Security Zone id" -msgstr "" - -#: neutron/plugins/embrane/common/config.py:34 -msgid "Out of band Security Zone id" -msgstr "" - -#: neutron/plugins/embrane/common/config.py:36 -msgid "Management Security Zone id" -msgstr "" - -#: neutron/plugins/embrane/common/config.py:38 -msgid "Dummy user traffic Security Zone id" -msgstr "" - -#: neutron/plugins/embrane/common/config.py:40 -#: neutron/services/loadbalancer/drivers/embrane/config.py:42 -msgid "Shared resource pool id" -msgstr "" - -#: neutron/plugins/embrane/common/config.py:42 -#: neutron/services/loadbalancer/drivers/embrane/config.py:49 -msgid "Define if the requests have run asynchronously or not" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:49 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:50 -#, python-format -msgid "Dva is pending for the following reason: %s" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:50 -msgid "" -"Dva can't be found to execute the operation, probably was cancelled " -"through the heleos UI" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:52 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:53 -#, python-format -msgid "Dva seems to be broken for reason %s" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:53 -#, python-format -msgid "Dva interface seems to be broken for reason %s" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:55 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:54 -#, python-format -msgid "Dva creation failed reason %s" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:56 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:55 -#, python-format -msgid "Dva creation is in pending state for reason %s" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:58 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:57 -#, python-format -msgid "Dva configuration failed for reason %s" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:59 -#, python-format -msgid "" -"Failed to delete the backend router for reason %s. Please remove it " -"manually through the heleos UI" -msgstr "" - -#: neutron/plugins/embrane/common/exceptions.py:22 -#, python-format -msgid "An unexpected error occurred:%(err_msg)s" -msgstr "" - -#: neutron/plugins/embrane/common/exceptions.py:26 -#, python-format -msgid "%(err_msg)s" -msgstr "" - -#: neutron/plugins/embrane/common/utils.py:45 -msgid "No ip allocation set" -msgstr "" - -#: neutron/plugins/embrane/l2base/support_exceptions.py:22 -#, python-format -msgid "Cannot retrieve utif info for the following reason: %(err_msg)s" -msgstr "" - -#: neutron/plugins/embrane/l2base/ml2/ml2_support.py:46 -#, python-format -msgid "" -"Network type %s not supported. Please be sure that tenant_network_type is" -" vlan" -msgstr "" - -#: neutron/plugins/hyperv/db.py:38 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:113 -#: neutron/plugins/openvswitch/ovs_db_v2.py:131 -#, python-format -msgid "" -"Reserving vlan %(vlan_id)s on physical network %(physical_network)s from " -"pool" -msgstr "" - -#: neutron/plugins/hyperv/db.py:53 -#, python-format -msgid "Reserving flat physical network %(physical_network)s from pool" -msgstr "" - -#: neutron/plugins/hyperv/db.py:76 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:136 -#: neutron/plugins/openvswitch/ovs_db_v2.py:155 -#, python-format -msgid "" -"Reserving specific vlan %(vlan_id)s on physical network " -"%(physical_network)s from pool" -msgstr "" - -#: neutron/plugins/hyperv/db.py:133 -#, python-format -msgid "Releasing vlan %(vlan_id)s on physical network %(physical_network)s" -msgstr "" - -#: neutron/plugins/hyperv/db.py:138 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:177 -#: neutron/plugins/openvswitch/ovs_db_v2.py:196 -#, python-format -msgid "vlan_id %(vlan_id)s on physical network %(physical_network)s not found" -msgstr "" - -#: neutron/plugins/hyperv/db.py:163 neutron/plugins/hyperv/db.py:176 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:64 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:83 -#: neutron/plugins/ml2/drivers/type_vlan.py:130 -#: neutron/plugins/ml2/drivers/type_vlan.py:151 -#: neutron/plugins/openvswitch/ovs_db_v2.py:87 -#: neutron/plugins/openvswitch/ovs_db_v2.py:105 -#, python-format -msgid "" -"Removing vlan %(vlan_id)s on physical network %(physical_network)s from " -"pool" -msgstr "" - -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:46 -msgid "Network type for tenant networks (local, flat, vlan or none)" -msgstr "" - -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:50 -#: neutron/plugins/linuxbridge/common/config.py:33 -#: neutron/plugins/mlnx/common/config.py:30 -msgid "List of :: or " -msgstr "" - -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:78 -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:100 -#, python-format -msgid "segmentation_id specified for %s network" -msgstr "" - -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:85 -#, python-format -msgid "physical_network specified for %s network" -msgstr "" - -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:127 -msgid "physical_network not provided" -msgstr "" - -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:179 -#, python-format -msgid "Invalid tenant_network_type: %s. Agent terminated!" -msgstr "" - -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:204 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:303 -#: neutron/plugins/ml2/drivers/type_vlan.py:96 -#: neutron/plugins/mlnx/mlnx_plugin.py:187 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:366 -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "" - -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:229 -#, python-format -msgid "Network type %s not supported" -msgstr "" - -#: neutron/plugins/hyperv/rpc_callbacks.py:76 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:114 -#: neutron/plugins/mlnx/rpc_callbacks.py:77 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:117 -#, python-format -msgid "Device %(device)s no longer exists on %(agent_id)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:50 -msgid "" -"List of : where the physical networks can be " -"expressed with wildcards, e.g.: .\"*:external\"" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:56 -msgid "Private vswitch name used for local networks" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:58 -#: neutron/plugins/linuxbridge/common/config.py:64 -#: neutron/plugins/mlnx/common/config.py:67 -#: neutron/plugins/nec/common/config.py:29 -#: neutron/plugins/oneconvergence/lib/config.py:47 -#: neutron/plugins/openvswitch/common/config.py:66 -#: neutron/plugins/ryu/common/config.py:43 -#: neutron/plugins/sriovnicagent/common/config.py:58 -msgid "" -"The number of seconds the agent will wait between polling for local " -"device changes." -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:62 -msgid "" -"Enables metrics collections for switch ports by using Hyper-V's metric " -"APIs. Collected data can by retrieved by other apps and services, e.g.: " -"Ceilometer. Requires Hyper-V / Windows Server 2012 and above" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:69 -msgid "" -"Specifies the maximum number of retries to enable Hyper-V's port metrics " -"collection. The agent will try to enable the feature once every " -"polling_interval period for at most metrics_max_retries or until it " -"succeedes." -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:151 -#, python-format -msgid "Failed reporting state! %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:186 -#, python-format -msgid "Invalid physical network mapping: %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:207 -#, python-format -msgid "network_delete received. Deleting network %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:213 -#, python-format -msgid "Network %s not defined on agent." -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:216 -msgid "port_delete received" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:221 -msgid "port_update received" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:243 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:130 -#, python-format -msgid "Provisioning network %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:256 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for network " -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:268 -#, python-format -msgid "Reclaiming local network %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:276 -#, python-format -msgid "Binding port %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:289 -#, python-format -msgid "Binding VLAN ID %(segmentation_id)s to switch port %(port_id)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:302 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:115 -#, python-format -msgid "Unsupported network type %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:311 -#, python-format -msgid "Network %s is not avalailable on this agent" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:315 -#, python-format -msgid "Unbinding port %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:328 -#, python-format -msgid "Port metrics enabled for port: %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:332 -#, python-format -msgid "Port metrics raw enabling for port: %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:357 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:294 -#, python-format -msgid "No port %s defined on agent." -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:374 -#, python-format -msgid "Adding port %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:377 -#, python-format -msgid "Port %(device)s updated. Details: %(device_details)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:403 -#, python-format -msgid "Removing port %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:411 -#, python-format -msgid "Removing port failed for device %(device)s: %(e)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:436 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:995 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1350 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:254 -msgid "Agent out of sync with plugin!" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:444 -msgid "Agent loop has new devices!" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:451 -#, python-format -msgid "Error in agent event loop: %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:459 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:393 -#, python-format -msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)" -msgstr "" - -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:472 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:268 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1036 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1542 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:350 -msgid "Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/hyperv/agent/security_groups_driver.py:62 -#, python-format -msgid "Hyper-V Exception: %(hyperv_exeption)s while adding rule: %(rule)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/security_groups_driver.py:72 -#, python-format -msgid "Hyper-V Exception: %(hyperv_exeption)s while removing rule: %(rule)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/security_groups_driver.py:92 -msgid "Aplying port filter." -msgstr "" - -#: neutron/plugins/hyperv/agent/security_groups_driver.py:95 -msgid "Updating port rules." -msgstr "" - -#: neutron/plugins/hyperv/agent/security_groups_driver.py:108 -#, python-format -msgid "Creating %(new)s new rules, removing %(old)s old rules." -msgstr "" - -#: neutron/plugins/hyperv/agent/security_groups_driver.py:119 -msgid "Removing port filter" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:36 -#, python-format -msgid "HyperVException: %(msg)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:81 -#, python-format -msgid "Vnic not found: %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:116 -#, python-format -msgid "Job failed with error %d" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:135 -#, python-format -msgid "" -"WMI job failed with status %(job_state)d. Error details: %(err_sum_desc)s" -" - %(err_desc)s - Error code: %(err_code)d" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:144 -#, python-format -msgid "WMI job failed with status %(job_state)d. Error details: %(error)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:148 -#, python-format -msgid "WMI job failed with status %d. No error description available" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:153 -#, python-format -msgid "WMI job succeeded: %(desc)s, Elapsed=%(elap)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:167 -#, python-format -msgid "Failed creating port for %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:190 -#, python-format -msgid "" -"Failed to disconnect port %(switch_port_name)s from switch " -"%(vswitch_name)s with error %(ret_val)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:201 -#, python-format -msgid "" -"Failed to delete port %(switch_port_name)s from switch %(vswitch_name)s " -"with error %(ret_val)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:208 -#: neutron/plugins/hyperv/agent/utilsv2.py:135 -#, python-format -msgid "VSwitch not found: %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utils.py:249 -#: neutron/plugins/hyperv/agent/utils.py:253 -msgid "Metrics collection is not supported on this version of Hyper-V" -msgstr "" - -#: neutron/plugins/hyperv/agent/utilsfactory.py:32 -msgid "Force V1 WMI utility classes" -msgstr "" - -#: neutron/plugins/hyperv/agent/utilsfactory.py:61 -msgid "" -"V1 virtualization namespace no longer supported on Windows Server / " -"Hyper-V Server 2012 R2 or above." -msgstr "" - -#: neutron/plugins/hyperv/agent/utilsfactory.py:68 -#, python-format -msgid "Loading class: %(module_name)s.%(class_name)s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utilsv2.py:158 -#: neutron/plugins/hyperv/agent/utilsv2.py:318 -#, python-format -msgid "Port Allocation not found: %s" -msgstr "" - -#: neutron/plugins/hyperv/agent/utilsv2.py:268 -#, python-format -msgid "Cannot get VM summary data for: %s" -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:97 -#, python-format -msgid "unable to serialize object type: '%s'" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:164 -#, python-format -msgid "" -"Sending request to SDN-VE. url: %(myurl)s method: %(method)s body: " -"%(body)s header: %(header)s " -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:177 -#, python-format -msgid "Error: Could not reach server: %(url)s Exception: %(excp)s." -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:184 -#, python-format -msgid "Error message: %(reply)s -- Status: %(status)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:187 -#, python-format -msgid "Received response status: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_api.py:194 -#, python-format -msgid "Deserialized body: %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.py:369 -#, python-format -msgid "Did not find tenant: %r" -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:152 -msgid "Set a new controller if needed." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:158 -#, python-format -msgid "Set the controller to a new controller: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:166 -#, python-format -msgid "Original SDN-VE HTTP request: %(orig)s; New request: %(new)s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:176 -#, python-format -msgid "Create network in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:185 -msgid "Create net failed: no SDN-VE tenant." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:196 -#, python-format -msgid "Create net failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:203 -#, python-format -msgid "Update network in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:223 -#, python-format -msgid "Update net failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:229 -#, python-format -msgid "Delete network in progress: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:239 -#, python-format -msgid "Delete net failed after deleting the network in DB: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:244 -#, python-format -msgid "Get network in progress: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:250 -msgid "Get networks in progress" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:260 -#, python-format -msgid "Create port in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:276 -msgid "Create port does not have tenant id info" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:282 -#, python-format -msgid "Create port does not have tenant id info; obtained is: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:303 -#, python-format -msgid "Create port failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:310 -#, python-format -msgid "Update port in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:337 -#, python-format -msgid "Update port failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:343 -#, python-format -msgid "Delete port in progress: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:356 -#, python-format -msgid "Delete port operation failed in SDN-VE after deleting the port from DB: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:365 -#, python-format -msgid "Create subnet in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:377 -#, python-format -msgid "Create subnet failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:379 -#, python-format -msgid "Subnet created: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:385 -#, python-format -msgid "Update subnet in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:410 -#, python-format -msgid "Update subnet failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:416 -#, python-format -msgid "Delete subnet in progress: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:421 -#, python-format -msgid "" -"Delete subnet operation failed in SDN-VE after deleting the subnet from " -"DB: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:430 -#, python-format -msgid "Create router in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:433 -#, python-format -msgid "Ignoring admin_state_up=False for router=%r. Overriding with True" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:443 -msgid "Create router failed: no SDN-VE tenant." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:451 -#, python-format -msgid "Create router failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:453 -#, python-format -msgid "Router created: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:458 -#, python-format -msgid "Update router in progress: id=%(id)s router=%(router)r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:465 -msgid "admin_state_up=False routers are not supported." -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:489 -#, python-format -msgid "Update router failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:495 -#, python-format -msgid "Delete router in progress: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:502 -#, python-format -msgid "" -"Delete router operation failed in SDN-VE after deleting the router in DB:" -" %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:507 -#, python-format -msgid "" -"Add router interface in progress: router_id=%(router_id)s " -"interface_info=%(interface_info)r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:515 -#, python-format -msgid "SdnvePluginV2.add_router_interface called. Port info: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:529 -#, python-format -msgid "Update router-add-interface failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:532 -#, python-format -msgid "Added router interface: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:536 -#, python-format -msgid "" -"Add router interface only called: router_id=%(router_id)s " -"interface_info=%(interface_info)r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:546 -msgid "" -"SdnvePluginV2._add_router_interface_only: failed to add the interface in " -"the roll back. of a remove_router_interface operation" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:552 -#, python-format -msgid "" -"Remove router interface in progress: router_id=%(router_id)s " -"interface_info=%(interface_info)r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:561 -msgid "No port ID" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:563 -#, python-format -msgid "SdnvePluginV2.remove_router_interface port: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:567 -msgid "No fixed IP" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:572 -#, python-format -msgid "SdnvePluginV2.remove_router_interface subnet_id: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:595 -#, python-format -msgid "Update router-remove-interface failed SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:616 -#, python-format -msgid "Create floatingip in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:627 -#, python-format -msgid "Creating floating ip operation failed in SDN-VE controller: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:630 -#, python-format -msgid "Created floatingip : %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:635 -#, python-format -msgid "Update floatingip in progress: %r" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:655 -#, python-format -msgid "Update floating ip failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:661 -#, python-format -msgid "Delete floatingip in progress: %s" -msgstr "" - -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:666 -#, python-format -msgid "Delete floatingip failed in SDN-VE: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:138 -msgid "info_update received" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:143 -#, python-format -msgid "info_update received. New controlleris to be set to: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:149 -msgid "info_update received. New controlleris set to be out of band" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:194 -#, python-format -msgid "Mapping physical network %(physical_network)s to interface %(interface)s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:200 -#, 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:218 -msgid "Agent in the rpc loop." -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:240 -#, python-format -msgid "Controller IPs: %s" -msgstr "" - -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:262 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1529 -#, python-format -msgid "%s Agent terminated!" -msgstr "" - -#: neutron/plugins/ibm/common/config.py:28 -msgid "Whether to use a fake controller." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:30 -msgid "Base URL for SDN-VE controller REST API." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:32 -msgid "List of IP addresses of SDN-VE controller(s)." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:34 -msgid "SDN-VE RPC subject." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:36 -msgid "SDN-VE controller port number." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:38 -msgid "SDN-VE request/response format." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:40 -msgid "SDN-VE administrator user ID." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:42 -msgid "SDN-VE administrator password." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:44 -#: neutron/plugins/nec/common/config.py:24 -#: neutron/plugins/openvswitch/common/config.py:29 -#: neutron/plugins/ryu/common/config.py:22 -msgid "Integration bridge to use." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:46 -msgid "Whether to reset the integration bridge before use." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:48 -msgid "Indicating if controller is out of band or not." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:51 -msgid "List of : mappings." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:54 -msgid "Tenant type: OVERLAY (default) or OF." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:56 -msgid "" -"The string in tenant description that indicates the tenant is a OVERLAY " -"tenant." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:59 -msgid "The string in tenant description that indicates the tenant is a OF tenant." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:65 -msgid "Agent polling interval if necessary." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:67 -msgid "Using root helper." -msgstr "" - -#: neutron/plugins/ibm/common/config.py:69 -msgid "Whether to use rpc." -msgstr "" - -#: neutron/plugins/ibm/common/exceptions.py:23 -#, python-format -msgid "" -"An unexpected error occurred in the SDN-VE Plugin. Here is the error " -"message: %(msg)s" -msgstr "" - -#: neutron/plugins/ibm/common/exceptions.py:28 -#, python-format -msgid "The input does not contain nececessary info: %(msg)s" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:123 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:147 -#: neutron/plugins/ml2/rpc.py:130 neutron/plugins/ml2/rpc.py:154 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:125 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:150 -#, python-format -msgid "Device %(device)s not bound to the agent host %(host)s" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:140 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:144 -#, python-format -msgid "Device %(device)s up on %(agent_id)s" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:261 -#: neutron/plugins/mlnx/mlnx_plugin.py:207 -#, python-format -msgid "Invalid tenant_network_type: %s. Service terminated!" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:272 -msgid "Linux Bridge Plugin initialization complete" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:301 -#, python-format -msgid "%s. Agent terminated!" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:346 -#: neutron/plugins/mlnx/mlnx_plugin.py:251 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:418 -msgid "provider:segmentation_id specified for flat network" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:355 -#: neutron/plugins/mlnx/mlnx_plugin.py:259 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:427 -#, python-format -msgid "provider:segmentation_id out of range (%(min_id)s through %(max_id)s)" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:362 -#: neutron/plugins/mlnx/mlnx_plugin.py:267 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:447 -msgid "provider:physical_network specified for local network" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:368 -#: neutron/plugins/mlnx/mlnx_plugin.py:271 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:453 -msgid "provider:segmentation_id specified for local network" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:83 -msgid "VXLAN is enabled, a valid local_ip must be provided" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:97 -msgid "Invalid Network ID, will lead to incorrect bridgename" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:104 -msgid "Invalid VLAN ID, will lead to incorrect subinterface name" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:111 -msgid "Invalid Interface ID, will lead to incorrect tap device name" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:120 -#, python-format -msgid "Invalid Segmentation ID: %s, will lead to incorrect vxlan device name" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:183 -#, python-format -msgid "Failed creating vxlan interface for %(segmentation_id)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:215 -#, python-format -msgid "" -"Creating subinterface %(interface)s for VLAN %(vlan_id)s on interface " -"%(physical_interface)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:228 -#, python-format -msgid "Done creating subinterface %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:235 -#, python-format -msgid "Creating vxlan interface %(interface)s for VNI %(segmentation_id)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:250 -#, python-format -msgid "Done creating vxlan interface %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:304 -#, python-format -msgid "Starting bridge %(bridge_name)s for subinterface %(interface)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:319 -#, python-format -msgid "Done starting bridge %(bridge_name)s for subinterface %(interface)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:341 -#, python-format -msgid "Unable to add %(interface)s to %(bridge_name)s! Exception: %(e)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:354 -#, python-format -msgid "Unable to add vxlan interface for network %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:361 -#, python-format -msgid "No mapping for physical network %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:370 -#, python-format -msgid "Unknown network_type %(network_type)s for network %(network_id)s." -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:382 -#, python-format -msgid "Tap device: %s does not exist on this host, skipped" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:400 -#, python-format -msgid "Adding device %(tap_device_name)s to bridge %(bridge_name)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:409 -#, python-format -msgid "%(tap_device_name)s already exists on bridge %(bridge_name)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:447 -#, python-format -msgid "Deleting bridge %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:454 -#, python-format -msgid "Done deleting bridge %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:457 -#, python-format -msgid "Cannot delete bridge %s, does not exist" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:471 -#, python-format -msgid "Removing device %(interface_name)s from bridge %(bridge_name)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:478 -#, python-format -msgid "Done removing device %(interface_name)s from bridge %(bridge_name)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:484 -#, python-format -msgid "" -"Cannot remove device %(interface_name)s bridge %(bridge_name)s does not " -"exist" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:492 -#, python-format -msgid "Deleting subinterface %s for vlan" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:499 -#, python-format -msgid "Done deleting subinterface %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:503 -#, python-format -msgid "Deleting vxlan interface %s for vlan" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:508 -#, python-format -msgid "Done deleting vxlan interface %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:522 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:556 -#, 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:533 -msgid "No valid Segmentation ID to perform UCAST test." -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:550 -msgid "" -"VXLAN muticast group must be provided in vxlan_group option to enable " -"VXLAN MCAST mode" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:575 -msgid "" -"Linux kernel vxlan module and iproute2 3.8 or above are required to " -"enable VXLAN." -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:585 -#, python-format -msgid "Using %s VXLAN mode" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:662 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:163 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:297 -msgid "network_delete received" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:676 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:66 -#, python-format -msgid "port_update RPC received for port: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:679 -msgid "fdb_add received" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:701 -msgid "fdb_remove received" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:723 -msgid "update chg_ip received" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:748 -msgid "fdb_update received" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:805 -msgid "Unable to obtain MAC address for unique ID. Agent terminated!" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:809 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:220 -#: neutron/plugins/nec/agent/nec_neutron_agent.py:144 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:109 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:100 -#, python-format -msgid "RPC agent_id: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:880 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1100 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:213 -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:913 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:934 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:354 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1126 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1187 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:240 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:920 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1172 -#, python-format -msgid "Attachment %s removed" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:928 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1162 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 -#, python-format -msgid "port_removed failed for %(device)s: %(e)s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:932 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:352 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1184 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:238 -#, python-format -msgid "Port %s updated." -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:985 -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:999 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:267 -#, python-format -msgid "Agent loop found changes! %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1003 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:273 -#, python-format -msgid "Error in agent loop. Devices info: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1026 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:407 -#, python-format -msgid "Parsing physical_interface_mappings failed: %s. Agent terminated!" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1029 -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:410 -#, python-format -msgid "Interface mappings: %s" -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:29 -#: neutron/plugins/mlnx/common/config.py:26 -msgid "Network type for tenant networks (local, vlan, or none)" -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:39 -msgid "" -"Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 " -"plugin using linuxbridge mechanism driver" -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:43 -msgid "TTL for vxlan interface protocol packets." -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:45 -msgid "TOS for vxlan interface protocol packets." -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:47 -msgid "Multicast group for vxlan interface." -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:49 -msgid "Local IP address of the VXLAN endpoints." -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:51 -msgid "" -"Extension to use alongside ml2 plugin's l2population mechanism driver. It" -" enables the plugin to populate VXLAN forwarding table." -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:59 -#: neutron/plugins/mlnx/common/config.py:45 -#: neutron/plugins/ofagent/common/config.py:29 -msgid "List of :" -msgstr "" - -#: neutron/plugins/linuxbridge/common/config.py:67 -#: neutron/plugins/mlnx/common/config.py:70 -msgid "Enable server RPC compatibility with old agents" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:142 -#: neutron/plugins/openvswitch/ovs_db_v2.py:161 -#, python-format -msgid "" -"Reserving specific vlan %(vlan_id)s on physical network " -"%(physical_network)s outside pool" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:166 -#: neutron/plugins/openvswitch/ovs_db_v2.py:191 -#, python-format -msgid "" -"Releasing vlan %(vlan_id)s on physical network %(physical_network)s to " -"pool" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:171 -#: neutron/plugins/openvswitch/ovs_db_v2.py:186 -#, python-format -msgid "" -"Releasing vlan %(vlan_id)s on physical network %(physical_network)s " -"outside pool" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:202 -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:212 -msgid "get_port_from_device() called" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:230 -#, python-format -msgid "set_port_status as %s called" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:59 -#, python-format -msgid "Flavor %(flavor)s could not be found" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:63 -msgid "Failed to add flavor binding" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:72 -msgid "Start initializing metaplugin" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:121 -#, python-format -msgid "default_flavor %s is not plugin list" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:127 -#, python-format -msgid "default_l3_flavor %s is not plugin list" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:133 -#, python-format -msgid "rpc_flavor %s is not plugin list" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:165 -#, python-format -msgid "Plugin location: %s" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:216 -#, python-format -msgid "Created network: %(net_id)s with flavor %(flavor)s" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:222 -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:366 -msgid "Failed to add flavor bindings" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:359 -#, python-format -msgid "Created router: %(router_id)s with flavor %(flavor)s" -msgstr "" - -#: neutron/plugins/metaplugin/meta_neutron_plugin.py:370 -#, python-format -msgid "Created router: %s" -msgstr "" - -#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:66 -#, python-format -msgid "Update subnet failed: %s" -msgstr "" - -#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:73 -msgid "Subnet in remote have already deleted" -msgstr "" - -#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:94 -#, python-format -msgid "Update network failed: %s" -msgstr "" - -#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:101 -msgid "Network in remote have already deleted" -msgstr "" - -#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:122 -#, python-format -msgid "Update port failed: %s" -msgstr "" - -#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:133 -msgid "Port in remote have already deleted" -msgstr "" - -#: neutron/plugins/metaplugin/common/config.py:23 -msgid "" -"Comma separated list of flavor:neutron_plugin for plugins to load. " -"Extension method is searched in the list order and the first one is used." -msgstr "" - -#: neutron/plugins/metaplugin/common/config.py:29 -msgid "" -"Comma separated list of flavor:neutron_plugin for L3 service plugins to " -"load. This is intended for specifying L2 plugins which support L3 " -"functions. If you use a router service plugin, set this blank." -msgstr "" - -#: neutron/plugins/metaplugin/common/config.py:36 -msgid "" -"Default flavor to use, when flavor:network is not specified at network " -"creation." -msgstr "" - -#: neutron/plugins/metaplugin/common/config.py:41 -msgid "" -"Default L3 flavor to use, when flavor:router is not specified at router " -"creation. Ignored if 'l3_plugin_list' is blank." -msgstr "" - -#: neutron/plugins/metaplugin/common/config.py:47 -msgid "Comma separated list of supported extension aliases." -msgstr "" - -#: neutron/plugins/metaplugin/common/config.py:51 -msgid "" -"Comma separated list of method:flavor to select specific plugin for a " -"method. This has priority over method search order based on " -"'plugin_list'." -msgstr "" - -#: neutron/plugins/metaplugin/common/config.py:57 -msgid "Specifies flavor for plugin to handle 'q-plugin' RPC requests." -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:44 -#, python-format -msgid "MidoNet %(resource_type)s %(id)s could not be found" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:48 -#: neutron/plugins/midonet/plugin.py:86 -#, python-format -msgid "MidoNet API error: %(msg)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:82 -#, python-format -msgid "MidoClient.create_bridge called: kwargs=%(kwargs)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:92 -#, python-format -msgid "MidoClient.delete_bridge called: id=%(id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:102 -#, python-format -msgid "MidoClient.get_bridge called: id=%s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:116 -#, python-format -msgid "MidoClient.update_bridge called: id=%(id)s, kwargs=%(kwargs)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:136 -#, python-format -msgid "" -"MidoClient.create_dhcp called: bridge=%(bridge)s, cidr=%(cidr)s, " -"gateway_ip=%(gateway_ip)s, host_rts=%(host_rts)s, " -"dns_servers=%(dns_servers)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:154 -#, python-format -msgid "" -"MidoClient.add_dhcp_host called: bridge=%(bridge)s, cidr=%(cidr)s, " -"ip=%(ip)s, mac=%(mac)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:159 -msgid "Tried to add tonon-existent DHCP" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:173 -#, python-format -msgid "" -"MidoClient.remove_dhcp_host called: bridge=%(bridge)s, cidr=%(cidr)s, " -"ip=%(ip)s, mac=%(mac)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:178 -msgid "Tried to delete mapping from non-existent subnet" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:183 -#, python-format -msgid "MidoClient.remove_dhcp_host: Deleting %(dh)r" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:196 -#, python-format -msgid "" -"MidoClient.delete_dhcp_host called: bridge_id=%(bridge_id)s, " -"cidr=%(cidr)s, ip=%(ip)s, mac=%(mac)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:211 -#, python-format -msgid "MidoClient.delete_dhcp called: bridge=%(bridge)s, cidr=%(cidr)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:218 -msgid "Tried to delete non-existent DHCP" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:230 -#, python-format -msgid "MidoClient.delete_port called: id=%(id)s, delete_chains=%(delete_chains)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:245 -#, python-format -msgid "MidoClient.get_port called: id=%(id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:259 -#, python-format -msgid "MidoClient.add_bridge_port called: bridge=%(bridge)s, kwargs=%(kwargs)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:271 -#, python-format -msgid "MidoClient.update_port called: id=%(id)s, kwargs=%(kwargs)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:296 -#, python-format -msgid "MidoClient.create_router called: kwargs=%(kwargs)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:306 -#, python-format -msgid "MidoClient.delete_router called: id=%(id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:316 -#, python-format -msgid "MidoClient.get_router called: id=%(id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:330 -#, python-format -msgid "MidoClient.update_router called: id=%(id)s, kwargs=%(kwargs)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:351 -#, python-format -msgid "" -"MidoClient.add_dhcp_route_option called: bridge=%(bridge)s, " -"cidr=%(cidr)s, gw_ip=%(gw_ip)sdst_ip=%(dst_ip)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:359 -msgid "Tried to access non-existent DHCP" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:391 -#, python-format -msgid "MidoClient.unlink called: port=%(port)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:396 -#, python-format -msgid "Attempted to unlink a port that was not linked. %s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:402 -#, python-format -msgid "" -"MidoClient.remove_rules_by_property called: tenant_id=%(tenant_id)s, " -"chain_name=%(chain_name)skey=%(key)s, value=%(value)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:429 -#, python-format -msgid "" -"MidoClient.create_router_chains called: router=%(router)s, " -"inbound_chain_name=%(in_chain)s, outbound_chain_name=%(out_chain)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:452 -#, python-format -msgid "MidoClient.delete_router_chains called: id=%(id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:467 -#, python-format -msgid "MidoClient.delete_port_chains called: id=%(id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:479 -#, python-format -msgid "" -"MidoClient.get_link_port called: router=%(router)s, " -"peer_router_id=%(peer_router_id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:518 -#, python-format -msgid "" -"MidoClient.add_static_nat called: tenant_id=%(tenant_id)s, " -"chain_name=%(chain_name)s, from_ip=%(from_ip)s, to_ip=%(to_ip)s, " -"port_id=%(port_id)s, nat_type=%(nat_type)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:526 -#, python-format -msgid "Invalid NAT type passed in %s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:578 -#, python-format -msgid "MidoClient.remote_static_route called: router=%(router)s, ip=%(ip)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:589 -#, python-format -msgid "" -"MidoClient.update_port_chains called: " -"port=%(port)sinbound_chain_id=%(inbound_chain_id)s, " -"outbound_chain_id=%(outbound_chain_id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:600 -#, python-format -msgid "MidoClient.create_chain called: tenant_id=%(tenant_id)s name=%(name)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:608 -#, python-format -msgid "MidoClient.delete_chain called: id=%(id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:614 -#, python-format -msgid "" -"MidoClient.delete_chains_by_names called: tenant_id=%(tenant_id)s " -"names=%(names)s " -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:625 -#, python-format -msgid "" -"MidoClient.get_chain_by_name called: tenant_id=%(tenant_id)s " -"name=%(name)s " -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:636 -#, python-format -msgid "" -"MidoClient.get_port_group_by_name called: tenant_id=%(tenant_id)s " -"name=%(name)s " -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:650 -#, python-format -msgid "MidoClient.create_port_group called: tenant_id=%(tenant_id)s name=%(name)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:659 -#, python-format -msgid "" -"MidoClient.delete_port_group_by_name called: tenant_id=%(tenant_id)s " -"name=%(name)s " -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:665 -#, python-format -msgid "Deleting pg %(id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:671 -#, python-format -msgid "" -"MidoClient.add_port_to_port_group_by_name called: tenant_id=%(tenant_id)s" -" name=%(name)s port_id=%(port_id)s" -msgstr "" - -#: neutron/plugins/midonet/midonet_lib.py:685 -#, python-format -msgid "MidoClient.remove_port_from_port_groups called: port_id=%(port_id)s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:100 -#, python-format -msgid "Invalid nat_type %s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:157 -#, python-format -msgid "Unrecognized direction %s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:191 -#, python-format -msgid "There is no %(name)s with ID %(id)s in MidoNet." -msgstr "" - -#: neutron/plugins/midonet/plugin.py:198 -#: neutron/plugins/ml2/drivers/arista/exceptions.py:23 -#: neutron/plugins/ml2/drivers/arista/exceptions.py:27 -#: neutron/plugins/ml2/drivers/arista/exceptions.py:31 -#: neutron/plugins/ml2/drivers/arista/exceptions.py:35 -#, python-format -msgid "%(msg)s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:235 -msgid "provider_router_id should be configured in the plugin config file" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:405 -#, python-format -msgid "MidonetPluginV2.create_subnet called: subnet=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:437 -#, python-format -msgid "MidonetPluginV2.create_subnet exiting: sn_entry=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:446 -#, python-format -msgid "MidonetPluginV2.delete_subnet called: id=%s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:465 -msgid "MidonetPluginV2.delete_subnet exiting" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:522 -#, python-format -msgid "MidonetPluginV2.create_port called: port=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:583 -#, python-format -msgid "Failed to create a port on network %(net_id)s: %(err)s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:588 -#, python-format -msgid "MidonetPluginV2.create_port exiting: port=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:593 -#, python-format -msgid "MidonetPluginV2.get_port called: id=%(id)s fields=%(fields)r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:600 -#, python-format -msgid "There is no port with ID %(id)s in MidoNet." -msgstr "" - -#: neutron/plugins/midonet/plugin.py:604 -#, python-format -msgid "MidonetPluginV2.get_port exiting: port=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:609 -#, python-format -msgid "MidonetPluginV2.get_ports called: filters=%(filters)s fields=%(fields)r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:618 -#, python-format -msgid "" -"MidonetPluginV2.delete_port called: id=%(id)s " -"l3_port_check=%(l3_port_check)r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:652 -#, python-format -msgid "Failed to delete DHCP mapping for port %(id)s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:727 -#, python-format -msgid "MidonetPluginV2.create_router called: router=%(router)s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:774 -#, python-format -msgid "MidonetPluginV2.create_router exiting: router_data=%(router_data)s." -msgstr "" - -#: neutron/plugins/midonet/plugin.py:786 -#, python-format -msgid "" -"MidonetPluginV2.set_router_gateway called: id=%(id)s, " -"gw_router=%(gw_router)s, gw_ip=%(gw_ip)s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:830 -#, python-format -msgid "MidonetPluginV2.remove_router_gateway called: id=%(id)s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:850 -#, python-format -msgid "MidonetPluginV2.update_router called: id=%(id)s router=%(router)r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:890 -#, python-format -msgid "MidonetPluginV2.update_router exiting: router=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:901 -#, python-format -msgid "MidonetPluginV2.delete_router called: id=%s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1001 -#, python-format -msgid "" -"MidonetPluginV2.add_router_interface called: router_id=%(router_id)s " -"interface_info=%(interface_info)r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1025 -msgid "" -"DHCP agent is not working correctly. No port to reach the Metadata server" -" on this network" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1034 -#, python-format -msgid "" -"Failed to create MidoNet resources to add router interface. " -"info=%(info)s, router_id=%(router_id)s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1041 -#, python-format -msgid "MidonetPluginV2.add_router_interface exiting: info=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1081 -#, python-format -msgid "" -"MidonetPluginV2.update_floatingip called: id=%(id)s " -"floatingip=%(floatingip)s " -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1100 -#, python-format -msgid "MidonetPluginV2.update_floating_ip exiting: fip=%s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1122 -#, python-format -msgid "" -"MidonetPluginV2.create_security_group called: " -"security_group=%(security_group)s default_sg=%(default_sg)s " -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1151 -#, python-format -msgid "Failed to create MidoNet resources for sg %(sg)r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1158 -#, python-format -msgid "MidonetPluginV2.create_security_group exiting: sg=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1164 -#, python-format -msgid "MidonetPluginV2.delete_security_group called: id=%s" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1196 -#, python-format -msgid "" -"MidonetPluginV2.create_security_group_rule called: " -"security_group_rule=%(security_group_rule)r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1206 -#, python-format -msgid "MidonetPluginV2.create_security_group_rule exiting: rule=%r" -msgstr "" - -#: neutron/plugins/midonet/plugin.py:1216 -#, python-format -msgid "MidonetPluginV2.delete_security_group_rule called: sg_rule_id=%s" -msgstr "" - -#: neutron/plugins/midonet/common/config.py:23 -msgid "MidoNet API server URI." -msgstr "" - -#: neutron/plugins/midonet/common/config.py:25 -msgid "MidoNet admin username." -msgstr "" - -#: neutron/plugins/midonet/common/config.py:28 -msgid "MidoNet admin password." -msgstr "" - -#: neutron/plugins/midonet/common/config.py:31 -msgid "ID of the project that MidoNet admin userbelongs to." -msgstr "" - -#: neutron/plugins/midonet/common/config.py:34 -msgid "Virtual provider router ID." -msgstr "" - -#: neutron/plugins/midonet/common/config.py:37 -msgid "Operational mode. Internal dev use only." -msgstr "" - -#: neutron/plugins/midonet/common/config.py:40 -msgid "Path to midonet host uuid file" -msgstr "" - -#: neutron/plugins/ml2/config.py:22 -msgid "" -"List of network type driver entrypoints to be loaded from the " -"neutron.ml2.type_drivers namespace." -msgstr "" - -#: neutron/plugins/ml2/config.py:26 -msgid "Ordered list of network_types to allocate as tenant networks." -msgstr "" - -#: neutron/plugins/ml2/config.py:30 -msgid "" -"An ordered list of networking mechanism driver entrypoints to be loaded " -"from the neutron.ml2.mechanism_drivers namespace." -msgstr "" - -#: neutron/plugins/ml2/config.py:35 -msgid "" -"An ordered list of extension driver entrypoints to be loaded from the " -"neutron.ml2.extension_drivers namespace." -msgstr "" - -#: neutron/plugins/ml2/db.py:54 -#, python-format -msgid "Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/ml2/db.py:197 neutron/plugins/ml2/db.py:249 -#: neutron/plugins/ml2/plugin.py:1025 -#, python-format -msgid "Multiple ports have port_id starting with %s" -msgstr "" - -#: neutron/plugins/ml2/db.py:203 -#, python-format -msgid "get_port_from_device_mac() called for mac %s" -msgstr "" - -#: neutron/plugins/ml2/db.py:245 -#, python-format -msgid "No binding found for port %(port_id)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:39 -#, python-format -msgid "Configured type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:44 -#, python-format -msgid "Loaded type driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:52 -#, 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:60 -#, python-format -msgid "Registered types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:68 -#, python-format -msgid "No type driver for tenant network_type: %s. Service terminated!" -msgstr "" - -#: neutron/plugins/ml2/managers.py:72 -#, python-format -msgid "Tenant network_types: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:88 -msgid "network_type required" -msgstr "" - -#: neutron/plugins/ml2/managers.py:127 -#, python-format -msgid "Network %s has no segments" -msgstr "" - -#: neutron/plugins/ml2/managers.py:145 -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:169 neutron/plugins/ml2/managers.py:178 -#: neutron/plugins/ml2/drivers/type_tunnel.py:179 -#, python-format -msgid "network_type value '%s' not supported" -msgstr "" - -#: neutron/plugins/ml2/managers.py:204 neutron/plugins/ml2/managers.py:231 -#, python-format -msgid "Failed to release segment '%s' because network type is not supported." -msgstr "" - -#: neutron/plugins/ml2/managers.py:247 -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:253 -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:265 -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:272 -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:294 -#, python-format -msgid "Mechanism driver '%(name)s' failed in %(method)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:596 -#, python-format -msgid "Mechanism driver %s failed in bind_port" -msgstr "" - -#: neutron/plugins/ml2/managers.py:600 -#, python-format -msgid "Failed to bind port %(port)s on host %(host)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:613 -#, python-format -msgid "Configured extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:619 -#, python-format -msgid "Loaded extension driver names: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:630 -#, python-format -msgid "Registered extension drivers: %s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:636 -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:644 -#, python-format -msgid "Got %(alias)s extension from driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:655 -#, python-format -msgid "Extension driver '%(name)s' failed in %(method)s" -msgstr "" - -#: neutron/plugins/ml2/managers.py:691 -#, python-format -msgid "Extended network dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:698 -#, python-format -msgid "Extended subnet dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/managers.py:705 -#, python-format -msgid "Extended port dict for driver '%(drv)s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:138 -msgid "Modular L2 Plugin initialization complete" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:197 -msgid "binding:profile value too large" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:253 -#, python-format -msgid "Failed to commit binding results for %(port)s after %(max)s tries" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:259 -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:385 -#, python-format -msgid "Serialized vif_details DB value '%(value)s' for port %(port)s is invalid" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:396 -#, python-format -msgid "Serialized profile DB value '%(value)s' for port %(port)s is invalid" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:465 -#, 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:499 -#, python-format -msgid "mechanism_manager.create_network_postcommit failed, deleting network '%s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:562 -#, python-format -msgid "Deleting network %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:583 -#, python-format -msgid "Ports to auto-delete: %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:589 neutron/plugins/ml2/plugin.py:717 -msgid "Tenant-owned ports exist" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:597 -#, python-format -msgid "Subnets to auto-delete: %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:609 -#, python-format -msgid "Deleting network record %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:614 neutron/plugins/ml2/plugin.py:729 -msgid "Committing transaction" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:620 -msgid "A concurrent port creation has occurred" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:629 -#, python-format -msgid "Exception auto-deleting port %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:637 -#, python-format -msgid "Exception auto-deleting subnet %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:646 -msgid "mechanism_manager.delete_network_postcommit failed" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:662 -#, python-format -msgid "mechanism_manager.create_subnet_postcommit failed, deleting subnet '%s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:694 -#, python-format -msgid "Deleting subnet %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:711 -#, python-format -msgid "Ports to auto-deallocate: %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:726 -msgid "Deleting subnet record" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:745 -#, python-format -msgid "Exception deleting fixed_ip from port %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:755 -msgid "mechanism_manager.delete_subnet_postcommit failed" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:787 -#, python-format -msgid "mechanism_manager.create_port_postcommit failed, deleting port '%s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:799 -#, python-format -msgid "_bind_port_if_needed failed, deleting port '%s'" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:881 -#, python-format -msgid "No Host supplied to bind DVR Port %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:941 -#: neutron/tests/unit/ml2/test_ml2_plugin.py:144 -#, python-format -msgid "Deleting port %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:961 -#: neutron/tests/unit/ml2/test_ml2_plugin.py:145 -#, python-format -msgid "The port '%s' was deleted" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1010 -#, python-format -msgid "mechanism_manager.delete_port_postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1034 -#, python-format -msgid "Binding info for DVR port %s not found" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1060 -#, python-format -msgid "Port %(port)s updated up by agent not found" -msgstr "" - -#: neutron/plugins/ml2/plugin.py:1090 -#, python-format -msgid "Port %s not found during update" -msgstr "" - -#: neutron/plugins/ml2/rpc.py:66 -#, python-format -msgid "Device %(device)s requested by agent %(agent_id)s not found in database" -msgstr "" - -#: neutron/plugins/ml2/rpc.py:75 -#, python-format -msgid "" -"Device %(device)s requested by agent %(agent_id)s on network " -"%(network_id)s not bound, vif_type: %(vif_type)s" -msgstr "" - -#: neutron/plugins/ml2/rpc.py:103 -#, python-format -msgid "Returning: %s" -msgstr "" - -#: neutron/plugins/ml2/rpc.py:122 -#, python-format -msgid "Device %(device)s no longer exists at agent %(agent_id)s" -msgstr "" - -#: neutron/plugins/ml2/rpc.py:148 -#, python-format -msgid "Device %(device)s up at agent %(agent_id)s" -msgstr "" - -#: neutron/plugins/ml2/common/exceptions.py:23 -#, python-format -msgid "%(method)s failed." -msgstr "" - -#: neutron/plugins/ml2/drivers/helpers.py:140 -#, python-format -msgid "" -"Allocate %(type)s segment from pool failed after %(number)s failed " -"attempts" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_agent.py:54 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:327 -#, python-format -msgid "Attempting to bind port %(port)s on network %(network)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_agent.py:61 -#, python-format -msgid "Refusing to bind due to unsupported vnic_type: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_agent.py:65 -#, python-format -msgid "Checking agent: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_agent.py:70 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:337 -#, python-format -msgid "Bound using segment: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_agent.py:73 -#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:112 -#, python-format -msgid "Attempting to bind with dead agent: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_hyperv.py:44 -#, python-format -msgid "Checking segment: %(segment)s for mappings: %(mappings)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_linuxbridge.py:44 -#: neutron/plugins/ml2/drivers/mech_openvswitch.py:45 -#, python-format -msgid "" -"Checking segment: %(segment)s for mappings: %(mappings)s with " -"tunnel_types: %(tunnel_types)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:35 -msgid "CRD service Username" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:38 -msgid "CRD Service Password" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:40 -msgid "CRD Tenant Name" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:43 -msgid "CRD Auth URL" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:46 -msgid "URL for connecting to CRD service" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:49 -msgid "Timeout value for connecting to CRD service in seconds" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:53 -msgid "Region name for connecting to CRD Service in admin context" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:57 -msgid "If set, ignore any SSL validation issues" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:60 -msgid "Auth strategy for connecting to neutron in admin context" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:63 -msgid "Location of ca certificates file to use for CRD client requests." -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:87 -msgid "Initializing CRD client... " -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_ncs.py:29 -msgid "HTTP URL of Tail-f NCS REST interface." -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_ncs.py:31 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:46 -msgid "HTTP username for authentication" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_ncs.py:33 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:48 -msgid "HTTP password for authentication" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_ncs.py:35 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:50 -msgid "HTTP timeout in seconds." -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:44 -msgid "HTTP URL of OpenDaylight REST interface." -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:52 -msgid "Tomcat session timeout in minutes." -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:102 -#, python-format -msgid "Failed to authenticate with OpenDaylight: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:105 -#, python-format -msgid "Authentication Timed Out: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:315 -#, python-format -msgid "ODL-----> sending URL (%s) <-----ODL" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:316 -#, python-format -msgid "ODL-----> sending JSON (%s) <-----ODL" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:340 -#: neutron/plugins/ml2/drivers/mech_nuage/driver.py:94 -#, python-format -msgid "" -"Refusing to bind port for segment ID %(id)s, segment %(seg)s, phys net " -"%(physnet)s, and network type %(nettype)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:31 -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:69 -msgid "Arbitrary flat physical_network names allowed" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:72 -msgid "physical network name is empty" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:75 -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:82 -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:90 -msgid "physical_network required for flat provider network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:93 -#, python-format -msgid "physical_network '%s' unknown for flat provider network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:100 -#, python-format -msgid "%s prohibited for flat provider network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:107 -#, python-format -msgid "Reserving flat network on physical network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_flat.py:130 -#, python-format -msgid "No flat network found on physical network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:34 -msgid "" -"Comma-separated list of : tuples enumerating ranges of " -"GRE tunnel IDs that are available for tenant network allocation" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:126 -#, python-format -msgid "Gre endpoint with ip %s already exists" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:35 -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_local.py:49 -#, python-format -msgid "%s prohibited for local provider network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:76 -#, python-format -msgid "Invalid tunnel ID range: '%(range)s' - %(e)s. Agent terminated!" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:79 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:88 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:437 -#, python-format -msgid "provider:physical_network specified for %s network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:95 -#, python-format -msgid "%(key)s prohibited for %(tunnel)s provider network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:166 -msgid "Network_type value needed by the ML2 plugin" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:38 -msgid "" -"List of :: or " -"specifying physical_network names usable for VLAN provider and tenant " -"networks, as well as ranges of VLAN tags on each available for allocation" -" to tenant networks." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:93 -msgid "Failed to parse network_vlan_ranges. Service terminated!" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:163 -msgid "VlanTypeDriver initialization complete" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:173 -#, python-format -msgid "physical_network '%s' unknown for VLAN provider network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:178 -#, python-format -msgid "segmentation_id out of range (%(min)s through %(max)s)" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:184 -msgid "segmentation_id requires physical_network for VLAN provider network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:192 -#, python-format -msgid "%s prohibited for VLAN provider network" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vlan.py:254 -#, python-format -msgid "No vlan_id %(vlan_id)s found on physical network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:38 -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:42 -msgid "Multicast group for VXLAN. If unset, disables VXLAN multicast mode." -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:127 -msgid "get_vxlan_endpoints() called" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:137 -#, python-format -msgid "add_vxlan_endpoint() called for ip %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:146 -#, python-format -msgid "Vxlan endpoint with ip %s already exists" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:32 -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:32 -msgid "Unable to reach EOS" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:132 -msgid "Required option primary_l3_host is not set" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:138 -msgid "VRFs are not supported MLAG config mode" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:142 -msgid "Required option secondary_l3_host is not set" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:146 -msgid "Required option primary_l3_host_username is not set" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:327 -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:435 -#, python-format -msgid "Executing command on Arista EOS: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:333 -#, python-format -msgid "Results of execution on Arista EOS: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:336 -#, python-format -msgid "Error occured while trying to execute commands %(cmd)s on EOS %(host)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:31 -msgid "" -"Username for Arista EOS. This is required field. If not set, all " -"communications to Arista EOSwill fail." -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:37 -msgid "" -"Password for Arista EOS. This is required field. If not set, all " -"communications to Arista EOS will fail." -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:42 -msgid "" -"Arista EOS IP address. This is required field. If not set, all " -"communications to Arista EOSwill fail." -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:47 -msgid "" -"Defines if hostnames are sent to Arista EOS as FQDNs " -"(\"node1.domain.com\") or as short names (\"node1\"). This is optional. " -"If not set, a value of \"True\" is assumed." -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:53 -msgid "" -"Sync interval in seconds between Neutron plugin and EOS. This interval " -"defines how often the synchronization is performed. This is an optional " -"field. If not set, a value of 180 seconds is assumed." -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:60 -msgid "" -"Defines Region Name that is assigned to this OpenStack Controller. This " -"is useful when multiple OpenStack/Neutron controllers are managing the " -"same Arista HW clusters. Note that this name must match with the region " -"name registered (or known) to keystone service. Authentication with " -"Keysotne is performed by EOS. This is optional. If not set, a value of " -"\"RegionOne\" is assumed." -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:81 -msgid "" -"Username for Arista EOS. This is required field. If not set, all " -"communications to Arista EOS will fail" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:87 -msgid "" -"Password for Arista EOS. This is required field. If not set, all " -"communications to Arista EOS will fail" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:92 -msgid "" -"Arista EOS IP address. This is required field. If not set, all " -"communications to Arista EOS will fail" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:97 -msgid "" -"Arista EOS IP address for second Switch MLAGed with the first one. This " -"an optional field, however, if mlag_config flag is set, then this is " -"required. If not set, all communications to Arista EOS will fail" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:104 -msgid "" -"This flag is used indicate if Arista Switches are configured in MLAG " -"mode. If yes, all L3 config is pushed to both the switches automatically." -" If this flag is set to True, ensure to specify IP addresses of both " -"switches. This is optional. If not set, a value of \"False\" is assumed." -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:113 -msgid "" -"A \"True\" value for this flag indicates to create a router in VRF. If " -"not set, all routers are created in default VRF.This is optional. If not " -"set, a value of \"False\" is assumed." -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/config.py:120 -msgid "" -"Sync interval in seconds between L3 Service plugin and EOS. This interval" -" defines how often the synchronization is performed. This is an optional " -"field. If not set, a value of 180 seconds is assumed" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:75 -#, python-format -msgid "'timestamp' command '%s' is not available on EOS" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:317 -#, python-format -msgid "VM id %(vmid)s not found for port %(portid)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:336 -#, python-format -msgid "Unknown device owner: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:450 -#, python-format -msgid "Error %(err)s while trying to execute commands %(cmd)s on EOS %(host)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:522 -msgid "Required option eapi_host is not set" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:526 -msgid "Required option eapi_username is not set" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:546 -msgid "Syncing Neutron <-> EOS" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:552 -msgid "OpenStack and EOS are in sync!" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:574 -#, python-format -msgid "" -"No Tenants configured in Neutron DB. But %d tenants discovered in EOS " -"during synchronization.Entire EOS region is cleared" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:739 -#, python-format -msgid "Network %s is not created as it is not found inArista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:753 -#, python-format -msgid "Network name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:781 -#, python-format -msgid "Network %s is not updated as it is not found inArista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:873 -#, 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:888 -#, python-format -msgid "Port name changed to %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:938 -#, python-format -msgid "VM %s is not updated as it is not found in Arista DB" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:40 -msgid "Allowed physical networks" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:42 -msgid "OS Type of the switch" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:44 -msgid "OS Version number" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:95 -msgid "Virtual Fabric: enabled" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:97 -msgid "Virtual Fabric: not enabled" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:135 -msgid "" -"Brocade Mechanism: failed to create network, network cannot be created in" -" the configured physical network" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:141 -msgid "" -"Brocade Mechanism: failed to create network, only network type vlan is " -"supported" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:149 -msgid "Brocade Mechanism: failed to create network in db" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:151 -msgid "Brocade Mechanism: create_network_precommit failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:153 -#, python-format -msgid "" -"create network (precommit): %(network_id)s of network type = " -"%(network_type)s with vlan = %(vlan_id)s for tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:165 -msgid "create_network_postcommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:185 -msgid "Brocade NOS driver: failed in create network" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:188 -msgid "Brocade Mechanism: create_network_postcommmit failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:190 -#, python-format -msgid "" -"created network (postcommit): %(network_id)s of network type = " -"%(network_type)s with vlan = %(vlan_id)s for tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:202 -msgid "delete_network_precommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:215 -msgid "Brocade Mechanism: failed to delete network in db" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:217 -msgid "Brocade Mechanism: delete_network_precommit failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:219 -#, python-format -msgid "" -"delete network (precommit): %(network_id)s with vlan = %(vlan_id)s for " -"tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:231 -msgid "delete_network_postcommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:243 -msgid "Brocade NOS driver: failed to delete network" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:245 -msgid "Brocade switch exception, delete_network_postcommit failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:248 -#, python-format -msgid "" -"delete network (postcommit): %(network_id)s with vlan = %(vlan_id)s for " -"tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:266 -msgid "create_port_precommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:284 -msgid "Brocade Mechanism: failed to create port in db" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:286 -msgid "Brocade Mechanism: create_port_precommit failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:291 -msgid "create_port_postcommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:315 -#, python-format -msgid "Brocade NOS driver: failed to associate mac %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:318 -msgid "Brocade switch exception: create_port_postcommit failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:321 -#, python-format -msgid "" -"created port (postcommit): port_id=%(port_id)s network_id=%(network_id)s " -"tenant_id=%(tenant_id)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:329 -msgid "delete_port_precommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:338 -msgid "Brocade Mechanism: failed to delete port in db" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:340 -msgid "Brocade Mechanism: delete_port_precommit failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:345 -msgid "delete_port_postcommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:369 -#, python-format -msgid "Brocade NOS driver: failed to dissociate MAC %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:372 -msgid "Brocade switch exception, delete_port_postcommit failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:375 -#, python-format -msgid "" -"delete port (postcommit): port_id=%(port_id)s network_id=%(network_id)s " -"tenant_id=%(tenant_id)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:382 -msgid "update_port_precommit(self: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:386 -msgid "update_port_postcommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:390 -msgid "create_subnetwork_precommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:394 -msgid "create_subnetwork_postcommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:398 -msgid "delete_subnetwork_precommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:402 -msgid "delete_subnetwork_postcommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:406 -msgid "update_subnet_precommit(self: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:410 -msgid "update_subnet_postcommit: called" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:77 -msgid "" -"Brocade Switch IP address is not set, check config ml2_conf_brocade.ini " -"file" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:88 -msgid "Connect failed to switch" -msgstr "" - -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:107 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:117 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:145 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:162 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:175 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:188 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:355 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:374 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:388 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:401 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:414 -msgid "NETCONF error" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:30 -msgid "Prefix for APIC domain/names/profiles created" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:40 -msgid "An ordered list of host names or IP addresses of the APIC controller(s)." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:43 -msgid "Username for the APIC controller" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:45 -msgid "Password for the APIC controller" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:48 -msgid "Name mapping strategy to use: use_uuid | use_name" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:50 -msgid "Use SSL to connect to the APIC controller" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:53 -msgid "Name for the domain created on APIC" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:56 -msgid "Name for the app profile used for Openstack" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:59 -msgid "Name for the vlan namespace to be used for Openstack" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:62 -msgid "Name of the node profile to be created" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:65 -msgid "Name of the entity profile to be created" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:68 -msgid "Name of the function profile to be created" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:71 -msgid "Name of the LACP profile to be created" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:74 -msgid "The uplink ports to check for ACI connectivity" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:77 -msgid "The switch pairs for VPC connectivity" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:80 -msgid "Range of VLAN's to be used for Openstack" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:83 -msgid "Setup root helper as rootwrap or sudo" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:86 -msgid "Synchronization interval in seconds" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:89 -msgid "Interval between agent status updates (in sec)" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:92 -msgid "Interval between agent poll for topology (in sec)" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/config.py:25 -msgid "The physical network managed by the switches." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:33 -#, python-format -msgid "Credential %(credential_name)s already exists for tenant %(tenant_id)s." -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:54 -#, python-format -msgid "Nexus Port Binding (%(filters)s) is not present" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:63 -#, python-format -msgid "Missing required field(s) to configure nexus switch: %(fields)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/mech_cisco_nexus.py:45 -#, python-format -msgid "nexus_switches found = %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:30 -msgid "get_nexusport_binding() called" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:39 -msgid "get_nexusvlan_binding() called" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:45 -msgid "add_nexusport_binding() called" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:58 -msgid "remove_nexusport_binding() called" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:74 -msgid "update_nexusport_binding called with no vlan" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:76 -msgid "update_nexusport_binding called" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:87 -msgid "get_nexusvm_bindings() called" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:94 -msgid "get_port_vlan_switch_binding() called" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:102 -#, python-format -msgid "" -"get_port_switch_bindings() called, port:'%(port_id)s', " -"switch:'%(switch_ip)s'" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py:123 -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py:162 -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py:171 -#, python-format -msgid "NexusDriver: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py:178 -#, python-format -msgid "NexusDriver created VLAN: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/l2pop/config.py:25 -msgid "" -"Delay within which agent is expected to update existing ports whent it " -"restarts" -msgstr "" - -#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:42 -msgid "Experimental L2 population driver" -msgstr "" - -#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:167 -msgid "Unable to retrieve the agent ip, check the agent configuration." -msgstr "" - -#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:173 -#, python-format -msgid "Port %(port)s updated by agent %(agent)s isn't bound to any segment" -msgstr "" - -#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:226 -#, python-format -msgid "" -"Unable to retrieve the agent ip, check the agent %(agent_host)s " -"configuration." -msgstr "" - -#: neutron/plugins/ml2/drivers/l2pop/rpc.py:40 -#, python-format -msgid "" -"Fanout notify l2population agents at %(topic)s the message %(method)s " -"with %(fdb_entries)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/l2pop/rpc.py:51 -#, python-format -msgid "" -"Notify l2population agent %(host)s at %(topic)s the message %(method)s " -"with %(fdb_entries)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:54 -msgid "Initializing driver" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:72 -msgid "Initialization done" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:133 -msgid "Ignoring port notification to controller because of missing host ID." -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:202 -#, python-format -msgid "No cache entry for host %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:207 -#, python-format -msgid "Expired cache entry for host %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:31 -msgid "" -"Supported PCI vendor devices, defined by vendor_id:product_id according " -"to the PCI ID Repository. Default enables support for Intel and Mellanox " -"SR-IOV capable NICs" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:37 -msgid "SRIOV neutron agent is required for port binding" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:86 -msgid "Failed to parse supported PCI vendor devices" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:87 -msgid "Parsing supported pci_vendor_devs failed" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:176 -#, python-format -msgid "Invalid pci_vendor_info: '%s'" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:179 -#, python-format -msgid "Missing vendor_id in: '%s'" -msgstr "" - -#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:182 -#, python-format -msgid "Missing product_id in: '%s'" -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/config.py:24 -#: neutron/plugins/mlnx/common/config.py:48 -msgid "Type of VM network interface: mlnx_direct or hostdev" -msgstr "" - -#: neutron/plugins/ml2/drivers/mlnx/mech_mlnx.py:54 -#, python-format -msgid "Checking segment: %(segment)s for mappings: %(mappings)s " -msgstr "" - -#: neutron/plugins/mlnx/agent_notify_api.py:48 -msgid "Sending delete network message" -msgstr "" - -#: neutron/plugins/mlnx/agent_notify_api.py:56 -msgid "Sending update port message" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:121 -msgid "Mellanox Embedded Switch Plugin initialisation complete" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:161 -#, python-format -msgid "Invalid physical network type %(type)s.Server terminated!" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:168 -#, python-format -msgid "Parsing physical_network_type failed: %s. Server terminated!" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:173 -#, python-format -msgid "" -"Invalid physical network type %(type)s for network %(net)s. Server " -"terminated!" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:177 -#, python-format -msgid "Physical Network type mappings: %s" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:185 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:364 -#, python-format -msgid "%s. Server terminated!" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:323 -#, python-format -msgid "Unsupported vnic type %(vnic_type)s for physical network type %(net_type)s" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:327 -msgid "Invalid vnic_type on port_create" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:329 -msgid "vnic_type is not defined in port profile" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:373 -msgid "Update network" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:386 -msgid "Delete network" -msgstr "" - -#: neutron/plugins/mlnx/mlnx_plugin.py:434 -#, python-format -msgid "create_port with %s" -msgstr "" - -#: neutron/plugins/mlnx/rpc_callbacks.py:97 -#, python-format -msgid "Device %(device)s up %(agent_id)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:57 -#, python-format -msgid "Agent cache inconsistency - port id is not stored for %s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:72 -#, python-format -msgid "Network %s not defined on Agent." -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:85 -#, python-format -msgid "Network %s is not available on this agent" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:96 -#, python-format -msgid "Connecting port %s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:106 -#, python-format -msgid "Binding Segmentation ID %(seg_id)sto eSwitch for vNIC mac_address %(mac)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:125 -#, python-format -msgid "Port_mac %s is not available on this agent" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:132 -msgid "Creating VLAN Network" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:134 -#, python-format -msgid "Unknown network type %(network_type)s for network %(network_id)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:166 -msgid "Invalid Network ID, cannot remove Network" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:168 -#, python-format -msgid "Delete network %s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:311 -#, python-format -msgid "Adding or updating port with mac %s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:314 -#, python-format -msgid "Port %s updated" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:339 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:226 -#, python-format -msgid "Removing device with mac_address %s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:347 -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:233 -#, python-format -msgid "Removing port failed for device %(device)s due to %(exc)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:364 -msgid "eSwitch Agent Started!" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:375 -msgid "" -"Request timeout in agent event loop eSwitchD is not responding - " -"exiting..." -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:415 -#, python-format -msgid "Failed on Agent initialisation : %s. Agent terminated!" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:420 -msgid "Agent initialised successfully, now running... " -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:30 -msgid "" -"Failed to import eventlet.green.zmq. Won't connect to eSwitchD - " -"exiting..." -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:74 -#, python-format -msgid "Action %(action)s failed: %(reason)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:76 -#, python-format -msgid "Unknown operation status %s" -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:81 -msgid "get_attached_vnics" -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:88 -#, python-format -msgid "" -"Set Vlan %(segmentation_id)s on Port %(port_mac)s on Fabric " -"%(physical_network)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:101 -#, python-format -msgid "Define Fabric %(fabric)s on interface %(ifc)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:110 -#, python-format -msgid "Port Up for %(port_mac)s on fabric %(fabric)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:119 -#, python-format -msgid "Port Down for %(port_mac)s on fabric %(fabric)s" -msgstr "" - -#: neutron/plugins/mlnx/agent/utils.py:128 -#, python-format -msgid "Port Release for %(port_mac)s on fabric %(fabric)s" -msgstr "" - -#: neutron/plugins/mlnx/common/comm_utils.py:57 -#, python-format -msgid "Request timeout - call again after %s seconds" -msgstr "" - -#: neutron/plugins/mlnx/common/config.py:34 -msgid "" -"List of : with " -"physical_network_type is either eth or ib" -msgstr "" - -#: neutron/plugins/mlnx/common/config.py:37 -msgid "Physical network type for provider network (eth or ib)" -msgstr "" - -#: neutron/plugins/mlnx/common/config.py:52 -msgid "eswitch daemon end point" -msgstr "" - -#: neutron/plugins/mlnx/common/config.py:54 -msgid "" -"The number of milliseconds the agent will wait for response on request to" -" daemon." -msgstr "" - -#: neutron/plugins/mlnx/common/config.py:57 -msgid "" -"The number of retries the agent will send request to daemon before giving" -" up" -msgstr "" - -#: neutron/plugins/mlnx/common/config.py:60 -msgid "" -"backoff rate multiplier for waiting period between retries for request to" -" daemon, i.e. value of 2 will double the request timeout each retry" -msgstr "" - -#: neutron/plugins/mlnx/common/exceptions.py:20 -#, python-format -msgid "Mlnx Exception: %(err_msg)s" -msgstr "" - -#: neutron/plugins/mlnx/common/exceptions.py:24 -msgid "Request Timeout: no response from eSwitchD" -msgstr "" - -#: neutron/plugins/mlnx/common/exceptions.py:28 -#, python-format -msgid "Operation Failed: %(err_msg)s" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:42 -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:63 -#, python-format -msgid "Removing vlan %(seg_id)s on physical network %(net)s from pool" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:119 -#, python-format -msgid "Reserving vlan %(seg_id)s on physical network %(net)s from pool" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:138 -#, python-format -msgid "" -"Reserving specific vlan %(seg_id)s on physical network %(phy_net)s from " -"pool" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:143 -#, python-format -msgid "" -"Reserving specific vlan %(seg_id)s on physical network %(phy_net)s " -"outside pool" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:170 -#, python-format -msgid "Releasing vlan %(seg_id)s on physical network %(phy_net)s to pool" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:175 -#, python-format -msgid "Releasing vlan %(seg_id)s on physical network %(phy_net)s outside pool" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:181 -#, python-format -msgid "vlan_id %(seg_id)s on physical network %(phy_net)s not found" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:239 -msgid "Get_port_from_device_mac() called" -msgstr "" - -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:247 -#, python-format -msgid "Set_port_status as %s called" -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:206 -#, python-format -msgid "_cleanup_ofc_tenant: No OFC tenant for %s" -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:209 -#, python-format -msgid "delete_ofc_tenant() failed due to %s" -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:225 -msgid "activate_port_if_ready(): skip, port.admin_state_up is False." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:229 -msgid "activate_port_if_ready(): skip, network.admin_state_up is False." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:233 -msgid "activate_port_if_ready(): skip, no portinfo for this port." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:237 -msgid "activate_port_if_ready(): skip, ofc_port already exists." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:245 -#, python-format -msgid "create_ofc_port() failed due to %s" -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:258 -#, python-format -msgid "deactivate_port(): skip, ofc_port for port=%s does not exist." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:277 -#, python-format -msgid "deactivate_port(): OFC port for port=%s is already removed." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:285 -#, python-format -msgid "Failed to delete port=%(port)s from OFC: %(exc)s" -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:304 -#, python-format -msgid "NECPluginV2.create_network() called, network=%s ." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:321 -#, python-format -msgid "Failed to create network id=%(id)s on OFC: %(exc)s" -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:337 -#, python-format -msgid "NECPluginV2.update_network() called, id=%(id)s network=%(network)s ." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:381 -#, python-format -msgid "NECPluginV2.delete_network() called, id=%s ." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:415 -#, python-format -msgid "delete_network() failed due to %s" -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:556 -#, python-format -msgid "NECPluginV2.create_port() called, port=%s ." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:620 -#, python-format -msgid "NECPluginV2.update_port() called, id=%(id)s port=%(port)s ." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:648 -#, python-format -msgid "NECPluginV2.delete_port() called, id=%s ." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:715 -#, python-format -msgid "NECPluginV2RPCCallbacks.update_ports() called, kwargs=%s ." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:725 -#, python-format -msgid "" -"update_ports(): ignore unchanged portinfo in port_added message " -"(port_id=%s)." -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:745 -#, python-format -msgid "" -"update_ports(): ignore port_removed message due to portinfo for " -"port_id=%s was not registered" -msgstr "" - -#: neutron/plugins/nec/nec_plugin.py:750 -#, python-format -msgid "" -"update_ports(): ignore port_removed message received from different host " -"(registered_datapath_id=%(registered)s, " -"received_datapath_id=%(received)s)." -msgstr "" - -#: neutron/plugins/nec/nec_router.py:58 -#, python-format -msgid "RouterMixin.create_router() called, router=%s ." -msgstr "" - -#: neutron/plugins/nec/nec_router.py:84 -#, python-format -msgid "RouterMixin.update_router() called, id=%(id)s, router=%(router)s ." -msgstr "" - -#: neutron/plugins/nec/nec_router.py:102 -#, python-format -msgid "RouterMixin.delete_router() called, id=%s." -msgstr "" - -#: neutron/plugins/nec/nec_router.py:121 -#, python-format -msgid "" -"RouterMixin.add_router_interface() called, id=%(id)s, " -"interface=%(interface)s." -msgstr "" - -#: neutron/plugins/nec/nec_router.py:128 -#, python-format -msgid "" -"RouterMixin.remove_router_interface() called, id=%(id)s, " -"interface=%(interface)s." -msgstr "" - -#: neutron/plugins/nec/nec_router.py:311 -#, python-format -msgid "" -"OFC does not support router with provider=%(provider)s, so removed it " -"from supported provider (new router driver map=%(driver_map)s)" -msgstr "" - -#: neutron/plugins/nec/nec_router.py:319 -#, python-format -msgid "" -"default_router_provider %(default)s is supported! Please specify one of " -"%(supported)s" -msgstr "" - -#: neutron/plugins/nec/nec_router.py:333 -#, python-format -msgid "Enabled router drivers: %s" -msgstr "" - -#: neutron/plugins/nec/nec_router.py:336 -#, python-format -msgid "" -"No router provider is enabled. neutron-server terminated! " -"(supported=%(supported)s, configured=%(config)s)" -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:40 -msgid "Disabled packet-filter extension." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:45 -#, python-format -msgid "create_packet_filter() called, packet_filter=%s ." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:61 -#, python-format -msgid "update_packet_filter() called, id=%(id)s packet_filter=%(packet_filter)s ." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:134 -#: neutron/plugins/nec/packet_filter.py:187 -#, python-format -msgid "Failed to create packet_filter id=%(id)s on OFC: %(exc)s" -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:144 -#, python-format -msgid "delete_packet_filter() called, id=%s ." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:162 -#, python-format -msgid "activate_packet_filter_if_ready() called, packet_filter=%s." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:171 -#, python-format -msgid "" -"activate_packet_filter_if_ready(): skip pf_id=%s, " -"packet_filter.admin_state_up is False." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:174 -#, python-format -msgid "" -"activate_packet_filter_if_ready(): skip pf_id=%s, no portinfo for the " -"in_port." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:177 -msgid "" -"_activate_packet_filter_if_ready(): skip, ofc_packet_filter already " -"exists." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:180 -#, python-format -msgid "activate_packet_filter_if_ready(): create packet_filter id=%s on OFC." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:200 -#, python-format -msgid "deactivate_packet_filter_if_ready() called, packet_filter=%s." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:205 -#, python-format -msgid "" -"deactivate_packet_filter(): skip, Not found OFC Mapping for packet_filter" -" id=%s." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:210 -#, python-format -msgid "deactivate_packet_filter(): deleting packet_filter id=%s from OFC." -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:219 -#, python-format -msgid "Failed to delete packet_filter id=%(id)s from OFC: %(exc)s" -msgstr "" - -#: neutron/plugins/nec/packet_filter.py:250 -#, python-format -msgid "Error occurred while disabling packet filter(s) for port %s" -msgstr "" - -#: neutron/plugins/nec/router_drivers.py:125 -#, python-format -msgid "create_router() failed due to %s" -msgstr "" - -#: neutron/plugins/nec/router_drivers.py:154 -#, python-format -msgid "_update_ofc_routes() failed due to %s" -msgstr "" - -#: neutron/plugins/nec/router_drivers.py:169 -#, python-format -msgid "delete_router() failed due to %s" -msgstr "" - -#: neutron/plugins/nec/router_drivers.py:180 -#, python-format -msgid "" -"RouterOpenFlowDriver.add_interface(): the requested port has no subnet. " -"add_interface() is skipped. router_id=%(id)s, port=%(port)s)" -msgstr "" - -#: neutron/plugins/nec/router_drivers.py:200 -#, python-format -msgid "add_router_interface() failed due to %s" -msgstr "" - -#: neutron/plugins/nec/router_drivers.py:218 -#, python-format -msgid "delete_router_interface() failed due to %s" -msgstr "" - -#: neutron/plugins/nec/agent/nec_neutron_agent.py:53 -#, python-format -msgid "Update ports: added=%(added)s, removed=%(removed)s" -msgstr "" - -#: neutron/plugins/nec/agent/nec_neutron_agent.py:76 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:51 -#, python-format -msgid "port_update received: %s" -msgstr "" - -#: neutron/plugins/nec/agent/nec_neutron_agent.py:220 -msgid "No port changed." -msgstr "" - -#: neutron/plugins/nec/common/config.py:35 -msgid "Host to connect to." -msgstr "" - -#: neutron/plugins/nec/common/config.py:37 -msgid "Base URL of OFC REST API. It is prepended to each API request." -msgstr "" - -#: neutron/plugins/nec/common/config.py:40 -msgid "Port to connect to." -msgstr "" - -#: neutron/plugins/nec/common/config.py:42 -msgid "Driver to use." -msgstr "" - -#: neutron/plugins/nec/common/config.py:44 -msgid "Enable packet filter." -msgstr "" - -#: neutron/plugins/nec/common/config.py:46 -msgid "Use SSL to connect." -msgstr "" - -#: neutron/plugins/nec/common/config.py:48 -msgid "Location of key file." -msgstr "" - -#: neutron/plugins/nec/common/config.py:50 -msgid "Location of certificate file." -msgstr "" - -#: neutron/plugins/nec/common/config.py:52 -msgid "Disable SSL certificate verification." -msgstr "" - -#: neutron/plugins/nec/common/config.py:54 -msgid "" -"Maximum attempts per OFC API request. NEC plugin retries API request to " -"OFC when OFC returns ServiceUnavailable (503). The value must be greater " -"than 0." -msgstr "" - -#: neutron/plugins/nec/common/config.py:63 -msgid "Default router provider to use." -msgstr "" - -#: neutron/plugins/nec/common/config.py:66 -msgid "List of enabled router providers." -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:20 -#, python-format -msgid "An OFC exception has occurred: %(reason)s" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:30 -#, python-format -msgid "The specified OFC resource (%(resource)s) is not found." -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:34 -#, python-format -msgid "An exception occurred in NECPluginV2 DB: %(reason)s" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:38 -#, python-format -msgid "" -"Neutron-OFC resource mapping for %(resource)s %(neutron_id)s is not " -"found. It may be deleted during processing." -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:44 -#, python-format -msgid "OFC returns Server Unavailable (503) (Retry-After=%(retry_after)s)" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:53 -#, python-format -msgid "PortInfo %(id)s could not be found" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:57 -msgid "" -"Invalid input for operation: datapath_id should be a hex string with at " -"most 8 bytes" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:63 -msgid "Invalid input for operation: port_no should be [0:65535]" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:68 -#, python-format -msgid "Router (provider=%(provider)s) does not support an external network" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:73 -#, python-format -msgid "Provider %(provider)s could not be found" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:77 -#, python-format -msgid "Cannot create more routers with provider=%(provider)s" -msgstr "" - -#: neutron/plugins/nec/common/exceptions.py:81 -#, python-format -msgid "" -"Provider of Router %(router_id)s is %(provider)s. This operation is " -"supported only for router provider %(expected_provider)s." -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:54 -#, python-format -msgid "Operation on OFC failed: %(status)s%(msg)s" -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:78 -#, python-format -msgid "Client request: %(host)s:%(port)s %(method)s %(action)s [%(body)s]" -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:87 -#, python-format -msgid "OFC returns [%(status)s:%(data)s]" -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:104 -#, python-format -msgid "OFC returns ServiceUnavailable (retry-after=%s)" -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:108 -#, python-format -msgid "Specified resource %s does not exist on OFC " -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:112 -#, python-format -msgid "Operation on OFC failed: status=%(status)s, detail=%(detail)s" -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:115 -msgid "Operation on OFC failed" -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:124 -#, python-format -msgid "Failed to connect OFC : %s" -msgstr "" - -#: neutron/plugins/nec/common/ofc_client.py:140 -#, python-format -msgid "Waiting for %s seconds due to OFC Service_Unavailable." -msgstr "" - -#: neutron/plugins/nec/db/api.py:103 -#, python-format -msgid "del_ofc_item(): NotFound item (resource=%(resource)s, id=%(id)s) " -msgstr "" - -#: neutron/plugins/nec/db/api.py:137 -#, python-format -msgid "del_portinfo(): NotFound portinfo for port_id: %s" -msgstr "" - -#: neutron/plugins/nec/db/api.py:158 -#: neutron/plugins/openvswitch/ovs_db_v2.py:317 -#, python-format -msgid "get_port_with_securitygroups() called:port_id=%s" -msgstr "" - -#: neutron/plugins/nec/db/router.py:85 -#, python-format -msgid "Add provider binding (router=%(router_id)s, provider=%(provider)s)" -msgstr "" - -#: neutron/plugins/nec/drivers/__init__.py:36 -#, python-format -msgid "Loading OFC driver: %s" -msgstr "" - -#: neutron/plugins/nec/drivers/pfc.py:33 -#, python-format -msgid "OFC %(resource)s ID has an invalid format: %(ofc_id)s" -msgstr "" - -#: neutron/plugins/nec/extensions/packetfilter.py:33 -msgid "Number of packet_filters allowed per tenant, -1 for unlimited" -msgstr "" - -#: neutron/plugins/nec/extensions/packetfilter.py:40 -#, python-format -msgid "PacketFilter %(id)s could not be found" -msgstr "" - -#: neutron/plugins/nec/extensions/packetfilter.py:44 -#, python-format -msgid "" -"IP version %(version)s is not supported for %(field)s (%(value)s is " -"specified)" -msgstr "" - -#: neutron/plugins/nec/extensions/packetfilter.py:49 -#, python-format -msgid "Packet Filter priority should be %(min)s-%(max)s (included)" -msgstr "" - -#: neutron/plugins/nec/extensions/packetfilter.py:53 -#, python-format -msgid "%(field)s field cannot be updated" -msgstr "" - -#: neutron/plugins/nec/extensions/packetfilter.py:57 -#, python-format -msgid "" -"The backend does not support duplicated priority. Priority %(priority)s " -"is in use" -msgstr "" - -#: neutron/plugins/nec/extensions/packetfilter.py:62 -#, python-format -msgid "" -"Ether Type '%(eth_type)s' conflicts with protocol '%(protocol)s'. Update " -"or clear protocol before changing ether type." -msgstr "" - -#: neutron/plugins/nuage/plugin.py:109 -#, python-format -msgid "%(resource)s with id %(resource_id)s does not exist" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:118 -#, python-format -msgid "" -"Either %(resource)s %(req_resource)s not found or you dont have " -"credential to access it" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:124 -#, python-format -msgid "" -"More than one entry found for %(resource)s %(req_resource)s. Use id " -"instead" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:154 -#, python-format -msgid "Router for subnet %s not found " -msgstr "" - -#: neutron/plugins/nuage/plugin.py:271 -#, python-format -msgid "Subnet %s not found on VSD" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:416 -#, python-format -msgid "provider:network_type %s not supported in VSP" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:461 -msgid "External network with subnets can not be changed to non-external network" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:539 -msgid "" -"Either net_partition is not provided with subnet OR default net_partition" -" is not created at the start" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:556 -#, python-format -msgid "Only one subnet is allowed per Provider network %s" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:567 -#, python-format -msgid "Only one subnet is allowed per external network %s" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:697 -#, python-format -msgid "" -"Unable to complete operation on subnet %s.One or more ports have an IP " -"allocation from this subnet." -msgstr "" - -#: neutron/plugins/nuage/plugin.py:724 -#, python-format -msgid "" -"Router %s does not hold default zone OR domain in VSD. Router-IF add " -"failed" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:736 -#, python-format -msgid "Subnet %s does not hold Nuage VSD reference. Router-IF add failed" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:746 -#, python-format -msgid "" -"Subnet %(subnet)s and Router %(router)s belong to different net_partition" -" Router-IF add not permitted" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:757 -#, python-format -msgid "Subnet %s has one or more active VMs Router-IF add not permitted" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:809 neutron/plugins/nuage/plugin.py:814 -#: neutron/plugins/nuage/plugin.py:820 -#, python-format -msgid "No router interface found for Router %s. Router-IF delete failed" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:836 -#, python-format -msgid "Subnet %s has one or more active VMs Router-IF delete not permitted" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:845 -#, python-format -msgid "" -"Router %s does not hold net_partition assoc on Nuage VSD. Router-IF " -"delete failed" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:886 -msgid "" -"Either net_partition is not provided with router OR default net_partition" -" is not created at the start" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:927 -msgid "for same subnet, multiple static routes not allowed" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:944 -#, python-format -msgid "Router %s does not hold net-partition assoc on VSD. extra-route failed" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:1061 -#, python-format -msgid "One or more router still attached to net_partition %s." -msgstr "" - -#: neutron/plugins/nuage/plugin.py:1066 -#, python-format -msgid "NetPartition with %s does not exist" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:1108 -#, python-format -msgid "sharedresource %s not found on VSD" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:1115 neutron/plugins/nuage/plugin.py:1257 -#, python-format -msgid "router %s is not associated with any net-partition" -msgstr "" - -#: neutron/plugins/nuage/plugin.py:1148 -msgid "Floating IP can not be associated to VM in different router context" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:22 -msgid "IP Address and Port of Nuage's VSD server" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:25 -msgid "Username and password for authentication" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:27 -msgid "Boolean for SSL connection with VSD server" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:29 -msgid "Nuage provided base uri to reach out to VSD" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:31 -msgid "" -"Organization name in which VSD will orchestrate network resources using " -"openstack" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:34 -msgid "Nuage provided uri for initial authorization to access VSD" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:38 -msgid "" -"Default Network partition in which VSD will orchestrate network resources" -" using openstack" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:42 -msgid "Per Net Partition quota of floating ips" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:47 -msgid "Nuage plugin will sync resources between openstack and VSD" -msgstr "" - -#: neutron/plugins/nuage/common/config.py:50 -msgid "" -"Sync interval in seconds between openstack and VSD. It defines how often " -"the synchronization is done. If not set, value of 0 is assumed and sync " -"will be performed only once, at the Neutron startup time." -msgstr "" - -#: neutron/plugins/nuage/common/exceptions.py:23 -#, python-format -msgid "Nuage Plugin does not support this operation: %(msg)s" -msgstr "" - -#: neutron/plugins/nuage/common/exceptions.py:27 -#, python-format -msgid "Bad request: %(msg)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:988 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1486 -#, python-format -msgid "Parsing bridge_mappings failed: %s." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:993 -#, python-format -msgid "Parsing physical_interface_mappings failed: %s." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:1014 -#, python-format -msgid "Invalid tunnel type specificed: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1514 -msgid "Tunneling cannot be enabled without a valid local_ip." -msgstr "" - -#: neutron/plugins/ofagent/common/config.py:25 -msgid "Number of seconds to retry acquiring an Open vSwitch datapath" -msgstr "" - -#: neutron/plugins/oneconvergence/plugin.py:238 -msgid "Failed to create subnet, deleting it from neutron" -msgstr "" - -#: neutron/plugins/oneconvergence/plugin.py:302 -#, python-format -msgid "Deleting newly created neutron port %s" -msgstr "" - -#: neutron/plugins/oneconvergence/plugin.py:375 -msgid "Failed to create floatingip" -msgstr "" - -#: neutron/plugins/oneconvergence/plugin.py:414 -msgid "Failed to create router" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:154 -msgid "Port list is updated" -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:161 -msgid "AGENT looping....." -msgstr "" - -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:173 -msgid "NVSD Agent initialized successfully, now running... " -msgstr "" - -#: neutron/plugins/oneconvergence/lib/config.py:26 -msgid "NVSD Controller IP address" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/config.py:29 -msgid "NVSD Controller Port number" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/config.py:32 -msgid "NVSD Controller username" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/config.py:35 -msgid "NVSD Controller password" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/config.py:38 -msgid "NVSD controller REST API request timeout in seconds" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/config.py:40 -msgid "Number of login retries to NVSD controller" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/config.py:45 -msgid "integration bridge" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:23 -#, python-format -msgid "An unknown nvsd plugin exception occurred: %(reason)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:27 -#: neutron/plugins/vmware/api_client/exception.py:68 -msgid "The request has timed out." -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:31 -msgid "Invalid access credentials to the Server." -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:35 -#, python-format -msgid "A resource is not found: %(reason)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:39 -#, python-format -msgid "Request sent to server is invalid: %(reason)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:43 -#, python-format -msgid "Internal Server Error: %(reason)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:47 -msgid "Connection is closed by the server." -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:51 -#, python-format -msgid "The request is forbidden access to the resource: %(reason)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/exception.py:55 -#, python-format -msgid "Internal Server Error from NVSD controller: %(reason)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:55 -#, python-format -msgid "Could not create a %(resource)s under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:59 -#, python-format -msgid "Failed to %(method)s %(resource)s id=%(resource_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:65 -#, python-format -msgid "Failed to %(method)s %(resource)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:110 -#, python-format -msgid "Network %(id)s created under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:127 -#, python-format -msgid "Network %(id)s updated under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:148 -#, python-format -msgid "Network %(id)s deleted under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:161 -#, python-format -msgid "Subnet %(id)s created under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:175 -#, python-format -msgid "Subnet %(id)s deleted under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:191 -#, python-format -msgid "Subnet %(id)s updated under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:223 -#, python-format -msgid "Port %(id)s created under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:247 -#, python-format -msgid "Port %(id)s updated under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:260 -#, python-format -msgid "Port %(id)s deleted under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:282 -#, python-format -msgid "Flatingip %(id)s created under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:300 -#, python-format -msgid "Flatingip %(id)s updated under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:314 -#, python-format -msgid "Flatingip %(id)s deleted under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:327 -#, python-format -msgid "Router %(id)s created under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:343 -#, python-format -msgid "Router %(id)s updated under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:353 -#, python-format -msgid "Router %(id)s deleted under tenant %(tenant_id)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:81 -#, python-format -msgid "Unable to connect to NVSD controller. Exiting after %(retries)s attempts" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:90 -#, python-format -msgid "Login Failed: %s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:91 -#, python-format -msgid "Unable to establish connection with Controller %s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:93 -msgid "Retrying after 1 second..." -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:97 -#, python-format -msgid "Login Successful %(uri)s %(status)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:101 -#, python-format -msgid "AuthToken = %s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:103 -msgid "login failed" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:111 -msgid "No Token, Re-login" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:127 -#, python-format -msgid "request: %(method)s %(uri)s successful" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:134 -#, python-format -msgid "request: Request failed from Controller side :%s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:139 -#, python-format -msgid "Response is Null, Request timed out: %(method)s to %(uri)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:151 -#, python-format -msgid "Request %(method)s %(uri)s body = %(body)s failed with status %(status)s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:155 -#, python-format -msgid "%s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:159 -#, python-format -msgid "%(method)s to %(url)s, unexpected response code: %(status)d" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:165 -#, python-format -msgid "Request failed from Controller side with Status=%s" -msgstr "" - -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:169 -#, python-format -msgid "Success: %(method)s %(url)s status=%(status)s" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:210 -#, python-format -msgid "Skipping unreasonable tunnel ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:229 -#, python-format -msgid "Removing tunnel %s from pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:258 -#, python-format -msgid "Reserving tunnel %s from pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:273 -#, python-format -msgid "Reserving specific tunnel %s from pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:276 -#, python-format -msgid "Reserving specific tunnel %s outside pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:299 -#, python-format -msgid "Releasing tunnel %s outside pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:301 -#, python-format -msgid "Releasing tunnel %s to pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:303 -#, python-format -msgid "tunnel_id %s not found" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:375 -#, python-format -msgid "Adding a tunnel endpoint for %s" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:391 -#, python-format -msgid "" -"Adding a tunnel endpoint failed due to a concurrenttransaction had been " -"committed (%s attempts left)" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:396 -msgid "Unable to generate a new tunnel id" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:309 -#, python-format -msgid "Invalid tenant_network_type: %s. Server terminated!" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:326 -#, python-format -msgid "Tunneling disabled but tenant_network_type is '%s'. Server terminated!" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:375 -#, python-format -msgid "Invalid tunnel ID range: '%(range)s' - %(e)s. Server terminated!" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:379 -#, python-format -msgid "Tunnel ID ranges: %s" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:434 -#, python-format -msgid "%s networks are not enabled" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:159 -msgid "DVR: Failed to obtain local DVR Mac address" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:292 -#, python-format -msgid "DVR: Duplicate DVR router interface detected for subnet %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:300 -#, python-format -msgid "DVR: Unable to retrieve subnet information for subnet_id %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:459 -#, python-format -msgid "Centralized-SNAT port %s already seen on " -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:461 -#, python-format -msgid "a different subnet %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:59 -#, 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:305 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:557 -#, python-format -msgid "Network %s not used on agent." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:314 -#, python-format -msgid "port_update message processed for port %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:317 -msgid "tunnel_update received" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:326 -msgid "No tunnel_type specified, cannot create tunnels" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:329 -#, python-format -msgid "tunnel_type %s not supported by agent" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:437 -#, python-format -msgid "Action %s not supported" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:458 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:466 -#, 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:495 -#, 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:514 -#, 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:534 -#, 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:543 -#, 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:560 -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:601 -#, 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:655 -#, python-format -msgid "port_unbound(): net_uuid %s not in local_vlan_map" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:728 -#, python-format -msgid "Adding %s to list of bridges." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:749 -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:843 -#, 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:864 -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:870 -#, 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:974 -#, python-format -msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1003 -#, 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:1013 -#, python-format -msgid "No VIF port for port %s defined on agent." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1026 -#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:799 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1248 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1029 -#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:782 -#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:802 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1231 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1251 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1268 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1094 -#, 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:1117 -#, python-format -msgid "Setting status for %s to UP" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1121 -#, python-format -msgid "Setting status for %s to DOWN" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1124 -#, python-format -msgid "Configuration for device %s completed." -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1143 -#, python-format -msgid "Ancillary Port %s added" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1215 -#, python-format -msgid "" -"process_network_ports - iteration:%(iter_num)d " -"-treat_devices_added_or_updated completed. Skipped %(num_skipped)d " -"devices of %(num_current)d devices currently available. Time elapsed: " -"%(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1231 -#, python-format -msgid "" -"process_network_ports - iteration:%d - failure while retrieving port " -"details from server" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1238 -#, python-format -msgid "" -"process_network_ports - iteration:%(iter_num)d -treat_devices_removed " -"completed in %(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1252 -#, python-format -msgid "" -"process_ancillary_network_ports - iteration: %(iter_num)d - " -"treat_ancillary_devices_added completed in %(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1260 -#, 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:1268 -#, python-format -msgid "" -"process_ancillary_network_ports - iteration: %(iter_num)d - " -"treat_ancillary_devices_removed completed in %(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1281 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1310 -#, python-format -msgid "Unable to sync tunnel IP %(local_ip)s: %(e)s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1347 -#, python-format -msgid "Agent rpc_loop - iteration:%d started" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1369 -msgid "Agent tunnel out of sync with plugin!" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1373 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1377 -#, python-format -msgid "" -"Agent rpc_loop - iteration:%(iter_num)d - starting polling. " -"Elapsed:%(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1389 -#, python-format -msgid "" -"Agent rpc_loop - iteration:%(iter_num)d - port information retrieved. " -"Elapsed:%(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1399 -#, python-format -msgid "Starting to process devices in:%s" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1404 -#, python-format -msgid "" -"Agent rpc_loop - iteration:%(iter_num)d -ports processed. " -"Elapsed:%(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1419 -#, python-format -msgid "" -"Agent rpc_loop - iteration:%(iter_num)d -ancillary port info retrieved. " -"Elapsed:%(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1428 -#, python-format -msgid "" -"Agent rpc_loop - iteration:%(iter_num)d - ancillary ports processed. " -"Elapsed:%(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1442 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1449 -#, python-format -msgid "" -"Agent rpc_loop - iteration:%(iter_num)d completed. Processed ports " -"statistics: %(port_stats)s. Elapsed:%(elapsed).3f" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1511 -#, python-format -msgid "Invalid tunnel type specified: %s" -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:31 -msgid "Enable tunneling support." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:33 -msgid "Tunnel bridge to use." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:35 -msgid "Peer patch port in integration bridge for tunnel bridge." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:38 -msgid "Peer patch port in tunnel bridge for integration bridge." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:41 -msgid "Local IP address of GRE tunnel endpoints." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:44 -msgid "List of :. Deprecated for ofagent." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:47 -msgid "Network type for tenant networks (local, vlan, gre, vxlan, or none)." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:51 -msgid "List of :: or ." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:55 -msgid "List of :." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:57 -msgid "" -"The type of tunnels to use when utilizing tunnels, either 'gre' or " -"'vxlan'." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:60 -msgid "" -"Use veths instead of patch ports to interconnect the integration bridge " -"to physical bridges." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:70 -msgid "Minimize polling by monitoring ovsdb for interface changes." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:74 -msgid "" -"The number of seconds to wait before respawning the ovsdb monitor after " -"losing communication with it." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:77 -msgid "Network types supported by the agent (gre and/or vxlan)." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:82 -msgid "MTU size of veth interfaces" -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:84 -msgid "" -"Use ML2 l2population mechanism driver to learn remote MAC and IPs and " -"improve tunnel scalability." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:87 -msgid "" -"Enable local ARP responder if it is supported. Requires OVS 2.1 and ML2 " -"l2population driver. Allows the switch (when supporting an overlay) to " -"respond to an ARP request locally without performing a costly ARP " -"broadcast into the overlay." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:93 -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:96 -msgid "Make the l2 agent run in DVR mode." -msgstr "" - -#: neutron/plugins/plumgrid/common/exceptions.py:24 -#, python-format -msgid "PLUMgrid Plugin Error: %(err_msg)s" -msgstr "" - -#: neutron/plugins/plumgrid/common/exceptions.py:28 -#, python-format -msgid "Connection failed with PLUMgrid Director: %(err_msg)s" -msgstr "" - -#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:31 -msgid "Python PLUMgrid Fake Library Started " -msgstr "" - -#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:36 -#, python-format -msgid "Fake Director: %s" -msgstr "" - -#: neutron/plugins/plumgrid/drivers/plumlib.py:37 -msgid "Python PLUMgrid Library Started " -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:46 -msgid "PLUMgrid Director server to connect to" -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:48 -msgid "PLUMgrid Director server port to connect to" -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:50 -msgid "PLUMgrid Director admin username" -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:52 -msgid "PLUMgrid Director admin password" -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:54 -msgid "PLUMgrid Director server timeout" -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:57 -msgid "PLUMgrid Driver" -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:75 -msgid "Neutron PLUMgrid Director: Starting Plugin" -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:93 -#, python-format -msgid "Neutron PLUMgrid Director: %s" -msgstr "" - -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:770 -msgid "" -"Networks with admin_state_up=False are not supported by PLUMgrid plugin " -"yet." -msgstr "" - -#: neutron/plugins/ryu/ryu_neutron_plugin.py:68 -#, python-format -msgid "get_ofp_rest_api: %s" -msgstr "" - -#: neutron/plugins/ryu/ryu_neutron_plugin.py:125 -msgid "Invalid configuration. check ryu.ini" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:95 -#, python-format -msgid "Could not get IPv4 address from %(nic)s: %(cfg)s" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:161 -#, python-format -msgid "External port %s" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:169 -msgid "Get Ryu rest API address" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:216 -msgid "Ryu rest API port isn't specified" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:217 -#, python-format -msgid "Going to ofp controller mode %s" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:293 -#, python-format -msgid "tunnel_ip %s" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:295 -#, python-format -msgid "ovsdb_port %s" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:297 -#, python-format -msgid "ovsdb_ip %s" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:303 -#, python-format -msgid "Initialization failed: %s" -msgstr "" - -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:306 -msgid "" -"Ryu initialization on the node is done. Agent initialized successfully, " -"now running..." -msgstr "" - -#: neutron/plugins/ryu/common/config.py:24 -msgid "OpenFlow REST API location." -msgstr "" - -#: neutron/plugins/ryu/common/config.py:26 -msgid "Minimum tunnel ID to use." -msgstr "" - -#: neutron/plugins/ryu/common/config.py:28 -msgid "Maximum tunnel ID to use." -msgstr "" - -#: neutron/plugins/ryu/common/config.py:30 -msgid "Tunnel IP to use." -msgstr "" - -#: neutron/plugins/ryu/common/config.py:32 -msgid "Tunnel interface to use." -msgstr "" - -#: neutron/plugins/ryu/common/config.py:34 -msgid "OVSDB port to connect to." -msgstr "" - -#: neutron/plugins/ryu/common/config.py:36 -msgid "OVSDB IP to connect to." -msgstr "" - -#: neutron/plugins/ryu/common/config.py:38 -msgid "OVSDB interface to connect to." -msgstr "" - -#: neutron/plugins/ryu/db/api_v2.py:39 -#, python-format -msgid "get_port_from_device() called:port_id=%s" -msgstr "" - -#: neutron/plugins/ryu/db/api_v2.py:75 -#, python-format -msgid "" -"Invalid tunnel key options tunnel_key_min: %(key_min)d tunnel_key_max: " -"%(key_max)d. Using default value" -msgstr "" - -#: neutron/plugins/ryu/db/api_v2.py:155 -#, python-format -msgid "last_key %(last_key)s new_key %(new_key)s" -msgstr "" - -#: neutron/plugins/ryu/db/api_v2.py:158 -msgid "No key found" -msgstr "" - -#: neutron/plugins/ryu/db/api_v2.py:191 -#, python-format -msgid "Transaction retry exhausted (%d). Abandoned tunnel key allocation." -msgstr "" - -#: neutron/plugins/sriovnicagent/eswitch_manager.py:46 -#, python-format -msgid "Failed to get devices for %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/eswitch_manager.py:48 -msgid "Device not found" -msgstr "" - -#: neutron/plugins/sriovnicagent/eswitch_manager.py:62 -msgid "Device has no virtual functions" -msgstr "" - -#: neutron/plugins/sriovnicagent/eswitch_manager.py:141 -#: neutron/plugins/sriovnicagent/eswitch_manager.py:154 -#, python-format -msgid "Cannot find vf index for pci slot %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/eswitch_manager.py:279 -#, python-format -msgid "device pci mismatch: %(device_mac)s - %(pci_slot)s" -msgstr "" - -#: neutron/plugins/sriovnicagent/pci_lib.py:58 -#: neutron/plugins/sriovnicagent/pci_lib.py:81 -#: neutron/plugins/sriovnicagent/pci_lib.py:108 -msgid "Failed executing ip command" -msgstr "" - -#: neutron/plugins/sriovnicagent/pci_lib.py:129 -#, python-format -msgid "Cannot find vfs %(vfs)s in device %(dev_name)s" -msgstr "" - -#: neutron/plugins/sriovnicagent/pci_lib.py:145 -#, python-format -msgid "failed to parse vf link show line %(line)s: for %(device)s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:181 -#, python-format -msgid "Failed to set device %s state" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:195 -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:220 -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:247 -msgid "SRIOV NIC Agent RPC Daemon Started!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:317 -#, python-format -msgid "Device name %(dev_name)s is missing from physical_device_mappings" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333 -#, python-format -msgid "Failed on Agent configuration parse : %s. Agent terminated!" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:336 -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:337 -#, python-format -msgid "Exclude Devices: %s" -msgstr "" - -#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:347 -msgid "Agent Initialization Failed" -msgstr "" - -#: neutron/plugins/sriovnicagent/common/config.py:41 -#, python-format -msgid "Device %(dev_name)s in mapping: %(mapping)s not unique" -msgstr "" - -#: neutron/plugins/sriovnicagent/common/config.py:65 -msgid "" -"List of : mapping physical network " -"names to the agent's node-specific physical network device of SR-IOV " -"physical function to be used for VLAN networks. All physical networks " -"listed in network_vlan_ranges on the server should have mappings to " -"appropriate interfaces on each agent" -msgstr "" - -#: neutron/plugins/sriovnicagent/common/config.py:74 -msgid "" -"List of : mapping network_device to the" -" agent's node-specific list of virtual functions that should not be used " -"for virtual networking. excluded_devices is a semicolon separated list of" -" virtual functions (BDF format).to exclude from network_device. The " -"network_device in the mapping should appear in the " -"physical_device_mappings list." -msgstr "" - -#: neutron/plugins/sriovnicagent/common/exceptions.py:24 -#, python-format -msgid "Invalid Device %(dev_name)s: %(reason)s" -msgstr "" - -#: neutron/plugins/sriovnicagent/common/exceptions.py:28 -#, python-format -msgid "ip command failed on device %(dev_name)s: %(reason)s" -msgstr "" - -#: neutron/plugins/sriovnicagent/common/exceptions.py:32 -#, python-format -msgid "Invalid pci slot %(pci_slot)s" -msgstr "" - -#: neutron/plugins/vmware/check_nsx_config.py:45 -#: neutron/plugins/vmware/check_nsx_config.py:80 -#, python-format -msgid "Error '%(err)s' when connecting to controller(s): %(ctl)s." -msgstr "" - -#: neutron/plugins/vmware/dhcpmeta_modes.py:56 -#, python-format -msgid "Invalid agent_mode: %s" -msgstr "" - -#: neutron/plugins/vmware/dhcpmeta_modes.py:107 -msgid "network_auto_schedule has been disabled" -msgstr "" - -#: neutron/plugins/vmware/dhcpmeta_modes.py:128 -#, python-format -msgid "Unable to run Neutron with config option '%s', as NSX does not support it" -msgstr "" - -#: neutron/plugins/vmware/dhcpmeta_modes.py:131 -#, python-format -msgid "Unmet dependency for config option '%s'" -msgstr "" - -#: neutron/plugins/vmware/nsx_cluster.py:49 -#, python-format -msgid "" -"Attribute '%s' has been deprecated or moved to a new section. See new " -"configuration file for details." -msgstr "" - -#: neutron/plugins/vmware/nsx_cluster.py:61 -#, python-format -msgid "The following cluster attributes were not specified: %s'" -msgstr "" - -#: neutron/plugins/vmware/api_client/__init__.py:28 -#, python-format -msgid "Invalid connection type: %s" -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:103 -#, python-format -msgid "[%d] no API providers currently available." -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:106 -#, python-format -msgid "[%d] Waiting to acquire API client connection." -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:110 -#, python-format -msgid "[%(rid)d] Connection %(conn)s idle for %(sec)0.2f seconds; reconnecting." -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:119 -#, python-format -msgid "[%(rid)d] Acquired connection %(conn)s. %(qsize)d connection(s) available." -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:140 -#, python-format -msgid "" -"[%(rid)d] Released connection %(conn)s is not an API provider for the " -"cluster" -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:150 -#, python-format -msgid "[%(rid)d] Connection returned in bad state, reconnecting to %(conn)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:176 -#, python-format -msgid "[%(rid)d] Released connection %(conn)s. %(qsize)d connection(s) available." -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:186 -#, python-format -msgid "Login request for an invalid connection: '%s'" -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:197 -msgid "Waiting for auth to complete" -msgstr "" - -#: neutron/plugins/vmware/api_client/base.py:239 -#, python-format -msgid "Invalid conn_params value: '%s'" -msgstr "" - -#: neutron/plugins/vmware/api_client/client.py:89 -#, python-format -msgid "Request returns \"%s\"" -msgstr "" - -#: neutron/plugins/vmware/api_client/client.py:102 -#, python-format -msgid "Request timed out: %(method)s to %(url)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/client.py:113 -#, python-format -msgid "Received error code: %s" -msgstr "" - -#: neutron/plugins/vmware/api_client/client.py:114 -#, python-format -msgid "Server Error Message: %s" -msgstr "" - -#: neutron/plugins/vmware/api_client/client.py:120 -#, python-format -msgid "" -"%(method)s to %(url)s, unexpected response code: %(status)d (content = " -"'%(body)s')" -msgstr "" - -#: neutron/plugins/vmware/api_client/client.py:137 -msgid "Unable to determine NSX version. Plugin might not work as expected." -msgstr "" - -#: neutron/plugins/vmware/api_client/eventlet_client.py:145 -#, python-format -msgid "Login error \"%s\"" -msgstr "" - -#: neutron/plugins/vmware/api_client/eventlet_client.py:150 -#, python-format -msgid "Saving new authentication cookie '%s'" -msgstr "" - -#: neutron/plugins/vmware/api_client/eventlet_request.py:101 -msgid "Joining an invalid green thread" -msgstr "" - -#: neutron/plugins/vmware/api_client/eventlet_request.py:121 -#, python-format -msgid "[%d] Request timeout." -msgstr "" - -#: neutron/plugins/vmware/api_client/eventlet_request.py:122 -msgid "Request timeout" -msgstr "" - -#: neutron/plugins/vmware/api_client/eventlet_request.py:148 -#, python-format -msgid "[%(rid)d] Completed request '%(method)s %(url)s': %(status)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/eventlet_request.py:155 -#, python-format -msgid "[%(rid)d] Error while handling request: %(req)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/eventlet_request.py:211 -#, python-format -msgid "[%(rid)d] Failed to parse API provider: %(e)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/exception.py:41 -msgid "Server denied session's authentication credentials." -msgstr "" - -#: neutron/plugins/vmware/api_client/exception.py:45 -msgid "An entity referenced in the request was not found." -msgstr "" - -#: neutron/plugins/vmware/api_client/exception.py:49 -msgid "Request conflicts with configuration on a different entity." -msgstr "" - -#: neutron/plugins/vmware/api_client/exception.py:54 -msgid "" -"Request could not completed because the associated resource could not be " -"reached." -msgstr "" - -#: neutron/plugins/vmware/api_client/exception.py:59 -msgid "The request is forbidden from accessing the referenced resource." -msgstr "" - -#: neutron/plugins/vmware/api_client/exception.py:64 -msgid "Create/Update actions are forbidden when in read-only mode." -msgstr "" - -#: neutron/plugins/vmware/api_client/exception.py:72 -msgid "The server is unable to fulfill the request due to a bad syntax" -msgstr "" - -#: neutron/plugins/vmware/api_client/exception.py:77 -msgid "The backend received an invalid security certificate." -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:84 -msgid "No API connections available" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:89 -#, python-format -msgid "[%(rid)d] Issuing - request url: %(conn)s body: %(body)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:117 -#, python-format -msgid "Setting X-Nvp-Wait-For-Config-Generation request header: '%s'" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:123 -#, python-format -msgid "[%(rid)d] Exception issuing request: %(e)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:131 -#, python-format -msgid "[%(rid)d] Completed request '%(conn)s': %(status)s (%(elapsed)s seconds)" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:140 -#, python-format -msgid "Reading X-Nvp-config-Generation response header: '%s'" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:167 -#, python-format -msgid "[%d] Maximum redirects exceeded, aborting request" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:177 -#, python-format -msgid "[%(rid)d] Redirecting request to: %(conn)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:190 -#, python-format -msgid "[%(rid)d] Request '%(method)s %(url)s' received: %(status)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:194 -#, python-format -msgid "Server error return: %s" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:198 -msgid "Invalid server response" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:203 -#, python-format -msgid "[%(rid)d] Failed request '%(conn)s': '%(msg)s' (%(elapsed)s seconds)" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:237 -#, python-format -msgid "[%d] Received redirect status without location header field" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:254 -#, python-format -msgid "[%(rid)d] Received invalid redirect location: '%(url)s'" -msgstr "" - -#: neutron/plugins/vmware/api_client/request.py:258 -#, python-format -msgid "[%(rid)d] Received malformed redirect location: %(url)s" -msgstr "" - -#: neutron/plugins/vmware/api_client/version.py:30 -#, python-format -msgid "Unable to fetch NSX version from response headers :%s" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:39 -msgid "" -"Maximum number of ports of a logical switch on a bridged transport zone " -"(default 5000)" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:43 -msgid "" -"Maximum number of ports of a logical switch on an overlay transport zone " -"(default 256)" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:47 -msgid "Maximum concurrent connections to each NSX controller." -msgstr "" - -#: neutron/plugins/vmware/common/config.py:52 -msgid "" -"Number of seconds a generation id should be valid for (default -1 meaning" -" do not time out)" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:56 -msgid "" -"If set to access_network this enables a dedicated connection to the " -"metadata proxy for metadata server access via Neutron router. If set to " -"dhcp_host_route this enables host route injection via the dhcp agent. " -"This option is only useful if running on a host that does not support " -"namespaces otherwise access_network should be used." -msgstr "" - -#: neutron/plugins/vmware/common/config.py:65 -msgid "" -"The default network tranport type to use (stt, gre, bridge, ipsec_gre, or" -" ipsec_stt)" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:69 -msgid "The mode used to implement DHCP/metadata services." -msgstr "" - -#: neutron/plugins/vmware/common/config.py:71 -msgid "" -"The default option leverages service nodes to perform packet replication " -"though one could set to this to 'source' to perform replication locally. " -"This is useful if one does not want to deploy a service node(s). It must " -"be set to 'service' for leveraging distributed routers." -msgstr "" - -#: neutron/plugins/vmware/common/config.py:82 -msgid "" -"Interval in seconds between runs of the state synchronization task. Set " -"it to 0 to disable it" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:86 -msgid "" -"Maximum value for the additional random delay in seconds between runs of " -"the state synchronization task" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:91 -msgid "" -"Minimum delay, in seconds, between two state synchronization queries to " -"NSX. It must not exceed state_sync_interval" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:96 -msgid "" -"Minimum number of resources to be retrieved from NSX during state " -"synchronization" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:100 -msgid "" -"Always read operational status from backend on show operations. Enabling " -"this option might slow down the system." -msgstr "" - -#: neutron/plugins/vmware/common/config.py:109 -msgid "User name for NSX controllers in this cluster" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:114 -msgid "Password for NSX controllers in this cluster" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:117 -msgid "Time before aborting a request" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:120 -msgid "Number of time a request should be retried" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:123 -msgid "Number of times a redirect should be followed" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:126 -msgid "Lists the NSX controllers in this cluster" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:131 -msgid "" -"This is uuid of the default NSX Transport zone that will be used for " -"creating tunneled isolated \"Neutron\" networks. It needs to be created " -"in NSX before starting Neutron with the nsx plugin." -msgstr "" - -#: neutron/plugins/vmware/common/config.py:136 -msgid "" -"Unique identifier of the NSX L3 Gateway service which will be used for " -"implementing routers and floating IPs" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:140 -msgid "" -"Unique identifier of the NSX L2 Gateway service which will be used by " -"default for network gateways" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:143 -msgid "" -"Unique identifier of the Service Cluster which will be used by logical " -"services like dhcp and metadata" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:146 -msgid "" -"Name of the interface on a L2 Gateway transport nodewhich should be used " -"by default when setting up a network connection" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:156 -msgid "User name for vsm" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:160 -msgid "Password for vsm" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:162 -msgid "uri for vsm" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:164 -msgid "Optional parameter identifying the ID of datacenter to deploy NSX Edges" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:167 -#: neutron/plugins/vmware/common/config.py:173 -msgid "Optional parameter identifying the ID of datastore to deploy NSX Edges" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:170 -msgid "Optional parameter identifying the ID of resource to deploy NSX Edges" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:176 -msgid "Network ID for physical network connectivity" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:179 -msgid "Task status check interval" -msgstr "" - -#: neutron/plugins/vmware/common/config.py:193 -#, python-format -msgid "Invalid replication_mode: %s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:21 -#, python-format -msgid "An unexpected error occurred in the NSX Plugin: %(err_msg)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:25 -#, python-format -msgid "Unable to fulfill request with version %(version)s." -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:29 -#, python-format -msgid "Invalid NSX connection parameters: %(conn_params)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:33 -#, python-format -msgid "" -"Invalid cluster values: %(invalid_attrs)s. Please ensure that these " -"values are specified in the [DEFAULT] section of the NSX plugin ini file." -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:39 -#, python-format -msgid "Unable to find cluster config entry for nova zone: %(nova_zone)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:44 -#, python-format -msgid "" -"Unable to create port on network %(network)s. Maximum number of ports " -"reached" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:49 -#, python-format -msgid "" -"While retrieving NAT rules, %(actual_rules)s were found whereas rules in " -"the (%(min_rules)s,%(max_rules)s) interval were expected" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:55 -#, python-format -msgid "Invalid NSX attachment type '%(attachment_type)s'" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:59 -msgid "" -"The networking backend is currently in maintenance mode and therefore " -"unable to accept requests which modify its state. Please try later." -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:65 -#, python-format -msgid "Gateway Service %(gateway)s is already in use" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:69 -msgid "" -"An invalid security certificate was specified for the gateway device. " -"Certificates must be enclosed between '-----BEGIN CERTIFICATE-----' and '" -"-----END CERTIFICATE-----'" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:76 -#, python-format -msgid "Quota exceeded for Vcns resource: %(overs)s: %(err_msg)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:80 -#, python-format -msgid "Router %(router_id)s is in use by Loadbalancer Service %(vip_id)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:85 -#, python-format -msgid "Router %(router_id)s is in use by firewall Service %(firewall_id)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:90 -#, python-format -msgid "Error happened in NSX VCNS Driver: %(err_msg)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:94 -#, python-format -msgid "" -"Service cluster: '%(cluster_id)s' is unavailable. Please, check NSX setup" -" and/or configuration" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:99 -#, python-format -msgid "" -"An error occurred while connecting LSN %(lsn_id)s and network %(net_id)s " -"via port %(port_id)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:108 -#, python-format -msgid "Unable to find LSN for %(entity)s %(entity_id)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:112 -#, python-format -msgid "Unable to find port for LSN %(lsn_id)s and %(entity)s %(entity_id)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:117 -#, python-format -msgid "Unable to migrate network '%(net_id)s' to LSN: %(reason)s" -msgstr "" - -#: neutron/plugins/vmware/common/exceptions.py:121 -#, python-format -msgid "Configuration conflict on Logical Service Node %(lsn_id)s" -msgstr "" - -#: neutron/plugins/vmware/common/nsx_utils.py:67 -#, python-format -msgid "Unable to find NSX switches for Neutron network %s" -msgstr "" - -#: neutron/plugins/vmware/common/nsx_utils.py:114 -#, python-format -msgid "Unable to find NSX port for Neutron port %s" -msgstr "" - -#: neutron/plugins/vmware/common/nsx_utils.py:154 -#, python-format -msgid "Unable to find NSX security profile for Neutron security group %s" -msgstr "" - -#: neutron/plugins/vmware/common/nsx_utils.py:158 -#, python-format -msgid "Multiple NSX security profiles found for Neutron security group %s" -msgstr "" - -#: neutron/plugins/vmware/common/nsx_utils.py:189 -#, python-format -msgid "Unable to find NSX router for Neutron router %s" -msgstr "" - -#: neutron/plugins/vmware/common/nsx_utils.py:246 -#, python-format -msgid "" -"Unable to retrieve operational status for gateway devices belonging to " -"tenant: %s" -msgstr "" - -#: neutron/plugins/vmware/common/nsx_utils.py:249 -msgid "Unable to retrieve operational status for gateway devices" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:231 -#, python-format -msgid "" -"Minimum request delay:%(req_delay)s must not exceed synchronization " -"interval:%(sync_interval)s" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:264 -#, python-format -msgid "Logical switch for neutron network %s not found on NSX." -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:299 -#: neutron/plugins/vmware/common/sync.py:381 -#: neutron/plugins/vmware/common/sync.py:476 -#, python-format -msgid "Updating status for neutron resource %(q_id)s to: %(status)s" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:351 -#, python-format -msgid "Logical router for neutron router %s not found on NSX." -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:401 -#, python-format -msgid "Unable to find Neutron router id for NSX logical router: %s" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:443 -#, python-format -msgid "Logical switch port for neutron port %s not found on NSX." -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:536 -#, python-format -msgid "" -"Requested page size is %(cur_chunk_size)d.It might be necessary to do " -"%(num_requests)d round-trips to NSX for fetching data. Please tune sync " -"parameters to ensure chunk size is less than %(max_page_size)d" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:569 -#, python-format -msgid "Fetching up to %s resources from NSX backend" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:589 -#, python-format -msgid "Total data size: %d" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:593 -#, python-format -msgid "" -"Fetched %(num_lswitches)d logical switches, %(num_lswitchports)d logical " -"switch ports,%(num_lrouters)d logical routers" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:609 -#, python-format -msgid "Running state synchronization task. Chunk: %s" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:619 -#, python-format -msgid "" -"An error occurred while communicating with NSX backend. Will retry " -"synchronization in %d seconds" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:623 -#, python-format -msgid "Time elapsed querying NSX: %s" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:630 -#, python-format -msgid "Number of chunks: %d" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:648 -#, python-format -msgid "Time elapsed hashing data: %s" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:660 -#, python-format -msgid "Synchronization for chunk %(chunk_num)d of %(total_chunks)d performed" -msgstr "" - -#: neutron/plugins/vmware/common/sync.py:672 -#, python-format -msgid "Time elapsed at end of sync: %s" -msgstr "" - -#: neutron/plugins/vmware/common/utils.py:64 -#, python-format -msgid "Specified name:'%s' exceeds maximum length. It will be truncated on NSX" -msgstr "" - -#: neutron/plugins/vmware/dbexts/db.py:76 -#, python-format -msgid "Port mapping for %s already available" -msgstr "" - -#: neutron/plugins/vmware/dbexts/db.py:123 -#, python-format -msgid "NSX identifiers for neutron port %s not yet stored in Neutron DB" -msgstr "" - -#: neutron/plugins/vmware/dbexts/db.py:134 -#, python-format -msgid "NSX identifiers for neutron router %s not yet stored in Neutron DB" -msgstr "" - -#: neutron/plugins/vmware/dbexts/db.py:149 -#, python-format -msgid "NSX identifiers for neutron security group %s not yet stored in Neutron DB" -msgstr "" - -#: neutron/plugins/vmware/dbexts/lsn_db.py:87 -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:71 -#, python-format -msgid "Unable to find Logical Service Node for network %s" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:46 -#, python-format -msgid "" -"Network Gateway '%(gateway_id)s' still has active mappings with one or " -"more neutron networks." -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:51 -#, python-format -msgid "Network Gateway %(gateway_id)s could not be found" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:55 -#, python-format -msgid "" -"Network Gateway Device '%(device_id)s' is still used by one or more " -"network gateways." -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:60 -#, python-format -msgid "Network Gateway Device %(device_id)s could not be found." -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:64 -#, python-format -msgid "" -"Port '%(port_id)s' is owned by '%(device_owner)s' and therefore cannot be" -" deleted directly via the port API." -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:69 -#, python-format -msgid "" -"The specified mapping '%(mapping)s' is already in use on network gateway " -"'%(gateway_id)s'." -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:74 -#, python-format -msgid "" -"Multiple network connections found on '%(gateway_id)s' with provided " -"criteria." -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:79 -#, python-format -msgid "" -"The connection %(network_mapping_info)s was not found on the network " -"gateway '%(network_gateway_id)s'" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:84 -#, python-format -msgid "The network gateway %(gateway_id)s cannot be updated or deleted" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:192 -msgid "" -"A network identifier must be specified when connecting a network to a " -"network gateway. Unable to complete operation" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:198 -#, python-format -msgid "" -"Invalid keys found among the ones provided in request body: " -"%(connection_attrs)s." -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:206 -msgid "Cannot specify a segmentation id when the segmentation type is flat" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:210 -#, python-format -msgid "Invalid segmentation id (%d) for vlan segmentation type" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:265 -#, python-format -msgid "Created network gateway with id:%s" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:277 -#, python-format -msgid "Updated network gateway with id:%s" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:292 -#, python-format -msgid "Network gateway '%s' was destroyed." -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:309 -#, python-format -msgid "Connecting network '%(network_id)s' to gateway '%(network_gateway_id)s'" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:350 -#, python-format -msgid "" -"Requested network '%(network_id)s' not found.Unable to create network " -"connection on gateway '%(network_gateway_id)s" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:358 -#, python-format -msgid "" -"Gateway port for '%(network_gateway_id)s' created on network " -"'%(network_id)s':%(port_id)s" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:374 -#, python-format -msgid "Ensured no Ip addresses are configured on port %s" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:384 -#, python-format -msgid "" -"Disconnecting network '%(network_id)s' from gateway " -"'%(network_gateway_id)s'" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:478 -#, python-format -msgid "Created network gateway device: %s" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:489 -#, python-format -msgid "Updated network gateway device: %s" -msgstr "" - -#: neutron/plugins/vmware/dbexts/networkgw_db.py:502 -#, python-format -msgid "Deleted network gateway device: %s." -msgstr "" - -#: neutron/plugins/vmware/dbexts/qos_db.py:295 -#, python-format -msgid "DSCP value (%s) will be ignored with 'trusted' marking" -msgstr "" - -#: neutron/plugins/vmware/dbexts/vcns_db.py:77 -#, python-format -msgid "Rule Resource binding with id:%s not found!" -msgstr "" - -#: neutron/plugins/vmware/dbexts/vcns_db.py:94 -msgid "Rule Resource binding not found!" -msgstr "" - -#: neutron/plugins/vmware/dbexts/vcns_db.py:123 -#: neutron/plugins/vmware/dbexts/vcns_db.py:133 -#, python-format -msgid "VIP Resource binding with id:%s not found!" -msgstr "" - -#: neutron/plugins/vmware/dbexts/vcns_db.py:162 -#, python-format -msgid "" -"Pool Resource binding with edge_id:%(edge_id)s pool_vseid:%(pool_vseid)s " -"not found!" -msgstr "" - -#: neutron/plugins/vmware/dbexts/vcns_db.py:174 -#, python-format -msgid "Pool Resource binding with id:%s not found!" -msgstr "" - -#: neutron/plugins/vmware/dbexts/vcns_db.py:200 -#, python-format -msgid "Monitor Resource binding with id:%s not found!" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:40 -msgid "" -"Pull LSN information from NSX in case it is missing from the local data " -"store. This is useful to rebuild the local store in case of server " -"recovery." -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:82 -#, python-format -msgid "Unable to create LSN for network %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:90 -#, python-format -msgid "Unable to delete Logical Service Node %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:107 -#, python-format -msgid "" -"Unable to find Logical Service Node Port for LSN %(lsn_id)s and subnet " -"%(subnet_id)s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:129 -#, python-format -msgid "" -"Unable to find Logical Service Node Port for LSN %(lsn_id)s and mac " -"address %(mac)s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:149 -#, python-format -msgid "Unable to create port for LSN %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:157 -#, python-format -msgid "Unable to delete LSN Port %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:174 -#, python-format -msgid "Metadata port not found while attempting to delete it from network %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:177 -#, python-format -msgid "Unable to find Logical Services Node Port with MAC %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:262 -#, python-format -msgid "" -"Unable to configure dhcp for Logical Service Node %(lsn_id)s and port " -"%(lsn_port_id)s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:283 -#, python-format -msgid "Unable to configure metadata for subnet %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:305 -#, python-format -msgid "Error while configuring LSN port %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:377 -#, python-format -msgid "Unable to save LSN for network %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:443 -#, python-format -msgid "Unable to save LSN port for subnet %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/migration.py:81 -#, python-format -msgid "Port %s is already gone" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/migration.py:112 -msgid "LSN already exist" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/migration.py:116 -msgid "Cannot migrate an external network" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/migration.py:125 -msgid "Cannot migrate a 'metadata' network" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/migration.py:128 -msgid "Unable to support multiple subnets per network" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:39 -msgid "Comma separated list of additional domain name servers" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:47 -msgid "Default DHCP lease time" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:55 -msgid "IP address used by Metadata server." -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:59 -msgid "TCP Port used by Metadata server." -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:136 -#, python-format -msgid "" -"Error while creating subnet %(cidr)s for network %(network)s. Please, " -"contact administrator" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:206 -#: neutron/plugins/vmware/dhcp_meta/nsx.py:224 -#, python-format -msgid "Performing DHCP %(action)s for resource: %(resource)s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:211 -#, python-format -msgid "Network %s is external: no LSN to create" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:219 -#, python-format -msgid "Logical Services Node for network %s configured successfully" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:241 -#, python-format -msgid "Error while configuring DHCP for port %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:253 -#, python-format -msgid "DHCP is disabled for subnet %s: nothing to do" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:272 -#, python-format -msgid "DHCP for port %s configured successfully" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:280 -#, python-format -msgid "Network %s is external: nothing to do" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:288 -#, python-format -msgid "Configuring metadata entry for port %s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:300 -#, python-format -msgid "Metadata for port %s configured successfully" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:304 -#, python-format -msgid "Handle metadata access via router: %(r)s and interface %(i)s" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/nsx.py:321 -#, python-format -msgid "Metadata for router %s handled successfully" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/rpc.py:67 -#, python-format -msgid "Subnet %s does not have a gateway, the metadata route will not be created" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/rpc.py:91 -msgid "Metadata access network is disabled" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/rpc.py:94 -msgid "" -"Overlapping IPs must be enabled in order to setup the metadata access " -"network" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/rpc.py:114 -#, python-format -msgid "" -"No router interface found for router '%s'. No metadata access network " -"should be created or destroyed" -msgstr "" - -#: neutron/plugins/vmware/dhcp_meta/rpc.py:122 -#, python-format -msgid "" -"An error occurred while operating on the metadata access network for " -"router:'%s'" -msgstr "" - -#: neutron/plugins/vmware/extensions/networkgw.py:84 -msgid "Cannot create a gateway with an empty device list" -msgstr "" - -#: neutron/plugins/vmware/extensions/networkgw.py:100 -#, python-format -msgid "Unexpected keys found in device description:%s" -msgstr "" - -#: neutron/plugins/vmware/extensions/networkgw.py:104 -#, python-format -msgid "%s: provided data are not iterable" -msgstr "" - -#: neutron/plugins/vmware/extensions/networkgw.py:111 -msgid "A connector type is required to create a gateway device" -msgstr "" - -#: neutron/plugins/vmware/extensions/networkgw.py:120 -#, python-format -msgid "Unknown connector type: %s" -msgstr "" - -#: neutron/plugins/vmware/extensions/networkgw.py:127 -msgid "Number of network gateways allowed per tenant, -1 for unlimited" -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:34 -msgid "Need to be admin in order to create queue called default" -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:38 -msgid "Default queue already exists." -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:42 -#, python-format -msgid "Invalid value for dscp %(data)s must be integer value between 0 and 63." -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:47 -msgid "The qos marking cannot be set to 'trusted' when the DSCP field is set" -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:52 -msgid "Invalid bandwidth rate, min greater than max." -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:56 -#, python-format -msgid "Invalid bandwidth rate, %(data)s must be a non negative integer." -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:61 -#, python-format -msgid "Queue %(id)s does not exist" -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:65 -msgid "Unable to delete queue attached to port." -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:69 -msgid "Port is not associated with lqueue" -msgstr "" - -#: neutron/plugins/vmware/extensions/qos.py:80 -#, python-format -msgid "'%s' must be a non negative integer." -msgstr "" - -#: neutron/plugins/vmware/nsxlib/__init__.py:80 -#, python-format -msgid "Error. %(type)s exception: %(exc)s." -msgstr "" - -#: neutron/plugins/vmware/nsxlib/__init__.py:84 -#, python-format -msgid "locals=[%s]" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/lsn.py:171 -#, python-format -msgid "" -"Attempt to plug Logical Services Node %(lsn)s into network with port " -"%(port)s failed. PatchAttachment already exists with another port" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:252 -#, python-format -msgid "Cannot update NSX routes %(routes)s for router %(router_id)s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:346 -#, python-format -msgid "Created logical port %(lport_uuid)s on logical router %(lrouter_uuid)s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:374 -#, python-format -msgid "Updated logical port %(lport_uuid)s on logical router %(lrouter_uuid)s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:385 -#, python-format -msgid "" -"Delete logical router port %(lport_uuid)s on logical router " -"%(lrouter_uuid)s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:449 -#, python-format -msgid "Invalid keys for NAT match: %s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:455 -#, python-format -msgid "Creating NAT rule: %s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:470 -msgid "" -"No SNAT rules cannot be applied as they are not available in this version" -" of the NSX platform" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:475 -msgid "" -"No DNAT rules cannot be applied as they are not available in this version" -" of the NSX platform" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:576 -#, python-format -msgid "" -"Found %(actual_rule_num)d matching NAT rules, which is not in the " -"expected range (%(min_exp_rule_num)d,%(max_exp_rule_num)d)" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:622 -#, python-format -msgid "Router Port %(lport_id)s not found on router %(lrouter_id)s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/router.py:627 -#, python-format -msgid "" -"An exception occurred while updating IP addresses on a router logical " -"port:%s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/secgroup.py:94 -#, python-format -msgid "Created Security Profile: %s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/secgroup.py:120 -#, python-format -msgid "Updated Security Profile: %s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/secgroup.py:140 -#, python-format -msgid "Unable to find security profile %s on NSX backend" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:130 -#, python-format -msgid "Created logical switch: %s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:150 -#: neutron/plugins/vmware/nsxlib/switch.py:165 -#, python-format -msgid "Network not found, Error: %s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:188 -msgid "Port or Network not found" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:247 -#, python-format -msgid "Lswitch %s not found in NSX" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:256 -msgid "Unable to get ports" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:273 -#, python-format -msgid "" -"Looking for port with q_port_id tag '%(neutron_port_id)s' on: " -"'%(lswitch_uuid)s'" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:281 -#, python-format -msgid "" -"Found '%(num_ports)d' ports with q_port_id tag: '%(neutron_port_id)s'. " -"Only 1 was expected." -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:290 -#, python-format -msgid "get_port() %(network)s %(port)s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:298 -#: neutron/plugins/vmware/nsxlib/switch.py:329 -#, python-format -msgid "Port or Network not found, Error: %s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:324 -#, python-format -msgid "Updated logical port %(result)s on logical switch %(uuid)s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:359 -#, python-format -msgid "Created logical port %(result)s on logical switch %(uuid)s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/switch.py:371 -#, python-format -msgid "Port not found, Error: %s" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/versioning.py:56 -msgid "Operation may not be supported" -msgstr "" - -#: neutron/plugins/vmware/nsxlib/versioning.py:64 -msgid "" -"NSX version is not set. Unable to complete request correctly. Check log " -"for NSX communication errors." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:213 -#, python-format -msgid "Unable to process default l2 gw service:%s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:248 -#, python-format -msgid "Created NSX router port:%s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:250 -#: neutron/plugins/vmware/plugins/service.py:439 -#, python-format -msgid "Unable to create port on NSX logical router %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:253 -#, python-format -msgid "" -"Unable to create logical router port for neutron port id %(port_id)s on " -"router %(nsx_router_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:332 -#, python-format -msgid "Attached %(att)s to NSX router port %(port)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:338 -#, python-format -msgid "" -"Unable to plug attachment in NSX logical router port %(r_port_id)s, " -"associated with Neutron %(q_port_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:344 -#, python-format -msgid "" -"Unable to plug attachment in router port %(r_port_id)s for neutron port " -"id %(q_port_id)s on router %(router_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:390 -msgid "An exception occurred while selecting logical switch for the port" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:430 -#, python-format -msgid "" -"An exception occurred while creating the neutron port %s on the NSX " -"plaform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:442 -#: neutron/plugins/vmware/plugins/base.py:494 -#: neutron/plugins/vmware/plugins/base.py:692 -#, python-format -msgid "" -"NSX plugin does not support regular VIF ports on external networks. Port " -"%s will be down." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:463 -#, python-format -msgid "" -"_nsx_create_port completed for port %(name)s on network %(network_id)s. " -"The new port id is %(id)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:474 -#, python-format -msgid "" -"Concurrent network deletion detected; Back-end Port %(nsx_id)s creation " -"to be rolled back for Neutron port: %(neutron_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:486 -#, python-format -msgid "NSX Port %s already gone" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:501 -#, python-format -msgid "Port '%s' was already deleted on NSX platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:508 -#, python-format -msgid "_nsx_delete_port completed for port %(port_id)s on network %(net_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:513 -#, python-format -msgid "Port %s not found in NSX" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:522 -#, python-format -msgid "" -"Neutron port %(port_id)s not found on NSX backend. Terminating delete " -"operation. A dangling router port might have been left on router " -"%(router_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:537 -#, python-format -msgid "" -"Ignoring exception as this means the peer for port '%s' has already been " -"deleted." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:549 -#, python-format -msgid "" -"It is not allowed to create router interface ports on external networks " -"as '%s'" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:574 -#, python-format -msgid "" -"_nsx_create_router_port completed for port %(name)s on network " -"%(network_id)s. The new port id is %(id)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:587 -#, python-format -msgid "" -"device_id field must be populated in order to create an external gateway " -"port for network %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:597 -#, python-format -msgid "The gateway port for the NSX router %s was not found on the backend" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:638 -#, python-format -msgid "" -"_nsx_create_ext_gw_port completed on external network %(ext_net_id)s, " -"attached to router:%(router_id)s. NSX port id is %(nsx_port_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:673 -#: neutron/plugins/vmware/plugins/base.py:1739 -#, python-format -msgid "Logical router resource %s not found on NSX platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:677 -#: neutron/plugins/vmware/plugins/base.py:1743 -msgid "Unable to update logical routeron NSX Platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:679 -#, python-format -msgid "" -"_nsx_delete_ext_gw_port completed on external network %(ext_net_id)s, " -"attached to NSX router:%(router_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:721 -#, python-format -msgid "" -"_nsx_create_l2_gw_port completed for port %(name)s on network " -"%(network_id)s. The new port id is %(id)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:765 -#, python-format -msgid "%s required" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:770 -msgid "Segmentation ID cannot be specified with flat network type" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:774 -msgid "Segmentation ID must be specified with vlan network type" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:778 -#: neutron/plugins/vmware/plugins/base.py:794 -#, python-format -msgid "%(segmentation_id)s out of range (%(min_id)s through %(max_id)s)" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:800 -#, python-format -msgid "%(net_type_param)s %(net_type_value)s not supported" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:845 -#, python-format -msgid "No switch has available ports (%d checked)" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:879 -#, python-format -msgid "Maximum number of logical ports reached for logical network %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:925 -#, python-format -msgid "" -"Network with admin_state_up=False are not yet supported by this plugin. " -"Ignoring setting for network %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1003 -#, python-format -msgid "The following logical switches were not found on the NSX backend:%s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1040 -msgid "admin_state_up=False networks are not supported." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1060 -#, python-format -msgid "Unable to find NSX mappings for neutron network:%s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1067 -#, python-format -msgid "" -"Logical switch update on NSX backend failed. Neutron network " -"id:%(net_id)s; NSX lswitch id:%(lswitch_id)s;Error:%(error)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1138 -#, python-format -msgid "port created on NSX backend for tenant %(tenant_id)s: (%(id)s)" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1141 -#, python-format -msgid "Logical switch for network %s was not found in NSX." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1152 -msgid "Unable to create port or set port attachment in NSX." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1240 -#, python-format -msgid "Updating port: %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1275 -#, python-format -msgid "Unable to update port id: %s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1358 -msgid "" -"Cannot create a distributed router with the NSX platform currently in " -"execution. Please, try without specifying the 'distributed' attribute." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1364 -msgid "Unable to create logical router on NSX Platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1375 -#, python-format -msgid "" -"Unable to create L3GW port on logical router %(router_uuid)s. Verify " -"Default Layer-3 Gateway service %(def_l3_gw_svc)s id is correct" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1385 -#, python-format -msgid "Unable to create router %s on NSX backend" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1414 -#: neutron/plugins/vmware/plugins/base.py:1499 -#: neutron/plugins/vmware/plugins/service.py:201 -#: neutron/plugins/vmware/plugins/service.py:1240 -#, python-format -msgid "Network '%s' is not a valid external network" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1463 -#, python-format -msgid "Failed to set gateway info for router being created:%s - removing router" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1466 -#, python-format -msgid "" -"Create router failed while setting external gateway. Router:%s has been " -"removed from DB and backend" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1508 -msgid "" -"'routes' cannot contain route '0.0.0.0/0', this must be updated through " -"the default gateway attribute" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1524 -#, python-format -msgid "Logical router %s not found on NSX Platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1528 -msgid "Unable to update logical router on NSX Platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1530 -msgid "" -"Request cannot contain 'routes' with the NSX platform currently in " -"execution. Please, try without specifying the static routes." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1587 -#, python-format -msgid "Logical router '%s' not found on NSX Platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1591 -#, python-format -msgid "Unable to delete logical router '%s' on NSX Platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1601 -#, python-format -msgid "" -"Unable to remove NSX mapping for Neutron router %(router_id)s because of " -"the following exception:%(d_exc)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1676 -#, python-format -msgid "" -"Add_router_interface completed for subnet:%(subnet_id)s and " -"router:%(router_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1775 -#, python-format -msgid "" -"An error occurred while removing NAT rules on the NSX platform for " -"floating ip:%s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1780 -msgid "An incorrect number of matching NAT rules was found on the NSX platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1922 -#, python-format -msgid "" -"An error occurred while creating NAT rules on the NSX platform for " -"floating ip:%(floating_ip)s mapped to internal ip:%(internal_ip)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1928 -msgid "Failed to update NAT rules for floatingip update" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1967 -#, python-format -msgid "The port '%s' is not associated with floating IPs" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1970 -#, python-format -msgid "Nat rules not found in nsx for port: %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2010 -#, python-format -msgid "Unable to create l2_gw_service for: %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2033 -msgid "" -"Unable to remove gateway service from NSX plaform - the resource was not " -"found" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2062 -#, python-format -msgid "Unable to update name on NSX backend for network gateway: %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2134 -#: neutron/plugins/vmware/plugins/base.py:2172 -#, python-format -msgid "" -"Neutron gateway device: %(neutron_id)s; NSX transport node identifier: " -"%(nsx_id)s; Operational status: %(status)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2269 -#, python-format -msgid "" -"Removal of gateway device: %(neutron_id)s failed on NSX backend (NSX " -"id:%(nsx_id)s) because the NSX resource was not found" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2276 -#, python-format -msgid "" -"Removal of gateway device: %(neutron_id)s failed on NSX backend (NSX " -"id:%(nsx_id)s). Neutron and NSX states have diverged." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2324 -#, python-format -msgid "" -"Error while updating security profile %(uuid)s with name %(name)s: " -"%(error)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2356 -#, python-format -msgid "" -"The NSX security profile %(sec_profile_id)s, associated with the Neutron " -"security group %(sec_group_id)s was not found on the backend" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2364 -#, python-format -msgid "" -"An exception occurred while removing the NSX security profile " -"%(sec_profile_id)s, associated with Netron security group " -"%(sec_group_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2371 -#, python-format -msgid "Unable to remove security group %s from backend" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2384 -#, python-format -msgid "Port values not valid for protocol: %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:144 -#, python-format -msgid "EDGE: router = %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:175 -msgid "EDGE: _vcns_create_ext_gw_port" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:184 -msgid "EDGE: _vcns_delete_ext_gw_port" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:339 -#, python-format -msgid "VCNS: delete default gateway %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:424 -#, python-format -msgid "An exception occurred while creating a port on lswitch %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:472 -#, python-format -msgid "Unable to create integration logic switch for router %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:482 -#, python-format -msgid "Unable to add router interface to integration lswitch for router %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:492 -#, python-format -msgid "Unable to create advance service router for %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:541 -#, python-format -msgid "Did not found lswitch %s in NSX" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:887 -#, python-format -msgid "Failed to create firewall on vShield Edge bound on router %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:895 -msgid "Bad Firewall request Input" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:910 -#: neutron/plugins/vmware/plugins/service.py:1226 -msgid "router_id is not provided!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:914 -#: neutron/plugins/vmware/plugins/service.py:1614 -#, python-format -msgid "router_id:%s is not an advanced router!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:919 -msgid "A firewall is already associated with the router" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1116 -#, python-format -msgid "Failed to find the edge with vip_id: %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1153 -#, python-format -msgid "" -"Operation can't be performed, Since resource %(model)s : %(id)s is in " -"DELETEing status!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1162 -#, python-format -msgid "Resource %(model)s : %(id)s not found!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1187 -#, python-format -msgid "Failed to create healthmonitor associated with pool id: %s!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1204 -msgid "Failed to create pool on vshield edge" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1223 -msgid "create_vip() called" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1231 -#, python-format -msgid "router_id: %s is not an advanced router!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1264 -msgid "Failed to create vip!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1304 -#, python-format -msgid "Failed to update vip with id: %s!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1321 -#, python-format -msgid "Failed to delete vip with id: %s!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1377 -#, python-format -msgid "Failed to update pool with id: %s!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1399 -#: neutron/plugins/vmware/plugins/service.py:1446 -#: neutron/plugins/vmware/plugins/service.py:1469 -msgid "Failed to update pool with the member" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1425 -msgid "Failed to update old pool with the member" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1489 -#, python-format -msgid "Failed to update monitor with id: %s!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1499 -msgid "Vcns right now can only support one monitor per pool" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1528 -msgid "Failed to associate monitor with pool!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1559 -msgid "Failed to update pool with pool_monitor!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1576 -#, python-format -msgid "" -"Failed to update ipsec vpn configuration on edge, since the router: %s " -"does not have a gateway yet!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1601 -msgid "Bad or unsupported Input request!" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1604 -#, python-format -msgid "" -"Failed to update ipsec VPN configuration with vpnservice: " -"%(vpnservice_id)s on vShield Edge: %(edge_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1611 -msgid "create_vpnservice() called" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1619 -#, python-format -msgid "a vpnservice is already associated with the router: %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1732 -#, python-format -msgid "Start deploying %(edge_id)s for router %(name)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1756 -#, python-format -msgid "Router %s not found" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1759 -#, python-format -msgid "Successfully deployed %(edge_id)s for router %(name)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1775 -#, python-format -msgid "Failed to deploy Edge for router %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1791 -#, python-format -msgid "interface_update_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1794 -#, python-format -msgid "snat_create_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1797 -#, python-format -msgid "snat_delete_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1800 -#, python-format -msgid "dnat_create_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1803 -#, python-format -msgid "dnat_delete_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1806 -#, python-format -msgid "routes_update_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1809 -#, python-format -msgid "nat_update_result %d" -msgstr "" - -#: neutron/plugins/vmware/shell/commands.py:24 -#, python-format -msgid "" -"\n" -"Service type = %s\n" -msgstr "" - -#: neutron/plugins/vmware/shell/commands.py:27 -#, python-format -msgid "Service uuids = %s\n" -msgstr "" - -#: neutron/plugins/vmware/shell/commands.py:28 -#, python-format -msgid "" -"Port uuids = %s\n" -"\n" -msgstr "" - -#: neutron/plugins/vmware/shell/commands.py:37 -msgid "ID or name of network to run report on" -msgstr "" - -#: neutron/plugins/vmware/shell/commands.py:46 -msgid "Migration report is:\n" -msgstr "" - -#: neutron/plugins/vmware/shell/commands.py:56 -msgid "ID or name of network to migrate" -msgstr "" - -#: neutron/plugins/vmware/shell/commands.py:66 -msgid "Migration has been successful:\n" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:135 -#, python-format -msgid "" -"VCNS: Failed to get edge status:\n" -"%s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:162 -#, python-format -msgid "VCNS: start updating vnic %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:167 -#, python-format -msgid "" -"VCNS: Failed to update vnic %(config)s:\n" -"%(response)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:173 -#, python-format -msgid "VCNS: Failed to update vnic %d" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:181 -#, python-format -msgid "VCNS: update vnic %(index)d: %(addr)s %(netmask)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:190 -#, python-format -msgid "Vnic %d currently not supported" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:211 -#, python-format -msgid "VCNS: start deploying edge %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:219 -#, python-format -msgid "VCNS: deploying edge %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:224 -#, python-format -msgid "VCNS: deploy edge failed for router %s." -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:243 -#, python-format -msgid "VCNS: Edge %s status query failed." -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:248 -#, python-format -msgid "VCNS: Unable to retrieve edge %(edge_id)s status. Retry %(retries)d." -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:255 -#, python-format -msgid "VCNS: Unable to retrieve edge %s status. Abort." -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:259 -#, python-format -msgid "VCNS: Edge %s status" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:266 -#, python-format -msgid "VCNS: Failed to deploy edge %(edge_id)s for %(name)s, status %(status)d" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:273 -#, python-format -msgid "VCNS: Edge %(edge_id)s deployed for router %(name)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:280 -#, python-format -msgid "VCNS: start destroying edge %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:288 -#, python-format -msgid "" -"VCNS: Failed to delete %(edge_id)s:\n" -"%(response)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:294 -#, python-format -msgid "VCNS: Failed to delete %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:304 -#, python-format -msgid "" -"VCNS: Failed to get edges:\n" -"%s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:382 -#, python-format -msgid "" -"VCNS: Failed to get nat config:\n" -"%s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:389 -#, python-format -msgid "VCNS: start creating nat rules: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:405 -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:530 -#, python-format -msgid "" -"VCNS: Failed to create snat rule:\n" -"%s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:413 -#, python-format -msgid "VCNS: create snat rule %(src)s/%(translated)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:436 -#, python-format -msgid "VCNS: start deleting %(type)s rules: %(addr)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:447 -#, python-format -msgid "" -"VCNS: Failed to delete snat rule:\n" -"%s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:454 -#, python-format -msgid "VCNS: delete snat rule %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:472 -#, python-format -msgid "VCNS: create dnat rule %(dst)s/%(translated)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:493 -#, python-format -msgid "VCNS: delete dnat rule %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:517 -#, python-format -msgid "VCNS: start updating nat rules: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:538 -#, python-format -msgid "" -"VCNS: update nat rule\n" -"SNAT:%(snat)s\n" -"DNAT:%(dnat)s\n" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:576 -#, python-format -msgid "VCNS: start updating routes for %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:600 -#, python-format -msgid "" -"VCNS: Failed to update routes:\n" -"%s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:652 -msgid "Failed to get service config" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:664 -msgid "Failed to enable loadbalancer service config" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:41 -#, python-format -msgid "Invalid action value %s in a firewall rule" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:50 -#, python-format -msgid "Invalid action value %s in a vshield firewall rule" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:190 -#, python-format -msgid "Failed to get firewall with edge id: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:208 -#, python-format -msgid "No rule id:%s found in the edge_firewall_binding" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:218 -#, python-format -msgid "Failed to get firewall rule: %(rule_id)s with edge_id: %(edge_id)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:234 -#, python-format -msgid "Failed to update firewall with edge_id: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:246 -#, python-format -msgid "Failed to delete firewall with edge_id:%s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:260 -#, python-format -msgid "Failed to update firewall rule: %(rule_id)s with edge_id: %(edge_id)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:273 -#, python-format -msgid "Failed to delete firewall rule: %(rule_id)s with edge_id: %(edge_id)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:290 -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:318 -#, python-format -msgid "Failed to add firewall rule above: %(rule_id)s with edge_id: %(edge_id)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:329 -#, python-format -msgid "Failed to append a firewall rulewith edge_id: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:350 -msgid "Can't execute insert rule operation without reference rule_id" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:50 -#, python-format -msgid "" -"Unsupported ike_version: %s! Only 'v1' ike version is supported on " -"vshield Edge!" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:64 -msgid "" -"IKEPolicy and IPsecPolicy should have consistent auth_algorithm, " -"encryption_algorithm and pfs for VSE!" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:72 -#, python-format -msgid "" -"Unsupported encryption_algorithm: %s! '3des', 'aes-128' and 'aes-256' are" -" supported on VSE right now." -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:81 -#, python-format -msgid "Unsupported pfs: %s! 'group2' and 'group5' are supported on VSE right now." -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:89 -#, python-format -msgid "" -"Unsupported transform protocol: %s! 'esp' is supported by default on VSE " -"right now." -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:98 -#, python-format -msgid "" -"Unsupported encapsulation mode: %s! 'tunnel' is supported by default on " -"VSE right now." -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:136 -#, python-format -msgid "Failed to update ipsec vpn configuration with edge_id: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:143 -#, python-format -msgid "IPsec config not found on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:146 -#, python-format -msgid "Failed to delete ipsec vpn configuration with edge_id: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:154 -#, python-format -msgid "Invalid %(protocol)s persistence method: %(type)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:180 -#, python-format -msgid "Failed to create app profile on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:191 -#, python-format -msgid "Failed to create vip on vshield edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:209 -#, python-format -msgid "vip_binding not found with id: %(id)s edge_id: %(edge_id)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:226 -msgid "Failed to get vip on edge" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:243 -#, python-format -msgid "Failed to update app profile on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:251 -#, python-format -msgid "Failed to update vip on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:262 -#, python-format -msgid "vip not found on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:265 -#, python-format -msgid "Failed to delete vip on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:270 -#, python-format -msgid "app profile not found on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:273 -#, python-format -msgid "Failed to delete app profile on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:284 -msgid "Failed to create pool" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:301 -#, python-format -msgid "pool_binding not found with id: %(id)s edge_id: %(edge_id)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:311 -msgid "Failed to get pool on edge" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:323 -msgid "Failed to update pool" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:333 -msgid "Failed to delete pool" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:343 -#, python-format -msgid "Failed to create monitor on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:361 -#, python-format -msgid "monitor_binding not found with id: %(id)s edge_id: %(edge_id)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:371 -#, python-format -msgid "Failed to get monitor on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:388 -#, python-format -msgid "Failed to update monitor on edge: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:399 -msgid "Failed to delete monitor" -msgstr "" - -#: neutron/plugins/vmware/vshield/vcns.py:54 -#, python-format -msgid "VcnsApiHelper('%(method)s', '%(uri)s', '%(body)s')" -msgstr "" - -#: neutron/plugins/vmware/vshield/vcns.py:62 -#, python-format -msgid "Header: '%s'" -msgstr "" - -#: neutron/plugins/vmware/vshield/vcns.py:63 -#, python-format -msgid "Content: '%s'" -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:35 -#, python-format -msgid "%(resource)s not found: %(msg)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:39 -#, python-format -msgid "An unknown exception %(status)s occurred: %(response)s." -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:50 -#, python-format -msgid "Resource %(uri)s has been redirected" -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:54 -#, python-format -msgid "Request %(uri)s is Bad, response %(response)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:58 -#, python-format -msgid "Forbidden: %(uri)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:62 -#, python-format -msgid "Resource %(uri)s not found" -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:66 -#, python-format -msgid "Media Type %(uri)s is not supported" -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:70 -#, python-format -msgid "Service Unavailable: %(uri)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:46 -#, python-format -msgid "Invalid state %(state)d" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:50 -#, python-format -msgid "State %(state)d skipped. Current state %(current)d" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:96 -#, python-format -msgid "Task %(task)s encountered exception in %(func)s at state %(state)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:182 -#, python-format -msgid "Start task %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:188 -#: neutron/plugins/vmware/vshield/tasks/tasks.py:208 -#: neutron/plugins/vmware/vshield/tasks/tasks.py:231 -#, python-format -msgid "Task %(task)s encountered exception in %(cb)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:194 -#: neutron/plugins/vmware/vshield/tasks/tasks.py:213 -#, python-format -msgid "Task %(task)s return %(status)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:296 -msgid "Stopping TaskManager" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:321 -msgid "TaskManager terminating because of an exception" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:343 -msgid "TaskManager terminated" -msgstr "" - -#: neutron/plugins/vmware/vshield/tasks/tasks.py:375 -msgid "Exception in _check_pending_tasks" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:51 -#, python-format -msgid "Agent %s already present" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:52 -#, python-format -msgid "" -"Network %(network_id)s is scheduled to be hosted by DHCP agent " -"%(agent_id)s" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:70 -#, python-format -msgid "Network %s is hosted already" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:79 -#: neutron/scheduler/dhcp_agent_scheduler.py:88 -msgid "No more DHCP agents" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:108 -msgid "No non-hosted networks" -msgstr "" - -#: neutron/scheduler/dhcp_agent_scheduler.py:119 -#, python-format -msgid "DHCP agent %s is not active" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:156 -#, python-format -msgid "No routers compatible with L3 agent configuration on host %s" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:173 -#, python-format -msgid "Router %(router_id)s has already been hosted by L3 agent %(agent_id)s" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:181 -msgid "No active L3 agents" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:193 -#, python-format -msgid "No L3 agents can host the router %s" -msgstr "" - -#: neutron/server/__init__.py:42 -msgid "" -"ERROR: Unable to find configuration file via the default search paths " -"(~/.neutron/, ~/, /etc/neutron/, /etc/) and the '--config-file' option!" -msgstr "" - -#: neutron/server/__init__.py:54 -msgid "RPC was already started in parent process by plugin." -msgstr "" - -#: neutron/server/__init__.py:66 -#, python-format -msgid "ERROR: %s" -msgstr "" - -#: neutron/services/provider_configuration.py:27 -msgid "" -"Defines providers for advanced services using the format: " -"::[:default]" -msgstr "" - -#: neutron/services/provider_configuration.py:45 -#, python-format -msgid "Provider name is limited by 255 characters: %s" -msgstr "" - -#: neutron/services/provider_configuration.py:54 -msgid "Invalid service provider format" -msgstr "" - -#: neutron/services/provider_configuration.py:62 -#, python-format -msgid "Invalid provider format. Last part should be 'default' or empty: %s" -msgstr "" - -#: neutron/services/provider_configuration.py:68 -#, python-format -msgid "Service type '%(svc_type)s' is not allowed, allowed types: %(allowed)s" -msgstr "" - -#: neutron/services/provider_configuration.py:82 -#, python-format -msgid "" -"Service provider '%(provider)s' could not be found for service type " -"%(service_type)s" -msgstr "" - -#: neutron/services/provider_configuration.py:87 -#, python-format -msgid "Service type %(service_type)s does not have a default service provider" -msgstr "" - -#: neutron/services/provider_configuration.py:92 -#, python-format -msgid "" -"Resource '%(resource_id)s' is already associated with provider " -"'%(provider)s' for service type '%(service_type)s'" -msgstr "" - -#: neutron/services/provider_configuration.py:105 -#, python-format -msgid "Driver %s is not unique across providers" -msgstr "" - -#: neutron/services/provider_configuration.py:115 -#, python-format -msgid "Multiple default providers for service %s" -msgstr "" - -#: neutron/services/provider_configuration.py:126 -#, python-format -msgid "Multiple providers specified for service %s" -msgstr "" - -#: neutron/services/service_base.py:70 -#, python-format -msgid "No providers specified for '%s' service, exiting" -msgstr "" - -#: neutron/services/service_base.py:81 -#, python-format -msgid "Loaded '%(provider)s' provider for service %(service_type)s" -msgstr "" - -#: neutron/services/service_base.py:87 -#, python-format -msgid "Error loading provider '%(provider)s' for service %(service_type)s" -msgstr "" - -#: neutron/services/service_base.py:98 -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" - -#: neutron/services/firewall/fwaas_plugin.py:42 -msgid "set_firewall_status() called" -msgstr "" - -#: neutron/services/firewall/fwaas_plugin.py:50 -#, python-format -msgid "Firewall %(fw_id)s in PENDING_DELETE state, not changing to %(status)s" -msgstr "" - -#: neutron/services/firewall/fwaas_plugin.py:63 -msgid "firewall_deleted() called" -msgstr "" - -#: neutron/services/firewall/fwaas_plugin.py:71 -#, python-format -msgid "Firewall %(fw)s unexpectedly deleted by agent, status was %(status)s" -msgstr "" - -#: neutron/services/firewall/fwaas_plugin.py:79 -msgid "get_firewalls_for_tenant() called" -msgstr "" - -#: neutron/services/firewall/fwaas_plugin.py:88 -msgid "get_firewalls_for_tenant_without_rules() called" -msgstr "" - -#: neutron/services/firewall/fwaas_plugin.py:94 -msgid "get_tenants_with_firewalls() called" -msgstr "" - -#: neutron/services/firewall/fwaas_plugin.py:139 -#, python-format -msgid "" -"Exceeded allowed count of firewalls for tenant %(tenant_id)s. Only one " -"firewall is supported per tenant." -msgstr "" - -#: neutron/services/firewall/agents/firewall_agent_api.py:31 -msgid "Name of the FWaaS Driver" -msgstr "" - -#: neutron/services/firewall/agents/firewall_agent_api.py:35 -msgid "Enable FWaaS" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:43 -msgid "Retrieve Firewall with rules from Plugin" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:51 -msgid "Retrieve Tenants with Firewalls configured from Plugin" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:62 -msgid "Initializing firewall agent" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:73 -msgid "" -"FWaaS plugin is configured in the server side, but FWaaS is disabled in " -"L3-agent." -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:83 -#, python-format -msgid "FWaaS Driver Loaded: '%s'" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:86 -#, python-format -msgid "Error importing FWaaS device driver: %s" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:123 -#, python-format -msgid "%(func_name)s from agent for fw: %(fwid)s" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:131 -#, python-format -msgid "No Routers on tenant: %s" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:138 -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:278 -#, python-format -msgid "Apply fw on Router List: '%s'" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:151 -#, python-format -msgid "Firewall Driver Error for %(func_name)s for fw: %(fwid)s" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:166 -#, python-format -msgid "FWaaS RPC failure in %(func_name)s for fw: %(fwid)s" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:186 -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:205 -#, python-format -msgid "Firewall Driver Error on fw state %(fwmsg)s for fw: %(fwid)s" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:217 -#, python-format -msgid "Process router add, router_id: '%s'" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:228 -#, python-format -msgid "Process router add, fw_list: '%s'" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:245 -#, python-format -msgid "FWaaS RPC info call failed for '%s'." -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:260 -#, python-format -msgid "Tenants with Firewalls: '%s'" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:270 -#, python-format -msgid "Router List: '%s'" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:272 -#, python-format -msgid "fw_list: '%s'" -msgstr "" - -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:289 -msgid "Failed fwaas process services sync" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:29 -msgid "vArmour director ip" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:31 -msgid "vArmour director port" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:33 -msgid "vArmour director username" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:35 -msgid "vArmour director password" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:45 -msgid "An unknown exception." -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:59 -msgid "Invalid login credential." -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:65 -msgid "vArmourRestAPI: started" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:98 -#, python-format -msgid "vArmourRestAPI: %(server)s %(port)s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:104 -#, python-format -msgid "vArmourRestAPI Sending: %(method)s %(action)s %(headers)s %(body_data)s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:115 -#, python-format -msgid "vArmourRestAPI Response: %(status)s %(resp_str)s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_api.py:123 -msgid "vArmourRestAPI: Could not establish HTTP connection" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:50 -msgid "vArmourL3NATAgent: __init__" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:64 -#, python-format -msgid "_router_added: %s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:71 -#, python-format -msgid "_router_removed: %s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:112 -#, python-format -msgid "_va_unset_zone_interfaces: %s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:144 -#, python-format -msgid "_va_set_interface_ip: %(pif)s %(cidr)s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:164 -#, python-format -msgid "_va_config_trusted_zone: %s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:195 -#, python-format -msgid "_va_config_untrusted_zone: %s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:210 -#, python-format -msgid "_va_config_untrusted_zone: gw=%r" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:223 -#, python-format -msgid "_va_config_router_snat_rules: %s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:255 -#, python-format -msgid "_va_config_floating_ips: %s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:277 -#, python-format -msgid "process_router: %s" -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:288 -msgid "Unable to parse interface mapping." -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:291 -msgid "Unable to read interface mapping." -msgstr "" - -#: neutron/services/firewall/agents/varmour/varmour_router.py:310 -#, python-format -msgid "external_gateway_added: %s" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:51 -msgid "Initializing fwaas iptables driver" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:54 -#, python-format -msgid "Creating firewall %(fw_id)s for tenant %(tid)s)" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:63 -#, python-format -msgid "Failed to create firewall: %s" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:92 -#, python-format -msgid "Deleting firewall %(fw_id)s for tenant %(tid)s)" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:107 -#, python-format -msgid "Failed to delete firewall: %s" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:111 -#, python-format -msgid "Updating firewall %(fw_id)s for tenant %(tid)s)" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:120 -#, python-format -msgid "Failed to update firewall: %s" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:124 -#, python-format -msgid "Applying firewall %(fw_id)s for tenant %(tid)s)" -msgstr "" - -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:145 -#, python-format -msgid "Failed to apply default policy on firewall: %s" -msgstr "" - -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:28 -msgid "Initializing fwaas vArmour driver" -msgstr "" - -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:33 -#, python-format -msgid "create_firewall (%s)" -msgstr "" - -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:38 -#, python-format -msgid "update_firewall (%s)" -msgstr "" - -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:46 -#, python-format -msgid "delete_firewall (%s)" -msgstr "" - -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:51 -#, python-format -msgid "apply_default_policy (%s)" -msgstr "" - -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:61 -#, python-format -msgid "Updating firewall (%s)" -msgstr "" - -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:110 -msgid "Unsupported IP version rule." -msgstr "" - -#: neutron/services/l3_router/l3_apic.py:60 -msgid "L3 Router Service Plugin for basic L3 using the APIC" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:116 -#, python-format -msgid "Error creating router on Arista HW router=%s " -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:139 -#, python-format -msgid "Error updating router on Arista HW router=%s " -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:154 -#, python-format -msgid "Error deleting router on Arista HW router %(r)s exception=%(e)s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:200 -#, python-format -msgid "Error Adding subnet %(subnet)s to router %(router_id)s on Arista HW" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:234 -#, python-format -msgid "" -"Error removing interface %(interface)s from router %(router_id)s on " -"Arista HWException =(exc)s" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:249 -msgid "Syncing Neutron Router DB <-> EOS" -msgstr "" - -#: neutron/services/l3_router/l3_arista.py:280 -#, python-format -msgid "Error Adding interface %(subnet_id)s to router %(router_id)s on Arista HW" -msgstr "" - -#: neutron/services/l3_router/brocade/l3_router_plugin.py:42 -msgid "Rbridge id of provider edge router(s)" -msgstr "" - -#: neutron/services/l3_router/brocade/l3_router_plugin.py:73 -#: neutron/tests/unit/ml2/drivers/brocade/test_brocade_l3_plugin.py:44 -#, python-format -msgid "rbridge id %s" -msgstr "" - -#: neutron/services/l3_router/brocade/l3_router_plugin.py:154 -#, python-format -msgid "BrocadeSVIPlugin.add_router_interface ports_count %d" -msgstr "" - -#: neutron/services/l3_router/brocade/l3_router_plugin.py:162 -msgid "BrocadeSVIPlugin: adding redundant router interface is not supported" -msgstr "" - -#: neutron/services/l3_router/brocade/l3_router_plugin.py:164 -msgid "BrocadeSVIPlugin:adding redundant router interface is not supported" -msgstr "" - -#: neutron/services/l3_router/brocade/l3_router_plugin.py:177 -#, python-format -msgid "" -"Failed to create Brocade resources to add router interface. " -"info=%(info)s, router_id=%(router_id)s" -msgstr "" - -#: neutron/services/l3_router/brocade/l3_router_plugin.py:223 -#, python-format -msgid "" -"Fail remove of interface from brocade router interface. info=%(info)s, " -"router_id=%(router_id)s" -msgstr "" - -#: neutron/services/loadbalancer/agent_scheduler.py:101 -#, python-format -msgid "Pool %(pool_id)s has already been hosted by lbaas agent %(agent_id)s" -msgstr "" - -#: neutron/services/loadbalancer/agent_scheduler.py:109 -#, python-format -msgid "No active lbaas agents for pool %s" -msgstr "" - -#: neutron/services/loadbalancer/agent_scheduler.py:115 -#, python-format -msgid "No lbaas agent supporting device driver %s" -msgstr "" - -#: neutron/services/loadbalancer/agent_scheduler.py:124 -#, python-format -msgid "Pool %(pool_id)s is scheduled to lbaas agent %(agent_id)s" -msgstr "" - -#: neutron/services/loadbalancer/plugin.py:80 -#, python-format -msgid "Delete associated loadbalancer pools before removing providers %s" -msgstr "" - -#: neutron/services/loadbalancer/plugin.py:89 -#, python-format -msgid "Error retrieving driver for provider %s" -msgstr "" - -#: neutron/services/loadbalancer/plugin.py:97 -#, python-format -msgid "Error retrieving provider for pool %s" -msgstr "" - -#: neutron/services/loadbalancer/plugin.py:188 -#, python-format -msgid "Failed to delete pool %s, putting it in ERROR state" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent.py:36 -msgid "Seconds between periodic task runs" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:39 -msgid "Drivers used to manage loadbalancing devices" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:45 -#, python-format -msgid "Unknown device with pool_id %(pool_id)s" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:94 -#, python-format -msgid "Error importing loadbalancer device driver: %s" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:101 -#, python-format -msgid "Multiple device drivers with the same name found: %s" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:141 -#, python-format -msgid "Error updating statistics on pool %s" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:157 -msgid "Unable to retrieve ready devices" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:174 -#: neutron/services/loadbalancer/agent/agent_manager.py:239 -#, python-format -msgid "No device driver on agent: %s." -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:184 -#, python-format -msgid "Unable to deploy instance for pool: %s" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:194 -#, python-format -msgid "Unable to destroy device for pool: %s" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:207 -#, python-format -msgid "%(operation)s %(obj)s %(id)s failed on device driver %(driver)s" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:333 -#, python-format -msgid "Destroying pool %s due to agent disabling" -msgstr "" - -#: neutron/services/loadbalancer/agent/agent_manager.py:336 -#, python-format -msgid "Agent_updated by server side %s!" -msgstr "" - -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:40 -msgid "Driver to use for scheduling pool to a default loadbalancer agent" -msgstr "" - -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:48 -msgid "Device driver for agent should be specified in plugin driver." -msgstr "" - -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:72 -#, python-format -msgid "Multiple lbaas agents found on host %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:152 -#, python-format -msgid "Unknown object type: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:163 -#, python-format -msgid "" -"Cannot update status: %(obj_type)s %(obj_id)s not found in the DB, it was" -" probably deleted concurrently" -msgstr "" - -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:186 -#, python-format -msgid "Unable to find port %s to plug." -msgstr "" - -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:210 -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:227 -#, python-format -msgid "" -"Unable to find port %s to unplug. This can occur when the Vip has been " -"deleted first." -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/config.py:32 -msgid "Load Balancer image id (Embrane LB)" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/config.py:34 -msgid "In band Security Zone id for LBs" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/config.py:36 -msgid "Out of band Security Zone id for LBs" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/config.py:38 -msgid "Management Security Zone id for LBs" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/config.py:40 -msgid "Dummy user traffic Security Zone id for LBs" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/config.py:44 -msgid "choose LB image flavor to use, accepted values: small, medium" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/config.py:47 -msgid "resource synchronization interval in seconds" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/constants.py:51 -#, python-format -msgid "%s, probably was cancelled through the heleos UI" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/constants.py:58 -#, python-format -msgid "" -"Failed to delete the backend load balancer for reason %s. Please remove " -"it manually through the heleos UI" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/constants.py:61 -#, python-format -msgid "" -"No subnet is associated to member %s (required to identify the proper " -"load balancer port)" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/driver.py:87 -msgid "Connection limit is not supported by Embrane LB" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/driver.py:93 -#, python-format -msgid "Session persistence %s not supported by Embrane LBaaS" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/driver.py:131 -#, python-format -msgid "Subnet assigned to pool %s doesn't exist, backend port can't be created" -msgstr "" - -#: neutron/services/loadbalancer/drivers/embrane/agent/lb_operations.py:111 -#, python-format -msgid "" -"The load balancer %s had no physical representation, likely already " -"deleted" -msgstr "" - -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:46 -msgid "Location to store config and state files" -msgstr "" - -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:53 -msgid "The user group" -msgstr "" - -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:59 -msgid "" -"When delete and re-add the same vip, send this many gratuitous ARPs to " -"flush the ARP cache in the Router. Set it below or equal to 0 to disable " -"this feature." -msgstr "" - -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:76 -#, python-format -msgid "Error importing interface driver: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:172 -#, python-format -msgid "Stats socket not found for pool %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:214 -#, python-format -msgid "Error while connecting to stats socket: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:393 -#, python-format -msgid "Unable to kill haproxy process: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:43 -#, python-format -msgid "NCC Error %d" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:54 -msgid "No NetScaler Control Center URI specified. Cannot connect." -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:133 -#, python-format -msgid "Connection error occurred while connecting to %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:138 -#, python-format -msgid "SSL error occurred while connecting to %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:143 -#, python-format -msgid "Request to %s timed out" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:150 -msgid "Request did not specify a valid URL" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:154 -#, python-format -msgid "Too many redirects occurred for request to %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:158 -#, python-format -msgid "A request error while connecting to %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:163 -#, python-format -msgid "A unknown error occurred during request to %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:168 -#, python-format -msgid "Response: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:171 -#, python-format -msgid "Unable to login. Invalid credentials passed.for: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:175 -#, python-format -msgid "Failed %(method)s operation on %(url)s status code: %(response_status)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:29 -msgid "The URL to reach the NetScaler Control Center Server." -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:33 -msgid "Username to login to the NetScaler Control Center Server." -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:37 -msgid "Password to login to the NetScaler Control Center Server." -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:75 -#, python-format -msgid "NetScaler driver vip creation: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:90 -#, python-format -msgid "NetScaler driver vip %(vip_id)s update: %(vip_obj)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:105 -#, python-format -msgid "NetScaler driver vip removal: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:126 -#, python-format -msgid "NetScaler driver pool creation: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:141 -#, python-format -msgid "NetScaler driver pool %(pool_id)s update: %(pool_obj)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:156 -#, python-format -msgid "NetScaler driver pool removal: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:173 -#, python-format -msgid "NetScaler driver poolmember creation: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:191 -#, python-format -msgid "NetScaler driver poolmember %(member_id)s update: %(member_obj)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:208 -#, python-format -msgid "NetScaler driver poolmember removal: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:226 -#, python-format -msgid "" -"NetScaler driver healthmonitor creation for pool %(pool_id)s: " -"%(monitor_obj)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:249 -#, python-format -msgid "NetScaler driver healthmonitor %(monitor_id)s update: %(monitor_obj)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:270 -#, python-format -msgid "NetScaler driver healthmonitor %(monitor_id)sremoval for pool %(pool_id)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:290 -#, python-format -msgid "NetScaler driver pool stats retrieval: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:415 -#, python-format -msgid "" -"Filtering ports based on network_id=%(network_id)s, " -"tenant_id=%(tenant_id)s, device_id=%(device_id)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:430 -#, python-format -msgid "Found an existing SNAT port for subnet %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:433 -#, python-format -msgid "Found no SNAT ports for subnet %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:454 -#, python-format -msgid "Created SNAT port: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:462 -#, python-format -msgid "Removed SNAT port: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:469 -#, python-format -msgid "No SNAT port found for subnet %s. Creating one..." -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:477 -#, python-format -msgid "SNAT port: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:487 -#, python-format -msgid "Removing SNAT port for subnet %s as this is the last pool using it..." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:62 -msgid "IP address of vDirect server." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:64 -msgid "IP address of secondary vDirect server." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:67 -msgid "vDirect user name." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:70 -msgid "vDirect user password." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:73 -msgid "Service ADC type. Default: VA." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:76 -msgid "Service ADC version." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:79 -msgid "Enables or disables the Service HA pair. Default: False." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:83 -msgid "Service throughput. Default: 1000." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:86 -msgid "Service SSL throughput. Default: 100." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:89 -msgid "Service compression throughput. Default: 100." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:92 -msgid "Size of service cache. Default: 20." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:95 -msgid "Name of l2_l3 workflow. Default: openstack_l2_l3." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:99 -msgid "Name of l4 workflow. Default: openstack_l4." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:107 -msgid "Parameter for l2_l3 workflow constructor." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:114 -msgid "Parameter for l2_l3 workflow setup." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:117 -msgid "List of actions that are not pushed to the completion queue." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:121 -msgid "Name of the l4 workflow action. Default: BaseCreate." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:125 -msgid "Resource pool IDs." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:128 -msgid "A required VLAN for the interswitch link to use." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:131 -msgid "" -"Enable or disable Alteon interswitch link for stateful session failover. " -"Default: False." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:232 -#, python-format -msgid "" -"vip: %(vip)s, extended_vip: %(extended_vip)s, service_name: " -"%(service_name)s, " -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:266 -#, python-format -msgid "Retrieved pip nport: %(port)r for vip: %(vip)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:274 -#, python-format -msgid "Found no pip nports associated with vip: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:283 -#, python-format -msgid "Failed to remove workflow %s. Going to set vip to ERROR status" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:297 -#, python-format -msgid "pip nport id: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:301 -#, python-format -msgid "pip nport delete failed: %r" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:389 -#, python-format -msgid "" -"_handle_pool_health_monitor. health_monitor = %(hm_id)s pool_id = " -"%(pool_id)s delete = %(delete)s vip_id = %(vip_id)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:420 -msgid "Starting operation completion handling thread" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:450 -#, python-format -msgid "_update_workflow response: %s " -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:459 -#: neutron/services/loadbalancer/drivers/radware/driver.py:490 -#, python-format -msgid "Pushing operation %s to the queue" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:467 -#, python-format -msgid "Remove the workflow %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:475 -#, python-format -msgid "Post-remove workflow function %r completed" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:479 -#, python-format -msgid "Post-remove workflow function %r failed" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:596 -#, python-format -msgid "create_workflow response: %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:650 -#, python-format -msgid "Could not find or allocate IP address for subnet id %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:685 -#, python-format -msgid "" -"vDirectRESTClient:init server=%(server)s, secondary " -"server=%(sec_server)s, port=%(port)d, ssl=%(ssl)r" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:691 -#, python-format -msgid "Fliping servers. Current is: %(server)s, switching to %(secondary)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:704 -msgid "" -"REST client is not able to recover since only one vDirect server is " -"configured." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:712 -#, python-format -msgid "vDirect server is not responding (%s)." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:716 -#, python-format -msgid "vDirect server is not active (%s)." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:744 -msgid "vdirectRESTClient: Could not establish HTTPS connection" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:751 -msgid "vdirectRESTClient: Could not establish HTTP connection" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:768 -#, python-format -msgid "vdirectRESTClient: %(action)s failure, %(e)r" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:836 -#, python-format -msgid "" -"Operation %(oper)s is completed after %(sec_to_completion)d sec with " -"success status: %(success)s :" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:848 -#, python-format -msgid "Operation %(operation)s failed. Reason: %(msg)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:880 -#, python-format -msgid "Operation %s is not completed yet.." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:895 -msgid "Exception was thrown inside OperationCompletionHandler" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:904 -#, python-format -msgid "Post-operation function %(func)r completed after operation %(oper)r" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:910 -#, python-format -msgid "Post-operation function %(func)r failed after operation %(oper)r" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:951 -#, python-format -msgid "_update: %s " -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/driver.py:991 -#, python-format -msgid "_remove_object_from_db %s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:22 -msgid "An unknown exception occurred in Radware LBaaS provider." -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:26 -msgid "" -"vDirect user/password missing. Specify in configuration file, under " -"[radware] section" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:31 -#, python-format -msgid "" -"Workflow %(workflow)s is missing on vDirect server. Upload missing " -"workflow" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:36 -#, python-format -msgid "" -"REST request failed with status %(status)s. Reason: %(reason)s, " -"Description: %(description)s. Success status codes are %(success_codes)s" -msgstr "" - -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:42 -#, python-format -msgid "%(operation)s operation is not supported for %(entity)s." -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:70 -msgid "Metering driver" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:72 -msgid "Interval between two metering measures" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:74 -msgid "Interval between two metering reports" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:98 -#, python-format -msgid "Loading Metering driver %s" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:100 -msgid "A metering driver must be specified" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:115 -#, python-format -msgid "Send metering report: %s" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:179 -#, python-format -msgid "Driver %(driver)s does not implement %(func)s" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:183 -#, python-format -msgid "Driver %(driver)s:%(func)s runtime error" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:218 -msgid "Get router traffic counters" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:222 -msgid "Update metering rules from agent" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:227 -msgid "Creating a metering label from agent" -msgstr "" - -#: neutron/services/metering/agents/metering_agent.py:234 -msgid "Delete a metering label from agent" -msgstr "" - -#: neutron/services/metering/drivers/iptables/iptables_driver.py:93 -#, python-format -msgid "Loading interface driver %s" -msgstr "" - -#: neutron/services/vpn/agent.py:26 -msgid "The vpn device drivers Neutron will use" -msgstr "" - -#: neutron/services/vpn/plugin.py:46 -#, python-format -msgid "VPN plugin using service driver: %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:89 -#, python-format -msgid "RESPONSE: %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:102 -#, python-format -msgid "%(method)s: Request for %(resource)s payload: %(payload)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:109 -#, python-format -msgid "%(method)s Took %(time).2f seconds to process" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:115 -#, python-format -msgid "%(method)s: Request timeout%(ssl)s (%(timeout).3f sec) for CSR(%(host)s)" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:124 -#, python-format -msgid "%(method)s: Unable to connect to CSR(%(host)s)" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:128 -#, python-format -msgid "%(method)s: Unexpected error for CSR (%(host)s): %(error)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:134 -#, python-format -msgid "%(method)s: Completed [%(status)s]" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:149 -#, python-format -msgid "%(auth)s with CSR %(host)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:156 -#, python-format -msgid "Successfully authenticated with CSR %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:158 -#, python-format -msgid "Failed authentication with CSR %(host)s [%(status)s]" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:193 -#, python-format -msgid "%(method)s: Request timeout for CSR(%(host)s)" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:42 -msgid "Status check interval for Cisco CSR IPSec connections" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:53 -#, python-format -msgid "Cisco CSR failed to create %(resource)s (%(which)s)" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:57 -#, python-format -msgid "Cisco CSR failed to change %(tunnel)s admin state to %(state)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:62 -#, python-format -msgid "" -"Required %(resource)s attribute %(attr)s mapping for Cisco CSR is missing" -" in device driver" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:67 -#, python-format -msgid "" -"Device driver does not have a mapping of '%(value)s for attribute " -"%(attr)s of %(resource)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:130 -#, python-format -msgid "Handling VPN service update notification '%s'" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:152 -#, python-format -msgid "Update: Existing connection %s changed" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:159 -#, python-format -msgid "Update: Connection %s no longer admin down" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:165 -#, python-format -msgid "Update: Connection %s forced to admin down" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:173 -#, python-format -msgid "Update: Created new connection %s in admin down state" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:178 -#, python-format -msgid "Update: Created new connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:189 -#, python-format -msgid "Update: Existing VPN service %s detected" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:193 -#, python-format -msgid "Update: New VPN service %s detected" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:204 -msgid "Update: Completed update processing" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:234 -#, python-format -msgid "Mark: %(service)d VPN services and %(conn)d IPSec connections marked dirty" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:256 -#, python-format -msgid "" -"Sweep: Removed %(service)d dirty VPN service%(splural)s and %(conn)d " -"dirty IPSec connection%(cplural)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:271 -#, python-format -msgid "Report: Collecting status for IPSec connections on VPN service %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:277 -#, python-format -msgid "Connection %s forced down" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:281 -#, python-format -msgid "Connection %(conn)s reported %(status)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:286 -#, python-format -msgid "Report: Adding info for IPSec connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:306 -#, python-format -msgid "Report: Adding info for VPN service %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:328 -msgid "Report: Starting status report processing" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:330 -#, python-format -msgid "Report: Collecting status for VPN service %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:336 -msgid "Sending status report update to plugin" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:338 -msgid "Report: Completed status report processing" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:622 -#, python-format -msgid "Unable to create %(resource)s %(which)s: %(status)d" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:635 -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:663 -#, python-format -msgid "Internal error - '%s' is not defined" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:648 -#, python-format -msgid "Unable to delete %(resource)s %(which)s: %(status)d" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:657 -#, python-format -msgid "Performing rollback action %(action)s for resource %(resource)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:683 -#, python-format -msgid "Creating IPSec connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:716 -#, python-format -msgid "FAILED: Create of IPSec site-to-site connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:719 -#, python-format -msgid "SUCCESS: Created IPSec site-to-site connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:728 -#, python-format -msgid "Deleting IPSec connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:730 -#, python-format -msgid "Unable to find connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:734 -#, python-format -msgid "SUCCESS: Deleted IPSec site-to-site connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:742 -#, python-format -msgid "Unable to change %(tunnel)s admin state to %(state)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/ipsec.py:46 -msgid "Location to store ipsec server config files" -msgstr "" - -#: neutron/services/vpn/device_drivers/ipsec.py:49 -msgid "Interval for checking ipsec status" -msgstr "" - -#: neutron/services/vpn/device_drivers/ipsec.py:59 -msgid "Template file for ipsec configuration" -msgstr "" - -#: neutron/services/vpn/device_drivers/ipsec.py:65 -msgid "Template file for ipsec secret configuration" -msgstr "" - -#: neutron/services/vpn/device_drivers/ipsec.py:247 -#, python-format -msgid "Failed to enable vpn process on router %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/ipsec.py:258 -#, python-format -msgid "Failed to disable vpn process on router %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/__init__.py:97 -#, python-format -msgid "Notify agent at %(topic)s.%(host)s the message %(method)s %(args)s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:66 -#, python-format -msgid "Unable to parse config files %s for Cisco CSR info" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:106 -#, python-format -msgid "Ignoring Cisco CSR for subnet %s - REST management is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:46 -#, python-format -msgid "Fatal - %(reason)s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:80 -#, python-format -msgid "No available Cisco CSR %(type)s IDs from %(min)d..%(max)d" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:135 -#, python-format -msgid "" -"Database inconsistency between IPSec connection and Cisco CSR mapping " -"table (%s)" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:161 -#, python-format -msgid "Reserved new CSR ID %(csr_id)d for %(policy)s ID %(policy_id)s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:188 -#, python-format -msgid "" -"Mappings for IPSec connection %(conn)s - tunnel=%(tunnel)s " -"ike_policy=%(csr_ike)d ipsec_policy=%(csr_ipsec)d" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:197 -#, python-format -msgid "" -"Existing entry for IPSec connection %s not found in Cisco CSR mapping " -"table" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:224 -#, python-format -msgid "" -"Attempt to create duplicate entry in Cisco CSR mapping table for " -"connection %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:227 -#, python-format -msgid "" -"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " -"%(ike_id)d and IPSec policy ID %(ipsec_id)d" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:239 -#, python-format -msgid "Removed mapping for connection %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_ipsec.py:104 -#, python-format -msgid "" -"Notify agent at %(topic)s.%(host)s the message %(method)s %(args)s for " -"router %(router)s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_validator.py:34 -#, python-format -msgid "" -"Cisco CSR does not support %(resource)s attribute %(key)s with value " -"'%(value)s'" -msgstr "" - -#: neutron/tests/functional/agent/linux/simple_daemon.py:37 -msgid "" -"uuid provided from the command line so external_process can track us via " -"/proc/cmdline interface." -msgstr "" - -#: neutron/tests/unit/test_api_v2_resource.py:181 -#: neutron/tests/unit/test_api_v2_resource.py:251 -msgid "Unmapped error" -msgstr "" - -#: neutron/tests/unit/test_api_v2_resource.py:320 -msgid "" -"The server has either erred or is incapable of performing the requested " -"operation." -msgstr "" - -#: neutron/tests/unit/bigswitch/fake_server.py:72 -#, python-format -msgid "" -"Request: action=%(action)s, uri=%(uri)r, body=%(body)s, " -"headers=%(headers)s" -msgstr "" - -#: neutron/tests/unit/bigswitch/fake_server.py:124 -#, python-format -msgid "No floating IPs in requesturi=%(uri)s, body=%(body)s" -msgstr "" - -#: neutron/tests/unit/bigswitch/fake_server.py:133 -#, python-format -msgid "Expected floating IPs from multiple tenants.uri=%(uri)s, body=%(body)s" -msgstr "" - -#: neutron/tests/unit/bigswitch/fake_server.py:178 -#, python-format -msgid "No host cert for %(server)s in cert %(cert)s" -msgstr "" - -#: neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py:215 -#: neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py:237 -#: neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py:256 -#: neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py:279 -#, python-format -msgid "Unexpected error code: %s" -msgstr "" - -#: neutron/tests/unit/ml2/drivers/mechanism_logger.py:32 -#, 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:59 -#, python-format -msgid "" -"%(method)s called with subnet settings %(current)s (original settings " -"%(original)s)" -msgstr "" - -#: neutron/tests/unit/ml2/drivers/mechanism_logger.py:85 -#, python-format -msgid "" -"%(method)s called with port settings %(current)s (original settings " -"%(original)s) bound to segment %(segment)s (original segment " -"%(original_segment)s) using driver %(driver)s (original driver " -"%(original_driver)s) on network %(network)s" -msgstr "" - -#: neutron/tests/unit/ml2/extensions/test_extension.py:54 -msgid "Adds test attributes to core resources." -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:65 -#, python-format -msgid "(create_tenant) OFC tenant %s already exists" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:77 -#, python-format -msgid "(delete_tenant) OFC tenant %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:79 -msgid "delete_tenant: SUCCEED" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:86 -#, python-format -msgid "(create_network) OFC tenant %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:89 -#, python-format -msgid "(create_network) OFC network %s already exists" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:100 -#, python-format -msgid "(update_network) OFC network %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:104 -msgid "update_network: SUCCEED" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:112 -#, python-format -msgid "(delete_network) OFC network %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:114 -msgid "delete_network: SUCCEED" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:121 -#, python-format -msgid "(create_port) OFC network %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:124 -#, python-format -msgid "(create_port) OFC port %s already exists" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:138 -#, python-format -msgid "(delete_port) OFC port %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:140 -msgid "delete_port: SUCCEED" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:173 -#, python-format -msgid "(create_router) OFC tenant %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:176 -#, python-format -msgid "(create_router) OFC router %s already exists" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:179 -msgid "Operation on OFC is failed" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:193 -#: neutron/tests/unit/nec/stub_ofc_driver.py:283 -#, python-format -msgid "(delete_router) OFC router %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:195 -msgid "delete_router: SUCCEED" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:203 -#, python-format -msgid "(add_router_interface) ip_address %s is not a valid format (a.b.c.d/N)." -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:208 -#, python-format -msgid "(add_router_interface) OFC router %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:211 -#, python-format -msgid "(add_router_interface) OFC network %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:218 -#, python-format -msgid "add_router_interface: SUCCEED (if_id=%s)" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:226 -#: neutron/tests/unit/nec/stub_ofc_driver.py:243 -#, python-format -msgid "(delete_router_interface) OFC router interface %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:235 -msgid "update_router_route: SUCCEED" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:246 -msgid "delete_router_interface: SUCCEED" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:256 -#, python-format -msgid "(add_router_route) OFC router %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:261 -#, python-format -msgid "(add_router_route) route to \"%s\" already exists" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:266 -#, python-format -msgid "add_router_route: SUCCEED (route_id=%s)" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:275 -#, python-format -msgid "(delete_router_route) OFC router route %s not found" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:277 -msgid "delete_router_route: SUCCEED" -msgstr "" - -#: neutron/tests/unit/nec/stub_ofc_driver.py:290 -#, python-format -msgid "list_router_routes: routes=%s" -msgstr "" - -#: neutron/tests/unit/nec/test_ofc_client.py:86 -msgid "The specified OFC resource (/somewhere) is not found." -msgstr "" - -#: neutron/tests/unit/nec/test_ofc_client.py:90 -#: neutron/tests/unit/nec/test_ofc_client.py:96 -#: neutron/tests/unit/nec/test_ofc_client.py:105 -msgid "An OFC exception has occurred: Operation on OFC failed" -msgstr "" - -#: neutron/tests/unit/nec/test_ofc_client.py:112 -msgid "An OFC exception has occurred: Failed to connect OFC : " -msgstr "" - -#: neutron/tests/unit/vmware/apiclient/fake.py:406 -#, python-format -msgid "lswitch:%s not found" -msgstr "" - -#: neutron/tests/unit/vmware/apiclient/fake.py:415 -#, python-format -msgid "lrouter:%s not found" -msgstr "" - -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:104 -#, python-format -msgid "Job %s does not nexist" -msgstr "" - -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:116 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:127 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:144 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:162 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:184 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:206 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:291 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:305 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:319 -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:361 -#, python-format -msgid "Edge %s does not exist" -msgstr "" - -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:194 -#, python-format -msgid "Rule id %d doest not exist" -msgstr "" - -#: neutron/tests/unit/vmware/vshield/fake_vcns.py:258 -#, python-format -msgid "Lswitch %s does not exist" -msgstr "" - -#: neutron/tests/unit/vmware/vshield/test_edge_router.py:129 -msgid "Tasks not completed" -msgstr "" - diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-error.po b/neutron/locale/es/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 5719fb678b1..00000000000 --- a/neutron/locale/es/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,263 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 20:07+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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "Se está descartando excepción original: %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "La excepción inesperada ha ocurrido %d vez(veces)... reintentando." - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "Error durante %(full_task_name)s: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "Excepción durante limpieza de rpc." - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "Excepción no controlada" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %s" -msgstr "" diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po b/neutron/locale/es/LC_MESSAGES/neutron-log-info.po index d40468cb024..574dff7374f 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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-07-18 20:49+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 11:04+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/neutron/language/" "es/)\n" @@ -19,17 +19,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "La extensión security-group se ha inhabilitado." + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "Preparando filtros para dispositivos %s" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "Se ha actualizado la regla de grupo de seguridad %r" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "Se ha actualizado el miembro de grupo de seguridad %r" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "Se ha actualizado regla de proveedor" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "Eliminar filtro de dispositivo para %r" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "Renovar reglas de cortafuegos" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -54,6 +106,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, 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/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "Candado creado ruta: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "No se ha podido eliminar el archivo %(file)s" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -64,72 +131,77 @@ msgstr "Omitiendo la tarea periódica %(task)s porque el intervalo es negativo" 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:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "Se ha captado %s, saliendo" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "El proceso padre se ha detenido inesperadamente, saliendo" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" -msgstr "" +msgstr "Hijo captado %s, saliendo" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Bifurcación demasiado rápida, en reposo" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "Se ha iniciado el hijo %d" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "Iniciando %d trabajadores" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, 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:360 +#: neutron/openstack/common/service.py:352 #, 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:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "Se ha captado %s, deteniendo hijos" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "" -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "En espera de %d hijos para salir" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -137,43 +209,30 @@ msgstr "" #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907 msgid "Agent out of sync with plugin!" -msgstr "" +msgstr "El agente está fuera de sincronización con el plug-in." -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" @@ -181,26 +240,28 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " msgstr "" +"El agente se ha inicializado satisfactoriamente, ahora se está ejecutando... " #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, python-format msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" +msgstr "Asignando %(vlan_id)s como vlan local para net-id=%(net_uuid)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" +msgstr "Reclamando vlan = %(vlan_id)s de net-id = %(net_uuid)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "port_unbound() net_uuid %s no está en local_vlan_map" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, 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/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -212,7 +273,7 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "Se ha actualizado el puerto %(device)s. Detalles: %(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format @@ -222,17 +283,53 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "Se ha eliminado el adjunto %s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "Túnel de agente fuera de sincronización con el plug-in. " + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/es/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index 65cb403ecba..00000000000 --- a/neutron/locale/es/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "El pid %d no está en la lista de hijos" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-critical.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-critical.po deleted file mode 100644 index 52ae6541ad5..00000000000 --- a/neutron/locale/fr/LC_MESSAGES/neutron-log-critical.po +++ /dev/null @@ -1,23 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-06-20 06:09+0000\n" -"PO-Revision-Date: 2014-05-30 06:24+0000\n" -"Last-Translator: FULL NAME \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" - -#~ msgid "Dummy message for transifex setup." -#~ msgstr "message fictif pour la configuration transifex" diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-error.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 6a9e66cdac3..00000000000 --- a/neutron/locale/fr/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,263 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 20:07+0000\n" -"Last-Translator: openstackjenkins \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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "Exception d'origine en cours de suppression : %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "Exception inattendue survenue %d fois... Nouvel essai." - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "Erreur pendant %(full_task_name)s : %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "Exception pendant le nettoyage rpc." - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "Exception non gérée" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %s" -msgstr "" diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po index 808648be4e6..76a85f92542 100644 --- a/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po @@ -3,12 +3,13 @@ # This file is distributed under the same license as the neutron project. # # Translators: +# Maxime COQUEREL , 2014 msgid "" msgstr "" "Project-Id-Version: Neutron\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-08-12 21:40+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: French (http://www.transifex.com/projects/p/neutron/language/" "fr/)\n" @@ -19,17 +20,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" -#: neutron/common/ipv6_utils.py:62 -msgid "IPv6 is not enabled on this system." +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "Extension du groupe de sécurité désactivée." + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "Préparation des filtres pour les unités %s" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "Règle de groupe de sécurité mise à jour %r" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "Membre de groupe de sécurité mis à jour %r" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "Règle de fournisseur mise à jour" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "Suppression du filtre d'unités pour %r" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "Régénération des règles de pare-feu" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + +#: neutron/common/ipv6_utils.py:62 +msgid "IPv6 is not enabled on this system." +msgstr "IPv6 n'est pas activé sur le système." + +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -54,6 +107,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, 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/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "Chemin de verrou créé: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "Echec de la suppression du fichier %(file)s" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -64,72 +132,77 @@ msgstr "Tâche périodique %(task)s ignorée car son intervalle est négatif" 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:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "%s interceptée, sortie" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "Processus parent arrêté de manière inattendue, sortie" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" -msgstr "" +msgstr "L'enfant a reçu %s, sortie" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Bifurcation trop rapide, pause" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "Enfant démarré %d" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "Démarrage des travailleurs %d" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, 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:360 +#: neutron/openstack/common/service.py:352 #, 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:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "%s interceptée, arrêt de l'enfant" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "Pause demandée après suppression de thread. Nettoyage." -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "En attente %d enfants pour sortie" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +msgstr "" + +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78 msgid "APIC service agent starting ..." -msgstr "" +msgstr "Démarrage du service de l'agent APIC" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95 msgid "APIC service agent started" -msgstr "" +msgstr "service de l'agent APIC démarré" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -139,68 +212,59 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "Agent non synchronisé avec le plug-in !" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" -msgstr "" +msgstr "Pont inconnu %(dpid)s ours %(ours)s" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" -msgstr "" +msgstr "réseau inconnu %s " #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " -msgstr "" +msgstr "Agent initialisé avec succès, en cours d'exécution... " #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, 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/ofagent/agent/ofa_neutron_agent.py:502 #, 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/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "port_unbound() net_uuid %s absent de local_vlan_map" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" +msgstr "Mappage du réseau physique %(physical_network)s sur le pont %(bridge)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -212,26 +276,63 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "Port %(device)s mis à jour. Détails : %(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format msgid "Configuration for device %s completed." -msgstr "" +msgstr "Configuration complète de l'équipement %s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "Connexion %s retirée" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "Tunnel d'agent désynchronisé avec le plug-in !" + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "ECHEC: Création de la connexion site à site IPsec %s" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "SUCCES: Création de la connexion site à site IPsec %s" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +"Analyse des fichiers de configuration %s pour la configuration du Cisco CSR" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format @@ -241,4 +342,4 @@ msgstr "" #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:75 #, python-format msgid "_handle_request called: %s" -msgstr "" +msgstr "_handle_request called: %s" diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index 1806bead737..00000000000 --- a/neutron/locale/fr/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+0000\n" -"Last-Translator: openstackjenkins \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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "PID %d absent de la liste d'enfants" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/it/LC_MESSAGES/neutron-log-error.po b/neutron/locale/it/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 5d96c45fe15..00000000000 --- a/neutron/locale/it/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,264 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-07-06 03:50+0000\n" -"Last-Translator: PierAlberto \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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "Eccezione originale in corso di eliminazione: %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "Un errore inatteso si è verificato %d volte... ritento." - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "Errore durante %(full_task_name)s: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "Eccezioni durante pulitura rpc." - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "Eccezione non gestita" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %s" -msgstr "" diff --git a/neutron/locale/it/LC_MESSAGES/neutron-log-info.po b/neutron/locale/it/LC_MESSAGES/neutron-log-info.po index 2e2426e88ea..bd448f861d9 100644 --- a/neutron/locale/it/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/it/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-08-17 05:19+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Italian (http://www.transifex.com/projects/p/neutron/language/" "it/)\n" @@ -20,17 +20,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "Estensione di security-group disabilitata." + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "Preparazione filtri per i dispositivi %s" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "Regola gruppo di sicurezza aggiornata %r" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "Membro gruppo di sicurezza aggiornato %r" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "Provider regola aggiornato" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "Rimuovi filtro dispositivo per %r" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "Aggiorna regole firewall" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -55,6 +107,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "Preato percorso di blocco : %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "Tentativo fallito nella rimozione di %(file)s" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -66,72 +133,77 @@ msgstr "" msgid "Skipping periodic task %(task)s because it is disabled" msgstr "Abbadono dell'attività periodica %(task)s perché è disabilitata" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "Rilevato %s, esistente" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "Il processo principale è stato interrotto inaspettatamente, uscire" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "Cogliere Child %s, uscendo" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Sblocco troppo veloce, attendere" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "Child avviato %d" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "Avvio %d operatori" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, 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:360 +#: neutron/openstack/common/service.py:352 #, 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:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "Intercettato %s, arresto in corso dei children" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "Attendere la chiamata dopo l'uccisione de filo. Bonifica." -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "In attesa %d degli elementi secondari per uscire" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -141,68 +213,55 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "Agent non sincronizzato con il plugin!" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " -msgstr "" +msgstr "Agent inizializzato correttamente, ora in esecuzione... " #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, python-format msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" +msgstr "Assegnazione %(vlan_id)s come vlan locale per net-id=%(net_uuid)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" +msgstr "Recupero vlan = %(vlan_id)s da net-id = %(net_uuid)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "port_unbound() net_uuid %s non in local_vlan_map" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" +msgstr "Associazione rete fisica %(physical_network)s al bridge %(bridge)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -214,7 +273,7 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "Porta %(device)s aggiornata. Dettagli: %(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format @@ -224,17 +283,53 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "Collegamento %s rimosso" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "Il tunnel agent non è sincronizzato con il plugin!" + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/it/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/it/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index d3bdf4d9d21..00000000000 --- a/neutron/locale/it/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d non incluso nell'elenco child" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/ja/LC_MESSAGES/neutron-log-error.po b/neutron/locale/ja/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index d82c5993625..00000000000 --- a/neutron/locale/ja/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,263 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 20:07+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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "除去される元の例外: %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "予期せぬ例外が、%d回()発生しました。再試行中。" - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "%(full_task_name)s 中のエラー: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "RPCクリーンアップ中に例外が発生" - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "未処理例外" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %s" -msgstr "" diff --git a/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po b/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po index 92c03c083da..72d4cc36e39 100644 --- a/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po @@ -3,12 +3,13 @@ # This file is distributed under the same license as the neutron project. # # Translators: +# Kuo(Kyohei MORIYAMA) <>, 2014 msgid "" msgstr "" "Project-Id-Version: Neutron\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-07-18 20:49+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 11:04+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Japanese (http://www.transifex.com/projects/p/neutron/" "language/ja/)\n" @@ -19,17 +20,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" -#: neutron/common/ipv6_utils.py:62 -msgid "IPv6 is not enabled on this system." +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "security-group 拡張を無効にしました。" + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "デバイス %s のフィルターを準備中" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "セキュリティー・グループ・ルールが %r を更新しました" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "セキュリティー・グループ・メンバーが %r を更新しました" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "プロバイダー・ルールが更新されました" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "%r のデバイス・フィルターを削除" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "ファイアウォール・ルールの最新表示" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + +#: neutron/common/ipv6_utils.py:62 +msgid "IPv6 is not enabled on this system." +msgstr " このシステムでは、 IPv6が有効ではありません。" + +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -54,6 +107,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "Eventlet backdoorは、プロセス%(pid)dの%(port)sをリスニングしています。" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "作成されたロックのパス: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "%(file)sの削除に失敗しました" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -64,72 +132,77 @@ msgstr "タスクの間隔が負であるため、定期タスク %(task)s を msgid "Skipping periodic task %(task)s because it is disabled" msgstr "タスクが使用不可であるため、定期タスク %(task)s をスキップしています" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "%s が見つかりました。終了しています" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "親プロセスが予期せずに停止しました。終了しています" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "fork が早すぎます。スリープ状態にしています" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "子 %d を開始しました" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "%d ワーカーを開始しています" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "子 %(pid)d がシグナル %(sig)d によって強制終了されました" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "子 %(pid)s が状況 %(code)d で終了しました" -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "%s が見つかりました。子を停止しています" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "" -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "%d 個の子で終了を待機しています" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -137,70 +210,60 @@ msgstr "" #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907 msgid "Agent out of sync with plugin!" -msgstr "" +msgstr "エージェントがプラグインと非同期です。" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " -msgstr "" +msgstr "エージェントが正常に初期化されました。現在実行中です... " #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, 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/ofagent/agent/ofa_neutron_agent.py:502 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" +msgstr "VLAN = %(vlan_id)s を net-id = %(net_uuid)s から再利用中" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "port_unbound() net_uuid %s が local_vlan_map にありません" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" msgstr "" +"物理ネットワーク %(physical_network)s をブリッジ %(bridge)s にマップしていま" +"す" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -212,7 +275,7 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "ポート %(device)s が更新されました。詳細: %(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format @@ -222,17 +285,53 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "接続機構 %s が削除されました" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "エージェント・トンネルがプラグインと非同期です" + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/ja/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/ja/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index 4feb7d81376..00000000000 --- a/neutron/locale/ja/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d は子リストにありません" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-error.po b/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 64590d5049f..00000000000 --- a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,263 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 20:07+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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "기존 예외가 삭제됨: %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "예기치 않은 예외 %d 번 발생하였습니다... 다시 시도중." - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "%(full_task_name)s 중 오류: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "" - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "처리되지 않은 예외" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %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 index c6adbb201be..6a97c247d01 100644 --- a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/ko_KR/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-07-18 20:49+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/neutron/" "language/ko_KR/)\n" @@ -19,17 +19,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "보안 그룹 확장을 사용하지 않습니다. " + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "%s 디바이스에 대한 필터 준비" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "보안 그룹 규칙이 %r을(를) 업데이트함" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "보안 그룹 멤버가 %r을(를) 업데이트함" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "제공자 규칙이 업데이트됨" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "%r의 디바이스 필터 제거" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "방화벽 규칙 새로 고치기" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -54,6 +106,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "Eventlet 백도어는 프로세스 %(pid)d 일 동안 %(port)s에서 수신" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "생성된 lock path: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "%(file)s 화일 제거 실패." + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -64,72 +131,77 @@ msgstr "간격이 음수이기 때문에 주기적 태스크 %(task)s을(를) msgid "Skipping periodic task %(task)s because it is disabled" msgstr "사용 안하기 때문에 주기적 태스크 %(task)s을(를) 건너뜀" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "%s 발견, 종료 중" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "상위 프로세스가 예기치 않게 정지했습니다. 종료 중" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" -msgstr "" +msgstr "자식으로 된 %s가 존재함." -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "포크가 너무 빠름. 정지 중" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "%d 하위를 시작했음" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "%d 작업자 시작 중" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "%(pid)d 하위가 %(sig)d 신호에 의해 강제 종료됨" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "%(pid)s 하위가 %(code)d 상태와 함께 종료했음" -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "%s 발견, 하위 중지 중" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." -msgstr "" +msgstr "쓰레드가 죽기를 기다려서, 지웁니다. " -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "%d 하위에서 종료하기를 대기 중임" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -137,70 +209,57 @@ msgstr "" #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907 msgid "Agent out of sync with plugin!" -msgstr "" +msgstr "에이전트가 플러그인과 동기화되지 않았습니다!" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " -msgstr "" +msgstr "에이전트가 초기화되었으며, 지금 실행 중... " #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, python-format msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" +msgstr "%(vlan_id)s을(를) net-id=%(net_uuid)s에 대한 로컬 vlan으로 지정 중" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" +msgstr "net-id = %(net_uuid)s에서 vlan = %(vlan_id)s 재확보 중" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "port_unbound() net_uuid %s이(가) local_vlan_map에 있지 않음" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" +msgstr "실제 네트워크 %(physical_network)s을(를) 브릿지 %(bridge)s에 맵핑 중" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -212,7 +271,7 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "%(device)s 포트가 업데이트되었습니다. 세부사항: %(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format @@ -222,17 +281,53 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "첨부 %s이(가) 제거됨" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "에이전트 터널이 플러그인과 동기화되지 않았습니다!" + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index f1ee7d0ff95..00000000000 --- a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d이(가) 하위 목록에 없음" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/neutron-log-error.pot b/neutron/locale/neutron-log-error.pot index 0cab0890c3e..fd84af58a4a 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 2014.2.dev123.g62ae82d\n" +"Project-Id-Version: neutron 2015.1.dev166.gf1384cc\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-15 06:11+0000\n" +"POT-Creation-Date: 2014-10-22 06:20+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,45 +17,69 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: neutron/policy.py:115 +#: neutron/policy.py:119 #, python-format msgid "" "Backward compatibility unavailable for deprecated policy %s. The policy " "will not be enforced" msgstr "" -#: neutron/policy.py:280 +#: neutron/policy.py:311 #, python-format msgid "Policy check error while calling %s!" msgstr "" +#: neutron/agent/l3_agent.py:1852 +#, python-format +msgid "Removing incompatible router '%s'" +msgstr "" + #: neutron/agent/l3_ha_agent.py:136 #, python-format msgid "Unable to process HA router %s without ha port" msgstr "" -#: neutron/agent/linux/external_process.py:230 +#: neutron/agent/linux/external_process.py:227 #, 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:250 +#: neutron/agent/linux/external_process.py:247 #, python-format msgid "respawning %(service)s for uuid %(uuid)s" msgstr "" -#: neutron/agent/linux/external_process.py:256 +#: neutron/agent/linux/external_process.py:253 msgid "Exiting agent as programmed in check_child_processes_actions" msgstr "" +#: neutron/agent/linux/interface.py:154 +#, python-format +msgid "Failed deleting ingress connection state of floatingip %s" +msgstr "" + +#: neutron/agent/linux/interface.py:163 +#, python-format +msgid "Failed deleting egress connection state of floatingip %s" +msgstr "" + #: neutron/cmd/sanity_check.py:58 msgid "" "Nova notifications are enabled, but novaclient is not installed. Either " "disable nova notifications or install python-novaclient." msgstr "" +#: neutron/db/l3_agentschedulers_db.py:141 +#, python-format +msgid "Failed to reschedule router %s" +msgstr "" + +#: neutron/db/l3_agentschedulers_db.py:146 +msgid "Exception encountered during router rescheduling." +msgstr "" + #: neutron/openstack/common/excutils.py:76 #, python-format msgid "Original exception being dropped: %s" @@ -66,53 +90,62 @@ msgstr "" msgid "Unexpected exception occurred %d time(s)... retrying." msgstr "" +#: neutron/openstack/common/lockutils.py:117 +#, python-format +msgid "Could not release the acquired lock `%s`" +msgstr "" + +#: neutron/openstack/common/loopingcall.py:95 +msgid "in fixed duration looping call" +msgstr "" + +#: neutron/openstack/common/loopingcall.py:138 +msgid "in dynamic looping call" +msgstr "" + #: neutron/openstack/common/periodic_task.py:202 #, python-format msgid "Error during %(full_task_name)s: %(e)s" msgstr "" -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "" - -#: neutron/openstack/common/service.py:277 +#: neutron/openstack/common/service.py:269 msgid "Unhandled exception" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:279 #, python-format msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" msgstr "" -#: neutron/plugins/ml2/drivers/type_gre.py:80 +#: neutron/plugins/ml2/drivers/type_gre.py:86 #, python-format msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" msgstr "" -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 +#: neutron/plugins/ml2/drivers/type_vxlan.py:92 #, python-format msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:110 msgid "APIC service agent: failed in reporting state" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:205 #, python-format msgid "No such interface (ignored): %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:255 msgid "APIC service agent: exception in LLDP parsing" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:310 #, python-format msgid "APIC service agent: can not get MACaddr for %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:326 msgid "APIC host agent: failed in reporting state" msgstr "" @@ -120,7 +153,7 @@ msgstr "" msgid "Error in agent event loop" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:56 +#: neutron/plugins/nuage/syncmanager.py:55 #, python-format msgid "Cannot complete the sync between Neutron and VSD because of error:%s" msgstr "" @@ -198,7 +231,7 @@ msgstr "" msgid "Error while processing VIF ports" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2089 +#: neutron/plugins/vmware/plugins/base.py:2098 #, python-format msgid "" "Rolling back database changes for gateway device %s because of an error " @@ -210,52 +243,103 @@ msgstr "" msgid "Not enough candidates, a HA router needs at least %s agents" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 +#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:123 +#, python-format +msgid "%(method)s: Unable to connect to CSR(%(host)s)" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:128 +#, python-format +msgid "%(method)s: Unexpected error for CSR (%(host)s): %(error)s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:158 +#, python-format +msgid "Failed authentication with CSR %(host)s [%(status)s]" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:193 +#, python-format +msgid "%(method)s: Request timeout for CSR(%(host)s)" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:621 +#, python-format +msgid "Unable to create %(resource)s %(which)s: %(status)d" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:634 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:662 +#, python-format +msgid "Internal error - '%s' is not defined" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:741 +#, python-format +msgid "Unable to change %(tunnel)s admin state to %(state)s" +msgstr "" + +#: neutron/services/vpn/device_drivers/ipsec.py:248 +#, python-format +msgid "Failed to enable vpn process on router %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/ipsec.py:259 +#, python-format +msgid "Failed to disable vpn process on router %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:61 #, python-format msgid "Config file parse error: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:75 #, python-format msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:88 #, python-format msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:96 #, python-format msgid "Ignoring Cisco CSR for router %s - timeout is not a floating point number" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:105 +#, python-format +msgid "Ignoring Cisco CSR for subnet %s - REST management is not an IP address" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:112 #, python-format msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:118 #, python-format msgid "Malformed interface name for Cisco CSR router entry - %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:154 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:201 msgid "No routers found in INI file!" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:173 #, python-format msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:176 #, python-format msgid "No matching routers on host %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:210 #, python-format msgid "Unable to find host for router %s" msgstr "" diff --git a/neutron/locale/neutron-log-info.pot b/neutron/locale/neutron-log-info.pot index 0649ada5c20..c37d770305a 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 2014.2.dev114.gf095f99\n" +"Project-Id-Version: neutron 2015.1.dev166.gf1384cc\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-14 06:10+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,18 +17,70 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated " "policy:%(old_policy)s" msgstr "" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router " "rescheduling is disabled." @@ -53,6 +105,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -63,72 +130,77 @@ msgstr "" msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "" -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "" -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -138,41 +210,28 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" @@ -227,11 +286,47 @@ msgstr "" msgid "Agent tunnel out of sync with plugin!" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/neutron-log-warning.pot b/neutron/locale/neutron-log-warning.pot index 24abf9670b7..afd67a31f93 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 2014.2.dev114.gf095f99\n" +"Project-Id-Version: neutron 2015.1.dev166.gf1384cc\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-14 06:11+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,50 +17,86 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" -#: neutron/policy.py:94 +#: neutron/policy.py:98 #, python-format msgid "" "Found deprecated policy rule:%s. Please consider upgrading your policy " "configuration file" msgstr "" -#: neutron/policy.py:137 +#: neutron/policy.py:155 #, python-format msgid "Unable to find data type descriptor for attribute %s" msgstr "" -#: neutron/agent/securitygroups_rpc.py:183 +#: neutron/agent/l3_agent.py:541 +#, python-format +msgid "" +"l3-agent cannot check service plugins enabled at the neutron server when " +"startup due to RPC error. It happens when the server does not support " +"this RPC API. If the error is UnsupportedVersion you can ignore this " +"warning. Detail message: %s" +msgstr "" + +#: neutron/agent/l3_agent.py:553 +#, python-format +msgid "" +"l3-agent cannot check service plugins enabled on the neutron server. " +"Retrying. Detail message: %s" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:186 msgid "" "security_group_info_for_devices rpc call not supported by the server, " "falling back to old security_group_rules_for_devices which scales worse." msgstr "" -#: neutron/agent/linux/keepalived.py:358 +#: neutron/agent/linux/keepalived.py:361 msgid "" "A previous instance of keepalived seems to be dead, unable to restart it," " a new instance will be spawned" msgstr "" -#: neutron/db/l3_agentschedulers_db.py:105 +#: neutron/agent/linux/ovs_lib.py:413 +#, python-format +msgid "ofport: %(ofport)s for VIF: %(vif)s is not a positive integer" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:425 +#, python-format +msgid "Unable to parse interface details. Exception: %s" +msgstr "" + +#: neutron/db/l3_agentschedulers_db.py:106 msgid "" "Time since last L3 agent reschedule check has exceeded the interval " "between checks. Waiting before check to allow agents to send a heartbeat " "in case there was a clock adjustment." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:127 +#: neutron/db/l3_agentschedulers_db.py:128 #, python-format msgid "" "Rescheduling router %(router)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_hamode_db.py:404 +#: neutron/db/l3_hamode_db.py:406 #, python-format msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" msgstr "" -#: neutron/openstack/common/service.py:364 +#: neutron/db/vpn/vpn_db.py:660 +#, python-format +msgid "vpnservice %s in db is already deleted" +msgstr "" + +#: neutron/openstack/common/loopingcall.py:87 +#, python-format +msgid "task %(func_name)s run outlasted interval by %(delay).2f sec" +msgstr "" + +#: neutron/openstack/common/service.py:356 #, python-format msgid "pid %d not in child list" msgstr "" @@ -70,69 +106,69 @@ msgstr "" msgid "%(type)s tunnel %(id)s not found" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:66 #, python-format msgid "Create network postcommit failed for network %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:76 #, python-format msgid "Create subnet postcommit failed for subnet %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:89 #, python-format msgid "Create port postcommit failed for port %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:108 #, python-format msgid "Add interface postcommit failed for port %s" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:299 +#: neutron/plugins/nuage/syncmanager.py:298 #, python-format msgid "Subnet %s not found in neutron for sync" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:317 +#: neutron/plugins/nuage/syncmanager.py:316 #, python-format msgid "Router %s not found in neutron for sync" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:329 +#: neutron/plugins/nuage/syncmanager.py:328 #, python-format msgid "" "Route with destination %(dest)s and nexthop %(hop)s not found in neutron " "for sync" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:343 +#: neutron/plugins/nuage/syncmanager.py:342 #, python-format msgid "Security group %s not found in neutron for sync" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:354 +#: neutron/plugins/nuage/syncmanager.py:353 #, python-format msgid "Security group rule %s not found in neutron for sync" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:364 +#: neutron/plugins/nuage/syncmanager.py:363 #, python-format msgid "Floating ip %s not found in neutron for sync" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:376 +#: neutron/plugins/nuage/syncmanager.py:375 #, python-format msgid "IP allocation for floating ip %s not found in neutron for sync" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:387 +#: neutron/plugins/nuage/syncmanager.py:386 #, python-format msgid "Net-partition %s not found in neutron for sync" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:397 +#: neutron/plugins/nuage/syncmanager.py:396 #, python-format msgid "VM port %s not found in neutron for sync" msgstr "" @@ -152,3 +188,18 @@ msgstr "" msgid "Device %s not defined on plugin" msgstr "" +#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:114 +#, python-format +msgid "%(method)s: Request timeout%(ssl)s (%(timeout).3f sec) for CSR(%(host)s)" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:647 +#, python-format +msgid "Unable to delete %(resource)s %(which)s: %(status)d" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:729 +#, python-format +msgid "Unable to find connection %s" +msgstr "" + diff --git a/neutron/locale/neutron.pot b/neutron/locale/neutron.pot index 220aa82616c..5e119ec7972 100644 --- a/neutron/locale/neutron.pot +++ b/neutron/locale/neutron.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 2014.2.dev123.g62ae82d\n" +"Project-Id-Version: neutron 2015.1.dev166.gf1384cc\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-15 06:10+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -88,48 +88,48 @@ msgstr "" msgid "Successfully loaded %(type)s plugin. Description: %(desc)s" msgstr "" -#: neutron/policy.py:87 +#: neutron/policy.py:91 #, python-format msgid "Loading policies from file: %s" msgstr "" -#: neutron/policy.py:142 +#: neutron/policy.py:160 #, python-format msgid "" "Attribute type descriptor is not a dict. Unable to generate any sub-attr " "policy rule for %s." msgstr "" -#: neutron/policy.py:215 +#: neutron/policy.py:246 #, python-format msgid "" "Unable to identify a target field from:%s.match should be in the form " "%%()s" msgstr "" -#: neutron/policy.py:241 +#: neutron/policy.py:272 #, python-format msgid "Unable to find ':' as separator in %s." msgstr "" -#: neutron/policy.py:245 +#: neutron/policy.py:276 #, python-format msgid "Unable to find resource name in %s" msgstr "" -#: neutron/policy.py:254 +#: neutron/policy.py:285 #, python-format msgid "" "Unable to verify match:%(match)s as the parent resource: %(res)s was not " "found" msgstr "" -#: neutron/policy.py:312 +#: neutron/policy.py:343 #, python-format msgid "Unable to find requested field: %(field)s in target: %(target_dict)s" msgstr "" -#: neutron/policy.py:370 +#: neutron/policy.py:401 #, python-format msgid "Failed policy check for '%s'" msgstr "" @@ -185,7 +185,7 @@ msgid "Seconds between running periodic tasks" msgstr "" #: neutron/service.py:43 -msgid "Number of separate worker processes for service" +msgid "Number of separate API worker processes for service" msgstr "" #: neutron/service.py:46 @@ -287,102 +287,102 @@ msgstr "" msgid "Could not bind to %(host)s:%(port)s after trying for %(time)d seconds" msgstr "" -#: neutron/wsgi.py:342 +#: neutron/wsgi.py:340 msgid "Missing Content-Type" msgstr "" -#: neutron/wsgi.py:531 +#: neutron/wsgi.py:529 #, python-format msgid "Data %(data)s type is %(type)s" msgstr "" -#: neutron/wsgi.py:614 +#: neutron/wsgi.py:612 msgid "Cannot understand JSON" msgstr "" -#: neutron/wsgi.py:627 neutron/wsgi.py:630 +#: neutron/wsgi.py:625 neutron/wsgi.py:628 msgid "Inline DTD forbidden" msgstr "" -#: neutron/wsgi.py:711 +#: neutron/wsgi.py:709 msgid "Cannot understand XML" msgstr "" -#: neutron/wsgi.py:820 +#: neutron/wsgi.py:818 msgid "Unrecognized Content-Type provided in request" msgstr "" -#: neutron/wsgi.py:824 +#: neutron/wsgi.py:822 msgid "No Content-Type provided in request" msgstr "" -#: neutron/wsgi.py:828 +#: neutron/wsgi.py:826 msgid "Empty body provided in request" msgstr "" -#: neutron/wsgi.py:835 +#: neutron/wsgi.py:833 msgid "Unable to deserialize body as provided Content-Type" msgstr "" -#: neutron/wsgi.py:931 +#: neutron/wsgi.py:929 msgid "You must implement __call__" msgstr "" -#: neutron/wsgi.py:1024 neutron/api/v2/base.py:191 neutron/api/v2/base.py:332 -#: neutron/api/v2/base.py:472 neutron/api/v2/base.py:527 +#: neutron/wsgi.py:1022 neutron/api/v2/base.py:191 neutron/api/v2/base.py:332 +#: neutron/api/v2/base.py:472 neutron/api/v2/base.py:531 #: neutron/extensions/l3agentscheduler.py:50 #: neutron/extensions/l3agentscheduler.py:93 msgid "The resource could not be found." msgstr "" -#: neutron/wsgi.py:1071 +#: neutron/wsgi.py:1069 #, python-format msgid "%(method)s %(url)s" msgstr "" -#: neutron/wsgi.py:1077 +#: neutron/wsgi.py:1075 msgid "Unsupported Content-Type" msgstr "" -#: neutron/wsgi.py:1078 +#: neutron/wsgi.py:1076 #, python-format msgid "InvalidContentType: %s" msgstr "" -#: neutron/wsgi.py:1082 +#: neutron/wsgi.py:1080 msgid "Malformed request body" msgstr "" -#: neutron/wsgi.py:1083 +#: neutron/wsgi.py:1081 #, python-format msgid "MalformedRequestBody: %s" msgstr "" -#: neutron/wsgi.py:1090 +#: neutron/wsgi.py:1088 #, python-format msgid "HTTP exception thrown: %s" msgstr "" -#: neutron/wsgi.py:1095 +#: neutron/wsgi.py:1093 msgid "Internal error" msgstr "" -#: neutron/wsgi.py:1110 neutron/wsgi.py:1212 +#: neutron/wsgi.py:1108 neutron/wsgi.py:1210 #, python-format msgid "%(url)s returned with HTTP %(status)d" msgstr "" -#: neutron/wsgi.py:1113 +#: neutron/wsgi.py:1111 #, python-format msgid "%(url)s returned a fault: %(exception)s" msgstr "" -#: neutron/wsgi.py:1231 +#: neutron/wsgi.py:1229 #, python-format msgid "The requested content type %s is invalid." msgstr "" -#: neutron/wsgi.py:1290 +#: neutron/wsgi.py:1288 msgid "Could not deserialize data" msgstr "" @@ -408,7 +408,7 @@ msgstr "" msgid "Number of threads to use during sync process." msgstr "" -#: neutron/agent/dhcp_agent.py:65 neutron/agent/l3_agent.py:496 +#: neutron/agent/dhcp_agent.py:65 neutron/agent/l3_agent.py:499 #: neutron/agent/metadata/namespace_proxy.py:165 msgid "Location of Metadata Proxy UNIX domain socket" msgstr "" @@ -488,25 +488,25 @@ msgid "" "port %(port_id)s, for router %(router_id)s will be considered" msgstr "" -#: neutron/agent/dhcp_agent.py:582 neutron/agent/l3_agent.py:1984 -#: neutron/agent/metadata/agent.py:363 -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:328 -#: neutron/services/metering/agents/metering_agent.py:272 +#: neutron/agent/dhcp_agent.py:582 neutron/agent/l3_agent.py:2017 +#: neutron/agent/metadata/agent.py:355 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:326 +#: neutron/services/metering/agents/metering_agent.py:270 msgid "" "Neutron server does not support state report. State report for this agent" " will be disabled." msgstr "" -#: neutron/agent/dhcp_agent.py:588 neutron/agent/l3_agent.py:1989 -#: neutron/agent/metadata/agent.py:368 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:110 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:795 +#: neutron/agent/dhcp_agent.py:588 neutron/agent/l3_agent.py:2022 +#: neutron/agent/metadata/agent.py:360 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:108 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:216 -#: neutron/plugins/nec/agent/nec_neutron_agent.py:182 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:261 +#: neutron/plugins/nec/agent/nec_neutron_agent.py:180 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:264 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:131 -#: neutron/services/loadbalancer/agent/agent_manager.py:121 -#: neutron/services/metering/agents/metering_agent.py:277 +#: neutron/services/loadbalancer/agent/agent_manager.py:119 +#: neutron/services/metering/agents/metering_agent.py:275 msgid "Failed reporting state!" msgstr "" @@ -515,17 +515,17 @@ msgstr "" msgid "Agent updated: %(payload)s" msgstr "" -#: neutron/agent/dhcp_agent.py:597 neutron/agent/l3_agent.py:1994 -#: neutron/services/metering/agents/metering_agent.py:280 +#: neutron/agent/dhcp_agent.py:597 neutron/agent/l3_agent.py:2027 +#: neutron/services/metering/agents/metering_agent.py:278 #, python-format msgid "agent_updated by server side %s!" msgstr "" -#: neutron/agent/l3_agent.py:214 +#: neutron/agent/l3_agent.py:217 msgid "Cannot allocate link local address" msgstr "" -#: neutron/agent/l3_agent.py:457 +#: neutron/agent/l3_agent.py:460 msgid "" "The working mode for the agent. Allowed modes are: 'legacy' - this " "preserves the existing behavior where the L3 agent is deployed on a " @@ -537,216 +537,207 @@ msgid "" "centralized node (or in single-host deployments, e.g. devstack)" msgstr "" -#: neutron/agent/l3_agent.py:470 neutron/debug/debug_agent.py:41 +#: neutron/agent/l3_agent.py:473 neutron/debug/debug_agent.py:41 msgid "Name of bridge used for external network traffic." msgstr "" -#: neutron/agent/l3_agent.py:474 +#: neutron/agent/l3_agent.py:477 msgid "TCP Port used by Neutron metadata namespace proxy." msgstr "" -#: neutron/agent/l3_agent.py:478 +#: neutron/agent/l3_agent.py:481 msgid "" "Send this many gratuitous ARPs for HA setup, if less than or equal to 0, " "the feature is disabled" msgstr "" -#: neutron/agent/l3_agent.py:481 +#: neutron/agent/l3_agent.py:484 msgid "" "If namespaces is disabled, the l3 agent can only configure a router that " "has the matching router ID." msgstr "" -#: neutron/agent/l3_agent.py:486 +#: neutron/agent/l3_agent.py:489 msgid "Agent should implement routers with no gateway" msgstr "" -#: neutron/agent/l3_agent.py:488 +#: neutron/agent/l3_agent.py:491 msgid "UUID of external network for routers implemented by the agents." msgstr "" -#: neutron/agent/l3_agent.py:491 +#: neutron/agent/l3_agent.py:494 msgid "Allow running metadata proxy." msgstr "" -#: neutron/agent/l3_agent.py:493 +#: neutron/agent/l3_agent.py:496 msgid "Delete namespace after removing a router." msgstr "" -#: neutron/agent/l3_agent.py:516 +#: neutron/agent/l3_agent.py:519 #, python-format msgid "Error importing interface driver '%s'" msgstr "" -#: neutron/agent/l3_agent.py:533 -#, python-format -msgid "" -"l3-agent cannot check service plugins enabled at the neutron server when " -"startup due to RPC error. It happens when the server does not support " -"this RPC API. If the error is UnsupportedVersion you can ignore this " -"warning. Detail message: %s" -msgstr "" - -#: neutron/agent/l3_agent.py:564 neutron/agent/linux/dhcp.py:785 -#: neutron/services/metering/drivers/iptables/iptables_driver.py:92 +#: neutron/agent/l3_agent.py:592 neutron/agent/linux/dhcp.py:786 +#: neutron/services/metering/drivers/iptables/iptables_driver.py:90 msgid "An interface driver must be specified" msgstr "" -#: neutron/agent/l3_agent.py:569 +#: neutron/agent/l3_agent.py:597 msgid "Router id is required if not using namespaces." msgstr "" -#: neutron/agent/l3_agent.py:587 +#: neutron/agent/l3_agent.py:615 msgid "RuntimeError in obtaining router list for namespace cleanup." msgstr "" -#: neutron/agent/l3_agent.py:617 +#: neutron/agent/l3_agent.py:651 #, python-format msgid "Failed to destroy stale router namespace %s" msgstr "" -#: neutron/agent/l3_agent.py:635 neutron/agent/linux/dhcp.py:235 +#: neutron/agent/l3_agent.py:669 neutron/agent/linux/dhcp.py:235 #, python-format msgid "Failed trying to delete namespace: %s" msgstr "" -#: neutron/agent/l3_agent.py:723 +#: neutron/agent/l3_agent.py:757 msgid "" "The 'gateway_external_network_id' option must be configured for this " "agent as Neutron has more than one external network." msgstr "" -#: neutron/agent/l3_agent.py:755 +#: neutron/agent/l3_agent.py:794 #, python-format msgid "Info for router %s were not found. Skipping router removal" msgstr "" -#: neutron/agent/l3_agent.py:830 -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:635 -#: neutron/services/firewall/agents/varmour/varmour_router.py:103 +#: neutron/agent/l3_agent.py:869 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:633 +#: neutron/services/firewall/agents/varmour/varmour_router.py:100 #, python-format msgid "Router port %s has no IP address" msgstr "" -#: neutron/agent/l3_agent.py:832 neutron/db/l3_db.py:954 -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:637 -#: neutron/services/firewall/agents/varmour/varmour_router.py:106 +#: neutron/agent/l3_agent.py:871 neutron/db/l3_db.py:1013 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:635 +#: neutron/services/firewall/agents/varmour/varmour_router.py:103 #, python-format msgid "Ignoring multiple IPs on router port %s" msgstr "" -#: neutron/agent/l3_agent.py:893 +#: neutron/agent/l3_agent.py:932 #, python-format msgid "Deleting stale internal router device: %s" msgstr "" -#: neutron/agent/l3_agent.py:930 +#: neutron/agent/l3_agent.py:969 #, python-format msgid "Deleting stale external router device: %s" msgstr "" -#: neutron/agent/l3_agent.py:1098 +#: neutron/agent/l3_agent.py:1139 #, python-format msgid "Unable to configure IP address for floating IP: %s" msgstr "" -#: neutron/agent/l3_agent.py:1178 +#: neutron/agent/l3_agent.py:1222 #, python-format msgid "Failed sending gratuitous ARP: %s" msgstr "" -#: neutron/agent/l3_agent.py:1240 +#: neutron/agent/l3_agent.py:1287 msgid "DVR: no map match_port found!" msgstr "" -#: neutron/agent/l3_agent.py:1444 +#: neutron/agent/l3_agent.py:1491 msgid "DVR: error adding redirection logic" msgstr "" -#: neutron/agent/l3_agent.py:1456 +#: neutron/agent/l3_agent.py:1503 msgid "DVR: removed snat failed" msgstr "" -#: neutron/agent/l3_agent.py:1557 +#: neutron/agent/l3_agent.py:1604 msgid "Missing subnet/agent_gateway_port" msgstr "" -#: neutron/agent/l3_agent.py:1678 +#: neutron/agent/l3_agent.py:1724 #, python-format msgid "Got router deleted notification for %s" msgstr "" -#: neutron/agent/l3_agent.py:1699 +#: neutron/agent/l3_agent.py:1745 msgid "DVR: Failed updating arp entry" msgstr "" -#: neutron/agent/l3_agent.py:1726 +#: neutron/agent/l3_agent.py:1772 #, python-format msgid "Got routers updated notification :%s" msgstr "" -#: neutron/agent/l3_agent.py:1736 +#: neutron/agent/l3_agent.py:1782 #, python-format msgid "Got router removed from agent :%r" msgstr "" -#: neutron/agent/l3_agent.py:1742 +#: neutron/agent/l3_agent.py:1788 #, python-format msgid "Got router added to agent :%r" msgstr "" -#: neutron/agent/l3_agent.py:1749 +#: neutron/agent/l3_agent.py:1794 #, python-format msgid "The external network bridge '%s' does not exist" msgstr "" -#: neutron/agent/l3_agent.py:1801 +#: neutron/agent/l3_agent.py:1834 #, python-format msgid "Failed to fetch router information for '%s'" msgstr "" -#: neutron/agent/l3_agent.py:1840 +#: neutron/agent/l3_agent.py:1875 #, python-format msgid "Starting _sync_routers_task - fullsync:%s" msgstr "" -#: neutron/agent/l3_agent.py:1860 +#: neutron/agent/l3_agent.py:1893 #, python-format msgid "Processing :%r" msgstr "" -#: neutron/agent/l3_agent.py:1868 +#: neutron/agent/l3_agent.py:1901 msgid "_sync_routers_task successfully completed" msgstr "" -#: neutron/agent/l3_agent.py:1870 +#: neutron/agent/l3_agent.py:1903 msgid "Failed synchronizing routers due to RPC error" msgstr "" -#: neutron/agent/l3_agent.py:1873 -#: neutron/services/metering/agents/metering_agent.py:61 +#: neutron/agent/l3_agent.py:1906 +#: neutron/services/metering/agents/metering_agent.py:59 msgid "Failed synchronizing routers" msgstr "" -#: neutron/agent/l3_agent.py:1896 +#: neutron/agent/l3_agent.py:1929 msgid "L3 agent started" msgstr "" -#: neutron/agent/l3_agent.py:1915 +#: neutron/agent/l3_agent.py:1948 #, python-format msgid "Added route entry is '%s'" msgstr "" -#: neutron/agent/l3_agent.py:1923 +#: neutron/agent/l3_agent.py:1956 #, python-format msgid "Removed route entry is '%s'" msgstr "" -#: neutron/agent/l3_agent.py:1957 +#: neutron/agent/l3_agent.py:1990 msgid "Report state task started" msgstr "" -#: neutron/agent/l3_agent.py:1981 +#: neutron/agent/l3_agent.py:2014 msgid "Report state task successfully completed" msgstr "" @@ -792,8 +783,8 @@ msgid "" msgstr "" #: neutron/agent/ovs_cleanup_util.py:73 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:665 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:299 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:663 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:302 #, python-format msgid "Delete %s" msgstr "" @@ -811,115 +802,78 @@ msgstr "" msgid "DVR functionality requires a server upgrade." msgstr "" -#: neutron/agent/securitygroups_rpc.py:33 +#: neutron/agent/securitygroups_rpc.py:36 msgid "Driver for security groups firewall in the L2 agent" msgstr "" -#: neutron/agent/securitygroups_rpc.py:37 +#: neutron/agent/securitygroups_rpc.py:40 msgid "" "Controls whether the neutron security group API is enabled in the server." " It should be false when using no security groups or using the nova " "security group API." msgstr "" -#: neutron/agent/securitygroups_rpc.py:44 +#: neutron/agent/securitygroups_rpc.py:47 msgid "Use ipset to speed-up the iptables based security groups." msgstr "" -#: neutron/agent/securitygroups_rpc.py:64 -#: neutron/agent/securitygroups_rpc.py:156 +#: neutron/agent/securitygroups_rpc.py:67 +#: neutron/agent/securitygroups_rpc.py:159 msgid "Driver configuration doesn't match with enable_security_group" msgstr "" -#: neutron/agent/securitygroups_rpc.py:77 -msgid "Disabled security-group extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:79 -msgid "Disabled allowed-address-pairs extension." -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:87 +#: neutron/agent/securitygroups_rpc.py:90 #, python-format msgid "Get security group rules for devices via rpc %r" msgstr "" -#: neutron/agent/securitygroups_rpc.py:111 +#: neutron/agent/securitygroups_rpc.py:114 msgid "" "Security group agent binding currently not set. This should be set by the" " end of the init process." msgstr "" -#: neutron/agent/securitygroups_rpc.py:122 +#: neutron/agent/securitygroups_rpc.py:125 #, python-format msgid "Security group rule updated on remote: %s" msgstr "" -#: neutron/agent/securitygroups_rpc.py:134 +#: neutron/agent/securitygroups_rpc.py:137 #, python-format msgid "Security group member updated on remote: %s" msgstr "" -#: neutron/agent/securitygroups_rpc.py:141 -#: neutron/agent/securitygroups_rpc.py:252 +#: neutron/agent/securitygroups_rpc.py:144 msgid "Provider rule updated" msgstr "" -#: neutron/agent/securitygroups_rpc.py:154 +#: neutron/agent/securitygroups_rpc.py:157 #, python-format msgid "Init firewall settings (driver=%s)" msgstr "" -#: neutron/agent/securitygroups_rpc.py:193 -#, python-format -msgid "Preparing filters for devices %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:223 -#, python-format -msgid "Security group rule updated %r" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:230 -#, python-format -msgid "Security group member updated %r" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:244 +#: neutron/agent/securitygroups_rpc.py:260 #, python-format msgid "" "Adding %s devices to the list of devices for which firewall needs to be " "refreshed" msgstr "" -#: neutron/agent/securitygroups_rpc.py:264 -#, python-format -msgid "Remove device filter for %r" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:273 -msgid "Refresh firewall rules" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:277 -msgid "No ports here to refresh firewall" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:291 +#: neutron/agent/securitygroups_rpc.py:308 #, python-format msgid "Update port filter for %s" msgstr "" -#: neutron/agent/securitygroups_rpc.py:314 +#: neutron/agent/securitygroups_rpc.py:331 #, python-format msgid "Preparing device filters for %d new devices" msgstr "" -#: neutron/agent/securitygroups_rpc.py:327 +#: neutron/agent/securitygroups_rpc.py:344 msgid "Refreshing firewall for all filtered devices" msgstr "" -#: neutron/agent/securitygroups_rpc.py:335 +#: neutron/agent/securitygroups_rpc.py:352 #, python-format msgid "Refreshing firewall for %d devices" msgstr "" @@ -942,13 +896,17 @@ msgstr "" msgid "Allow overlapping IP." msgstr "" -#: neutron/agent/common/config.py:102 +#: neutron/agent/common/config.py:51 +msgid "Add comments to iptables rules." +msgstr "" + +#: neutron/agent/common/config.py:111 msgid "" "DEFAULT.root_helper is deprecated! Please move root_helper configuration " "to [AGENT] section." msgstr "" -#: neutron/agent/common/config.py:113 +#: neutron/agent/common/config.py:122 msgid "Top-level directory for maintaining dhcp state" msgstr "" @@ -994,20 +952,20 @@ msgstr "" msgid "An error occurred while communicating with async process [%s]." msgstr "" -#: neutron/agent/linux/daemon.py:37 +#: neutron/agent/linux/daemon.py:35 #, python-format msgid "Error while handling pidfile: %s" msgstr "" -#: neutron/agent/linux/daemon.py:45 +#: neutron/agent/linux/daemon.py:43 msgid "Unable to unlock pid file" msgstr "" -#: neutron/agent/linux/daemon.py:94 +#: neutron/agent/linux/daemon.py:92 msgid "Fork failed" msgstr "" -#: neutron/agent/linux/daemon.py:136 +#: neutron/agent/linux/daemon.py:134 #, python-format msgid "Pidfile %s already exist. Daemon already running?" msgstr "" @@ -1048,17 +1006,17 @@ msgstr "" msgid "No DHCP started for %s" msgstr "" -#: neutron/agent/linux/dhcp.py:256 neutron/agent/linux/utils.py:152 +#: neutron/agent/linux/dhcp.py:256 neutron/agent/linux/utils.py:155 #, python-format msgid "Error while reading %s" msgstr "" -#: neutron/agent/linux/dhcp.py:263 neutron/agent/linux/utils.py:159 +#: neutron/agent/linux/dhcp.py:263 neutron/agent/linux/utils.py:162 #, python-format msgid "Unable to convert value in %s" msgstr "" -#: neutron/agent/linux/dhcp.py:265 neutron/agent/linux/utils.py:161 +#: neutron/agent/linux/dhcp.py:265 neutron/agent/linux/utils.py:164 #, python-format msgid "Unable to access %s" msgstr "" @@ -1107,118 +1065,124 @@ msgstr "" msgid "Done building host file %s" 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/dhcp.py:832 +#: neutron/agent/linux/dhcp.py:833 #, python-format msgid "Setting gateway for dhcp netns on net %(n)s to %(ip)s" msgstr "" -#: neutron/agent/linux/dhcp.py:842 +#: neutron/agent/linux/dhcp.py:843 #, python-format msgid "Removing gateway for dhcp netns on net %s" msgstr "" -#: neutron/agent/linux/dhcp.py:886 +#: neutron/agent/linux/dhcp.py:887 #, python-format msgid "" "DHCP port %(device_id)s on network %(network_id)s does not yet exist. " "Checking for a reserved port." msgstr "" -#: neutron/agent/linux/dhcp.py:900 +#: neutron/agent/linux/dhcp.py:901 #, python-format msgid "DHCP port %(device_id)s on network %(network_id)s does not yet exist." msgstr "" -#: neutron/agent/linux/dhcp.py:935 neutron/debug/debug_agent.py:67 +#: neutron/agent/linux/dhcp.py:936 neutron/debug/debug_agent.py:67 #, python-format msgid "Reusing existing device: %s." msgstr "" -#: neutron/agent/linux/external_process.py:33 +#: neutron/agent/linux/external_process.py:32 msgid "Location to store child pid files" msgstr "" #: neutron/agent/linux/external_process.py:35 -msgid "Periodically check child processes" -msgstr "" - -#: neutron/agent/linux/external_process.py:38 msgid "Action to be executed when a child process dies" msgstr "" -#: neutron/agent/linux/external_process.py:40 -msgid "Interval between checks of child process liveness (seconds)" +#: neutron/agent/linux/external_process.py:37 +msgid "" +"Interval between checks of child process liveness (seconds), use 0 to " +"disable" msgstr "" -#: neutron/agent/linux/interface.py:37 +#: neutron/agent/linux/interface.py:39 msgid "Name of Open vSwitch bridge to use" msgstr "" -#: neutron/agent/linux/interface.py:40 +#: neutron/agent/linux/interface.py:42 msgid "Uses veth for an interface or not" msgstr "" -#: neutron/agent/linux/interface.py:42 +#: neutron/agent/linux/interface.py:44 msgid "MTU setting for device." msgstr "" -#: neutron/agent/linux/interface.py:44 -msgid "Mapping between flavor and LinuxInterfaceDriver" +#: neutron/agent/linux/interface.py:46 +msgid "" +"Mapping between flavor and LinuxInterfaceDriver. It is specific to " +"MetaInterfaceDriver used with admin_user, admin_password, " +"admin_tenant_name, admin_url, auth_strategy, auth_region and " +"endpoint_type." msgstr "" -#: neutron/agent/linux/interface.py:46 +#: neutron/agent/linux/interface.py:52 msgid "Admin username" msgstr "" -#: neutron/agent/linux/interface.py:48 neutron/agent/metadata/agent.py:54 +#: neutron/agent/linux/interface.py:54 neutron/agent/metadata/agent.py:51 #: neutron/plugins/metaplugin/common/config.py:65 msgid "Admin password" msgstr "" -#: neutron/agent/linux/interface.py:51 neutron/agent/metadata/agent.py:57 +#: neutron/agent/linux/interface.py:57 neutron/agent/metadata/agent.py:54 #: neutron/plugins/metaplugin/common/config.py:68 msgid "Admin tenant name" msgstr "" -#: neutron/agent/linux/interface.py:53 neutron/agent/metadata/agent.py:59 +#: neutron/agent/linux/interface.py:59 neutron/agent/metadata/agent.py:56 #: neutron/plugins/metaplugin/common/config.py:70 msgid "Authentication URL" msgstr "" -#: neutron/agent/linux/interface.py:55 neutron/agent/metadata/agent.py:61 +#: neutron/agent/linux/interface.py:61 neutron/agent/metadata/agent.py:58 #: neutron/common/config.py:47 neutron/plugins/metaplugin/common/config.py:72 msgid "The type of authentication to use" msgstr "" -#: neutron/agent/linux/interface.py:57 neutron/agent/metadata/agent.py:63 +#: neutron/agent/linux/interface.py:63 neutron/agent/metadata/agent.py:60 #: neutron/plugins/metaplugin/common/config.py:74 msgid "Authentication region" msgstr "" -#: neutron/agent/linux/interface.py:214 neutron/agent/linux/interface.py:268 -#: neutron/agent/linux/interface.py:330 neutron/agent/linux/interface.py:379 +#: neutron/agent/linux/interface.py:66 neutron/agent/metadata/agent.py:70 +msgid "Network service endpoint type to pull from the keystone catalog" +msgstr "" + +#: neutron/agent/linux/interface.py:265 neutron/agent/linux/interface.py:320 +#: neutron/agent/linux/interface.py:383 neutron/agent/linux/interface.py:430 #, python-format msgid "Device %s already exists" msgstr "" -#: neutron/agent/linux/interface.py:232 neutron/agent/linux/interface.py:279 -#: neutron/agent/linux/interface.py:342 neutron/agent/linux/interface.py:386 +#: neutron/agent/linux/interface.py:283 neutron/agent/linux/interface.py:331 +#: neutron/agent/linux/interface.py:395 neutron/agent/linux/interface.py:437 #, python-format msgid "Unplugged interface '%s'" msgstr "" -#: neutron/agent/linux/interface.py:234 neutron/agent/linux/interface.py:278 -#: neutron/agent/linux/interface.py:344 neutron/agent/linux/interface.py:388 +#: neutron/agent/linux/interface.py:285 neutron/agent/linux/interface.py:330 +#: neutron/agent/linux/interface.py:397 neutron/agent/linux/interface.py:439 #, python-format msgid "Failed unplugging interface '%s'" msgstr "" -#: neutron/agent/linux/interface.py:446 +#: neutron/agent/linux/interface.py:498 #, python-format msgid "Driver location: %s" msgstr "" @@ -1227,61 +1191,61 @@ msgstr "" msgid "Force ip_lib calls to use the root helper" msgstr "" -#: neutron/agent/linux/iptables_firewall.py:85 +#: neutron/agent/linux/iptables_firewall.py:87 #, python-format msgid "Preparing device (%s) filter" msgstr "" -#: neutron/agent/linux/iptables_firewall.py:93 +#: neutron/agent/linux/iptables_firewall.py:95 #, python-format msgid "Updating device (%s) filter" msgstr "" -#: neutron/agent/linux/iptables_firewall.py:95 +#: neutron/agent/linux/iptables_firewall.py:97 #, python-format msgid "Attempted to update port filter which is not filtered %s" msgstr "" -#: neutron/agent/linux/iptables_firewall.py:104 +#: neutron/agent/linux/iptables_firewall.py:106 #, python-format msgid "Removing device (%s) filter" msgstr "" -#: neutron/agent/linux/iptables_firewall.py:106 +#: neutron/agent/linux/iptables_firewall.py:108 #, python-format msgid "Attempted to remove port filter which is not filtered %r" msgstr "" -#: neutron/agent/linux/iptables_manager.py:157 +#: neutron/agent/linux/iptables_manager.py:167 #, python-format msgid "Attempted to remove chain %s which does not exist" msgstr "" -#: neutron/agent/linux/iptables_manager.py:199 +#: neutron/agent/linux/iptables_manager.py:210 #, python-format msgid "Unknown chain: %r" msgstr "" -#: neutron/agent/linux/iptables_manager.py:234 +#: neutron/agent/linux/iptables_manager.py:247 #, 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:389 +#: neutron/agent/linux/iptables_manager.py:404 #, python-format msgid "Got semaphore / lock \"%s\"" msgstr "" -#: neutron/agent/linux/iptables_manager.py:392 +#: neutron/agent/linux/iptables_manager.py:407 #, python-format msgid "Semaphore / lock released \"%s\"" msgstr "" -#: neutron/agent/linux/iptables_manager.py:443 -#: neutron/tests/unit/test_iptables_manager.py:753 -#: neutron/tests/unit/test_iptables_manager.py:787 +#: neutron/agent/linux/iptables_manager.py:458 +#: neutron/tests/unit/test_iptables_manager.py:858 +#: neutron/tests/unit/test_iptables_manager.py:892 #, python-format msgid "" "IPTablesManager.apply failed to apply the following set of iptables " @@ -1289,16 +1253,16 @@ msgid "" "%s" msgstr "" -#: neutron/agent/linux/iptables_manager.py:446 +#: neutron/agent/linux/iptables_manager.py:461 msgid "IPTablesManager.apply completed with success" msgstr "" -#: neutron/agent/linux/iptables_manager.py:456 +#: neutron/agent/linux/iptables_manager.py:471 #, python-format msgid "Unable to find table %s" msgstr "" -#: neutron/agent/linux/iptables_manager.py:660 +#: neutron/agent/linux/iptables_manager.py:675 #, python-format msgid "Attempted to get traffic counters of chain %s which does not exist" msgstr "" @@ -1322,48 +1286,33 @@ msgid "" "%(valid_auth_types)s" msgstr "" -#: neutron/agent/linux/ovs_lib.py:38 +#: neutron/agent/linux/ovs_lib.py:39 msgid "Timeout in seconds for ovs-vsctl commands" msgstr "" -#: neutron/agent/linux/ovs_lib.py:72 neutron/agent/linux/ovs_lib.py:170 -#: neutron/agent/linux/ovs_lib.py:290 -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:55 +#: neutron/agent/linux/ovs_lib.py:73 neutron/agent/linux/ovs_lib.py:171 +#: neutron/agent/linux/ovs_lib.py:291 +#: neutron/plugins/bigswitch/agent/restproxy_agent.py:54 #, python-format msgid "Unable to execute %(cmd)s. Exception: %(exception)s" msgstr "" -#: neutron/agent/linux/ovs_lib.py:241 +#: neutron/agent/linux/ovs_lib.py:242 msgid "" "Unable to create VXLAN tunnel port. Please ensure that an openvswitch " "version that supports VXLAN is installed." msgstr "" -#: neutron/agent/linux/ovs_lib.py:338 +#: neutron/agent/linux/ovs_lib.py:339 #, python-format msgid "Found not yet ready openvswitch port: %s" msgstr "" -#: neutron/agent/linux/ovs_lib.py:353 +#: neutron/agent/linux/ovs_lib.py:354 #, python-format msgid "Found failed openvswitch port: %s" msgstr "" -#: neutron/agent/linux/ovs_lib.py:408 -#, python-format -msgid "Port: %(port_name)s is on %(switch)s, not on %(br_name)s" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:416 -#, python-format -msgid "ofport: %(ofport)s for VIF: %(vif)s is not a positive integer" -msgstr "" - -#: neutron/agent/linux/ovs_lib.py:426 -#, python-format -msgid "Unable to parse interface details. Exception: %s" -msgstr "" - #: neutron/agent/linux/ovs_lib.py:444 #, python-format msgid "Unable to determine mac address for %s" @@ -1411,12 +1360,12 @@ msgstr "" msgid "Location to store IPv6 RA config files" msgstr "" -#: neutron/agent/linux/utils.py:48 +#: neutron/agent/linux/utils.py:46 #, python-format msgid "Running command: %s" msgstr "" -#: neutron/agent/linux/utils.py:71 +#: neutron/agent/linux/utils.py:70 #, python-format msgid "" "\n" @@ -1426,75 +1375,71 @@ msgid "" "Stderr: %(stderr)r" msgstr "" -#: neutron/agent/metadata/agent.py:52 +#: neutron/agent/metadata/agent.py:49 #: neutron/plugins/metaplugin/common/config.py:63 msgid "Admin user" msgstr "" -#: neutron/agent/metadata/agent.py:66 +#: neutron/agent/metadata/agent.py:63 msgid "Turn off verification of the certificate for ssl" msgstr "" -#: neutron/agent/metadata/agent.py:69 +#: neutron/agent/metadata/agent.py:66 msgid "Certificate Authority public key (CA cert) file for ssl" msgstr "" #: neutron/agent/metadata/agent.py:73 -msgid "Network service endpoint type to pull from the keystone catalog" -msgstr "" - -#: neutron/agent/metadata/agent.py:76 msgid "IP address used by Nova metadata server." msgstr "" -#: neutron/agent/metadata/agent.py:79 +#: neutron/agent/metadata/agent.py:76 msgid "TCP Port used by Nova metadata server." msgstr "" -#: neutron/agent/metadata/agent.py:82 +#: neutron/agent/metadata/agent.py:79 #: neutron/plugins/vmware/dhcp_meta/nsx.py:63 msgid "Shared secret to sign instance-id request" msgstr "" -#: neutron/agent/metadata/agent.py:87 +#: neutron/agent/metadata/agent.py:84 msgid "Protocol to access nova metadata, http or https" msgstr "" -#: neutron/agent/metadata/agent.py:89 +#: neutron/agent/metadata/agent.py:86 msgid "Allow to perform insecure SSL (https) requests to nova metadata" msgstr "" -#: neutron/agent/metadata/agent.py:93 +#: neutron/agent/metadata/agent.py:90 msgid "Client certificate for nova metadata api server." msgstr "" -#: neutron/agent/metadata/agent.py:96 +#: neutron/agent/metadata/agent.py:93 msgid "Private key of client certificate." msgstr "" -#: neutron/agent/metadata/agent.py:126 -#: neutron/agent/metadata/namespace_proxy.py:68 +#: neutron/agent/metadata/agent.py:123 +#: neutron/agent/metadata/namespace_proxy.py:66 #, python-format msgid "Request: %s" msgstr "" -#: neutron/agent/metadata/agent.py:135 -#: neutron/agent/metadata/namespace_proxy.py:76 +#: neutron/agent/metadata/agent.py:132 +#: neutron/agent/metadata/namespace_proxy.py:74 msgid "Unexpected error." msgstr "" -#: neutron/agent/metadata/agent.py:136 -#: neutron/agent/metadata/namespace_proxy.py:77 +#: neutron/agent/metadata/agent.py:133 +#: neutron/agent/metadata/namespace_proxy.py:75 msgid "An unknown error has occurred. Please try your request again." msgstr "" -#: neutron/agent/metadata/agent.py:182 +#: neutron/agent/metadata/agent.py:179 msgid "" "Either one of parameter network_id or router_id must be passed to " "_get_ports method." msgstr "" -#: neutron/agent/metadata/agent.py:231 +#: neutron/agent/metadata/agent.py:229 msgid "" "The remote metadata server responded with Forbidden. This response " "usually occurs when shared secrets do not match." @@ -1511,19 +1456,19 @@ msgstr "" msgid "Unexpected response code: %s" msgstr "" -#: neutron/agent/metadata/agent.py:308 +#: neutron/agent/metadata/agent.py:300 msgid "Location for Metadata Proxy UNIX domain socket" msgstr "" -#: neutron/agent/metadata/agent.py:311 +#: neutron/agent/metadata/agent.py:303 msgid "Number of separate worker processes for metadata server" msgstr "" -#: neutron/agent/metadata/agent.py:315 +#: neutron/agent/metadata/agent.py:307 msgid "Number of backlog requests to configure the metadata server socket with" msgstr "" -#: neutron/agent/metadata/namespace_proxy.py:63 +#: neutron/agent/metadata/namespace_proxy.py:61 msgid "network_id and router_id are None. One must be provided." msgstr "" @@ -1576,7 +1521,7 @@ msgid "" " and '%(desc)s'" msgstr "" -#: neutron/api/api_common.py:315 neutron/api/v2/base.py:597 +#: neutron/api/api_common.py:315 neutron/api/v2/base.py:599 #, python-format msgid "Unable to find '%s' in request body" msgstr "" @@ -1724,36 +1669,36 @@ msgid "" "available. Payload: %(payload)s" msgstr "" -#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:38 +#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:40 #, python-format msgid "Nofity agent at %(host)s the message %(method)s" msgstr "" -#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:57 +#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:62 #, python-format msgid "Notify agent at %(topic)s.%(host)s the message %(method)s" msgstr "" -#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:99 +#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:105 #, python-format msgid "" "No plugin for L3 routing registered. Cannot notify agents with the " "message %s" msgstr "" -#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:117 +#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:123 #, python-format msgid "" "Fanout notify agent at %(topic)s the message %(method)s on router " "%(router_id)s" msgstr "" -#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:49 +#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:47 #, python-format msgid "Notify metering agent at %(topic)s.%(host)s the message %(method)s" msgstr "" -#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:64 +#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:62 #, python-format msgid "" "Fanout notify metering agent at %(topic)s the message %(method)s on " @@ -1829,10 +1774,6 @@ msgstr "" msgid "Update dhcp port %(port)s from %(host)s." msgstr "" -#: neutron/api/rpc/handlers/dvr_rpc.py:128 -msgid "DVR agent binding currently not set." -msgstr "" - #: neutron/api/rpc/handlers/l3_rpc.py:70 msgid "" "No plugin for L3 routing registered! Will reply to l3 agent with empty " @@ -2003,7 +1944,7 @@ msgid "'%s' is not a valid input" msgstr "" #: neutron/api/v2/attributes.py:355 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:534 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:529 #, python-format msgid "'%s' is not a valid UUID" msgstr "" @@ -2029,7 +1970,7 @@ msgid "'%s' cannot be converted to boolean" msgstr "" #: neutron/api/v2/attributes.py:491 -#: neutron/plugins/nec/extensions/packetfilter.py:75 +#: neutron/plugins/nec/extensions/packetfilter.py:72 #, python-format msgid "'%s' is not a integer" msgstr "" @@ -2057,60 +1998,60 @@ msgstr "" msgid "Invalid format: %s" msgstr "" -#: neutron/api/v2/base.py:550 +#: neutron/api/v2/base.py:554 msgid "" "Specifying 'tenant_id' other than authenticated tenant in request " "requires admin privileges" msgstr "" -#: neutron/api/v2/base.py:558 +#: neutron/api/v2/base.py:562 msgid "Running without keystone AuthN requires that tenant_id is specified" msgstr "" -#: neutron/api/v2/base.py:576 +#: neutron/api/v2/base.py:580 msgid "Resource body required" msgstr "" -#: neutron/api/v2/base.py:578 +#: neutron/api/v2/base.py:582 #, python-format msgid "Request body: %(body)s" msgstr "" -#: neutron/api/v2/base.py:588 +#: neutron/api/v2/base.py:585 msgid "Bulk operation not supported" msgstr "" -#: neutron/api/v2/base.py:592 +#: neutron/api/v2/base.py:588 msgid "Resources required" msgstr "" -#: neutron/api/v2/base.py:608 +#: neutron/api/v2/base.py:610 #, python-format msgid "Failed to parse request. Required attribute '%s' not specified" msgstr "" -#: neutron/api/v2/base.py:615 +#: neutron/api/v2/base.py:617 #, python-format msgid "Attribute '%s' not allowed in POST" msgstr "" -#: neutron/api/v2/base.py:620 +#: neutron/api/v2/base.py:622 #, python-format msgid "Cannot update read-only attribute %s" msgstr "" -#: neutron/api/v2/base.py:638 +#: neutron/api/v2/base.py:640 #, python-format msgid "Invalid input for %(attr)s. Reason: %(reason)s." msgstr "" -#: neutron/api/v2/base.py:647 neutron/extensions/allowedaddresspairs.py:75 +#: neutron/api/v2/base.py:649 neutron/extensions/allowedaddresspairs.py:75 #: neutron/extensions/multiprovidernet.py:45 #, python-format msgid "Unrecognized attribute(s) '%s'" msgstr "" -#: neutron/api/v2/base.py:666 +#: neutron/api/v2/base.py:668 #, python-format msgid "Tenant %(tenant_id)s not allowed to create %(resource)s on this network" msgstr "" @@ -2127,7 +2068,7 @@ msgid "%s failed" msgstr "" #: neutron/api/v2/resource.py:130 -#: neutron/tests/unit/test_api_v2_resource.py:299 +#: neutron/tests/unit/test_api_v2_resource.py:296 msgid "Request Failed: internal server error while processing your request." msgstr "" @@ -2195,7 +2136,7 @@ msgstr "" msgid "The core plugin Neutron will use" msgstr "" -#: neutron/common/config.py:51 neutron/db/migration/cli.py:35 +#: neutron/common/config.py:51 neutron/db/migration/cli.py:33 msgid "The service plugins Neutron will use" msgstr "" @@ -2288,51 +2229,55 @@ msgstr "" msgid "The uuid of the admin nova tenant" msgstr "" -#: neutron/common/config.py:106 +#: neutron/common/config.py:105 +msgid "The name of the admin nova tenant" +msgstr "" + +#: neutron/common/config.py:108 msgid "Authorization URL for connecting to nova in admin context" msgstr "" -#: neutron/common/config.py:109 +#: neutron/common/config.py:111 msgid "CA file for novaclient to verify server certificates" msgstr "" -#: neutron/common/config.py:111 +#: neutron/common/config.py:113 msgid "If True, ignore any SSL validation issues" msgstr "" -#: neutron/common/config.py:113 +#: neutron/common/config.py:115 msgid "" "Name of nova region to use. Useful if keystone manages more than one " "region." msgstr "" -#: neutron/common/config.py:116 +#: neutron/common/config.py:118 msgid "" "Number of seconds between sending events to nova if there are any events " "to send." msgstr "" -#: neutron/common/config.py:123 +#: neutron/common/config.py:125 msgid "" "Where to store Neutron state files. This directory must be writable by " "the agent." msgstr "" -#: neutron/common/config.py:156 +#: neutron/common/config.py:158 #, python-format msgid "Base MAC: %s" msgstr "" -#: neutron/common/config.py:164 +#: neutron/common/config.py:166 msgid "Logging enabled!" msgstr "" -#: neutron/common/config.py:180 +#: neutron/common/config.py:182 #, python-format msgid "Config paste file: %s" msgstr "" -#: neutron/common/config.py:185 +#: neutron/common/config.py:187 #, python-format msgid "Unable to load %(app_name)s from configuration file %(config_path)s." msgstr "" @@ -2626,30 +2571,40 @@ msgstr "" #: neutron/common/exceptions.py:309 #, python-format +msgid "Invalid network Tunnel range: '%(tunnel_range)s' - %(error)s" +msgstr "" + +#: neutron/common/exceptions.py:320 +#, python-format msgid "Invalid network VXLAN port range: '%(vxlan_range)s'" msgstr "" -#: neutron/common/exceptions.py:313 +#: neutron/common/exceptions.py:324 msgid "VXLAN Network unsupported." msgstr "" -#: neutron/common/exceptions.py:317 +#: neutron/common/exceptions.py:328 #, python-format msgid "Found duplicate extension: %(alias)s" msgstr "" -#: neutron/common/exceptions.py:321 +#: neutron/common/exceptions.py:332 #, python-format msgid "" "The following device_id %(device_id)s is not owned by your tenant or " "matches another tenants router." msgstr "" -#: neutron/common/exceptions.py:326 +#: neutron/common/exceptions.py:337 #, python-format msgid "Invalid CIDR %(input)s given as IP prefix" msgstr "" +#: neutron/common/exceptions.py:341 +#, python-format +msgid "Router '%(router_id)s' is not compatible with this agent" +msgstr "" + #: neutron/common/ipv6_utils.py:35 msgid "Unable to generate IP address by EUI64 for IPv4 prefix" msgstr "" @@ -2680,7 +2635,7 @@ msgid "" "therefore results cannot be cached for %(func_name)s." msgstr "" -#: neutron/common/utils.py:118 neutron/openstack/common/fileutils.py:63 +#: neutron/common/utils.py:118 #, python-format msgid "Reloading cached file %s" msgstr "" @@ -2768,117 +2723,117 @@ msgstr "" msgid "Delete allocated IP %(ip_address)s (%(network_id)s/%(subnet_id)s)" msgstr "" -#: neutron/db/db_base_plugin_v2.py:224 -#, python-format -msgid "All IPs from subnet %(subnet_id)s (%(cidr)s) allocated" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:229 -#, python-format -msgid "Allocated IP - %(ip_address)s from %(first_ip)s to %(last_ip)s" -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:236 -msgid "No more free IP's in slice. Deleting allocation pool." -msgstr "" - -#: neutron/db/db_base_plugin_v2.py:255 +#: neutron/db/db_base_plugin_v2.py:266 #, python-format msgid "Rebuilding availability ranges for subnet %s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:398 +#: neutron/db/db_base_plugin_v2.py:411 msgid "IP allocation requires subnet_id or ip_address" msgstr "" -#: neutron/db/db_base_plugin_v2.py:410 +#: neutron/db/db_base_plugin_v2.py:423 #, python-format msgid "IP address %s is not a valid IP for the defined networks subnets" msgstr "" -#: neutron/db/db_base_plugin_v2.py:416 +#: neutron/db/db_base_plugin_v2.py:429 #, 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 +#: neutron/db/db_base_plugin_v2.py:449 #, python-format msgid "IP address %s is not a valid IP for the defined subnet" msgstr "" -#: neutron/db/db_base_plugin_v2.py:445 neutron/db/db_base_plugin_v2.py:478 +#: neutron/db/db_base_plugin_v2.py:453 +#, python-format +msgid "" +"IPv6 address %(address)s can not be directly assigned to a port on subnet" +" %(id)s with %(mode)s address mode" +msgstr "" + +#: neutron/db/db_base_plugin_v2.py:465 neutron/db/db_base_plugin_v2.py:507 #: neutron/plugins/opencontrail/contrail_plugin.py:388 msgid "Exceeded maximim amount of fixed ips per port" msgstr "" -#: neutron/db/db_base_plugin_v2.py:493 +#: neutron/db/db_base_plugin_v2.py:522 #, python-format msgid "Port update. Hold %s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:500 +#: neutron/db/db_base_plugin_v2.py:529 #, python-format msgid "Port update. Adding %s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:574 +#: neutron/db/db_base_plugin_v2.py:604 msgid "0 is not allowed as CIDR prefix length" msgstr "" -#: neutron/db/db_base_plugin_v2.py:584 +#: neutron/db/db_base_plugin_v2.py:614 #, 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:589 +#: neutron/db/db_base_plugin_v2.py:619 #, 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:609 +#: neutron/db/db_base_plugin_v2.py:639 msgid "Performing IP validity checks on allocation pools" msgstr "" -#: neutron/db/db_base_plugin_v2.py:616 +#: neutron/db/db_base_plugin_v2.py:646 #, python-format msgid "Found invalid IP address in pool: %(start)s - %(end)s:" msgstr "" -#: neutron/db/db_base_plugin_v2.py:623 +#: neutron/db/db_base_plugin_v2.py:653 msgid "Specified IP addresses do not match the subnet IP version" msgstr "" -#: neutron/db/db_base_plugin_v2.py:627 +#: neutron/db/db_base_plugin_v2.py:657 #, python-format msgid "Start IP (%(start)s) is greater than end IP (%(end)s)" msgstr "" -#: neutron/db/db_base_plugin_v2.py:632 +#: neutron/db/db_base_plugin_v2.py:662 #, python-format msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:645 +#: neutron/db/db_base_plugin_v2.py:675 msgid "Checking for overlaps among allocation pools and gateway ip" msgstr "" -#: neutron/db/db_base_plugin_v2.py:656 +#: neutron/db/db_base_plugin_v2.py:686 #, python-format msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:669 neutron/db/db_base_plugin_v2.py:673 +#: neutron/db/db_base_plugin_v2.py:699 neutron/db/db_base_plugin_v2.py:703 #, python-format msgid "Invalid route: %s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:751 +#: neutron/db/db_base_plugin_v2.py:781 +#, 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:789 #, python-format msgid "" "ipv6_ra_mode set to '%(ra_mode)s' with ipv6_address_mode set to " @@ -2886,49 +2841,49 @@ msgid "" "the same value" msgstr "" -#: neutron/db/db_base_plugin_v2.py:759 +#: neutron/db/db_base_plugin_v2.py:797 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:765 +#: neutron/db/db_base_plugin_v2.py:803 msgid "Cannot disable enable_dhcp with ipv6 attributes set" msgstr "" -#: neutron/db/db_base_plugin_v2.py:857 +#: neutron/db/db_base_plugin_v2.py:895 #, python-format msgid "An exception occurred while creating the %(resource)s:%(item)s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:954 +#: neutron/db/db_base_plugin_v2.py:992 #, python-format msgid "%(name)s '%(addr)s' does not match the ip_version '%(ip_version)s'" msgstr "" -#: neutron/db/db_base_plugin_v2.py:978 +#: neutron/db/db_base_plugin_v2.py:1016 msgid "Gateway is not valid on subnet" msgstr "" -#: neutron/db/db_base_plugin_v2.py:998 neutron/db/db_base_plugin_v2.py:1012 +#: neutron/db/db_base_plugin_v2.py:1036 neutron/db/db_base_plugin_v2.py:1050 #: neutron/plugins/opencontrail/contrail_plugin.py:312 msgid "new subnet" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1005 +#: neutron/db/db_base_plugin_v2.py:1043 #, python-format msgid "Error parsing dns address %s" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1021 +#: neutron/db/db_base_plugin_v2.py:1059 msgid "ipv6_ra_mode is not valid when ip_version is 4" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1025 +#: neutron/db/db_base_plugin_v2.py:1063 msgid "ipv6_address_mode is not valid when ip_version is 4" msgstr "" -#: neutron/db/db_base_plugin_v2.py:1395 +#: neutron/db/db_base_plugin_v2.py:1432 #, python-format msgid "" "Ignoring PortNotFound when deleting port '%s'. The port has already been " @@ -2971,119 +2926,119 @@ msgstr "" msgid "Removed routes are %s" msgstr "" -#: neutron/db/l3_agentschedulers_db.py:48 +#: neutron/db/l3_agentschedulers_db.py:49 msgid "Driver to use for scheduling router to a default L3 agent" msgstr "" -#: neutron/db/l3_agentschedulers_db.py:51 +#: neutron/db/l3_agentschedulers_db.py:52 msgid "Allow auto scheduling of routers to L3 agent." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:53 +#: neutron/db/l3_agentschedulers_db.py:54 msgid "" "Automatically reschedule routers from offline L3 agents to online L3 " "agents." msgstr "" -#: neutron/db/l3_db.py:230 +#: neutron/db/l3_db.py:259 #, python-format msgid "No eligible l3 agent associated with external network %s found" msgstr "" -#: neutron/db/l3_db.py:251 +#: neutron/db/l3_db.py:280 #, python-format msgid "No IPs available for external network %s" msgstr "" -#: neutron/db/l3_db.py:265 +#: neutron/db/l3_db.py:300 #, python-format msgid "Network %s is not an external network" msgstr "" -#: neutron/db/l3_db.py:377 +#: neutron/db/l3_db.py:407 #, python-format msgid "Router already has a port on subnet %s" msgstr "" -#: neutron/db/l3_db.py:391 +#: neutron/db/l3_db.py:421 #, 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:407 neutron/db/l3_db.py:534 neutron/db/l3_dvr_db.py:210 +#: neutron/db/l3_db.py:437 neutron/db/l3_db.py:584 neutron/db/l3_dvr_db.py:239 #: neutron/plugins/bigswitch/l3_router_plugin.py:170 #: neutron/plugins/bigswitch/l3_router_plugin.py:179 #: neutron/plugins/opencontrail/contrail_plugin.py:499 msgid "Either subnet_id or port_id must be specified" msgstr "" -#: neutron/db/l3_db.py:410 neutron/plugins/opencontrail/contrail_plugin.py:509 +#: neutron/db/l3_db.py:440 neutron/plugins/opencontrail/contrail_plugin.py:509 msgid "Cannot specify both subnet-id and port-id" msgstr "" -#: neutron/db/l3_db.py:423 +#: neutron/db/l3_db.py:453 msgid "Router port must have exactly one fixed IP" msgstr "" -#: neutron/db/l3_db.py:437 +#: neutron/db/l3_db.py:467 msgid "Subnet for router interface must have a gateway IP" msgstr "" -#: neutron/db/l3_db.py:580 neutron/plugins/nec/nec_router.py:197 +#: neutron/db/l3_db.py:632 neutron/plugins/nec/nec_router.py:195 #, python-format msgid "Cannot add floating IP to port on subnet %s which has no gateway_ip" msgstr "" -#: neutron/db/l3_db.py:616 +#: neutron/db/l3_db.py:668 #, 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:620 +#: neutron/db/l3_db.py:672 #, 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:632 +#: neutron/db/l3_db.py:684 #, python-format msgid "Port %(id)s does not have fixed ip %(address)s" msgstr "" -#: neutron/db/l3_db.py:639 +#: neutron/db/l3_db.py:691 #, python-format msgid "Cannot add floating IP to port %s that hasno fixed IP addresses" msgstr "" -#: neutron/db/l3_db.py:643 +#: neutron/db/l3_db.py:695 #, 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:673 neutron/plugins/vmware/plugins/base.py:1804 +#: neutron/db/l3_db.py:725 neutron/plugins/vmware/plugins/base.py:1813 msgid "fixed_ip_address cannot be specified without a port_id" msgstr "" -#: neutron/db/l3_db.py:713 +#: neutron/db/l3_db.py:765 #, python-format msgid "Network %s is not a valid external network" msgstr "" -#: neutron/db/l3_db.py:846 +#: neutron/db/l3_db.py:898 #, python-format msgid "" "Port %(port_id)s has owner %(port_owner)s, but no IP address, so it can " "be deleted" msgstr "" -#: neutron/db/l3_db.py:960 +#: neutron/db/l3_db.py:1019 #, python-format msgid "Skipping port %s as no IP is configure on it" msgstr "" @@ -3099,25 +3054,25 @@ msgstr "" msgid "Centralizing distributed router %s is not supported" msgstr "" -#: neutron/db/l3_dvr_db.py:404 +#: neutron/db/l3_dvr_db.py:443 #, python-format msgid "Agent Gateway port does not exist, so create one: %s" msgstr "" -#: neutron/db/l3_dvr_db.py:419 +#: neutron/db/l3_dvr_db.py:458 msgid "Unable to create the Agent Gateway Port" msgstr "" -#: neutron/db/l3_dvr_db.py:445 +#: neutron/db/l3_dvr_db.py:491 msgid "Unable to create the SNAT Interface Port" msgstr "" -#: neutron/db/l3_dvr_db.py:469 +#: neutron/db/l3_dvr_db.py:526 #, python-format msgid "SNAT interface port list does not exist, so create one: %s" msgstr "" -#: neutron/db/l3_dvrscheduler_db.py:307 +#: neutron/db/l3_dvrscheduler_db.py:296 msgid "No active L3 agents found for SNAT" msgstr "" @@ -3137,17 +3092,17 @@ msgstr "" msgid "Subnet used for the l3 HA admin network." msgstr "" -#: neutron/db/routedserviceinsertion_db.py:36 +#: neutron/db/routedserviceinsertion_db.py:34 #, python-format msgid "Resource type '%(resource_type)s' is longer than %(maxlen)d characters" msgstr "" -#: neutron/db/securitygroups_rpc_base.py:58 +#: neutron/db/securitygroups_rpc_base.py:57 #, python-format msgid "%s must implement get_port_from_device." msgstr "" -#: neutron/db/securitygroups_rpc_base.py:338 +#: neutron/db/securitygroups_rpc_base.py:349 #, python-format msgid "No valid gateway port on subnet %s is found for IPv6 RA" msgstr "" @@ -3164,97 +3119,90 @@ msgid "" "sort '%(resource)s'" msgstr "" -#: neutron/db/firewall/firewall_db.py:241 -#: neutron/plugins/vmware/plugins/service.py:907 -#: neutron/services/firewall/fwaas_plugin.py:218 +#: neutron/db/firewall/firewall_db.py:267 +#: neutron/services/firewall/fwaas_plugin.py:216 msgid "create_firewall() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:262 -#: neutron/plugins/vmware/plugins/service.py:941 -#: neutron/services/firewall/fwaas_plugin.py:232 +#: neutron/db/firewall/firewall_db.py:288 +#: neutron/services/firewall/fwaas_plugin.py:230 msgid "update_firewall() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:271 -#: neutron/plugins/vmware/plugins/service.py:967 -#: neutron/services/firewall/fwaas_plugin.py:247 +#: neutron/db/firewall/firewall_db.py:297 +#: neutron/services/firewall/fwaas_plugin.py:245 msgid "delete_firewall() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:280 +#: neutron/db/firewall/firewall_db.py:306 msgid "get_firewall() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:285 +#: neutron/db/firewall/firewall_db.py:311 msgid "get_firewalls() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:291 +#: neutron/db/firewall/firewall_db.py:317 msgid "get_firewalls_count() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:296 +#: neutron/db/firewall/firewall_db.py:322 msgid "create_firewall_policy() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:312 -#: neutron/plugins/vmware/plugins/service.py:1029 -#: neutron/services/firewall/fwaas_plugin.py:256 +#: neutron/db/firewall/firewall_db.py:337 +#: neutron/services/firewall/fwaas_plugin.py:254 msgid "update_firewall_policy() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:326 +#: neutron/db/firewall/firewall_db.py:359 msgid "delete_firewall_policy() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:338 +#: neutron/db/firewall/firewall_db.py:371 msgid "get_firewall_policy() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:343 +#: neutron/db/firewall/firewall_db.py:376 msgid "get_firewall_policies() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:349 +#: neutron/db/firewall/firewall_db.py:382 msgid "get_firewall_policies_count() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:354 +#: neutron/db/firewall/firewall_db.py:387 msgid "create_firewall_rule() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:386 -#: neutron/plugins/vmware/plugins/service.py:1003 -#: neutron/services/firewall/fwaas_plugin.py:264 +#: neutron/db/firewall/firewall_db.py:419 +#: neutron/services/firewall/fwaas_plugin.py:262 msgid "update_firewall_rule() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:418 +#: neutron/db/firewall/firewall_db.py:455 msgid "delete_firewall_rule() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:426 +#: neutron/db/firewall/firewall_db.py:463 msgid "get_firewall_rule() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:431 +#: neutron/db/firewall/firewall_db.py:468 msgid "get_firewall_rules() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:437 +#: neutron/db/firewall/firewall_db.py:474 msgid "get_firewall_rules_count() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:446 -#: neutron/plugins/vmware/plugins/service.py:1056 -#: neutron/services/firewall/fwaas_plugin.py:274 +#: neutron/db/firewall/firewall_db.py:483 +#: neutron/services/firewall/fwaas_plugin.py:272 msgid "insert_rule() called" msgstr "" -#: neutron/db/firewall/firewall_db.py:490 -#: neutron/plugins/vmware/plugins/service.py:1085 -#: neutron/services/firewall/fwaas_plugin.py:282 +#: neutron/db/firewall/firewall_db.py:529 +#: neutron/services/firewall/fwaas_plugin.py:280 msgid "remove_rule() called" msgstr "" @@ -3271,99 +3219,99 @@ msgstr "" msgid "'cookie_name' is not allowed for this type of session persistence" msgstr "" -#: neutron/db/metering/metering_rpc.py:46 +#: neutron/db/metering/metering_rpc.py:44 #, python-format msgid "Unable to find agent %s." msgstr "" -#: neutron/db/migration/__init__.py:44 +#: neutron/db/migration/__init__.py:38 #, python-format msgid "%s cannot be called while in offline mode" msgstr "" -#: neutron/db/migration/cli.py:32 +#: neutron/db/migration/cli.py:30 msgid "Neutron plugin provider module" msgstr "" -#: neutron/db/migration/cli.py:41 +#: neutron/db/migration/cli.py:39 msgid "Neutron quota driver class" msgstr "" -#: neutron/db/migration/cli.py:49 +#: neutron/db/migration/cli.py:47 msgid "URL to database" msgstr "" -#: neutron/db/migration/cli.py:52 +#: neutron/db/migration/cli.py:50 msgid "Database engine" msgstr "" -#: neutron/db/migration/cli.py:75 +#: neutron/db/migration/cli.py:73 msgid "You must provide a revision or relative delta" msgstr "" -#: neutron/db/migration/cli.py:105 neutron/db/migration/cli.py:118 +#: neutron/db/migration/cli.py:103 neutron/db/migration/cli.py:116 msgid "Timeline branches unable to generate timeline" msgstr "" -#: neutron/db/migration/cli.py:112 +#: neutron/db/migration/cli.py:110 msgid "HEAD file does not match migration timeline head" msgstr "" -#: neutron/db/migration/cli.py:158 +#: neutron/db/migration/cli.py:156 msgid "Available commands" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:89 +#: neutron/db/migration/migrate_to_ml2.py:90 msgid "Missing version in alembic_versions table" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:91 +#: neutron/db/migration/migrate_to_ml2.py:92 #, python-format msgid "Multiple versions in alembic_versions table: %s" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:95 +#: neutron/db/migration/migrate_to_ml2.py:96 #, python-format msgid "" "Unsupported database schema %(current)s. Please migrate your database to " "one of following versions: %(supported)s" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:415 +#: neutron/db/migration/migrate_to_ml2.py:425 #, python-format msgid "Unknown tunnel type: %s" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:429 +#: neutron/db/migration/migrate_to_ml2.py:453 msgid "The plugin type whose database will be migrated" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:432 +#: neutron/db/migration/migrate_to_ml2.py:456 msgid "The connection url for the target db" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:435 +#: neutron/db/migration/migrate_to_ml2.py:459 #, python-format msgid "The %s tunnel type to migrate from" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:438 -#: neutron/plugins/openvswitch/common/config.py:80 +#: neutron/db/migration/migrate_to_ml2.py:462 +#: neutron/plugins/openvswitch/common/config.py:67 msgid "The UDP port to use for VXLAN tunnels." msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:441 +#: neutron/db/migration/migrate_to_ml2.py:465 msgid "Retain the old plugin's tables" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:447 +#: neutron/db/migration/migrate_to_ml2.py:471 #, python-format msgid "" "Tunnel args (tunnel-type and vxlan-udp-port) are not valid for the %s " "plugin" msgstr "" -#: neutron/db/migration/migrate_to_ml2.py:454 +#: neutron/db/migration/migrate_to_ml2.py:478 #, python-format msgid "" "Support for migrating %(plugin)s for release %(release)s is not yet " @@ -3385,11 +3333,6 @@ msgstr "" msgid "Table %(old_t)r was renamed to %(new_t)r" msgstr "" -#: neutron/db/vpn/vpn_db.py:651 -#, python-format -msgid "vpnservice %s in db is already deleted" -msgstr "" - #: neutron/debug/commands.py:33 msgid "Unimplemented commands" msgstr "" @@ -3526,12 +3469,12 @@ msgstr "" msgid "Adds external network attribute to network resource." msgstr "" -#: neutron/extensions/extra_dhcp_opt.py:25 +#: neutron/extensions/extra_dhcp_opt.py:23 #, python-format msgid "ExtraDhcpOpt %(id)s could not be found" msgstr "" -#: neutron/extensions/extra_dhcp_opt.py:29 +#: neutron/extensions/extra_dhcp_opt.py:27 #, python-format msgid "Invalid data format for extra-dhcp-opt: %(data)s" msgstr "" @@ -3555,51 +3498,67 @@ msgid "" "exceeds the maximum %(quota)s." msgstr "" -#: neutron/extensions/firewall.py:37 +#: neutron/extensions/firewall.py:35 #, python-format msgid "Firewall %(firewall_id)s could not be found." msgstr "" -#: neutron/extensions/firewall.py:41 +#: neutron/extensions/firewall.py:39 #, python-format msgid "Firewall %(firewall_id)s is still active." msgstr "" -#: neutron/extensions/firewall.py:45 +#: neutron/extensions/firewall.py:43 #, python-format msgid "" "Operation cannot be performed since associated Firewall %(firewall_id)s " "is in %(pending_state)s." msgstr "" -#: neutron/extensions/firewall.py:50 +#: neutron/extensions/firewall.py:48 #, python-format msgid "Firewall Policy %(firewall_policy_id)s could not be found." msgstr "" -#: neutron/extensions/firewall.py:54 +#: neutron/extensions/firewall.py:52 #, python-format msgid "Firewall Policy %(firewall_policy_id)s is being used." msgstr "" -#: neutron/extensions/firewall.py:58 +#: neutron/extensions/firewall.py:62 +#, python-format +msgid "" +"Operation cannot be performed since Firewall Policy " +"%(firewall_policy_id)s is shared but Firewall Rule %(firewall_rule_id)s " +"is not shared" +msgstr "" + +#: neutron/extensions/firewall.py:74 +#, python-format +msgid "" +"Operation cannot be performed. Before sharing Firewall Policy " +"%(firewall_policy_id)s, share associated Firewall Rule " +"%(firewall_rule_id)s" +msgstr "" + +#: neutron/extensions/firewall.py:80 #, python-format msgid "Firewall Rule %(firewall_rule_id)s could not be found." msgstr "" -#: neutron/extensions/firewall.py:62 +#: neutron/extensions/firewall.py:84 #, python-format msgid "Firewall Rule %(firewall_rule_id)s is being used." msgstr "" -#: neutron/extensions/firewall.py:66 +#: neutron/extensions/firewall.py:88 #, python-format msgid "" "Firewall Rule %(firewall_rule_id)s is not associated with Firewall " "Policy %(firewall_policy_id)s." msgstr "" -#: neutron/extensions/firewall.py:71 +#: neutron/extensions/firewall.py:93 #, python-format msgid "" "Firewall Rule protocol %(protocol)s is not supported. Only protocol " @@ -3607,62 +3566,69 @@ msgid "" "supported." msgstr "" -#: neutron/extensions/firewall.py:77 +#: neutron/extensions/firewall.py:99 #, python-format msgid "" "Firewall rule action %(action)s is not supported. Only action values " "%(values)s are supported." msgstr "" -#: neutron/extensions/firewall.py:82 +#: neutron/extensions/firewall.py:104 #, python-format msgid "%(param)s are not allowed when protocol is set to ICMP." msgstr "" -#: neutron/extensions/firewall.py:87 +#: neutron/extensions/firewall.py:109 msgid "Source/destination port requires a protocol" msgstr "" -#: neutron/extensions/firewall.py:91 +#: neutron/extensions/firewall.py:113 #, python-format msgid "Invalid value for port %(port)s." msgstr "" -#: neutron/extensions/firewall.py:95 +#: neutron/extensions/firewall.py:117 msgid "Missing rule info argument for insert/remove rule operation." msgstr "" -#: neutron/extensions/firewall.py:105 +#: neutron/extensions/firewall.py:127 #, python-format msgid "%(driver)s: Internal driver error." msgstr "" -#: neutron/extensions/firewall.py:154 +#: neutron/extensions/firewall.py:138 +#, python-format +msgid "" +"Operation cannot be performed since Firewall Rule %(firewall_rule_id)s is" +" not shared and belongs to another tenant %(tenant_id)s" +msgstr "" + +#: neutron/extensions/firewall.py:189 #, python-format msgid "Port '%s' is not a valid number" msgstr "" -#: neutron/extensions/firewall.py:158 +#: neutron/extensions/firewall.py:193 #, python-format msgid "Invalid port '%s'" msgstr "" -#: neutron/extensions/firewall.py:172 +#: neutron/extensions/firewall.py:207 #, python-format msgid "%(msg_ip)s and %(msg_subnet)s" msgstr "" -#: neutron/extensions/firewall.py:293 +#: neutron/extensions/firewall.py:328 msgid "Number of firewalls allowed per tenant. A negative value means unlimited." msgstr "" -#: neutron/extensions/firewall.py:297 +#: neutron/extensions/firewall.py:332 msgid "" "Number of firewall policies allowed per tenant. A negative value means " "unlimited." msgstr "" -#: neutron/extensions/firewall.py:301 +#: neutron/extensions/firewall.py:336 msgid "" "Number of firewall rules allowed per tenant. A negative value means " "unlimited." @@ -3730,11 +3696,11 @@ msgid "" "external network %(net_id)s is required by one or more floating IPs." msgstr "" -#: neutron/extensions/l3.py:138 +#: neutron/extensions/l3.py:151 msgid "Number of routers allowed per tenant. A negative value means unlimited." msgstr "" -#: neutron/extensions/l3.py:142 +#: neutron/extensions/l3.py:155 msgid "" "Number of floating IPs allowed per tenant. A negative value means " "unlimited." @@ -3924,21 +3890,21 @@ msgid "" "unlimited." msgstr "" -#: neutron/extensions/metering.py:33 +#: neutron/extensions/metering.py:31 #, python-format msgid "Metering label %(label_id)s does not exist" msgstr "" -#: neutron/extensions/metering.py:37 +#: neutron/extensions/metering.py:35 msgid "Duplicate Metering Rule in POST." msgstr "" -#: neutron/extensions/metering.py:41 +#: neutron/extensions/metering.py:39 #, python-format msgid "Metering label rule %(rule_id)s does not exist" msgstr "" -#: neutron/extensions/metering.py:45 +#: neutron/extensions/metering.py:43 #, python-format msgid "" "Metering label rule with remote_ip_prefix %(remote_ip_prefix)s overlaps " @@ -3970,19 +3936,19 @@ msgid "Port does not have port security binding." msgstr "" #: neutron/extensions/providernet.py:54 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:272 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:267 msgid "Plugin does not support updating provider attributes" msgstr "" -#: neutron/extensions/quotasv2.py:67 +#: neutron/extensions/quotasv2.py:66 msgid "POST requests are not supported on this resource." msgstr "" -#: neutron/extensions/quotasv2.py:86 +#: neutron/extensions/quotasv2.py:85 msgid "Only admin is authorized to access quotas for another tenant" msgstr "" -#: neutron/extensions/quotasv2.py:91 +#: neutron/extensions/quotasv2.py:90 msgid "Only admin can view or configure quota" msgstr "" @@ -4091,138 +4057,138 @@ msgid "" "unlimited." msgstr "" -#: neutron/extensions/servicetype.py:52 +#: neutron/extensions/servicetype.py:49 msgid "Neutron Service Type Management" msgstr "" -#: neutron/extensions/servicetype.py:60 +#: neutron/extensions/servicetype.py:57 msgid "API for retrieving service providers for Neutron advanced services" msgstr "" -#: neutron/extensions/vpnaas.py:31 +#: neutron/extensions/vpnaas.py:29 #, python-format msgid "VPNService %(vpnservice_id)s could not be found" msgstr "" -#: neutron/extensions/vpnaas.py:35 +#: neutron/extensions/vpnaas.py:33 #, python-format msgid "ipsec_site_connection %(ipsec_site_conn_id)s not found" msgstr "" -#: neutron/extensions/vpnaas.py:39 +#: neutron/extensions/vpnaas.py:37 #, python-format msgid "ipsec_site_connection %(attr)s is equal to or less than dpd_interval" msgstr "" -#: neutron/extensions/vpnaas.py:44 +#: neutron/extensions/vpnaas.py:42 #, python-format msgid "ipsec_site_connection MTU %(mtu)d is too small for ipv%(version)s" msgstr "" -#: neutron/extensions/vpnaas.py:49 +#: neutron/extensions/vpnaas.py:47 #, python-format msgid "IKEPolicy %(ikepolicy_id)s could not be found" msgstr "" -#: neutron/extensions/vpnaas.py:53 +#: neutron/extensions/vpnaas.py:51 #, python-format msgid "IPsecPolicy %(ipsecpolicy_id)s could not be found" msgstr "" -#: neutron/extensions/vpnaas.py:57 +#: neutron/extensions/vpnaas.py:55 #, python-format msgid "" "IKEPolicy %(ikepolicy_id)s is in use by existing IPsecSiteConnection and " "can't be updated or deleted" msgstr "" -#: neutron/extensions/vpnaas.py:62 +#: neutron/extensions/vpnaas.py:60 #, python-format msgid "VPNService %(vpnservice_id)s is still in use" msgstr "" -#: neutron/extensions/vpnaas.py:66 +#: neutron/extensions/vpnaas.py:64 #, python-format msgid "Router %(router_id)s is used by VPNService %(vpnservice_id)s" msgstr "" -#: neutron/extensions/vpnaas.py:70 +#: neutron/extensions/vpnaas.py:68 +#, python-format +msgid "Subnet %(subnet_id)s is used by VPNService %(vpnservice_id)s" +msgstr "" + +#: neutron/extensions/vpnaas.py:72 #, python-format msgid "Invalid state %(state)s of vpnaas resource %(id)s for updating" msgstr "" -#: neutron/extensions/vpnaas.py:75 +#: neutron/extensions/vpnaas.py:77 #, python-format msgid "" "IPsecPolicy %(ipsecpolicy_id)s is in use by existing IPsecSiteConnection " "and can't be updated or deleted" msgstr "" -#: neutron/extensions/vpnaas.py:80 +#: neutron/extensions/vpnaas.py:82 #, python-format msgid "Can not load driver :%(device_driver)s" msgstr "" -#: neutron/extensions/vpnaas.py:84 +#: neutron/extensions/vpnaas.py:86 #, python-format msgid "Subnet %(subnet_id)s is not connected to Router %(router_id)s" msgstr "" -#: neutron/extensions/vpnaas.py:89 +#: neutron/extensions/vpnaas.py:91 #, python-format msgid "Router %(router_id)s has no external network gateway set" msgstr "" -#: neutron/notifiers/nova.py:165 +#: neutron/notifiers/nova.py:169 msgid "device_id is not set on port yet." msgstr "" -#: neutron/notifiers/nova.py:169 +#: neutron/notifiers/nova.py:173 msgid "Port ID not set! Nova will not be notified of port status change." msgstr "" -#: neutron/notifiers/nova.py:194 +#: neutron/notifiers/nova.py:198 #, python-format msgid "" "Ignoring state change previous_port_status: %(pre_status)s " "current_port_status: %(cur_status)s port_id %(id)s" msgstr "" -#: neutron/notifiers/nova.py:220 +#: neutron/notifiers/nova.py:224 #, python-format msgid "Sending events: %s" msgstr "" -#: neutron/notifiers/nova.py:225 +#: neutron/notifiers/nova.py:229 #, python-format msgid "Nova returned NotFound for event: %s" msgstr "" -#: neutron/notifiers/nova.py:228 +#: neutron/notifiers/nova.py:232 #, python-format msgid "Failed to notify nova on events: %s" msgstr "" -#: neutron/notifiers/nova.py:232 neutron/notifiers/nova.py:248 +#: neutron/notifiers/nova.py:236 neutron/notifiers/nova.py:252 #, python-format msgid "Error response returned from nova: %s" msgstr "" -#: neutron/notifiers/nova.py:243 +#: neutron/notifiers/nova.py:247 #, python-format msgid "Nova event: %s returned with failed status" msgstr "" -#: neutron/notifiers/nova.py:246 +#: neutron/notifiers/nova.py:250 #, python-format msgid "Nova event response: %s" msgstr "" -#: neutron/openstack/common/eventlet_backdoor.py:140 -#, python-format -msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" -msgstr "" - #: neutron/openstack/common/gettextutils.py:320 msgid "Message objects do not support addition." msgstr "" @@ -4233,84 +4199,31 @@ msgid "" "characters. Please use unicode() or translate() instead." msgstr "" -#: neutron/openstack/common/lockutils.py:103 +#: neutron/openstack/common/lockutils.py:101 #, python-format -msgid "Could not release the acquired lock `%s`" +msgid "Unable to acquire lock on `%(filename)s` due to %(exception)s" msgstr "" -#: neutron/openstack/common/lockutils.py:168 -#, python-format -msgid "Got semaphore \"%(lock)s\"" -msgstr "" - -#: neutron/openstack/common/lockutils.py:177 -#, python-format -msgid "Attempting to grab file lock \"%(lock)s\"" -msgstr "" - -#: neutron/openstack/common/lockutils.py:187 -#, python-format -msgid "Created lock path: %s" -msgstr "" - -#: neutron/openstack/common/lockutils.py:205 -#, python-format -msgid "Got file lock \"%(lock)s\" at %(path)s" -msgstr "" - -#: neutron/openstack/common/lockutils.py:209 -#, python-format -msgid "Released file lock \"%(lock)s\" at %(path)s" -msgstr "" - -#: neutron/openstack/common/lockutils.py:247 -#, python-format -msgid "Got semaphore / lock \"%(function)s\"" -msgstr "" - -#: neutron/openstack/common/lockutils.py:251 -#, python-format -msgid "Semaphore / lock released \"%(function)s\"" -msgstr "" - -#: neutron/openstack/common/log.py:327 +#: neutron/openstack/common/log.py:287 #, python-format msgid "Deprecated: %s" msgstr "" -#: neutron/openstack/common/log.py:436 +#: neutron/openstack/common/log.py:395 #, python-format msgid "Error loading logging config %(log_config)s: %(err_msg)s" msgstr "" -#: neutron/openstack/common/log.py:486 +#: neutron/openstack/common/log.py:456 #, python-format msgid "syslog facility must be one of: %s" msgstr "" -#: neutron/openstack/common/log.py:729 +#: neutron/openstack/common/log.py:707 #, python-format msgid "Fatal call to deprecated config: %(msg)s" msgstr "" -#: neutron/openstack/common/loopingcall.py:82 -#, python-format -msgid "task run outlasted interval by %s sec" -msgstr "" - -#: neutron/openstack/common/loopingcall.py:89 -msgid "in fixed duration looping call" -msgstr "" - -#: neutron/openstack/common/loopingcall.py:129 -#, python-format -msgid "Dynamic looping call sleeping for %.02f seconds" -msgstr "" - -#: neutron/openstack/common/loopingcall.py:136 -msgid "in dynamic looping call" -msgstr "" - #: neutron/openstack/common/periodic_task.py:40 #, python-format msgid "Unexpected argument for periodic task creation: %(arg)s." @@ -4365,32 +4278,6 @@ msgstr "" msgid "process_input not supported over SSH" msgstr "" -#: neutron/openstack/common/sslutils.py:50 -#, python-format -msgid "Unable to find cert_file : %s" -msgstr "" - -#: neutron/openstack/common/sslutils.py:53 -#, python-format -msgid "Unable to find ca_file : %s" -msgstr "" - -#: neutron/openstack/common/sslutils.py:56 -#, python-format -msgid "Unable to find key_file : %s" -msgstr "" - -#: neutron/openstack/common/sslutils.py:59 -msgid "" -"When running server in SSL mode, you must specify both a cert_file and " -"key_file option value in your configuration file" -msgstr "" - -#: neutron/openstack/common/sslutils.py:98 -#, python-format -msgid "Invalid SSL version : %s" -msgstr "" - #: neutron/openstack/common/strutils.py:92 #, python-format msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s" @@ -4406,20 +4293,6 @@ msgstr "" msgid "Invalid string format: %s" msgstr "" -#: neutron/openstack/common/versionutils.py:69 -#, 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:73 -#, 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/middleware/catch_errors.py:40 #, python-format msgid "An error occurred during processing the request: %s" @@ -4431,7 +4304,7 @@ msgstr "" msgid "Request is too large." msgstr "" -#: neutron/plugins/bigswitch/config.py:32 +#: neutron/plugins/bigswitch/config.py:28 msgid "" "A comma separated list of Big Switch or Floodlight servers and port " "numbers. The plugin proxies the requests to the Big Switch/Floodlight " @@ -4440,76 +4313,76 @@ msgid "" "support failover." msgstr "" -#: neutron/plugins/bigswitch/config.py:39 +#: neutron/plugins/bigswitch/config.py:35 msgid "" "The username and password for authenticating against the Big Switch or " "Floodlight controller." msgstr "" -#: neutron/plugins/bigswitch/config.py:42 +#: neutron/plugins/bigswitch/config.py:38 msgid "" "If True, Use SSL when connecting to the Big Switch or Floodlight " "controller." msgstr "" -#: neutron/plugins/bigswitch/config.py:45 +#: neutron/plugins/bigswitch/config.py:41 msgid "" "Trust and store the first certificate received for each controller " "address and use it to validate future connections to that address." msgstr "" -#: neutron/plugins/bigswitch/config.py:49 +#: neutron/plugins/bigswitch/config.py:45 msgid "Disables SSL certificate validation for controllers" msgstr "" -#: neutron/plugins/bigswitch/config.py:51 +#: neutron/plugins/bigswitch/config.py:47 msgid "Re-use HTTP/HTTPS connections to the controller." msgstr "" -#: neutron/plugins/bigswitch/config.py:54 +#: neutron/plugins/bigswitch/config.py:50 msgid "Directory containing ca_certs and host_certs certificate directories." msgstr "" -#: neutron/plugins/bigswitch/config.py:57 +#: neutron/plugins/bigswitch/config.py:53 msgid "Sync data on connect" msgstr "" -#: neutron/plugins/bigswitch/config.py:59 +#: neutron/plugins/bigswitch/config.py:55 msgid "" "If neutron fails to create a resource because the backend controller " "doesn't know of a dependency, the plugin automatically triggers a full " "data synchronization to the controller." msgstr "" -#: neutron/plugins/bigswitch/config.py:64 +#: neutron/plugins/bigswitch/config.py:60 msgid "" "Time between verifications that the backend controller database is " "consistent with Neutron. (0 to disable)" msgstr "" -#: neutron/plugins/bigswitch/config.py:67 +#: neutron/plugins/bigswitch/config.py:63 msgid "" "Maximum number of seconds to wait for proxy request to connect and " "complete." msgstr "" -#: neutron/plugins/bigswitch/config.py:70 +#: neutron/plugins/bigswitch/config.py:66 msgid "" "Maximum number of threads to spawn to handle large volumes of port " "creations." msgstr "" -#: neutron/plugins/bigswitch/config.py:74 +#: neutron/plugins/bigswitch/config.py:70 msgid "User defined identifier for this Neutron deployment" msgstr "" -#: neutron/plugins/bigswitch/config.py:76 +#: neutron/plugins/bigswitch/config.py:72 msgid "" "Flag to decide if a route to the metadata server should be injected into " "the VM" msgstr "" -#: neutron/plugins/bigswitch/config.py:81 +#: neutron/plugins/bigswitch/config.py:77 msgid "" "The default router rules installed in new tenant routers. Repeat the " "config option for each rule. Format is " @@ -4517,34 +4390,34 @@ msgid "" "all tenants." msgstr "" -#: neutron/plugins/bigswitch/config.py:86 +#: neutron/plugins/bigswitch/config.py:82 msgid "Maximum number of router rules" msgstr "" -#: neutron/plugins/bigswitch/config.py:90 +#: neutron/plugins/bigswitch/config.py:86 msgid "Virtual interface type to configure on Nova compute nodes" msgstr "" -#: neutron/plugins/bigswitch/config.py:97 +#: neutron/plugins/bigswitch/config.py:93 #, python-format msgid "Nova compute nodes to manually set VIF type to %s" msgstr "" -#: neutron/plugins/bigswitch/config.py:104 +#: neutron/plugins/bigswitch/config.py:100 msgid "List of allowed vif_type values." msgstr "" -#: neutron/plugins/bigswitch/config.py:108 +#: neutron/plugins/bigswitch/config.py:104 msgid "" "Name of integration bridge on compute nodes used for security group " "insertion." msgstr "" -#: neutron/plugins/bigswitch/config.py:111 +#: neutron/plugins/bigswitch/config.py:107 msgid "Seconds between agent checks for port changes" msgstr "" -#: neutron/plugins/bigswitch/config.py:113 +#: neutron/plugins/bigswitch/config.py:109 msgid "Virtual switch type." msgstr "" @@ -4561,99 +4434,99 @@ msgstr "" msgid "NeutronRestProxyV2: too many external networks" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:93 +#: neutron/plugins/bigswitch/plugin.py:90 msgid "Syntax error in server config file, aborting plugin" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:127 neutron/plugins/ml2/db.py:212 +#: neutron/plugins/bigswitch/plugin.py:124 neutron/plugins/ml2/db.py:215 #, python-format msgid "get_port_and_sgs() called for port_id %s" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:237 +#: neutron/plugins/bigswitch/plugin.py:234 #, python-format msgid "Unable to update remote topology: %s" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:322 +#: neutron/plugins/bigswitch/plugin.py:319 #, python-format msgid "" "Setting admin_state_up=False is not supported in this plugin version. " "Ignoring setting for resource: %s" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:328 +#: neutron/plugins/bigswitch/plugin.py:325 #, python-format msgid "" "Operational status is internally set by the plugin. Ignoring setting " "status=%s." msgstr "" -#: neutron/plugins/bigswitch/plugin.py:353 +#: neutron/plugins/bigswitch/plugin.py:350 #, python-format msgid "Unrecognized vif_type in configuration [%s]. Defaulting to ovs." msgstr "" -#: neutron/plugins/bigswitch/plugin.py:399 -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:106 +#: neutron/plugins/bigswitch/plugin.py:398 +#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:109 msgid "Iconsistency with backend controller triggering full synchronization." msgstr "" -#: neutron/plugins/bigswitch/plugin.py:416 +#: neutron/plugins/bigswitch/plugin.py:415 #, python-format msgid "NeutronRestProxyV2: Unable to create port: %s" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:475 +#: neutron/plugins/bigswitch/plugin.py:476 #, python-format msgid "NeutronRestProxy: Starting plugin. Version=%s" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:502 +#: neutron/plugins/bigswitch/plugin.py:503 msgid "NeutronRestProxyV2: initialization done" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:546 +#: neutron/plugins/bigswitch/plugin.py:547 msgid "NeutronRestProxyV2: create_network() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:589 +#: neutron/plugins/bigswitch/plugin.py:590 msgid "NeutronRestProxyV2.update_network() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:617 +#: neutron/plugins/bigswitch/plugin.py:618 msgid "NeutronRestProxyV2: delete_network() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:655 +#: neutron/plugins/bigswitch/plugin.py:656 msgid "NeutronRestProxyV2: create_port() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:747 +#: neutron/plugins/bigswitch/plugin.py:748 msgid "NeutronRestProxyV2: update_port() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:807 +#: neutron/plugins/bigswitch/plugin.py:808 msgid "NeutronRestProxyV2: delete_port() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:830 +#: neutron/plugins/bigswitch/plugin.py:831 msgid "NeutronRestProxyV2: create_subnet() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:847 +#: neutron/plugins/bigswitch/plugin.py:848 msgid "NeutronRestProxyV2: update_subnet() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:866 +#: neutron/plugins/bigswitch/plugin.py:867 msgid "NeutronRestProxyV2: delete_subnet() called" msgstr "" -#: neutron/plugins/bigswitch/plugin.py:890 +#: neutron/plugins/bigswitch/plugin.py:891 msgid "Adding host route: " msgstr "" -#: neutron/plugins/bigswitch/plugin.py:891 +#: neutron/plugins/bigswitch/plugin.py:892 #, python-format msgid "Destination:%(dst)s nexthop:%(next)s" msgstr "" @@ -4667,237 +4540,237 @@ msgstr "" msgid "Updating router rules to %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:82 +#: neutron/plugins/bigswitch/servermanager.py:79 #, python-format msgid "Error in REST call to remote network controller: %(reason)s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:121 +#: neutron/plugins/bigswitch/servermanager.py:118 msgid "Couldn't retrieve capabilities. Newer API calls won't be supported." msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:123 +#: neutron/plugins/bigswitch/servermanager.py:120 #, python-format msgid "The following capabilities were received for %(server)s: %(cap)s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:152 +#: neutron/plugins/bigswitch/servermanager.py:148 #, python-format msgid "ServerProxy: server=%(server)s, port=%(port)d, ssl=%(ssl)r" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:155 +#: neutron/plugins/bigswitch/servermanager.py:151 #, python-format msgid "" "ServerProxy: resource=%(resource)s, data=%(data)r, headers=%(headers)r, " "action=%(action)s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:176 +#: neutron/plugins/bigswitch/servermanager.py:172 msgid "ServerProxy: Could not establish HTTPS connection" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:184 +#: neutron/plugins/bigswitch/servermanager.py:180 msgid "ServerProxy: Could not establish HTTP connection" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:220 +#: neutron/plugins/bigswitch/servermanager.py:216 #, python-format msgid "ServerProxy: %(action)s failure, %(e)r" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:223 +#: neutron/plugins/bigswitch/servermanager.py:219 #, python-format msgid "" "ServerProxy: status=%(status)d, reason=%(reason)r, ret=%(ret)s, " "data=%(data)r" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:244 +#: neutron/plugins/bigswitch/servermanager.py:240 msgid "ServerPool: initializing" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:267 +#: neutron/plugins/bigswitch/servermanager.py:263 msgid "Servers not defined. Aborting server manager." msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:274 +#: neutron/plugins/bigswitch/servermanager.py:270 #, python-format msgid "Servers must be defined as :. Configuration was %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:283 +#: neutron/plugins/bigswitch/servermanager.py:279 msgid "ServerPool: initialization done" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:333 +#: neutron/plugins/bigswitch/servermanager.py:329 #, python-format msgid "ssl_cert_directory [%s] does not exist. Create it or disable ssl." msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:350 +#: neutron/plugins/bigswitch/servermanager.py:346 #, python-format msgid "No certificates were found to verify controller %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:392 +#: neutron/plugins/bigswitch/servermanager.py:388 #, python-format msgid "" "Could not retrieve initial certificate from controller %(server)s. Error " "details: %(error)s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:397 +#: neutron/plugins/bigswitch/servermanager.py:393 #, python-format msgid "Storing to certificate for host %(server)s at %(path)s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:444 +#: neutron/plugins/bigswitch/servermanager.py:448 msgid "Server requires synchronization, but no topology function was defined." msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:461 +#: neutron/plugins/bigswitch/servermanager.py:463 #, python-format msgid "" "ServerProxy: %(action)s failure for servers: %(server)r Response: " "%(response)s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:467 +#: neutron/plugins/bigswitch/servermanager.py:469 #, python-format msgid "" "ServerProxy: Error details: status=%(status)d, reason=%(reason)r, " "ret=%(ret)s, data=%(data)r" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:474 +#: neutron/plugins/bigswitch/servermanager.py:476 #, python-format msgid "ServerProxy: %(action)s failure for all servers: %(server)r" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:497 +#: neutron/plugins/bigswitch/servermanager.py:501 #, python-format msgid "" "NeutronRestProxyV2: Received and ignored error code %(code)s on " "%(action)s action to resource %(resource)s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:507 +#: neutron/plugins/bigswitch/servermanager.py:511 #, python-format msgid "Unable to create remote router: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:513 +#: neutron/plugins/bigswitch/servermanager.py:517 #, python-format msgid "Unable to update remote router: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:518 +#: neutron/plugins/bigswitch/servermanager.py:522 #, python-format msgid "Unable to delete remote router: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:524 +#: neutron/plugins/bigswitch/servermanager.py:528 #, python-format msgid "Unable to add router interface: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:529 +#: neutron/plugins/bigswitch/servermanager.py:533 #, python-format msgid "Unable to delete remote intf: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:535 +#: neutron/plugins/bigswitch/servermanager.py:539 #, python-format msgid "Unable to create remote network: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:541 -#: neutron/plugins/bigswitch/servermanager.py:546 +#: neutron/plugins/bigswitch/servermanager.py:545 +#: neutron/plugins/bigswitch/servermanager.py:550 #, python-format msgid "Unable to update remote network: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:555 +#: neutron/plugins/bigswitch/servermanager.py:559 #, python-format msgid "No device MAC attached to port %s. Skipping notification to controller." msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:560 +#: neutron/plugins/bigswitch/servermanager.py:564 #, python-format msgid "Unable to create remote port: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:565 +#: neutron/plugins/bigswitch/servermanager.py:569 #, python-format msgid "Unable to delete remote port: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:575 +#: neutron/plugins/bigswitch/servermanager.py:579 #, python-format msgid "Unable to create floating IP: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:580 +#: neutron/plugins/bigswitch/servermanager.py:584 #, python-format msgid "Unable to update floating IP: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:585 +#: neutron/plugins/bigswitch/servermanager.py:589 #, python-format msgid "Unable to delete floating IP: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:590 +#: neutron/plugins/bigswitch/servermanager.py:594 #, python-format msgid "Unable to retrieve switch: %s" msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:595 +#: neutron/plugins/bigswitch/servermanager.py:599 msgid "Backend server(s) do not support automated consitency checks." msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:599 +#: neutron/plugins/bigswitch/servermanager.py:603 #, python-format msgid "Consistency watchdog disabled by polling interval setting of %s." msgstr "" -#: neutron/plugins/bigswitch/servermanager.py:611 +#: neutron/plugins/bigswitch/servermanager.py:615 msgid "Encountered an error checking controller health." msgstr "" -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:116 -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:234 +#: neutron/plugins/bigswitch/agent/restproxy_agent.py:115 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:233 msgid "Port update received" msgstr "" -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:120 +#: neutron/plugins/bigswitch/agent/restproxy_agent.py:119 #, python-format msgid "Port %s is not present on this host." msgstr "" -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:123 +#: neutron/plugins/bigswitch/agent/restproxy_agent.py:122 #, python-format msgid "Port %s found. Refreshing firewall." msgstr "" -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:151 -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:267 +#: neutron/plugins/bigswitch/agent/restproxy_agent.py:150 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:266 msgid "Agent loop has new device" msgstr "" -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:155 -#: neutron/plugins/nec/agent/nec_neutron_agent.py:225 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:159 -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:271 +#: neutron/plugins/bigswitch/agent/restproxy_agent.py:154 +#: neutron/plugins/nec/agent/nec_neutron_agent.py:223 +#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:157 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:270 msgid "Error in agent event loop" msgstr "" -#: neutron/plugins/bigswitch/agent/restproxy_agent.py:161 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:225 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1458 -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:277 +#: neutron/plugins/bigswitch/agent/restproxy_agent.py:160 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:223 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1010 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1461 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:276 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:285 #, python-format msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!" @@ -4927,675 +4800,667 @@ msgstr "" msgid "Logging port %(port)s on host_id %(host)s" msgstr "" -#: neutron/plugins/bigswitch/extensions/routerrule.py:28 +#: neutron/plugins/bigswitch/extensions/routerrule.py:26 #, python-format msgid "Invalid format for router rules: %(rule)s, %(reason)s" msgstr "" -#: neutron/plugins/bigswitch/extensions/routerrule.py:32 +#: neutron/plugins/bigswitch/extensions/routerrule.py:30 #, python-format msgid "" "Unable to complete rules update for %(router_id)s. The number of rules " "exceeds the maximum %(quota)s." msgstr "" -#: neutron/plugins/bigswitch/extensions/routerrule.py:49 +#: neutron/plugins/bigswitch/extensions/routerrule.py:47 #, python-format msgid "Invalid data format for router rule: '%s'" msgstr "" -#: neutron/plugins/bigswitch/extensions/routerrule.py:81 +#: neutron/plugins/bigswitch/extensions/routerrule.py:79 #, python-format msgid "Duplicate nexthop in rule '%s'" msgstr "" -#: neutron/plugins/bigswitch/extensions/routerrule.py:89 +#: neutron/plugins/bigswitch/extensions/routerrule.py:87 #, python-format msgid "Action must be either permit or deny. '%s' was provided" msgstr "" -#: neutron/plugins/bigswitch/extensions/routerrule.py:101 +#: neutron/plugins/bigswitch/extensions/routerrule.py:99 #, python-format msgid "Duplicate router rules (src,dst) found '%s'" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:64 -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:34 +#: neutron/plugins/brocade/NeutronPlugin.py:59 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:31 #: neutron/services/l3_router/brocade/l3_router_plugin.py:36 msgid "The address of the host to SSH to" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:66 -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:36 +#: neutron/plugins/brocade/NeutronPlugin.py:61 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:33 #: neutron/services/l3_router/brocade/l3_router_plugin.py:38 msgid "The SSH username to use" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:68 -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:38 +#: neutron/plugins/brocade/NeutronPlugin.py:63 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:35 #: neutron/services/l3_router/brocade/l3_router_plugin.py:40 msgid "The SSH password to use" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:70 +#: neutron/plugins/brocade/NeutronPlugin.py:65 msgid "Currently unused" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:74 +#: neutron/plugins/brocade/NeutronPlugin.py:69 msgid "The network interface to use when creatinga port" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:96 -#: neutron/plugins/hyperv/rpc_callbacks.py:42 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:71 +#: neutron/plugins/brocade/NeutronPlugin.py:91 +#: neutron/plugins/hyperv/rpc_callbacks.py:41 #: neutron/plugins/mlnx/rpc_callbacks.py:37 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:80 #, python-format msgid "Device %(device)s details requested from %(agent_id)s" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:110 -#: neutron/plugins/brocade/NeutronPlugin.py:137 -#: neutron/plugins/hyperv/rpc_callbacks.py:58 -#: neutron/plugins/hyperv/rpc_callbacks.py:87 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:95 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:132 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:155 +#: neutron/plugins/brocade/NeutronPlugin.py:106 +#: neutron/plugins/brocade/NeutronPlugin.py:133 +#: neutron/plugins/hyperv/rpc_callbacks.py:57 +#: neutron/plugins/hyperv/rpc_callbacks.py:86 #: neutron/plugins/mlnx/rpc_callbacks.py:60 #: neutron/plugins/mlnx/rpc_callbacks.py:90 #: neutron/plugins/mlnx/rpc_callbacks.py:106 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:98 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:135 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:158 #, python-format msgid "%s can not be found in database" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:303 -#: neutron/plugins/brocade/NeutronPlugin.py:347 -#: neutron/plugins/brocade/NeutronPlugin.py:400 -#: neutron/plugins/brocade/NeutronPlugin.py:430 +#: neutron/plugins/brocade/NeutronPlugin.py:299 +#: neutron/plugins/brocade/NeutronPlugin.py:343 +#: neutron/plugins/brocade/NeutronPlugin.py:396 +#: neutron/plugins/brocade/NeutronPlugin.py:426 msgid "Brocade NOS driver error" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:304 +#: neutron/plugins/brocade/NeutronPlugin.py:300 #, python-format msgid "Returning the allocated vlan (%d) to the pool" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:307 -#: neutron/plugins/brocade/NeutronPlugin.py:348 -#: neutron/plugins/brocade/NeutronPlugin.py:401 -#: neutron/plugins/brocade/NeutronPlugin.py:432 +#: neutron/plugins/brocade/NeutronPlugin.py:303 +#: neutron/plugins/brocade/NeutronPlugin.py:344 +#: neutron/plugins/brocade/NeutronPlugin.py:397 +#: neutron/plugins/brocade/NeutronPlugin.py:428 msgid "Brocade plugin raised exception, check logs" msgstr "" -#: neutron/plugins/brocade/NeutronPlugin.py:313 +#: neutron/plugins/brocade/NeutronPlugin.py:309 #, python-format msgid "Allocated vlan (%d) from the pool" msgstr "" -#: neutron/plugins/brocade/nos/nosdriver.py:69 +#: neutron/plugins/brocade/nos/nosdriver.py:65 #, python-format msgid "Connect failed to switch: %s" msgstr "" -#: neutron/plugins/brocade/nos/nosdriver.py:71 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:90 +#: neutron/plugins/brocade/nos/nosdriver.py:67 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:86 #, python-format msgid "Connect success to host %(host)s:%(ssh_port)d" msgstr "" -#: neutron/plugins/brocade/nos/nosdriver.py:96 -#: neutron/plugins/brocade/nos/nosdriver.py:110 -#: neutron/plugins/brocade/nos/nosdriver.py:123 -#: neutron/plugins/brocade/nos/nosdriver.py:136 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:331 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:342 +#: neutron/plugins/brocade/nos/nosdriver.py:92 +#: neutron/plugins/brocade/nos/nosdriver.py:106 +#: neutron/plugins/brocade/nos/nosdriver.py:119 +#: neutron/plugins/brocade/nos/nosdriver.py:132 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:327 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:338 #, python-format msgid "NETCONF error: %s" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:89 +#: neutron/plugins/cisco/network_plugin.py:87 msgid "Plugin initialization complete" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:117 +#: neutron/plugins/cisco/network_plugin.py:115 #, python-format msgid "'%(model)s' object has no attribute '%(name)s'" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:134 -#: neutron/plugins/cisco/db/network_db_v2.py:32 +#: neutron/plugins/cisco/network_plugin.py:132 +#: neutron/plugins/cisco/db/network_db_v2.py:30 msgid "get_all_qoss() called" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:140 +#: neutron/plugins/cisco/network_plugin.py:138 msgid "get_qos_details() called" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:145 +#: neutron/plugins/cisco/network_plugin.py:143 msgid "create_qos() called" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:151 +#: neutron/plugins/cisco/network_plugin.py:149 msgid "delete_qos() called" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:156 +#: neutron/plugins/cisco/network_plugin.py:154 msgid "rename_qos() called" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:161 +#: neutron/plugins/cisco/network_plugin.py:159 msgid "get_all_credentials() called" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:167 +#: neutron/plugins/cisco/network_plugin.py:165 msgid "get_credential_details() called" msgstr "" -#: neutron/plugins/cisco/network_plugin.py:172 +#: neutron/plugins/cisco/network_plugin.py:170 msgid "rename_credential() called" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:108 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:106 msgid "" "Interval when the process_services() loop executes in seconds. This is " "when the config agent lets each service helper to process its neutron " "resources." msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:115 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:113 msgid "Path of the routing service helper class." msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:137 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:135 #, python-format msgid "" "Error in loading routing service helper. Class specified is %(class)s. " "Reason:%(reason)s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:148 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:146 msgid "Cisco cfg agent started" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:208 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:206 msgid "No routing service helper loaded" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:237 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:235 #, python-format msgid "" "Invalid payload format for received RPC message " "`hosting_devices_removed`. Error is %{error}s. Payload is %(payload)s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:281 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:279 msgid "[Agent registration] Agent successfully registered" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:285 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:283 #, python-format msgid "" "[Agent registration] Neutron server said that device manager was not " "ready. Retrying in %0.2f seconds " msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:290 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:288 msgid "" "[Agent registration] Neutron server said that no device manager was " "found. Cannot continue. Exiting!" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:294 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:292 #, python-format msgid "[Agent registration] %d unsuccessful registration attempts. Exiting!" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:333 +#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:331 msgid "Failed sending agent report!" msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:28 +#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:26 msgid "" "Critical device parameter missing. Failed initializing CSR1kv routing " "driver." msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:34 +#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:32 #, python-format msgid "" "Failed connecting to CSR1kv. Reason: %(reason)s. Connection params are " "User:%(user)s, Host:%(host)s, Port:%(port)s, Device timeout:%(timeout)s." msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:41 +#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:39 #, python-format msgid "Error executing snippet:%(snippet)s. ErrorType:%(type)s ErrorTag:%(tag)s." msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:47 +#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:45 #, python-format msgid "" "Data in attribute: %(attribute)s does not correspond to expected value. " "Value received is %(value)s. " msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:52 +#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:50 #, python-format msgid "Driver %(driver)s does not exist." msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:56 +#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:54 #, python-format msgid "Driver not found for resource id:%(id)s." msgstr "" -#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:60 +#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:58 #, python-format msgid "Driver cannot be set for missing parameter:%(p)s." msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_status.py:30 +#: neutron/plugins/cisco/cfg_agent/device_status.py:28 msgid "Time in seconds for connecting to a hosting device" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_status.py:32 +#: neutron/plugins/cisco/cfg_agent/device_status.py:30 msgid "" "The time in seconds until a backlogged hosting device is presumed dead. " "This value should be set up high enough to recover from a period of " "connectivity loss or high load when the device may not be responding." msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_status.py:59 +#: neutron/plugins/cisco/cfg_agent/device_status.py:57 #, python-format msgid "Cannot ping ip address: %s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_status.py:143 +#: neutron/plugins/cisco/cfg_agent/device_status.py:141 #, python-format msgid "" "Hosting device: %(hd_id)s @ %(ip)s hasn't passed minimum boot time. " "Skipping it. " msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_status.py:147 +#: neutron/plugins/cisco/cfg_agent/device_status.py:145 #, python-format msgid "Checking hosting device: %(hd_id)s @ %(ip)s for reachability." msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_status.py:154 +#: neutron/plugins/cisco/cfg_agent/device_status.py:152 #, python-format msgid "Hosting device: %(hd_id)s @ %(ip)s is now reachable. Adding it to response" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_status.py:158 +#: neutron/plugins/cisco/cfg_agent/device_status.py:156 #, python-format msgid "Hosting device: %(hd_id)s @ %(ip)s still not reachable " msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/driver_mgr.py:80 +#: neutron/plugins/cisco/cfg_agent/device_drivers/driver_mgr.py:79 #, python-format msgid "" "Error loading cfg agent driver %(driver)s for hosting device template " "%(t_name)s(%(t_id)s)" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:64 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:62 #, python-format msgid "Missing device parameter:%s. Aborting CSR1kvRoutingDriver initialization" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:230 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:228 #, python-format msgid "Unknown route command %s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:322 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:320 #, python-format msgid "Interfaces:%s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:337 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:335 #, python-format msgid "IP Address:%s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:339 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:337 #, python-format msgid "Cannot find interface: %s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:374 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:372 #, python-format msgid "Enabled interface %s " msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:393 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:391 #, python-format msgid "VRFs:%s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:438 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:436 #, python-format msgid "Mismatch in ACL configuration for %s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:467 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:465 #, python-format msgid "VRF %s successfully created" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:469 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:467 #, python-format msgid "Failed creating VRF %s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:477 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:475 #, python-format msgid "VRF %s removed" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:479 -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:483 -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:496 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:477 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:481 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:494 #, python-format msgid "VRF %s not present" msgstr "" -#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:681 +#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:679 #, python-format msgid "%s successfully executed" msgstr "" -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:229 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:227 msgid "Failed processing routers" msgstr "" -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:290 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:288 msgid "RPC Error in fetching routers from plugin" msgstr "" -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:377 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:375 #, python-format msgid "Router: %(id)s is on an unreachable hosting device. " msgstr "" -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:386 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:384 #, python-format msgid "Key Error, missing key: %s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:390 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:388 #, python-format msgid "Driver Exception on router:%(id)s. Error is %(e)s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:401 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:399 #, python-format msgid "Exception in processing routers on device:%s" msgstr "" -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:544 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:542 #, python-format msgid "Info for router %s was not found. Skipping router removal" msgstr "" -#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:559 +#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:557 #, python-format msgid "" "Router remove for router_id: %s was incomplete. Adding the router to " "removed_routers list" msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:25 +#: neutron/plugins/cisco/common/cisco_exceptions.py:22 #, python-format msgid "Segmentation ID for network %(net_id)s is not found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:30 +#: neutron/plugins/cisco/common/cisco_exceptions.py:27 msgid "" "Unable to complete operation. No more dynamic NICs are available in the " "system." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:36 +#: neutron/plugins/cisco/common/cisco_exceptions.py:33 #, python-format msgid "" "NetworkVlanBinding for %(vlan_id)s and network %(network_id)s already " "exists." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:42 +#: neutron/plugins/cisco/common/cisco_exceptions.py:39 #, python-format msgid "Vlan ID %(vlan_id)s not found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:47 +#: neutron/plugins/cisco/common/cisco_exceptions.py:44 msgid "" "Unable to complete operation. VLAN ID exists outside of the configured " "network segment range." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:53 +#: neutron/plugins/cisco/common/cisco_exceptions.py:50 msgid "No Vlan ID available." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:58 +#: neutron/plugins/cisco/common/cisco_exceptions.py:55 #, python-format msgid "QoS level %(qos_id)s could not be found for tenant %(tenant_id)s." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:64 +#: neutron/plugins/cisco/common/cisco_exceptions.py:61 #, python-format msgid "QoS level with name %(qos_name)s already exists for tenant %(tenant_id)s." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:70 +#: neutron/plugins/cisco/common/cisco_exceptions.py:67 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:23 #, python-format msgid "Credential %(credential_id)s could not be found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:75 +#: neutron/plugins/cisco/common/cisco_exceptions.py:72 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:28 #, python-format msgid "Credential %(credential_name)s could not be found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:80 +#: neutron/plugins/cisco/common/cisco_exceptions.py:77 #, python-format msgid "Credential %(credential_name)s already exists." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:85 +#: neutron/plugins/cisco/common/cisco_exceptions.py:82 #, python-format msgid "Provider network %s already exists" msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:90 +#: neutron/plugins/cisco/common/cisco_exceptions.py:87 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:39 #, python-format msgid "Connection to %(host)s is not configured." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:95 +#: neutron/plugins/cisco/common/cisco_exceptions.py:92 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:44 #, python-format msgid "Unable to connect to Nexus %(nexus_host)s. Reason: %(exc)s." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:100 +#: neutron/plugins/cisco/common/cisco_exceptions.py:97 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:49 #, python-format msgid "Failed to configure Nexus: %(config)s. Reason: %(exc)s." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:105 +#: neutron/plugins/cisco/common/cisco_exceptions.py:102 #, python-format msgid "Nexus Port Binding (%(filters)s) is not present." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:114 +#: neutron/plugins/cisco/common/cisco_exceptions.py:111 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:69 msgid "No usable Nexus switch found to create SVI interface." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:119 +#: neutron/plugins/cisco/common/cisco_exceptions.py:116 #, python-format msgid "PortVnic Binding %(port_id)s already exists." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:124 +#: neutron/plugins/cisco/common/cisco_exceptions.py:121 #, python-format msgid "PortVnic Binding %(port_id)s is not present." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:129 +#: neutron/plugins/cisco/common/cisco_exceptions.py:126 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:74 msgid "No subnet_id specified for router gateway." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:134 +#: neutron/plugins/cisco/common/cisco_exceptions.py:131 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:79 #, python-format msgid "Subnet %(subnet_id)s has an interface on %(router_id)s." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:139 +#: neutron/plugins/cisco/common/cisco_exceptions.py:136 #: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:84 msgid "Nexus hardware router gateway only uses Subnet Ids." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:143 +#: neutron/plugins/cisco/common/cisco_exceptions.py:140 #, python-format msgid "" "Unable to unplug the attachment %(att_id)s from port %(port_id)s for " "network %(net_id)s. The attachment %(att_id)s does not exist." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:150 +#: neutron/plugins/cisco/common/cisco_exceptions.py:147 #, python-format msgid "Policy Profile %(profile_id)s already exists." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:156 +#: neutron/plugins/cisco/common/cisco_exceptions.py:153 #, python-format msgid "Policy Profile %(profile_id)s could not be found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:161 +#: neutron/plugins/cisco/common/cisco_exceptions.py:158 #, python-format msgid "Network Profile %(profile_id)s already exists." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:167 +#: neutron/plugins/cisco/common/cisco_exceptions.py:164 #, python-format msgid "Network Profile %(profile)s could not be found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:172 +#: neutron/plugins/cisco/common/cisco_exceptions.py:169 #, python-format msgid "" "One or more network segments belonging to network profile %(profile)s is " "in use." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:178 +#: neutron/plugins/cisco/common/cisco_exceptions.py:175 #, python-format msgid "" "No more segments available in network segment pool " "%(network_profile_name)s." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:184 +#: neutron/plugins/cisco/common/cisco_exceptions.py:181 #, python-format msgid "VM Network %(name)s could not be found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:189 +#: neutron/plugins/cisco/common/cisco_exceptions.py:186 #, python-format msgid "Unable to create the network. The VXLAN ID %(vxlan_id)s is in use." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:195 +#: neutron/plugins/cisco/common/cisco_exceptions.py:192 #, python-format msgid "Vxlan ID %(vxlan_id)s not found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:200 +#: neutron/plugins/cisco/common/cisco_exceptions.py:197 msgid "" "Unable to complete operation. VXLAN ID exists outside of the configured " "network segment range." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:206 +#: neutron/plugins/cisco/common/cisco_exceptions.py:203 #, python-format msgid "Connection to VSM failed: %(reason)s." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:211 +#: neutron/plugins/cisco/common/cisco_exceptions.py:208 #, python-format msgid "Internal VSM Error: %(reason)s." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:216 +#: neutron/plugins/cisco/common/cisco_exceptions.py:213 #, python-format msgid "Network Binding for network %(network_id)s could not be found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:222 +#: neutron/plugins/cisco/common/cisco_exceptions.py:219 #, python-format msgid "Port Binding for port %(port_id)s could not be found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:228 +#: neutron/plugins/cisco/common/cisco_exceptions.py:225 #, python-format msgid "Profile-Tenant binding for profile %(profile_id)s could not be found." msgstr "" -#: neutron/plugins/cisco/common/cisco_exceptions.py:234 +#: neutron/plugins/cisco/common/cisco_exceptions.py:231 msgid "No service cluster found to perform multi-segment bridging." msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:72 +#: neutron/plugins/cisco/common/cisco_faults.py:70 msgid "Port not Found" msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:73 +#: neutron/plugins/cisco/common/cisco_faults.py:71 msgid "Unable to find a port with the specified identifier." msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:87 +#: neutron/plugins/cisco/common/cisco_faults.py:85 msgid "Credential Not Found" msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:88 +#: neutron/plugins/cisco/common/cisco_faults.py:86 msgid "Unable to find a Credential with the specified identifier." msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:103 +#: neutron/plugins/cisco/common/cisco_faults.py:101 msgid "QoS Not Found" msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:104 +#: neutron/plugins/cisco/common/cisco_faults.py:102 msgid "Unable to find a QoS with the specified identifier." msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:119 +#: neutron/plugins/cisco/common/cisco_faults.py:117 msgid "Nova tenant Not Found" msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:120 +#: neutron/plugins/cisco/common/cisco_faults.py:118 msgid "Unable to find a Novatenant with the specified identifier." msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:135 +#: neutron/plugins/cisco/common/cisco_faults.py:133 msgid "Requested State Invalid" msgstr "" -#: neutron/plugins/cisco/common/cisco_faults.py:136 +#: neutron/plugins/cisco/common/cisco_faults.py:134 msgid "Unable to update port state with specified value." msgstr "" @@ -5696,1173 +5561,1154 @@ msgstr "" msgid "Some config files were not parsed properly" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:330 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:325 #, python-format msgid "seg_min %(seg_min)s, seg_max %(seg_max)s" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:561 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:556 #, python-format msgid "Reserving specific vlan %(vlan)s on physical network %(network)s from pool" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:586 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:581 #, python-format msgid "vlan_id %(vlan)s on physical network %(network)s not found" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:600 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:595 #, python-format msgid "Unreasonable vxlan ID range %(vxlan_min)s - %(vxlan_max)s" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:642 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:637 #, python-format msgid "Reserving specific vxlan %s from pool" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:663 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:658 #, python-format msgid "vxlan_id %s not found" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:772 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:767 msgid "create_network_profile()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:794 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:789 msgid "delete_network_profile()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:808 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:803 msgid "update_network_profile()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:817 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:812 msgid "get_network_profile()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:842 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:837 msgid "create_policy_profile()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:853 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:848 msgid "delete_policy_profile()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:862 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:857 msgid "update_policy_profile()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:871 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:866 msgid "get_policy_profile()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:890 -#: neutron/plugins/cisco/db/n1kv_db_v2.py:944 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:885 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:939 msgid "Invalid profile type" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:908 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:903 msgid "_profile_binding_exists()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:917 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:912 msgid "get_profile_binding()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:927 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:922 msgid "delete_profile_binding()" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:934 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:929 #, python-format msgid "" "Profile-Tenant binding missing for profile ID %(profile_id)s and tenant " "ID %(tenant_id)s" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:965 -msgid "_get_profile_bindings()" -msgstr "" - -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1121 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1126 msgid "segment_range not required for TRUNK" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1127 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1132 msgid "multicast_ip_range not required" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1254 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1259 msgid "Invalid segment range. example range: 500-550" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1267 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1272 msgid "Invalid multicast ip address range. example range: 224.1.1.1-224.1.1.10" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1274 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1279 #, python-format msgid "%s is not a valid multicast ip address" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1278 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1283 #, python-format msgid "%s is reserved multicast ip address" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1282 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1287 #, python-format msgid "%s is not a valid ip address" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1286 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1291 #, python-format msgid "" "Invalid multicast IP range '%(min_ip)s-%(max_ip)s': Range should be from " "low address to high address" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1299 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1304 msgid "Arguments segment_type missing for network profile" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1308 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1313 msgid "segment_type should either be vlan, overlay, multi-segment or trunk" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1314 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1319 msgid "Argument physical_network missing for network profile" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1320 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1325 msgid "segment_range not required for trunk" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1326 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1331 msgid "Argument sub_type missing for network profile" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1333 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1338 msgid "Argument segment_range missing for network profile" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1344 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1349 msgid "Argument multicast_ip_range missing for VXLAN multicast network profile" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1372 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1377 #, python-format msgid "Segment range is invalid, select from %(min)s-%(nmin)s, %(nmax)s-%(max)s" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1390 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1395 #, python-format msgid "segment range is invalid. Valid range is : %(min)s-%(max)s" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1404 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1409 #, python-format msgid "NetworkProfile name %s already exists" msgstr "" -#: neutron/plugins/cisco/db/n1kv_db_v2.py:1421 +#: neutron/plugins/cisco/db/n1kv_db_v2.py:1426 msgid "Segment range overlaps with another profile" msgstr "" -#: neutron/plugins/cisco/db/network_db_v2.py:40 +#: neutron/plugins/cisco/db/network_db_v2.py:38 msgid "get_qos() called" msgstr "" -#: neutron/plugins/cisco/db/network_db_v2.py:53 +#: neutron/plugins/cisco/db/network_db_v2.py:51 msgid "add_qos() called" msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:44 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:42 msgid "Name of the L3 admin tenant." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:46 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:44 msgid "" "Name of management network for device configuration. Default value is " "osn_mgmt_nw" msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:49 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:47 msgid "" "Default security group applied on management port. Default value is " "mgmt_sec_grp." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:52 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:50 msgid "Seconds of no status update until a cfg agent is considered down." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:55 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:53 msgid "Ensure that Nova is running before attempting to create any VM." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:61 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:59 msgid "Name of Glance image for CSR1kv." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:63 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:61 msgid "UUID of Nova flavor for CSR1kv." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:67 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:65 msgid "Plugging driver for CSR1kv." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:71 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:69 msgid "Hosting device driver for CSR1kv." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:75 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:73 msgid "Config agent driver for CSR1kv." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:77 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:75 msgid "Booting time in seconds before a CSR1kv becomes operational." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:80 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:78 msgid "Username to use for CSR1kv configurations." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:82 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:80 msgid "Password to use for CSR1kv configurations." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:124 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:122 #, python-format msgid "No tenant with a name or ID of %s exists." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:127 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:125 #, python-format msgid "Multiple tenants matches found for %s" msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:146 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:144 msgid "The virtual management network has no subnet. Please assign one." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:150 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:148 #, python-format msgid "The virtual management network has %d subnets. The first one will be used." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:156 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:154 msgid "" "The virtual management network does not have unique name. Please ensure " "that it is." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:160 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:158 msgid "There is no virtual management network. Please create one." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:182 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:180 msgid "" "The security group for the virtual management network does not have " "unique name. Please ensure that it is." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:187 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:185 msgid "" "There is no security group for the virtual management network. Please " "create one." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:201 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:199 msgid "Error loading hosting device driver" msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:214 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:212 msgid "Error loading plugging driver" msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:330 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:328 #, python-format msgid "Cisco cfg agent %s is not alive" msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:367 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:365 msgid "" "Not all Nova services are up and running. Skipping this CSR1kv vm create " "request." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:404 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:402 msgid "Created a CSR1kv hosting device VM" msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:422 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:420 #, python-format msgid "Failed to delete hosting device %s service VM. Will un-register it anyway." msgstr "" -#: neutron/plugins/cisco/db/l3/device_handling_db.py:463 +#: neutron/plugins/cisco/db/l3/device_handling_db.py:461 msgid "There are no active Cisco cfg agents" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:45 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:43 msgid "" "Time in seconds between renewed scheduling attempts of non-scheduled " "routers." msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:53 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:51 msgid "Router could not be created due to internal error." msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:57 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:55 msgid "Internal error during router processing." msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:61 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:59 #, python-format msgid "Could not get binding information for router %(router_id)s." msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:316 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:314 #, python-format msgid "Attempting to schedule router %s." msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:328 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:326 #, python-format msgid "Successfully scheduled router %(r_id)s to hosting device %(d_id)s" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:335 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:333 #, python-format msgid "Un-schedule router %s." msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:348 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:346 #, python-format msgid "Backlogging router %s for renewed scheduling attempt later" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:355 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:353 #, python-format msgid "Router %s removed from backlog" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:365 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:363 msgid "Processing router (scheduling) backlog" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:385 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:383 msgid "Synchronizing router (scheduling) backlog" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:408 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:406 #, python-format msgid "DB inconsistency: No type and hosting info associated with router %s" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:413 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:411 #, python-format msgid "DB inconsistency: Multiple type and hosting info associated with router %s" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:436 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:434 #, python-format msgid "DB inconsistency: No hosting info associated with router %s" msgstr "" -#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:513 +#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:511 #, python-format msgid "Failed to allocate hosting port for port %s" msgstr "" -#: neutron/plugins/cisco/l3/service_vm_lib.py:34 +#: neutron/plugins/cisco/l3/service_vm_lib.py:30 msgid "Path to templates for hosting devices." msgstr "" -#: neutron/plugins/cisco/l3/service_vm_lib.py:37 +#: neutron/plugins/cisco/l3/service_vm_lib.py:33 msgid "Path to config drive files for service VM instances." msgstr "" -#: neutron/plugins/cisco/l3/service_vm_lib.py:71 +#: neutron/plugins/cisco/l3/service_vm_lib.py:67 #, python-format msgid "Failure determining running Nova services: %s" msgstr "" -#: neutron/plugins/cisco/l3/service_vm_lib.py:88 +#: neutron/plugins/cisco/l3/service_vm_lib.py:84 #, python-format msgid "Failed to get status of service VM instance %(id)s, due to %(err)s" msgstr "" -#: neutron/plugins/cisco/l3/service_vm_lib.py:104 +#: neutron/plugins/cisco/l3/service_vm_lib.py:100 #, python-format msgid "Failure finding needed Nova resource: %s" msgstr "" -#: neutron/plugins/cisco/l3/service_vm_lib.py:126 +#: neutron/plugins/cisco/l3/service_vm_lib.py:122 #, python-format msgid "Failed to create service VM instance: %s" msgstr "" -#: neutron/plugins/cisco/l3/service_vm_lib.py:142 +#: neutron/plugins/cisco/l3/service_vm_lib.py:138 #, python-format msgid "Failed to delete service VM instance %(id)s, due to %(err)s" msgstr "" -#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:34 +#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:32 msgid "CSR1kv configdrive template file." msgstr "" -#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:68 +#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:66 #, python-format msgid "Failed to create config file: %s. Trying toclean up." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:42 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:40 msgid "Name of N1kv port profile for management ports." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:44 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:42 msgid "" "Name of N1kv port profile for T1 ports (i.e., ports carrying traffic from" " VXLAN segmented networks)." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:47 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:45 msgid "" "Name of N1kv port profile for T2 ports (i.e., ports carrying traffic from" " VLAN segmented networks)." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:50 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:48 msgid "" "Name of N1kv network profile for T1 networks (i.e., trunk networks for " "VXLAN segmented traffic)." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:53 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:51 msgid "" "Name of N1kv network profile for T2 networks (i.e., trunk networks for " "VLAN segmented traffic)." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:109 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:107 #, python-format msgid "" "The %(resource)s %(name)s does not have unique name. Please refer to " "admin guide and create one." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:114 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:112 #, python-format msgid "" "There is no %(resource)s %(name)s. Please refer to admin guide and create" " one." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:214 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:212 #, python-format msgid "Error %s when creating service VM resources. Cleaning up." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:285 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:283 #, python-format msgid "Aborting resource deletion after %d unsuccessful attempts" msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:291 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:289 #, python-format msgid "Resource deletion attempt %d starting" msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:310 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:308 msgid "Resource deletion succeeded" msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:321 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:319 #, python-format -msgid "Failed to delete %(resource_name) %(net_id)s for service vm due to %(err)s" +msgid "" +"Failed to delete %(resource_name)s %(net_id)s for service vm due to " +"%(err)s" msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:413 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:411 #, python-format msgid "Updating trunk: %(action)s VLAN %(tag)d for network_id %(id)s" msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:453 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:451 #, python-format msgid "Hosting port DB inconsistency for hosting device %s" msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:460 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:458 #, python-format msgid "" "Attempt %(attempt)d to find trunk ports for hosting device %(hd_id)s " "failed. Trying again in %(time)d seconds." msgstr "" -#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:506 +#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:504 #, python-format msgid "Port trunk pair DB inconsistency for port %s" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:79 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:75 #, python-format msgid "%(module)s.%(name)s init done" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:120 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:116 #, python-format msgid "No %s Plugin loaded" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:121 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117 #, python-format msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:145 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:141 msgid "create_network() called" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:158 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:154 #, python-format msgid "Provider network added to DB: %(network_id)s, %(vlan_id)s" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:169 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:165 msgid "update_network() called" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:193 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:189 #, python-format msgid "Provider network removed from DB: %s" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:235 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:231 msgid "create_port() called" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:261 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:257 msgid "update_port() called" msgstr "" -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:273 +#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:269 msgid "delete_port() called" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_client.py:226 +#: neutron/plugins/cisco/n1kv/n1kv_client.py:223 msgid "Logical network" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_client.py:251 +#: neutron/plugins/cisco/n1kv/n1kv_client.py:248 msgid "network_segment_pool" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_client.py:298 +#: neutron/plugins/cisco/n1kv/n1kv_client.py:295 msgid "Invalid input for CIDR" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_client.py:440 +#: neutron/plugins/cisco/n1kv/n1kv_client.py:437 #, python-format msgid "req: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_client.py:450 +#: neutron/plugins/cisco/n1kv/n1kv_client.py:447 #, python-format msgid "status_code %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_client.py:458 +#: neutron/plugins/cisco/n1kv/n1kv_client.py:455 #, python-format msgid "VSM: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:129 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:124 msgid "_setup_vsm" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:148 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:143 msgid "_populate_policy_profiles" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:175 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:170 msgid "No policy profile populated from VSM" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:212 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:342 -#: neutron/plugins/mlnx/mlnx_plugin.py:226 neutron/plugins/nuage/plugin.py:413 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:414 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:207 +#: neutron/plugins/mlnx/mlnx_plugin.py:223 neutron/plugins/nuage/plugin.py:419 msgid "provider:network_type required" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:216 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:230 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:352 -#: neutron/plugins/mlnx/mlnx_plugin.py:256 neutron/plugins/nuage/plugin.py:423 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:424 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:443 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:211 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:225 +#: neutron/plugins/mlnx/mlnx_plugin.py:253 neutron/plugins/nuage/plugin.py:429 msgid "provider:segmentation_id required" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:219 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:214 msgid "provider:segmentation_id out of range (1 through 4094)" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:224 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:219 msgid "provider:physical_network specified for Overlay network" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:233 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:228 msgid "provider:segmentation_id out of range (5000+)" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:237 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:374 -#: neutron/plugins/mlnx/mlnx_plugin.py:242 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:459 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:232 +#: neutron/plugins/mlnx/mlnx_plugin.py:239 #, python-format msgid "provider:network_type %s not supported" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:248 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:380 -#: neutron/plugins/mlnx/mlnx_plugin.py:282 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:465 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:243 +#: neutron/plugins/mlnx/mlnx_plugin.py:279 #, python-format msgid "Unknown provider:physical_network %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:252 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:386 -#: neutron/plugins/mlnx/mlnx_plugin.py:288 neutron/plugins/nuage/plugin.py:420 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:471 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:247 +#: neutron/plugins/mlnx/mlnx_plugin.py:285 neutron/plugins/nuage/plugin.py:426 msgid "provider:physical_network required" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:430 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:425 #, python-format msgid "_populate_member_segments %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:469 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:464 msgid "Invalid pairing supplied" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:474 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:469 #, python-format msgid "Invalid UUID supplied in %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:475 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:470 msgid "Invalid UUID supplied" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:504 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:499 #, python-format msgid "Cannot add a trunk segment '%s' as a member of another trunk segment" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:509 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:504 #, python-format msgid "Cannot add vlan segment '%s' as a member of a vxlan trunk segment" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:515 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:510 #, python-format msgid "Network UUID '%s' belongs to a different physical network" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:520 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:515 #, python-format msgid "Cannot add vxlan segment '%s' as a member of a vlan trunk segment" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:525 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:520 #, python-format msgid "Vlan tag '%s' is out of range" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:528 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:523 #, python-format msgid "Vlan tag '%s' is not an integer value" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:533 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:528 #, python-format msgid "%s is not a valid uuid" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:580 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:583 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:575 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:578 msgid "n1kv:profile_id does not exist" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:595 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:590 msgid "_send_create_logical_network" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:618 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:613 #, python-format msgid "_send_create_network_profile_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:628 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:623 #, python-format msgid "_send_update_network_profile_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:638 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:633 #, python-format msgid "_send_delete_network_profile_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:653 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:648 #, python-format msgid "_send_create_network_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:685 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:680 #, python-format msgid "_send_update_network_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:707 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:702 #, python-format msgid "add_segments=%s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:708 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:703 #, python-format msgid "del_segments=%s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:732 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:727 #, python-format msgid "_send_delete_network_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:772 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:767 #, python-format msgid "_send_create_subnet_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:782 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:777 #, python-format msgid "_send_update_subnet_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:793 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:788 #, python-format msgid "_send_delete_subnet_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:819 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:814 #, python-format msgid "_send_create_port_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:836 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:831 #, python-format msgid "_send_update_port_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:852 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:846 #, python-format msgid "_send_delete_port_request: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:883 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:875 #, python-format msgid "Create network: profile_id=%s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:891 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:883 #, python-format msgid "" "Physical_network %(phy_net)s, seg_type %(net_type)s, seg_id %(seg_id)s, " "multicast_ip %(multicast_ip)s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:903 -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:913 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:895 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:905 #, python-format msgid "Seg list %s " msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:954 -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:255 -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:198 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:946 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:254 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:196 #: neutron/plugins/metaplugin/meta_neutron_plugin.py:226 -#: neutron/plugins/mlnx/mlnx_plugin.py:369 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:519 +#: neutron/plugins/mlnx/mlnx_plugin.py:366 #, python-format msgid "Created network: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1012 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1004 #, python-format msgid "Updated network: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1026 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1018 #, python-format msgid "Cannot delete network '%s', delete the associated subnet first" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1030 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1022 #, python-format msgid "Cannot delete network '%s' that is member of a trunk segment" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1034 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1026 #, python-format msgid "Cannot delete network '%s' that is a member of a multi-segment network" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1062 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1054 #, python-format msgid "Get network: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1084 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1076 msgid "Get networks" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1135 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1127 #, python-format msgid "Create port: profile_id=%s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1182 -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:305 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1174 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:303 #, python-format msgid "Created port: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1193 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1185 #, python-format msgid "Update port: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1256 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1248 #, python-format msgid "Get port: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1276 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1268 msgid "Get ports" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1292 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1284 msgid "Create subnet" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1302 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1294 #, python-format msgid "Created subnet: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1317 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1309 msgid "Update subnet" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1332 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1324 #, python-format msgid "Delete subnet: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1347 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1339 #, python-format msgid "Get subnet: %s" msgstr "" -#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1367 +#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1359 msgid "Get subnets" msgstr "" -#: neutron/plugins/common/utils.py:30 +#: neutron/plugins/common/utils.py:33 +#, python-format +msgid "%(id)s is not a valid %(type)s identifier" +msgstr "" + +#: neutron/plugins/common/utils.py:38 +msgid "End of tunnel range is less than start of tunnel range" +msgstr "" + +#: neutron/plugins/common/utils.py:48 #, python-format msgid "%s is not a valid VLAN tag" msgstr "" -#: neutron/plugins/common/utils.py:34 +#: neutron/plugins/common/utils.py:52 msgid "End of VLAN range is less than start of VLAN range" msgstr "" -#: neutron/plugins/embrane/base_plugin.py:107 -#: neutron/plugins/embrane/agent/dispatcher.py:132 -#: neutron/services/loadbalancer/drivers/embrane/poller.py:56 -#: neutron/services/loadbalancer/drivers/embrane/agent/dispatcher.py:108 +#: neutron/plugins/embrane/base_plugin.py:105 +#: neutron/plugins/embrane/agent/dispatcher.py:130 +#: neutron/services/loadbalancer/drivers/embrane/poller.py:54 +#: neutron/services/loadbalancer/drivers/embrane/agent/dispatcher.py:106 msgid "Unhandled exception occurred" msgstr "" -#: neutron/plugins/embrane/base_plugin.py:172 -#: neutron/plugins/embrane/base_plugin.py:191 +#: neutron/plugins/embrane/base_plugin.py:170 +#: neutron/plugins/embrane/base_plugin.py:189 #, python-format msgid "The following routers have not physical match: %s" msgstr "" -#: neutron/plugins/embrane/base_plugin.py:177 +#: neutron/plugins/embrane/base_plugin.py:175 #, python-format msgid "Requested router: %s" msgstr "" -#: neutron/plugins/embrane/base_plugin.py:229 +#: neutron/plugins/embrane/base_plugin.py:227 #, python-format msgid "Deleting router=%s" msgstr "" -#: neutron/plugins/embrane/agent/operations/router_operations.py:97 +#: neutron/plugins/embrane/agent/operations/router_operations.py:95 #, python-format msgid "The router %s had no physical representation,likely already deleted" msgstr "" -#: neutron/plugins/embrane/agent/operations/router_operations.py:126 +#: neutron/plugins/embrane/agent/operations/router_operations.py:124 #, python-format msgid "Interface %s not found in the heleos back-end,likely already deleted" msgstr "" -#: neutron/plugins/embrane/common/config.py:23 -#: neutron/services/loadbalancer/drivers/embrane/config.py:25 +#: neutron/plugins/embrane/common/config.py:21 +#: neutron/services/loadbalancer/drivers/embrane/config.py:23 msgid "ESM management root address" msgstr "" -#: neutron/plugins/embrane/common/config.py:25 -#: neutron/services/loadbalancer/drivers/embrane/config.py:27 +#: neutron/plugins/embrane/common/config.py:23 +#: neutron/services/loadbalancer/drivers/embrane/config.py:25 msgid "ESM admin username." msgstr "" -#: neutron/plugins/embrane/common/config.py:28 -#: neutron/services/loadbalancer/drivers/embrane/config.py:30 +#: neutron/plugins/embrane/common/config.py:26 +#: neutron/services/loadbalancer/drivers/embrane/config.py:28 msgid "ESM admin password." msgstr "" -#: neutron/plugins/embrane/common/config.py:30 +#: neutron/plugins/embrane/common/config.py:28 msgid "Router image id (Embrane FW/VPN)" msgstr "" -#: neutron/plugins/embrane/common/config.py:32 +#: neutron/plugins/embrane/common/config.py:30 msgid "In band Security Zone id" msgstr "" -#: neutron/plugins/embrane/common/config.py:34 +#: neutron/plugins/embrane/common/config.py:32 msgid "Out of band Security Zone id" msgstr "" -#: neutron/plugins/embrane/common/config.py:36 +#: neutron/plugins/embrane/common/config.py:34 msgid "Management Security Zone id" msgstr "" -#: neutron/plugins/embrane/common/config.py:38 +#: neutron/plugins/embrane/common/config.py:36 msgid "Dummy user traffic Security Zone id" msgstr "" -#: neutron/plugins/embrane/common/config.py:40 -#: neutron/services/loadbalancer/drivers/embrane/config.py:42 +#: neutron/plugins/embrane/common/config.py:38 +#: neutron/services/loadbalancer/drivers/embrane/config.py:40 msgid "Shared resource pool id" msgstr "" -#: neutron/plugins/embrane/common/config.py:42 -#: neutron/services/loadbalancer/drivers/embrane/config.py:49 +#: neutron/plugins/embrane/common/config.py:40 +#: neutron/services/loadbalancer/drivers/embrane/config.py:47 msgid "Define if the requests have run asynchronously or not" msgstr "" -#: neutron/plugins/embrane/common/constants.py:49 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:50 +#: neutron/plugins/embrane/common/constants.py:47 +#: neutron/services/loadbalancer/drivers/embrane/constants.py:48 #, python-format msgid "Dva is pending for the following reason: %s" msgstr "" -#: neutron/plugins/embrane/common/constants.py:50 +#: neutron/plugins/embrane/common/constants.py:48 msgid "" "Dva can't be found to execute the operation, probably was cancelled " "through the heleos UI" msgstr "" -#: neutron/plugins/embrane/common/constants.py:52 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:53 +#: neutron/plugins/embrane/common/constants.py:50 +#: neutron/services/loadbalancer/drivers/embrane/constants.py:51 #, python-format msgid "Dva seems to be broken for reason %s" msgstr "" -#: neutron/plugins/embrane/common/constants.py:53 +#: neutron/plugins/embrane/common/constants.py:51 #, python-format msgid "Dva interface seems to be broken for reason %s" msgstr "" -#: neutron/plugins/embrane/common/constants.py:55 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:54 +#: neutron/plugins/embrane/common/constants.py:53 +#: neutron/services/loadbalancer/drivers/embrane/constants.py:52 #, python-format msgid "Dva creation failed reason %s" msgstr "" +#: neutron/plugins/embrane/common/constants.py:54 +#: neutron/services/loadbalancer/drivers/embrane/constants.py:53 +#, python-format +msgid "Dva creation is in pending state for reason %s" +msgstr "" + #: neutron/plugins/embrane/common/constants.py:56 #: neutron/services/loadbalancer/drivers/embrane/constants.py:55 #, python-format -msgid "Dva creation is in pending state for reason %s" -msgstr "" - -#: neutron/plugins/embrane/common/constants.py:58 -#: neutron/services/loadbalancer/drivers/embrane/constants.py:57 -#, python-format msgid "Dva configuration failed for reason %s" msgstr "" -#: neutron/plugins/embrane/common/constants.py:59 +#: neutron/plugins/embrane/common/constants.py:57 #, python-format msgid "" "Failed to delete the backend router for reason %s. Please remove it " "manually through the heleos UI" msgstr "" -#: neutron/plugins/embrane/common/exceptions.py:22 +#: neutron/plugins/embrane/common/exceptions.py:20 #, python-format msgid "An unexpected error occurred:%(err_msg)s" msgstr "" -#: neutron/plugins/embrane/common/exceptions.py:26 +#: neutron/plugins/embrane/common/exceptions.py:24 #, python-format msgid "%(err_msg)s" msgstr "" -#: neutron/plugins/embrane/common/utils.py:45 +#: neutron/plugins/embrane/common/utils.py:43 msgid "No ip allocation set" msgstr "" -#: neutron/plugins/embrane/l2base/support_exceptions.py:22 +#: neutron/plugins/embrane/l2base/support_exceptions.py:20 #, python-format msgid "Cannot retrieve utif info for the following reason: %(err_msg)s" msgstr "" -#: neutron/plugins/embrane/l2base/ml2/ml2_support.py:46 +#: neutron/plugins/embrane/l2base/ml2/ml2_support.py:43 #, python-format msgid "" "Network type %s not supported. Please be sure that tenant_network_type is" " vlan" msgstr "" -#: neutron/plugins/hyperv/db.py:38 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:113 -#: neutron/plugins/openvswitch/ovs_db_v2.py:131 +#: neutron/plugins/hyperv/db.py:37 #, python-format msgid "" "Reserving vlan %(vlan_id)s on physical network %(physical_network)s from " "pool" msgstr "" -#: neutron/plugins/hyperv/db.py:53 +#: neutron/plugins/hyperv/db.py:52 #, python-format msgid "Reserving flat physical network %(physical_network)s from pool" msgstr "" -#: neutron/plugins/hyperv/db.py:76 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:136 -#: neutron/plugins/openvswitch/ovs_db_v2.py:155 +#: neutron/plugins/hyperv/db.py:75 #, python-format msgid "" "Reserving specific vlan %(vlan_id)s on physical network " "%(physical_network)s from pool" msgstr "" -#: neutron/plugins/hyperv/db.py:133 +#: neutron/plugins/hyperv/db.py:132 #, python-format msgid "Releasing vlan %(vlan_id)s on physical network %(physical_network)s" msgstr "" -#: neutron/plugins/hyperv/db.py:138 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:177 -#: neutron/plugins/openvswitch/ovs_db_v2.py:196 +#: neutron/plugins/hyperv/db.py:137 #, python-format msgid "vlan_id %(vlan_id)s on physical network %(physical_network)s not found" msgstr "" -#: neutron/plugins/hyperv/db.py:163 neutron/plugins/hyperv/db.py:176 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:64 -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:83 +#: neutron/plugins/hyperv/db.py:162 neutron/plugins/hyperv/db.py:175 #: neutron/plugins/ml2/drivers/type_vlan.py:130 #: neutron/plugins/ml2/drivers/type_vlan.py:151 -#: neutron/plugins/openvswitch/ovs_db_v2.py:87 -#: neutron/plugins/openvswitch/ovs_db_v2.py:105 #, python-format msgid "" "Removing vlan %(vlan_id)s on physical network %(physical_network)s from " "pool" msgstr "" -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:46 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:45 msgid "Network type for tenant networks (local, flat, vlan or none)" msgstr "" -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:50 -#: neutron/plugins/linuxbridge/common/config.py:33 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:49 +#: neutron/plugins/linuxbridge/common/config.py:30 #: neutron/plugins/mlnx/common/config.py:30 msgid "List of :: or " msgstr "" -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:78 -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:100 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:77 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:99 #, python-format msgid "segmentation_id specified for %s network" msgstr "" -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:85 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:84 #, python-format msgid "physical_network specified for %s network" msgstr "" -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:127 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:126 msgid "physical_network not provided" msgstr "" -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:179 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:178 #, python-format msgid "Invalid tenant_network_type: %s. Agent terminated!" msgstr "" -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:204 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:303 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:203 #: neutron/plugins/ml2/drivers/type_vlan.py:96 -#: neutron/plugins/mlnx/mlnx_plugin.py:187 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:366 +#: neutron/plugins/mlnx/mlnx_plugin.py:184 #, python-format msgid "Network VLAN ranges: %s" msgstr "" -#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:229 +#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:228 #, python-format msgid "Network type %s not supported" msgstr "" -#: neutron/plugins/hyperv/rpc_callbacks.py:76 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:114 +#: neutron/plugins/hyperv/rpc_callbacks.py:75 #: neutron/plugins/mlnx/rpc_callbacks.py:77 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:117 #, python-format msgid "Device %(device)s no longer exists on %(agent_id)s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:50 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:48 msgid "" "List of : where the physical networks can be " "expressed with wildcards, e.g.: .\"*:external\"" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:56 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:54 msgid "Private vswitch name used for local networks" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:58 -#: neutron/plugins/linuxbridge/common/config.py:64 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:56 +#: neutron/plugins/linuxbridge/common/config.py:61 #: neutron/plugins/mlnx/common/config.py:67 -#: neutron/plugins/nec/common/config.py:29 +#: neutron/plugins/nec/common/config.py:28 #: neutron/plugins/oneconvergence/lib/config.py:47 -#: neutron/plugins/openvswitch/common/config.py:66 +#: neutron/plugins/openvswitch/common/config.py:53 #: neutron/plugins/ryu/common/config.py:43 #: neutron/plugins/sriovnicagent/common/config.py:58 msgid "" @@ -6870,14 +6716,14 @@ msgid "" "device changes." msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:62 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:60 msgid "" "Enables metrics collections for switch ports by using Hyper-V's metric " "APIs. Collected data can by retrieved by other apps and services, e.g.: " "Ceilometer. Requires Hyper-V / Windows Server 2012 and above" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:69 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:67 msgid "" "Specifies the maximum number of retries to enable Hyper-V's port metrics " "collection. The agent will try to enable the feature once every " @@ -6885,1199 +6731,1110 @@ msgid "" "succeedes." msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:151 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:149 #, python-format msgid "Failed reporting state! %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:186 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:184 #, python-format msgid "Invalid physical network mapping: %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:207 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:205 #, python-format msgid "network_delete received. Deleting network %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:213 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:211 #, python-format msgid "Network %s not defined on agent." msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:216 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:214 msgid "port_delete received" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:221 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:219 msgid "port_update received" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:243 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:241 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:130 #, python-format msgid "Provisioning network %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:256 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:254 #, python-format msgid "" "Cannot provision unknown network type %(network_type)s for network " "%(net_uuid)s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:268 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:266 #, python-format msgid "Reclaiming local network %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:276 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:274 #, python-format msgid "Binding port %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:289 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:287 #, python-format msgid "Binding VLAN ID %(segmentation_id)s to switch port %(port_id)s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:302 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:300 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:115 #, python-format msgid "Unsupported network type %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:311 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:309 #, python-format msgid "Network %s is not avalailable on this agent" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:315 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:313 #, python-format msgid "Unbinding port %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:328 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:326 #, python-format msgid "Port metrics enabled for port: %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:332 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:330 #, python-format msgid "Port metrics raw enabling for port: %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:357 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:355 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:294 #, python-format msgid "No port %s defined on agent." msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:374 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:372 #, python-format msgid "Adding port %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:377 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:375 #, python-format msgid "Port %(device)s updated. Details: %(device_details)s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:403 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:401 #, python-format msgid "Removing port %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:411 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:409 #, python-format msgid "Removing port failed for device %(device)s: %(e)s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:436 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:995 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1350 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:434 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:993 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1353 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:254 msgid "Agent out of sync with plugin!" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:444 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:442 msgid "Agent loop has new devices!" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:451 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:449 #, python-format msgid "Error in agent event loop: %s" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:459 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:457 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:393 #, python-format msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)" msgstr "" -#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:472 -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:268 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1036 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1542 +#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:470 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:266 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1034 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1545 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:350 msgid "Agent initialized successfully, now running... " msgstr "" -#: neutron/plugins/hyperv/agent/security_groups_driver.py:62 +#: neutron/plugins/hyperv/agent/security_groups_driver.py:61 #, python-format msgid "Hyper-V Exception: %(hyperv_exeption)s while adding rule: %(rule)s" msgstr "" -#: neutron/plugins/hyperv/agent/security_groups_driver.py:72 +#: neutron/plugins/hyperv/agent/security_groups_driver.py:71 #, python-format msgid "Hyper-V Exception: %(hyperv_exeption)s while removing rule: %(rule)s" msgstr "" -#: neutron/plugins/hyperv/agent/security_groups_driver.py:92 +#: neutron/plugins/hyperv/agent/security_groups_driver.py:91 msgid "Aplying port filter." msgstr "" -#: neutron/plugins/hyperv/agent/security_groups_driver.py:95 +#: neutron/plugins/hyperv/agent/security_groups_driver.py:94 msgid "Updating port rules." msgstr "" -#: neutron/plugins/hyperv/agent/security_groups_driver.py:108 +#: neutron/plugins/hyperv/agent/security_groups_driver.py:107 #, python-format msgid "Creating %(new)s new rules, removing %(old)s old rules." msgstr "" -#: neutron/plugins/hyperv/agent/security_groups_driver.py:119 +#: neutron/plugins/hyperv/agent/security_groups_driver.py:118 msgid "Removing port filter" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:36 +#: neutron/plugins/hyperv/agent/utils.py:34 #, python-format msgid "HyperVException: %(msg)s" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:81 +#: neutron/plugins/hyperv/agent/utils.py:79 #, python-format msgid "Vnic not found: %s" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:116 +#: neutron/plugins/hyperv/agent/utils.py:114 #, python-format msgid "Job failed with error %d" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:135 +#: neutron/plugins/hyperv/agent/utils.py:133 #, python-format msgid "" "WMI job failed with status %(job_state)d. Error details: %(err_sum_desc)s" " - %(err_desc)s - Error code: %(err_code)d" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:144 +#: neutron/plugins/hyperv/agent/utils.py:142 #, python-format msgid "WMI job failed with status %(job_state)d. Error details: %(error)s" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:148 +#: neutron/plugins/hyperv/agent/utils.py:146 #, python-format msgid "WMI job failed with status %d. No error description available" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:153 +#: neutron/plugins/hyperv/agent/utils.py:151 #, python-format msgid "WMI job succeeded: %(desc)s, Elapsed=%(elap)s" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:167 +#: neutron/plugins/hyperv/agent/utils.py:165 #, python-format msgid "Failed creating port for %s" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:190 +#: neutron/plugins/hyperv/agent/utils.py:188 #, python-format msgid "" "Failed to disconnect port %(switch_port_name)s from switch " "%(vswitch_name)s with error %(ret_val)s" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:201 +#: neutron/plugins/hyperv/agent/utils.py:199 #, python-format msgid "" "Failed to delete port %(switch_port_name)s from switch %(vswitch_name)s " "with error %(ret_val)s" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:208 -#: neutron/plugins/hyperv/agent/utilsv2.py:135 +#: neutron/plugins/hyperv/agent/utils.py:206 +#: neutron/plugins/hyperv/agent/utilsv2.py:133 #, python-format msgid "VSwitch not found: %s" msgstr "" -#: neutron/plugins/hyperv/agent/utils.py:249 -#: neutron/plugins/hyperv/agent/utils.py:253 +#: neutron/plugins/hyperv/agent/utils.py:247 +#: neutron/plugins/hyperv/agent/utils.py:251 msgid "Metrics collection is not supported on this version of Hyper-V" msgstr "" -#: neutron/plugins/hyperv/agent/utilsfactory.py:32 +#: neutron/plugins/hyperv/agent/utilsfactory.py:31 msgid "Force V1 WMI utility classes" msgstr "" -#: neutron/plugins/hyperv/agent/utilsfactory.py:61 +#: neutron/plugins/hyperv/agent/utilsfactory.py:60 msgid "" "V1 virtualization namespace no longer supported on Windows Server / " "Hyper-V Server 2012 R2 or above." msgstr "" -#: neutron/plugins/hyperv/agent/utilsfactory.py:68 +#: neutron/plugins/hyperv/agent/utilsfactory.py:67 #, python-format msgid "Loading class: %(module_name)s.%(class_name)s" msgstr "" -#: neutron/plugins/hyperv/agent/utilsv2.py:158 -#: neutron/plugins/hyperv/agent/utilsv2.py:318 +#: neutron/plugins/hyperv/agent/utilsv2.py:156 +#: neutron/plugins/hyperv/agent/utilsv2.py:316 #, python-format msgid "Port Allocation not found: %s" msgstr "" -#: neutron/plugins/hyperv/agent/utilsv2.py:268 +#: neutron/plugins/hyperv/agent/utilsv2.py:266 #, python-format msgid "Cannot get VM summary data for: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:77 +#: neutron/plugins/ibm/sdnve_api.py:75 #, python-format msgid "The IP addr of available SDN-VE controllers: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:80 +#: neutron/plugins/ibm/sdnve_api.py:78 #, python-format msgid "The SDN-VE controller IP address: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:97 +#: neutron/plugins/ibm/sdnve_api.py:95 #, python-format msgid "unable to serialize object type: '%s'" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:164 +#: neutron/plugins/ibm/sdnve_api.py:162 #, python-format msgid "" "Sending request to SDN-VE. url: %(myurl)s method: %(method)s body: " "%(body)s header: %(header)s " msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:177 +#: neutron/plugins/ibm/sdnve_api.py:175 #, python-format msgid "Error: Could not reach server: %(url)s Exception: %(excp)s." msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:184 +#: neutron/plugins/ibm/sdnve_api.py:182 #, python-format msgid "Error message: %(reply)s -- Status: %(status)s" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:187 +#: neutron/plugins/ibm/sdnve_api.py:185 #, python-format msgid "Received response status: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:194 +#: neutron/plugins/ibm/sdnve_api.py:192 #, python-format msgid "Deserialized body: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:236 +#: neutron/plugins/ibm/sdnve_api.py:234 msgid "Bad resource for forming a list request" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:246 +#: neutron/plugins/ibm/sdnve_api.py:244 msgid "Bad resource for forming a show request" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:256 +#: neutron/plugins/ibm/sdnve_api.py:254 msgid "Bad resource for forming a create request" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:268 +#: neutron/plugins/ibm/sdnve_api.py:266 msgid "Bad resource for forming a update request" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:279 +#: neutron/plugins/ibm/sdnve_api.py:277 msgid "Bad resource for forming a delete request" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:307 +#: neutron/plugins/ibm/sdnve_api.py:305 #, python-format msgid "Non matching tenant and network types: %(ttype)s %(ntype)s" msgstr "" -#: neutron/plugins/ibm/sdnve_api.py:369 +#: neutron/plugins/ibm/sdnve_api.py:367 #, python-format msgid "Did not find tenant: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:32 +#: neutron/plugins/ibm/sdnve_api_fake.py:30 msgid "Fake SDNVE controller initialized" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:35 +#: neutron/plugins/ibm/sdnve_api_fake.py:33 msgid "Fake SDNVE controller: list" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:39 +#: neutron/plugins/ibm/sdnve_api_fake.py:37 msgid "Fake SDNVE controller: show" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:43 +#: neutron/plugins/ibm/sdnve_api_fake.py:41 msgid "Fake SDNVE controller: create" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:47 +#: neutron/plugins/ibm/sdnve_api_fake.py:45 msgid "Fake SDNVE controller: update" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:51 +#: neutron/plugins/ibm/sdnve_api_fake.py:49 msgid "Fake SDNVE controller: delete" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:55 +#: neutron/plugins/ibm/sdnve_api_fake.py:53 msgid "Fake SDNVE controller: get tenant by id" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:59 +#: neutron/plugins/ibm/sdnve_api_fake.py:57 msgid "Fake SDNVE controller: check and create tenant" msgstr "" -#: neutron/plugins/ibm/sdnve_api_fake.py:63 +#: neutron/plugins/ibm/sdnve_api_fake.py:61 msgid "Fake SDNVE controller: get controller" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:152 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:150 msgid "Set a new controller if needed." msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:158 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:156 #, python-format msgid "Set the controller to a new controller: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:166 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:164 #, python-format msgid "Original SDN-VE HTTP request: %(orig)s; New request: %(new)s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:176 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:174 #, python-format msgid "Create network in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:185 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:183 msgid "Create net failed: no SDN-VE tenant." msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:196 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:194 #, python-format msgid "Create net failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:203 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:201 #, python-format msgid "Update network in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:223 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:221 #, python-format msgid "Update net failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:229 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:227 #, python-format msgid "Delete network in progress: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:239 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:237 #, python-format msgid "Delete net failed after deleting the network in DB: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:244 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:242 #, python-format msgid "Get network in progress: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:250 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:248 msgid "Get networks in progress" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:260 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:258 #, python-format msgid "Create port in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:276 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:274 msgid "Create port does not have tenant id info" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:282 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:280 #, python-format msgid "Create port does not have tenant id info; obtained is: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:303 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:301 #, python-format msgid "Create port failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:310 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:308 #, python-format msgid "Update port in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:337 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:335 #, python-format msgid "Update port failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:343 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:341 #, python-format msgid "Delete port in progress: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:356 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:354 #, python-format msgid "Delete port operation failed in SDN-VE after deleting the port from DB: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:365 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:363 #, python-format msgid "Create subnet in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:377 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:375 #, python-format msgid "Create subnet failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:379 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:377 #, python-format msgid "Subnet created: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:385 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:383 #, python-format msgid "Update subnet in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:410 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:408 #, python-format msgid "Update subnet failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:416 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:414 #, python-format msgid "Delete subnet in progress: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:421 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:419 #, python-format msgid "" "Delete subnet operation failed in SDN-VE after deleting the subnet from " "DB: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:430 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:428 #, python-format msgid "Create router in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:433 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:431 #, python-format msgid "Ignoring admin_state_up=False for router=%r. Overriding with True" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:443 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:441 msgid "Create router failed: no SDN-VE tenant." msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:451 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:449 #, python-format msgid "Create router failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:453 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:451 #, python-format msgid "Router created: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:458 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:456 #, python-format msgid "Update router in progress: id=%(id)s router=%(router)r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:465 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:463 msgid "admin_state_up=False routers are not supported." msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:489 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:487 #, python-format msgid "Update router failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:495 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:493 #, python-format msgid "Delete router in progress: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:502 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:500 #, python-format msgid "" "Delete router operation failed in SDN-VE after deleting the router in DB:" " %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:507 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:505 #, python-format msgid "" "Add router interface in progress: router_id=%(router_id)s " "interface_info=%(interface_info)r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:515 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:513 #, python-format msgid "SdnvePluginV2.add_router_interface called. Port info: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:529 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:527 #, python-format msgid "Update router-add-interface failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:532 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:530 #, python-format msgid "Added router interface: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:536 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:534 #, python-format msgid "" "Add router interface only called: router_id=%(router_id)s " "interface_info=%(interface_info)r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:546 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:544 msgid "" "SdnvePluginV2._add_router_interface_only: failed to add the interface in " "the roll back. of a remove_router_interface operation" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:552 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:550 #, python-format msgid "" "Remove router interface in progress: router_id=%(router_id)s " "interface_info=%(interface_info)r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:561 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:559 msgid "No port ID" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:563 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:561 #, python-format msgid "SdnvePluginV2.remove_router_interface port: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:567 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:565 msgid "No fixed IP" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:572 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:570 #, python-format msgid "SdnvePluginV2.remove_router_interface subnet_id: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:595 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:593 #, python-format msgid "Update router-remove-interface failed SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:616 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:614 #, python-format msgid "Create floatingip in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:627 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:625 #, python-format msgid "Creating floating ip operation failed in SDN-VE controller: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:630 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:628 #, python-format msgid "Created floatingip : %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:635 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:633 #, python-format msgid "Update floatingip in progress: %r" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:655 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:653 #, python-format msgid "Update floating ip failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:661 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:659 #, python-format msgid "Delete floatingip in progress: %s" msgstr "" -#: neutron/plugins/ibm/sdnve_neutron_plugin.py:666 +#: neutron/plugins/ibm/sdnve_neutron_plugin.py:664 #, python-format msgid "Delete floatingip failed in SDN-VE: %s" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:138 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:136 msgid "info_update received" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:143 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:141 #, python-format msgid "info_update received. New controlleris to be set to: %s" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:149 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:147 msgid "info_update received. New controlleris set to be out of band" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:194 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:192 #, python-format msgid "Mapping physical network %(physical_network)s to interface %(interface)s" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:200 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:198 #, 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:218 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:216 msgid "Agent in the rpc loop." msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:240 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:238 #, python-format msgid "Controller IPs: %s" msgstr "" -#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:262 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1529 +#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:260 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1532 #, python-format msgid "%s Agent terminated!" msgstr "" -#: neutron/plugins/ibm/common/config.py:28 +#: neutron/plugins/ibm/common/config.py:26 msgid "Whether to use a fake controller." msgstr "" -#: neutron/plugins/ibm/common/config.py:30 +#: neutron/plugins/ibm/common/config.py:28 msgid "Base URL for SDN-VE controller REST API." msgstr "" -#: neutron/plugins/ibm/common/config.py:32 +#: neutron/plugins/ibm/common/config.py:30 msgid "List of IP addresses of SDN-VE controller(s)." msgstr "" -#: neutron/plugins/ibm/common/config.py:34 +#: neutron/plugins/ibm/common/config.py:32 msgid "SDN-VE RPC subject." msgstr "" -#: neutron/plugins/ibm/common/config.py:36 +#: neutron/plugins/ibm/common/config.py:34 msgid "SDN-VE controller port number." msgstr "" -#: neutron/plugins/ibm/common/config.py:38 +#: neutron/plugins/ibm/common/config.py:36 msgid "SDN-VE request/response format." msgstr "" -#: neutron/plugins/ibm/common/config.py:40 +#: neutron/plugins/ibm/common/config.py:38 msgid "SDN-VE administrator user ID." msgstr "" -#: neutron/plugins/ibm/common/config.py:42 +#: neutron/plugins/ibm/common/config.py:40 msgid "SDN-VE administrator password." msgstr "" -#: neutron/plugins/ibm/common/config.py:44 -#: neutron/plugins/nec/common/config.py:24 +#: neutron/plugins/ibm/common/config.py:42 +#: neutron/plugins/nec/common/config.py:23 #: neutron/plugins/openvswitch/common/config.py:29 #: neutron/plugins/ryu/common/config.py:22 msgid "Integration bridge to use." msgstr "" -#: neutron/plugins/ibm/common/config.py:46 +#: neutron/plugins/ibm/common/config.py:44 msgid "Whether to reset the integration bridge before use." msgstr "" -#: neutron/plugins/ibm/common/config.py:48 +#: neutron/plugins/ibm/common/config.py:46 msgid "Indicating if controller is out of band or not." msgstr "" -#: neutron/plugins/ibm/common/config.py:51 +#: neutron/plugins/ibm/common/config.py:49 msgid "List of : mappings." msgstr "" -#: neutron/plugins/ibm/common/config.py:54 +#: neutron/plugins/ibm/common/config.py:52 msgid "Tenant type: OVERLAY (default) or OF." msgstr "" -#: neutron/plugins/ibm/common/config.py:56 +#: neutron/plugins/ibm/common/config.py:54 msgid "" "The string in tenant description that indicates the tenant is a OVERLAY " "tenant." msgstr "" -#: neutron/plugins/ibm/common/config.py:59 +#: neutron/plugins/ibm/common/config.py:57 msgid "The string in tenant description that indicates the tenant is a OF tenant." msgstr "" -#: neutron/plugins/ibm/common/config.py:65 +#: neutron/plugins/ibm/common/config.py:63 msgid "Agent polling interval if necessary." msgstr "" -#: neutron/plugins/ibm/common/config.py:67 +#: neutron/plugins/ibm/common/config.py:65 msgid "Using root helper." msgstr "" -#: neutron/plugins/ibm/common/config.py:69 +#: neutron/plugins/ibm/common/config.py:67 msgid "Whether to use rpc." msgstr "" -#: neutron/plugins/ibm/common/exceptions.py:23 +#: neutron/plugins/ibm/common/exceptions.py:21 #, python-format msgid "" "An unexpected error occurred in the SDN-VE Plugin. Here is the error " "message: %(msg)s" msgstr "" -#: neutron/plugins/ibm/common/exceptions.py:28 +#: neutron/plugins/ibm/common/exceptions.py:26 #, python-format msgid "The input does not contain nececessary info: %(msg)s" msgstr "" -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:123 -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:147 -#: neutron/plugins/ml2/rpc.py:130 neutron/plugins/ml2/rpc.py:154 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:125 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:150 -#, python-format -msgid "Device %(device)s not bound to the agent host %(host)s" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:140 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:144 -#, python-format -msgid "Device %(device)s up on %(agent_id)s" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:261 -#: neutron/plugins/mlnx/mlnx_plugin.py:207 -#, python-format -msgid "Invalid tenant_network_type: %s. Service terminated!" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:272 -msgid "Linux Bridge Plugin initialization complete" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:301 -#, python-format -msgid "%s. Agent terminated!" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:346 -#: neutron/plugins/mlnx/mlnx_plugin.py:251 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:418 -msgid "provider:segmentation_id specified for flat network" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:355 -#: neutron/plugins/mlnx/mlnx_plugin.py:259 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:427 -#, python-format -msgid "provider:segmentation_id out of range (%(min_id)s through %(max_id)s)" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:362 -#: neutron/plugins/mlnx/mlnx_plugin.py:267 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:447 -msgid "provider:physical_network specified for local network" -msgstr "" - -#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:368 -#: neutron/plugins/mlnx/mlnx_plugin.py:271 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:453 -msgid "provider:segmentation_id specified for local network" -msgstr "" - -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:83 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:81 msgid "VXLAN is enabled, a valid local_ip must be provided" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:97 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:95 msgid "Invalid Network ID, will lead to incorrect bridgename" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:104 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:102 msgid "Invalid VLAN ID, will lead to incorrect subinterface name" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:111 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:109 msgid "Invalid Interface ID, will lead to incorrect tap device name" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:120 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:118 #, python-format msgid "Invalid Segmentation ID: %s, will lead to incorrect vxlan device name" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:183 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:181 #, python-format msgid "Failed creating vxlan interface for %(segmentation_id)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:215 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:213 #, python-format msgid "" "Creating subinterface %(interface)s for VLAN %(vlan_id)s on interface " "%(physical_interface)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:228 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:226 #, python-format msgid "Done creating subinterface %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:235 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:233 #, python-format msgid "Creating vxlan interface %(interface)s for VNI %(segmentation_id)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:250 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:248 #, python-format msgid "Done creating vxlan interface %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:304 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:302 #, python-format msgid "Starting bridge %(bridge_name)s for subinterface %(interface)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:319 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:317 #, python-format msgid "Done starting bridge %(bridge_name)s for subinterface %(interface)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:341 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:339 #, python-format msgid "Unable to add %(interface)s to %(bridge_name)s! Exception: %(e)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:354 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:352 #, python-format msgid "Unable to add vxlan interface for network %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:361 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:359 #, python-format msgid "No mapping for physical network %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:370 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:368 #, python-format msgid "Unknown network_type %(network_type)s for network %(network_id)s." msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:382 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:380 #, python-format msgid "Tap device: %s does not exist on this host, skipped" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:400 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:398 #, python-format msgid "Adding device %(tap_device_name)s to bridge %(bridge_name)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:409 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:407 #, python-format msgid "%(tap_device_name)s already exists on bridge %(bridge_name)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:447 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:445 #, python-format msgid "Deleting bridge %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:454 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:452 #, python-format msgid "Done deleting bridge %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:457 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:455 #, python-format msgid "Cannot delete bridge %s, does not exist" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:471 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:469 #, python-format msgid "Removing device %(interface_name)s from bridge %(bridge_name)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:478 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:476 #, python-format msgid "Done removing device %(interface_name)s from bridge %(bridge_name)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:484 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:482 #, python-format msgid "" "Cannot remove device %(interface_name)s bridge %(bridge_name)s does not " "exist" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:492 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:490 #, python-format msgid "Deleting subinterface %s for vlan" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:499 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:497 #, python-format msgid "Done deleting subinterface %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:503 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:501 #, python-format msgid "Deleting vxlan interface %s for vlan" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:508 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:506 #, python-format msgid "Done deleting vxlan interface %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:522 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:556 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:520 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:554 #, 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:533 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:531 msgid "No valid Segmentation ID to perform UCAST test." msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:550 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:548 msgid "" "VXLAN muticast group must be provided in vxlan_group option to enable " "VXLAN MCAST mode" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:575 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:573 msgid "" "Linux kernel vxlan module and iproute2 3.8 or above are required to " "enable VXLAN." msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:585 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:583 #, python-format msgid "Using %s VXLAN mode" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:662 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:660 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:163 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:297 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:300 msgid "network_delete received" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:676 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:674 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:66 #, python-format msgid "port_update RPC received for port: %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:679 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:677 msgid "fdb_add received" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:701 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:699 msgid "fdb_remove received" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:723 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:721 msgid "update chg_ip received" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:748 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:746 msgid "fdb_update received" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:805 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:803 msgid "Unable to obtain MAC address for unique ID. Agent terminated!" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:809 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:807 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:220 -#: neutron/plugins/nec/agent/nec_neutron_agent.py:144 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:109 +#: neutron/plugins/nec/agent/nec_neutron_agent.py:142 +#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:107 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:100 #, python-format msgid "RPC agent_id: %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:880 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1100 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:878 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1103 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:213 #, python-format msgid "Port %(device)s updated. Details: %(details)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:913 -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:934 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:911 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:932 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:354 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1126 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1187 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1129 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1190 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:240 #, python-format msgid "Device %s not defined on plugin" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:920 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1172 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:918 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1158 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1175 #, python-format msgid "Attachment %s removed" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:928 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1162 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:926 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1165 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1182 #, python-format msgid "port_removed failed for %(device)s: %(e)s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:932 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:930 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:352 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1184 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1187 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:238 #, python-format msgid "Port %s updated." msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:985 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:983 msgid "LinuxBridge Agent RPC Daemon Started!" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:999 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:997 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:267 #, python-format msgid "Agent loop found changes! %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1003 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1001 #: neutron/plugins/sriovnicagent/sriov_nic_agent.py:273 #, python-format msgid "Error in agent loop. Devices info: %s" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1026 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1024 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:407 #, python-format msgid "Parsing physical_interface_mappings failed: %s. Agent terminated!" msgstr "" -#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1029 +#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1027 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:410 #, python-format msgid "Interface mappings: %s" msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:29 +#: neutron/plugins/linuxbridge/common/config.py:26 #: neutron/plugins/mlnx/common/config.py:26 msgid "Network type for tenant networks (local, vlan, or none)" msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:39 +#: neutron/plugins/linuxbridge/common/config.py:36 msgid "" "Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 " "plugin using linuxbridge mechanism driver" msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:43 +#: neutron/plugins/linuxbridge/common/config.py:40 msgid "TTL for vxlan interface protocol packets." msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:45 +#: neutron/plugins/linuxbridge/common/config.py:42 msgid "TOS for vxlan interface protocol packets." msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:47 +#: neutron/plugins/linuxbridge/common/config.py:44 msgid "Multicast group for vxlan interface." msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:49 +#: neutron/plugins/linuxbridge/common/config.py:46 msgid "Local IP address of the VXLAN endpoints." msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:51 +#: neutron/plugins/linuxbridge/common/config.py:48 msgid "" "Extension to use alongside ml2 plugin's l2population mechanism driver. It" " enables the plugin to populate VXLAN forwarding table." msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:59 +#: neutron/plugins/linuxbridge/common/config.py:56 #: neutron/plugins/mlnx/common/config.py:45 #: neutron/plugins/ofagent/common/config.py:29 msgid "List of :" msgstr "" -#: neutron/plugins/linuxbridge/common/config.py:67 +#: neutron/plugins/linuxbridge/common/config.py:64 #: neutron/plugins/mlnx/common/config.py:70 msgid "Enable server RPC compatibility with old agents" msgstr "" -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:142 -#: neutron/plugins/openvswitch/ovs_db_v2.py:161 -#, python-format -msgid "" -"Reserving specific vlan %(vlan_id)s on physical network " -"%(physical_network)s outside pool" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:166 -#: neutron/plugins/openvswitch/ovs_db_v2.py:191 -#, python-format -msgid "" -"Releasing vlan %(vlan_id)s on physical network %(physical_network)s to " -"pool" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:171 -#: neutron/plugins/openvswitch/ovs_db_v2.py:186 -#, python-format -msgid "" -"Releasing vlan %(vlan_id)s on physical network %(physical_network)s " -"outside pool" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:202 -#: neutron/plugins/mlnx/db/mlnx_db_v2.py:212 -msgid "get_port_from_device() called" -msgstr "" - -#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:230 -#, python-format -msgid "set_port_status as %s called" -msgstr "" - #: neutron/plugins/metaplugin/meta_neutron_plugin.py:59 #, python-format msgid "Flavor %(flavor)s could not be found" @@ -8198,38 +7955,38 @@ msgstr "" msgid "Specifies flavor for plugin to handle 'q-plugin' RPC requests." msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:44 +#: neutron/plugins/midonet/midonet_lib.py:39 #, python-format msgid "MidoNet %(resource_type)s %(id)s could not be found" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:48 -#: neutron/plugins/midonet/plugin.py:86 +#: neutron/plugins/midonet/midonet_lib.py:43 +#: neutron/plugins/midonet/plugin.py:80 #, python-format msgid "MidoNet API error: %(msg)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:82 +#: neutron/plugins/midonet/midonet_lib.py:77 #, python-format msgid "MidoClient.create_bridge called: kwargs=%(kwargs)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:92 +#: neutron/plugins/midonet/midonet_lib.py:87 #, python-format msgid "MidoClient.delete_bridge called: id=%(id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:102 +#: neutron/plugins/midonet/midonet_lib.py:97 #, python-format msgid "MidoClient.get_bridge called: id=%s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:116 +#: neutron/plugins/midonet/midonet_lib.py:111 #, python-format msgid "MidoClient.update_bridge called: id=%(id)s, kwargs=%(kwargs)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:136 +#: neutron/plugins/midonet/midonet_lib.py:131 #, python-format msgid "" "MidoClient.create_dhcp called: bridge=%(bridge)s, cidr=%(cidr)s, " @@ -8237,142 +7994,142 @@ msgid "" "dns_servers=%(dns_servers)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:154 +#: neutron/plugins/midonet/midonet_lib.py:149 #, python-format msgid "" "MidoClient.add_dhcp_host called: bridge=%(bridge)s, cidr=%(cidr)s, " "ip=%(ip)s, mac=%(mac)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:159 +#: neutron/plugins/midonet/midonet_lib.py:154 msgid "Tried to add tonon-existent DHCP" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:173 +#: neutron/plugins/midonet/midonet_lib.py:168 #, python-format msgid "" "MidoClient.remove_dhcp_host called: bridge=%(bridge)s, cidr=%(cidr)s, " "ip=%(ip)s, mac=%(mac)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:178 +#: neutron/plugins/midonet/midonet_lib.py:173 msgid "Tried to delete mapping from non-existent subnet" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:183 +#: neutron/plugins/midonet/midonet_lib.py:178 #, python-format msgid "MidoClient.remove_dhcp_host: Deleting %(dh)r" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:196 +#: neutron/plugins/midonet/midonet_lib.py:191 #, python-format msgid "" "MidoClient.delete_dhcp_host called: bridge_id=%(bridge_id)s, " "cidr=%(cidr)s, ip=%(ip)s, mac=%(mac)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:211 +#: neutron/plugins/midonet/midonet_lib.py:206 #, python-format msgid "MidoClient.delete_dhcp called: bridge=%(bridge)s, cidr=%(cidr)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:218 +#: neutron/plugins/midonet/midonet_lib.py:213 msgid "Tried to delete non-existent DHCP" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:230 +#: neutron/plugins/midonet/midonet_lib.py:226 #, python-format msgid "MidoClient.delete_port called: id=%(id)s, delete_chains=%(delete_chains)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:245 +#: neutron/plugins/midonet/midonet_lib.py:241 #, python-format msgid "MidoClient.get_port called: id=%(id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:259 +#: neutron/plugins/midonet/midonet_lib.py:255 #, python-format msgid "MidoClient.add_bridge_port called: bridge=%(bridge)s, kwargs=%(kwargs)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:271 +#: neutron/plugins/midonet/midonet_lib.py:267 #, python-format msgid "MidoClient.update_port called: id=%(id)s, kwargs=%(kwargs)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:296 +#: neutron/plugins/midonet/midonet_lib.py:292 #, python-format msgid "MidoClient.create_router called: kwargs=%(kwargs)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:306 +#: neutron/plugins/midonet/midonet_lib.py:302 #, python-format msgid "MidoClient.delete_router called: id=%(id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:316 +#: neutron/plugins/midonet/midonet_lib.py:312 #, python-format msgid "MidoClient.get_router called: id=%(id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:330 +#: neutron/plugins/midonet/midonet_lib.py:326 #, python-format msgid "MidoClient.update_router called: id=%(id)s, kwargs=%(kwargs)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:351 +#: neutron/plugins/midonet/midonet_lib.py:347 #, python-format msgid "" "MidoClient.add_dhcp_route_option called: bridge=%(bridge)s, " "cidr=%(cidr)s, gw_ip=%(gw_ip)sdst_ip=%(dst_ip)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:359 +#: neutron/plugins/midonet/midonet_lib.py:355 msgid "Tried to access non-existent DHCP" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:391 +#: neutron/plugins/midonet/midonet_lib.py:387 #, python-format msgid "MidoClient.unlink called: port=%(port)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:396 +#: neutron/plugins/midonet/midonet_lib.py:392 #, python-format msgid "Attempted to unlink a port that was not linked. %s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:402 +#: neutron/plugins/midonet/midonet_lib.py:398 #, python-format msgid "" "MidoClient.remove_rules_by_property called: tenant_id=%(tenant_id)s, " "chain_name=%(chain_name)skey=%(key)s, value=%(value)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:429 +#: neutron/plugins/midonet/midonet_lib.py:425 #, python-format msgid "" "MidoClient.create_router_chains called: router=%(router)s, " "inbound_chain_name=%(in_chain)s, outbound_chain_name=%(out_chain)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:452 +#: neutron/plugins/midonet/midonet_lib.py:448 #, python-format msgid "MidoClient.delete_router_chains called: id=%(id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:467 +#: neutron/plugins/midonet/midonet_lib.py:463 #, python-format msgid "MidoClient.delete_port_chains called: id=%(id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:479 +#: neutron/plugins/midonet/midonet_lib.py:475 #, python-format msgid "" "MidoClient.get_link_port called: router=%(router)s, " "peer_router_id=%(peer_router_id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:518 +#: neutron/plugins/midonet/midonet_lib.py:514 #, python-format msgid "" "MidoClient.add_static_nat called: tenant_id=%(tenant_id)s, " @@ -8380,17 +8137,17 @@ msgid "" "port_id=%(port_id)s, nat_type=%(nat_type)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:526 +#: neutron/plugins/midonet/midonet_lib.py:522 #, python-format msgid "Invalid NAT type passed in %s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:578 +#: neutron/plugins/midonet/midonet_lib.py:574 #, python-format msgid "MidoClient.remote_static_route called: router=%(router)s, ip=%(ip)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:589 +#: neutron/plugins/midonet/midonet_lib.py:585 #, python-format msgid "" "MidoClient.update_port_chains called: " @@ -8398,82 +8155,82 @@ msgid "" "outbound_chain_id=%(outbound_chain_id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:600 +#: neutron/plugins/midonet/midonet_lib.py:596 #, python-format msgid "MidoClient.create_chain called: tenant_id=%(tenant_id)s name=%(name)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:608 +#: neutron/plugins/midonet/midonet_lib.py:604 #, python-format msgid "MidoClient.delete_chain called: id=%(id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:614 +#: neutron/plugins/midonet/midonet_lib.py:610 #, python-format msgid "" "MidoClient.delete_chains_by_names called: tenant_id=%(tenant_id)s " "names=%(names)s " msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:625 +#: neutron/plugins/midonet/midonet_lib.py:621 #, python-format msgid "" "MidoClient.get_chain_by_name called: tenant_id=%(tenant_id)s " "name=%(name)s " msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:636 +#: neutron/plugins/midonet/midonet_lib.py:632 #, python-format msgid "" "MidoClient.get_port_group_by_name called: tenant_id=%(tenant_id)s " "name=%(name)s " msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:650 +#: neutron/plugins/midonet/midonet_lib.py:646 #, python-format msgid "MidoClient.create_port_group called: tenant_id=%(tenant_id)s name=%(name)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:659 +#: neutron/plugins/midonet/midonet_lib.py:655 #, python-format msgid "" "MidoClient.delete_port_group_by_name called: tenant_id=%(tenant_id)s " "name=%(name)s " msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:665 +#: neutron/plugins/midonet/midonet_lib.py:661 #, python-format msgid "Deleting pg %(id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:671 +#: neutron/plugins/midonet/midonet_lib.py:667 #, python-format msgid "" "MidoClient.add_port_to_port_group_by_name called: tenant_id=%(tenant_id)s" " name=%(name)s port_id=%(port_id)s" msgstr "" -#: neutron/plugins/midonet/midonet_lib.py:685 +#: neutron/plugins/midonet/midonet_lib.py:681 #, python-format msgid "MidoClient.remove_port_from_port_groups called: port_id=%(port_id)s" msgstr "" -#: neutron/plugins/midonet/plugin.py:100 +#: neutron/plugins/midonet/plugin.py:94 #, python-format msgid "Invalid nat_type %s" msgstr "" -#: neutron/plugins/midonet/plugin.py:157 +#: neutron/plugins/midonet/plugin.py:151 #, python-format msgid "Unrecognized direction %s" msgstr "" -#: neutron/plugins/midonet/plugin.py:191 +#: neutron/plugins/midonet/plugin.py:185 #, python-format msgid "There is no %(name)s with ID %(id)s in MidoNet." msgstr "" -#: neutron/plugins/midonet/plugin.py:198 +#: neutron/plugins/midonet/plugin.py:192 #: neutron/plugins/ml2/drivers/arista/exceptions.py:23 #: neutron/plugins/ml2/drivers/arista/exceptions.py:27 #: neutron/plugins/ml2/drivers/arista/exceptions.py:31 @@ -8482,214 +8239,214 @@ msgstr "" msgid "%(msg)s" msgstr "" -#: neutron/plugins/midonet/plugin.py:235 +#: neutron/plugins/midonet/plugin.py:229 msgid "provider_router_id should be configured in the plugin config file" msgstr "" -#: neutron/plugins/midonet/plugin.py:405 +#: neutron/plugins/midonet/plugin.py:399 #, python-format msgid "MidonetPluginV2.create_subnet called: subnet=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:437 +#: neutron/plugins/midonet/plugin.py:431 #, python-format msgid "MidonetPluginV2.create_subnet exiting: sn_entry=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:446 +#: neutron/plugins/midonet/plugin.py:440 #, python-format msgid "MidonetPluginV2.delete_subnet called: id=%s" msgstr "" -#: neutron/plugins/midonet/plugin.py:465 +#: neutron/plugins/midonet/plugin.py:459 msgid "MidonetPluginV2.delete_subnet exiting" msgstr "" -#: neutron/plugins/midonet/plugin.py:522 +#: neutron/plugins/midonet/plugin.py:516 #, python-format msgid "MidonetPluginV2.create_port called: port=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:583 +#: neutron/plugins/midonet/plugin.py:577 #, python-format msgid "Failed to create a port on network %(net_id)s: %(err)s" msgstr "" -#: neutron/plugins/midonet/plugin.py:588 +#: neutron/plugins/midonet/plugin.py:582 #, python-format msgid "MidonetPluginV2.create_port exiting: port=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:593 +#: neutron/plugins/midonet/plugin.py:587 #, python-format msgid "MidonetPluginV2.get_port called: id=%(id)s fields=%(fields)r" msgstr "" -#: neutron/plugins/midonet/plugin.py:600 +#: neutron/plugins/midonet/plugin.py:594 #, python-format msgid "There is no port with ID %(id)s in MidoNet." msgstr "" -#: neutron/plugins/midonet/plugin.py:604 +#: neutron/plugins/midonet/plugin.py:598 #, python-format msgid "MidonetPluginV2.get_port exiting: port=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:609 +#: neutron/plugins/midonet/plugin.py:603 #, python-format msgid "MidonetPluginV2.get_ports called: filters=%(filters)s fields=%(fields)r" msgstr "" -#: neutron/plugins/midonet/plugin.py:618 +#: neutron/plugins/midonet/plugin.py:612 #, python-format msgid "" "MidonetPluginV2.delete_port called: id=%(id)s " "l3_port_check=%(l3_port_check)r" msgstr "" -#: neutron/plugins/midonet/plugin.py:652 +#: neutron/plugins/midonet/plugin.py:646 #, python-format msgid "Failed to delete DHCP mapping for port %(id)s" msgstr "" -#: neutron/plugins/midonet/plugin.py:727 +#: neutron/plugins/midonet/plugin.py:721 #, python-format msgid "MidonetPluginV2.create_router called: router=%(router)s" msgstr "" -#: neutron/plugins/midonet/plugin.py:774 +#: neutron/plugins/midonet/plugin.py:768 #, python-format msgid "MidonetPluginV2.create_router exiting: router_data=%(router_data)s." msgstr "" -#: neutron/plugins/midonet/plugin.py:786 +#: neutron/plugins/midonet/plugin.py:780 #, python-format msgid "" "MidonetPluginV2.set_router_gateway called: id=%(id)s, " "gw_router=%(gw_router)s, gw_ip=%(gw_ip)s" msgstr "" -#: neutron/plugins/midonet/plugin.py:830 +#: neutron/plugins/midonet/plugin.py:824 #, python-format msgid "MidonetPluginV2.remove_router_gateway called: id=%(id)s" msgstr "" -#: neutron/plugins/midonet/plugin.py:850 +#: neutron/plugins/midonet/plugin.py:844 #, python-format msgid "MidonetPluginV2.update_router called: id=%(id)s router=%(router)r" msgstr "" -#: neutron/plugins/midonet/plugin.py:890 +#: neutron/plugins/midonet/plugin.py:884 #, python-format msgid "MidonetPluginV2.update_router exiting: router=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:901 +#: neutron/plugins/midonet/plugin.py:895 #, python-format msgid "MidonetPluginV2.delete_router called: id=%s" msgstr "" -#: neutron/plugins/midonet/plugin.py:1001 +#: neutron/plugins/midonet/plugin.py:995 #, python-format msgid "" "MidonetPluginV2.add_router_interface called: router_id=%(router_id)s " "interface_info=%(interface_info)r" msgstr "" -#: neutron/plugins/midonet/plugin.py:1025 +#: neutron/plugins/midonet/plugin.py:1019 msgid "" "DHCP agent is not working correctly. No port to reach the Metadata server" " on this network" msgstr "" -#: neutron/plugins/midonet/plugin.py:1034 +#: neutron/plugins/midonet/plugin.py:1028 #, python-format msgid "" "Failed to create MidoNet resources to add router interface. " "info=%(info)s, router_id=%(router_id)s" msgstr "" -#: neutron/plugins/midonet/plugin.py:1041 +#: neutron/plugins/midonet/plugin.py:1035 #, python-format msgid "MidonetPluginV2.add_router_interface exiting: info=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:1081 +#: neutron/plugins/midonet/plugin.py:1075 #, python-format msgid "" "MidonetPluginV2.update_floatingip called: id=%(id)s " "floatingip=%(floatingip)s " msgstr "" -#: neutron/plugins/midonet/plugin.py:1100 +#: neutron/plugins/midonet/plugin.py:1094 #, python-format msgid "MidonetPluginV2.update_floating_ip exiting: fip=%s" msgstr "" -#: neutron/plugins/midonet/plugin.py:1122 +#: neutron/plugins/midonet/plugin.py:1116 #, python-format msgid "" "MidonetPluginV2.create_security_group called: " "security_group=%(security_group)s default_sg=%(default_sg)s " msgstr "" -#: neutron/plugins/midonet/plugin.py:1151 +#: neutron/plugins/midonet/plugin.py:1145 #, python-format msgid "Failed to create MidoNet resources for sg %(sg)r" msgstr "" -#: neutron/plugins/midonet/plugin.py:1158 +#: neutron/plugins/midonet/plugin.py:1152 #, python-format msgid "MidonetPluginV2.create_security_group exiting: sg=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:1164 +#: neutron/plugins/midonet/plugin.py:1158 #, python-format msgid "MidonetPluginV2.delete_security_group called: id=%s" msgstr "" -#: neutron/plugins/midonet/plugin.py:1196 +#: neutron/plugins/midonet/plugin.py:1190 #, python-format msgid "" "MidonetPluginV2.create_security_group_rule called: " "security_group_rule=%(security_group_rule)r" msgstr "" -#: neutron/plugins/midonet/plugin.py:1206 +#: neutron/plugins/midonet/plugin.py:1200 #, python-format msgid "MidonetPluginV2.create_security_group_rule exiting: rule=%r" msgstr "" -#: neutron/plugins/midonet/plugin.py:1216 +#: neutron/plugins/midonet/plugin.py:1210 #, python-format msgid "MidonetPluginV2.delete_security_group_rule called: sg_rule_id=%s" msgstr "" -#: neutron/plugins/midonet/common/config.py:23 +#: neutron/plugins/midonet/common/config.py:21 msgid "MidoNet API server URI." msgstr "" -#: neutron/plugins/midonet/common/config.py:25 +#: neutron/plugins/midonet/common/config.py:23 msgid "MidoNet admin username." msgstr "" -#: neutron/plugins/midonet/common/config.py:28 +#: neutron/plugins/midonet/common/config.py:26 msgid "MidoNet admin password." msgstr "" -#: neutron/plugins/midonet/common/config.py:31 +#: neutron/plugins/midonet/common/config.py:29 msgid "ID of the project that MidoNet admin userbelongs to." msgstr "" -#: neutron/plugins/midonet/common/config.py:34 +#: neutron/plugins/midonet/common/config.py:32 msgid "Virtual provider router ID." msgstr "" -#: neutron/plugins/midonet/common/config.py:37 +#: neutron/plugins/midonet/common/config.py:35 msgid "Operational mode. Internal dev use only." msgstr "" -#: neutron/plugins/midonet/common/config.py:40 +#: neutron/plugins/midonet/common/config.py:38 msgid "Path to midonet host uuid file" msgstr "" @@ -8715,23 +8472,23 @@ msgid "" "neutron.ml2.extension_drivers namespace." msgstr "" -#: neutron/plugins/ml2/db.py:54 +#: neutron/plugins/ml2/db.py:56 #, python-format msgid "Added segment %(id)s of type %(network_type)s for network %(network_id)s" msgstr "" -#: neutron/plugins/ml2/db.py:197 neutron/plugins/ml2/db.py:249 -#: neutron/plugins/ml2/plugin.py:1025 +#: neutron/plugins/ml2/db.py:200 neutron/plugins/ml2/db.py:252 +#: neutron/plugins/ml2/plugin.py:1058 #, python-format msgid "Multiple ports have port_id starting with %s" msgstr "" -#: neutron/plugins/ml2/db.py:203 +#: neutron/plugins/ml2/db.py:206 #, python-format msgid "get_port_from_device_mac() called for mac %s" msgstr "" -#: neutron/plugins/ml2/db.py:245 +#: neutron/plugins/ml2/db.py:248 #, python-format msgid "No binding found for port %(port_id)s" msgstr "" @@ -8782,254 +8539,254 @@ msgstr "" msgid "Initializing driver for type '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:169 neutron/plugins/ml2/managers.py:178 +#: neutron/plugins/ml2/managers.py:170 neutron/plugins/ml2/managers.py:179 #: neutron/plugins/ml2/drivers/type_tunnel.py:179 #, python-format msgid "network_type value '%s' not supported" msgstr "" -#: neutron/plugins/ml2/managers.py:204 neutron/plugins/ml2/managers.py:231 +#: neutron/plugins/ml2/managers.py:205 neutron/plugins/ml2/managers.py:232 #, python-format msgid "Failed to release segment '%s' because network type is not supported." msgstr "" -#: neutron/plugins/ml2/managers.py:247 +#: neutron/plugins/ml2/managers.py:248 #, python-format msgid "Configured mechanism driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:253 +#: neutron/plugins/ml2/managers.py:254 #, python-format msgid "Loaded mechanism driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:265 +#: neutron/plugins/ml2/managers.py:266 #, python-format msgid "Registered mechanism drivers: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:272 +#: neutron/plugins/ml2/managers.py:273 #, python-format msgid "Initializing mechanism driver '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:294 +#: neutron/plugins/ml2/managers.py:295 #, python-format msgid "Mechanism driver '%(name)s' failed in %(method)s" msgstr "" -#: neutron/plugins/ml2/managers.py:596 +#: neutron/plugins/ml2/managers.py:597 #, python-format msgid "Mechanism driver %s failed in bind_port" msgstr "" -#: neutron/plugins/ml2/managers.py:600 +#: neutron/plugins/ml2/managers.py:601 #, python-format msgid "Failed to bind port %(port)s on host %(host)s" msgstr "" -#: neutron/plugins/ml2/managers.py:613 +#: neutron/plugins/ml2/managers.py:614 #, python-format msgid "Configured extension driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:619 +#: neutron/plugins/ml2/managers.py:620 #, python-format msgid "Loaded extension driver names: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:630 +#: neutron/plugins/ml2/managers.py:631 #, python-format msgid "Registered extension drivers: %s" msgstr "" -#: neutron/plugins/ml2/managers.py:636 +#: neutron/plugins/ml2/managers.py:637 #, python-format msgid "Initializing extension driver '%s'" msgstr "" -#: neutron/plugins/ml2/managers.py:644 +#: neutron/plugins/ml2/managers.py:645 #, python-format msgid "Got %(alias)s extension from driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:655 +#: neutron/plugins/ml2/managers.py:656 #, python-format msgid "Extension driver '%(name)s' failed in %(method)s" msgstr "" -#: neutron/plugins/ml2/managers.py:691 +#: neutron/plugins/ml2/managers.py:692 #, python-format msgid "Extended network dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:698 +#: neutron/plugins/ml2/managers.py:699 #, python-format msgid "Extended subnet dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/managers.py:705 +#: neutron/plugins/ml2/managers.py:706 #, python-format msgid "Extended port dict for driver '%(drv)s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:138 +#: neutron/plugins/ml2/plugin.py:136 msgid "Modular L2 Plugin initialization complete" msgstr "" -#: neutron/plugins/ml2/plugin.py:197 +#: neutron/plugins/ml2/plugin.py:206 msgid "binding:profile value too large" msgstr "" -#: neutron/plugins/ml2/plugin.py:253 +#: neutron/plugins/ml2/plugin.py:262 #, python-format msgid "Failed to commit binding results for %(port)s after %(max)s tries" msgstr "" -#: neutron/plugins/ml2/plugin.py:259 +#: neutron/plugins/ml2/plugin.py:268 #, python-format msgid "Attempt %(count)s to bind port %(port)s" msgstr "" -#: neutron/plugins/ml2/plugin.py:385 +#: neutron/plugins/ml2/plugin.py:394 #, python-format msgid "Serialized vif_details DB value '%(value)s' for port %(port)s is invalid" msgstr "" -#: neutron/plugins/ml2/plugin.py:396 +#: neutron/plugins/ml2/plugin.py:405 #, python-format msgid "Serialized profile DB value '%(value)s' for port %(port)s is invalid" msgstr "" -#: neutron/plugins/ml2/plugin.py:465 +#: neutron/plugins/ml2/plugin.py:474 #, 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:499 +#: neutron/plugins/ml2/plugin.py:508 #, python-format msgid "mechanism_manager.create_network_postcommit failed, deleting network '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:562 +#: neutron/plugins/ml2/plugin.py:571 #, python-format msgid "Deleting network %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:583 +#: neutron/plugins/ml2/plugin.py:598 #, python-format msgid "Ports to auto-delete: %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:589 neutron/plugins/ml2/plugin.py:717 +#: neutron/plugins/ml2/plugin.py:604 neutron/plugins/ml2/plugin.py:732 msgid "Tenant-owned ports exist" msgstr "" -#: neutron/plugins/ml2/plugin.py:597 +#: neutron/plugins/ml2/plugin.py:612 #, python-format msgid "Subnets to auto-delete: %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:609 +#: neutron/plugins/ml2/plugin.py:624 #, python-format msgid "Deleting network record %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:614 neutron/plugins/ml2/plugin.py:729 +#: neutron/plugins/ml2/plugin.py:629 neutron/plugins/ml2/plugin.py:744 msgid "Committing transaction" msgstr "" -#: neutron/plugins/ml2/plugin.py:620 +#: neutron/plugins/ml2/plugin.py:635 msgid "A concurrent port creation has occurred" msgstr "" -#: neutron/plugins/ml2/plugin.py:629 +#: neutron/plugins/ml2/plugin.py:644 #, python-format msgid "Exception auto-deleting port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:637 +#: neutron/plugins/ml2/plugin.py:652 #, python-format msgid "Exception auto-deleting subnet %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:646 +#: neutron/plugins/ml2/plugin.py:661 msgid "mechanism_manager.delete_network_postcommit failed" msgstr "" -#: neutron/plugins/ml2/plugin.py:662 +#: neutron/plugins/ml2/plugin.py:677 #, python-format msgid "mechanism_manager.create_subnet_postcommit failed, deleting subnet '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:694 +#: neutron/plugins/ml2/plugin.py:709 #, python-format msgid "Deleting subnet %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:711 +#: neutron/plugins/ml2/plugin.py:726 #, python-format msgid "Ports to auto-deallocate: %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:726 +#: neutron/plugins/ml2/plugin.py:741 msgid "Deleting subnet record" msgstr "" -#: neutron/plugins/ml2/plugin.py:745 +#: neutron/plugins/ml2/plugin.py:760 #, python-format msgid "Exception deleting fixed_ip from port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:755 +#: neutron/plugins/ml2/plugin.py:770 msgid "mechanism_manager.delete_subnet_postcommit failed" msgstr "" -#: neutron/plugins/ml2/plugin.py:787 +#: neutron/plugins/ml2/plugin.py:806 #, python-format msgid "mechanism_manager.create_port_postcommit failed, deleting port '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:799 +#: neutron/plugins/ml2/plugin.py:818 #, python-format msgid "_bind_port_if_needed failed, deleting port '%s'" msgstr "" -#: neutron/plugins/ml2/plugin.py:881 +#: neutron/plugins/ml2/plugin.py:904 #, python-format msgid "No Host supplied to bind DVR Port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:941 -#: neutron/tests/unit/ml2/test_ml2_plugin.py:144 +#: neutron/plugins/ml2/plugin.py:968 +#: neutron/tests/unit/ml2/test_ml2_plugin.py:148 #, python-format msgid "Deleting port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:961 -#: neutron/tests/unit/ml2/test_ml2_plugin.py:145 +#: neutron/plugins/ml2/plugin.py:988 +#: neutron/tests/unit/ml2/test_ml2_plugin.py:149 #, python-format msgid "The port '%s' was deleted" msgstr "" -#: neutron/plugins/ml2/plugin.py:1010 +#: neutron/plugins/ml2/plugin.py:1043 #, python-format msgid "mechanism_manager.delete_port_postcommit failed for port %s" msgstr "" -#: neutron/plugins/ml2/plugin.py:1034 +#: neutron/plugins/ml2/plugin.py:1067 #, python-format msgid "Binding info for DVR port %s not found" msgstr "" -#: neutron/plugins/ml2/plugin.py:1060 +#: neutron/plugins/ml2/plugin.py:1093 #, python-format msgid "Port %(port)s updated up by agent not found" msgstr "" -#: neutron/plugins/ml2/plugin.py:1090 +#: neutron/plugins/ml2/plugin.py:1123 #, python-format msgid "Port %s not found during update" msgstr "" @@ -9056,6 +8813,11 @@ msgstr "" msgid "Device %(device)s no longer exists at agent %(agent_id)s" msgstr "" +#: neutron/plugins/ml2/rpc.py:130 neutron/plugins/ml2/rpc.py:154 +#, python-format +msgid "Device %(device)s not bound to the agent host %(host)s" +msgstr "" + #: neutron/plugins/ml2/rpc.py:148 #, python-format msgid "Device %(device)s up at agent %(agent_id)s" @@ -9074,7 +8836,6 @@ msgid "" msgstr "" #: neutron/plugins/ml2/drivers/mech_agent.py:54 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:327 #, python-format msgid "Attempting to bind port %(port)s on network %(network)s" msgstr "" @@ -9090,7 +8851,6 @@ msgid "Checking agent: %s" msgstr "" #: neutron/plugins/ml2/drivers/mech_agent.py:70 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:337 #, python-format msgid "Bound using segment: %s" msgstr "" @@ -9114,105 +8874,33 @@ msgid "" "tunnel_types: %(tunnel_types)s" msgstr "" -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:35 -msgid "CRD service Username" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:38 -msgid "CRD Service Password" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:40 -msgid "CRD Tenant Name" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:43 -msgid "CRD Auth URL" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:46 -msgid "URL for connecting to CRD service" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:49 -msgid "Timeout value for connecting to CRD service in seconds" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:53 -msgid "Region name for connecting to CRD Service in admin context" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:57 -msgid "If set, ignore any SSL validation issues" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:60 -msgid "Auth strategy for connecting to neutron in admin context" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:63 -msgid "Location of ca certificates file to use for CRD client requests." -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:87 -msgid "Initializing CRD client... " -msgstr "" - #: neutron/plugins/ml2/drivers/mechanism_ncs.py:29 msgid "HTTP URL of Tail-f NCS REST interface." msgstr "" #: neutron/plugins/ml2/drivers/mechanism_ncs.py:31 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:46 +#: neutron/plugins/ml2/drivers/mechanism_odl.py:41 msgid "HTTP username for authentication" msgstr "" #: neutron/plugins/ml2/drivers/mechanism_ncs.py:33 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:48 +#: neutron/plugins/ml2/drivers/mechanism_odl.py:43 msgid "HTTP password for authentication" msgstr "" #: neutron/plugins/ml2/drivers/mechanism_ncs.py:35 -#: neutron/plugins/ml2/drivers/mechanism_odl.py:50 +#: neutron/plugins/ml2/drivers/mechanism_odl.py:45 msgid "HTTP timeout in seconds." msgstr "" -#: neutron/plugins/ml2/drivers/mechanism_odl.py:44 +#: neutron/plugins/ml2/drivers/mechanism_odl.py:39 msgid "HTTP URL of OpenDaylight REST interface." msgstr "" -#: neutron/plugins/ml2/drivers/mechanism_odl.py:52 +#: neutron/plugins/ml2/drivers/mechanism_odl.py:47 msgid "Tomcat session timeout in minutes." msgstr "" -#: neutron/plugins/ml2/drivers/mechanism_odl.py:102 -#, python-format -msgid "Failed to authenticate with OpenDaylight: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:105 -#, python-format -msgid "Authentication Timed Out: %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:315 -#, python-format -msgid "ODL-----> sending URL (%s) <-----ODL" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:316 -#, python-format -msgid "ODL-----> sending JSON (%s) <-----ODL" -msgstr "" - -#: neutron/plugins/ml2/drivers/mechanism_odl.py:340 -#: neutron/plugins/ml2/drivers/mech_nuage/driver.py:94 -#, python-format -msgid "" -"Refusing to bind port for segment ID %(id)s, segment %(seg)s, phys net " -"%(physnet)s, and network type %(nettype)s" -msgstr "" - #: neutron/plugins/ml2/drivers/type_flat.py:31 msgid "" "List of physical_network names with which flat networks can be created. " @@ -9260,13 +8948,17 @@ msgstr "" msgid "No flat network found on physical network %s" msgstr "" -#: neutron/plugins/ml2/drivers/type_gre.py:34 +#: neutron/plugins/ml2/drivers/type_gre.py:35 msgid "" "Comma-separated list of : tuples enumerating ranges of " "GRE tunnel IDs that are available for tenant network allocation" msgstr "" -#: neutron/plugins/ml2/drivers/type_gre.py:126 +#: neutron/plugins/ml2/drivers/type_gre.py:75 +msgid "Failed to parse tunnel_id_ranges. Service terminated!" +msgstr "" + +#: neutron/plugins/ml2/drivers/type_gre.py:132 #, python-format msgid "Gre endpoint with ip %s already exists" msgstr "" @@ -9280,18 +8972,7 @@ msgstr "" msgid "%s prohibited for local provider network" msgstr "" -#: neutron/plugins/ml2/drivers/type_tunnel.py:76 -#, python-format -msgid "Invalid tunnel ID range: '%(range)s' - %(e)s. Agent terminated!" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:79 -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "" - #: neutron/plugins/ml2/drivers/type_tunnel.py:88 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:437 #, python-format msgid "provider:physical_network specified for %s network" msgstr "" @@ -9355,53 +9036,69 @@ msgstr "" msgid "Multicast group for VXLAN. If unset, disables VXLAN multicast mode." msgstr "" -#: neutron/plugins/ml2/drivers/type_vxlan.py:127 +#: neutron/plugins/ml2/drivers/type_vxlan.py:82 +msgid "Failed to parse vni_ranges. Service terminated!" +msgstr "" + +#: neutron/plugins/ml2/drivers/type_vxlan.py:132 msgid "get_vxlan_endpoints() called" msgstr "" -#: neutron/plugins/ml2/drivers/type_vxlan.py:137 +#: neutron/plugins/ml2/drivers/type_vxlan.py:142 #, python-format msgid "add_vxlan_endpoint() called for ip %s" msgstr "" -#: neutron/plugins/ml2/drivers/type_vxlan.py:146 +#: neutron/plugins/ml2/drivers/type_vxlan.py:151 #, python-format msgid "Vxlan endpoint with ip %s already exists" msgstr "" -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:32 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:29 #: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:32 msgid "Unable to reach EOS" msgstr "" -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:132 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:131 msgid "Required option primary_l3_host is not set" msgstr "" -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:138 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:137 msgid "VRFs are not supported MLAG config mode" msgstr "" -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:142 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:141 msgid "Required option secondary_l3_host is not set" msgstr "" -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:146 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:145 msgid "Required option primary_l3_host_username is not set" msgstr "" -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:327 -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:435 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:261 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:280 +#, python-format +msgid "Failed to create router %s on EOS" +msgstr "" + +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:322 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:354 +#, python-format +msgid "Failed to add interface to router %s on EOS" +msgstr "" + +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:372 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:453 #, python-format msgid "Executing command on Arista EOS: %s" msgstr "" -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:333 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:378 #, python-format msgid "Results of execution on Arista EOS: %s" msgstr "" -#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:336 +#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:381 #, python-format msgid "Error occured while trying to execute commands %(cmd)s on EOS %(host)s" msgstr "" @@ -9495,380 +9192,384 @@ msgid "" "field. If not set, a value of 180 seconds is assumed" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:75 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:76 #, python-format msgid "'timestamp' command '%s' is not available on EOS" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:317 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:330 #, python-format msgid "VM id %(vmid)s not found for port %(portid)s" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:336 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:349 #, python-format msgid "Unknown device owner: %s" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:450 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:468 #, python-format msgid "Error %(err)s while trying to execute commands %(cmd)s on EOS %(host)s" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:522 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:540 msgid "Required option eapi_host is not set" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:526 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:544 msgid "Required option eapi_username is not set" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:546 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:565 +msgid "Sync start trigger sent to EOS" +msgstr "" + +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:582 msgid "Syncing Neutron <-> EOS" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:552 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:588 msgid "OpenStack and EOS are in sync!" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:574 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:610 #, python-format msgid "" "No Tenants configured in Neutron DB. But %d tenants discovered in EOS " "during synchronization.Entire EOS region is cleared" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:739 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:775 #, python-format msgid "Network %s is not created as it is not found inArista DB" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:753 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:789 #, python-format msgid "Network name changed to %s" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:781 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:817 #, python-format msgid "Network %s is not updated as it is not found inArista DB" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:873 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:909 #, 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:888 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:924 #, python-format msgid "Port name changed to %s" msgstr "" -#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:938 +#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:974 #, python-format msgid "VM %s is not updated as it is not found in Arista DB" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:40 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:37 msgid "Allowed physical networks" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:42 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:39 msgid "OS Type of the switch" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:44 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:41 msgid "OS Version number" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:95 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:92 msgid "Virtual Fabric: enabled" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:97 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:94 msgid "Virtual Fabric: not enabled" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:135 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:132 msgid "" "Brocade Mechanism: failed to create network, network cannot be created in" " the configured physical network" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:141 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:138 msgid "" "Brocade Mechanism: failed to create network, only network type vlan is " "supported" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:149 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:146 msgid "Brocade Mechanism: failed to create network in db" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:151 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:148 msgid "Brocade Mechanism: create_network_precommit failed" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:153 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:150 #, python-format msgid "" "create network (precommit): %(network_id)s of network type = " "%(network_type)s with vlan = %(vlan_id)s for tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:165 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:162 msgid "create_network_postcommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:185 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:182 msgid "Brocade NOS driver: failed in create network" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:188 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:185 msgid "Brocade Mechanism: create_network_postcommmit failed" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:190 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:187 #, python-format msgid "" "created network (postcommit): %(network_id)s of network type = " "%(network_type)s with vlan = %(vlan_id)s for tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:202 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:199 msgid "delete_network_precommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:215 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:212 msgid "Brocade Mechanism: failed to delete network in db" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:217 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:214 msgid "Brocade Mechanism: delete_network_precommit failed" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:219 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:216 #, python-format msgid "" "delete network (precommit): %(network_id)s with vlan = %(vlan_id)s for " "tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:231 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:228 msgid "delete_network_postcommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:243 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:240 msgid "Brocade NOS driver: failed to delete network" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:245 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:242 msgid "Brocade switch exception, delete_network_postcommit failed" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:248 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:245 #, python-format msgid "" "delete network (postcommit): %(network_id)s with vlan = %(vlan_id)s for " "tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:266 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:263 msgid "create_port_precommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:284 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:281 msgid "Brocade Mechanism: failed to create port in db" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:286 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:283 msgid "Brocade Mechanism: create_port_precommit failed" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:291 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:288 msgid "create_port_postcommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:315 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:312 #, python-format msgid "Brocade NOS driver: failed to associate mac %s" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:318 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:315 msgid "Brocade switch exception: create_port_postcommit failed" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:321 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:318 #, python-format msgid "" "created port (postcommit): port_id=%(port_id)s network_id=%(network_id)s " "tenant_id=%(tenant_id)s" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:329 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:326 msgid "delete_port_precommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:338 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:335 msgid "Brocade Mechanism: failed to delete port in db" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:340 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:337 msgid "Brocade Mechanism: delete_port_precommit failed" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:345 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:342 msgid "delete_port_postcommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:369 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:366 #, python-format msgid "Brocade NOS driver: failed to dissociate MAC %s" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:372 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:369 msgid "Brocade switch exception, delete_port_postcommit failed" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:375 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:372 #, python-format msgid "" "delete port (postcommit): port_id=%(port_id)s network_id=%(network_id)s " "tenant_id=%(tenant_id)s" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:382 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:379 msgid "update_port_precommit(self: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:386 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:383 msgid "update_port_postcommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:390 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:387 msgid "create_subnetwork_precommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:394 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:391 msgid "create_subnetwork_postcommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:398 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:395 msgid "delete_subnetwork_precommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:402 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:399 msgid "delete_subnetwork_postcommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:406 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:403 msgid "update_subnet_precommit(self: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:410 +#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:407 msgid "update_subnet_postcommit: called" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:77 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:73 msgid "" "Brocade Switch IP address is not set, check config ml2_conf_brocade.ini " "file" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:88 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:84 msgid "Connect failed to switch" msgstr "" -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:107 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:117 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:145 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:162 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:175 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:188 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:355 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:374 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:388 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:401 -#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:414 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:103 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:113 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:141 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:158 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:171 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:184 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:351 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:370 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:384 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:397 +#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:410 msgid "NETCONF error" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:30 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:28 msgid "Prefix for APIC domain/names/profiles created" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:40 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:38 msgid "An ordered list of host names or IP addresses of the APIC controller(s)." msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:43 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:41 msgid "Username for the APIC controller" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:45 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:43 msgid "Password for the APIC controller" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:48 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:46 msgid "Name mapping strategy to use: use_uuid | use_name" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:50 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:48 msgid "Use SSL to connect to the APIC controller" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:53 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:51 msgid "Name for the domain created on APIC" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:56 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:54 msgid "Name for the app profile used for Openstack" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:59 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:57 msgid "Name for the vlan namespace to be used for Openstack" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:62 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:60 msgid "Name of the node profile to be created" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:65 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:63 msgid "Name of the entity profile to be created" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:68 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:66 msgid "Name of the function profile to be created" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:71 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:69 msgid "Name of the LACP profile to be created" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:74 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:72 msgid "The uplink ports to check for ACI connectivity" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:77 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:75 msgid "The switch pairs for VPC connectivity" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:80 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:78 msgid "Range of VLAN's to be used for Openstack" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:83 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:81 msgid "Setup root helper as rootwrap or sudo" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:86 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:84 msgid "Synchronization interval in seconds" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:89 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:87 msgid "Interval between agent status updates (in sec)" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/config.py:92 +#: neutron/plugins/ml2/drivers/cisco/apic/config.py:90 msgid "Interval between agent poll for topology (in sec)" msgstr "" @@ -9947,68 +9648,119 @@ msgstr "" msgid "NexusDriver created VLAN: %s" msgstr "" -#: neutron/plugins/ml2/drivers/l2pop/config.py:25 +#: neutron/plugins/ml2/drivers/freescale/config.py:29 +msgid "CRD service Username." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:32 +msgid "CRD Service Password." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:34 +msgid "CRD Tenant Name." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:37 +msgid "CRD Auth URL." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:40 +msgid "URL for connecting to CRD service." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:43 +msgid "Timeout value for connecting to CRD service in seconds." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:47 +msgid "Region name for connecting to CRD Service in admin context." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:51 +msgid "If set, ignore any SSL validation issues." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:54 +msgid "Auth strategy for connecting to neutron in admin context." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/config.py:57 +msgid "Location of ca certificates file to use for CRD client requests." +msgstr "" + +#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:38 +msgid "Initializing CRD client... " +msgstr "" + +#: neutron/plugins/ml2/drivers/l2pop/config.py:21 msgid "" "Delay within which agent is expected to update existing ports whent it " "restarts" msgstr "" -#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:42 +#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:38 msgid "Experimental L2 population driver" msgstr "" -#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:167 +#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:149 msgid "Unable to retrieve the agent ip, check the agent configuration." msgstr "" -#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:173 +#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:155 #, python-format msgid "Port %(port)s updated by agent %(agent)s isn't bound to any segment" msgstr "" -#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:226 +#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:208 #, python-format msgid "" "Unable to retrieve the agent ip, check the agent %(agent_host)s " "configuration." msgstr "" -#: neutron/plugins/ml2/drivers/l2pop/rpc.py:40 +#: neutron/plugins/ml2/drivers/l2pop/rpc.py:36 #, python-format msgid "" "Fanout notify l2population agents at %(topic)s the message %(method)s " "with %(fdb_entries)s" msgstr "" -#: neutron/plugins/ml2/drivers/l2pop/rpc.py:51 +#: neutron/plugins/ml2/drivers/l2pop/rpc.py:47 #, python-format msgid "" "Notify l2population agent %(host)s at %(topic)s the message %(method)s " "with %(fdb_entries)s" msgstr "" -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:54 +#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:52 msgid "Initializing driver" msgstr "" -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:72 +#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:70 msgid "Initialization done" msgstr "" -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:133 +#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:137 msgid "Ignoring port notification to controller because of missing host ID." msgstr "" -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:202 +#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:206 #, python-format msgid "No cache entry for host %s" msgstr "" -#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:207 +#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:211 #, python-format msgid "Expired cache entry for host %s" msgstr "" +#: neutron/plugins/ml2/drivers/mech_nuage/driver.py:91 +#, python-format +msgid "" +"Refusing to bind port for segment ID %(id)s, segment %(seg)s, phys net " +"%(physnet)s, and network type %(nettype)s" +msgstr "" + #: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:31 msgid "" "Supported PCI vendor devices, defined by vendor_id:product_id according " @@ -10061,60 +9813,81 @@ msgstr "" msgid "Sending update port message" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:121 +#: neutron/plugins/mlnx/mlnx_plugin.py:118 msgid "Mellanox Embedded Switch Plugin initialisation complete" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:161 +#: neutron/plugins/mlnx/mlnx_plugin.py:158 #, python-format msgid "Invalid physical network type %(type)s.Server terminated!" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:168 +#: neutron/plugins/mlnx/mlnx_plugin.py:165 #, python-format msgid "Parsing physical_network_type failed: %s. Server terminated!" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:173 +#: neutron/plugins/mlnx/mlnx_plugin.py:170 #, python-format msgid "" "Invalid physical network type %(type)s for network %(net)s. Server " "terminated!" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:177 +#: neutron/plugins/mlnx/mlnx_plugin.py:174 #, python-format msgid "Physical Network type mappings: %s" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:185 -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:364 +#: neutron/plugins/mlnx/mlnx_plugin.py:182 #, python-format msgid "%s. Server terminated!" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:323 +#: neutron/plugins/mlnx/mlnx_plugin.py:204 +#, python-format +msgid "Invalid tenant_network_type: %s. Service terminated!" +msgstr "" + +#: neutron/plugins/mlnx/mlnx_plugin.py:248 +msgid "provider:segmentation_id specified for flat network" +msgstr "" + +#: neutron/plugins/mlnx/mlnx_plugin.py:256 +#, python-format +msgid "provider:segmentation_id out of range (%(min_id)s through %(max_id)s)" +msgstr "" + +#: neutron/plugins/mlnx/mlnx_plugin.py:264 +msgid "provider:physical_network specified for local network" +msgstr "" + +#: neutron/plugins/mlnx/mlnx_plugin.py:268 +msgid "provider:segmentation_id specified for local network" +msgstr "" + +#: neutron/plugins/mlnx/mlnx_plugin.py:320 #, python-format msgid "Unsupported vnic type %(vnic_type)s for physical network type %(net_type)s" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:327 +#: neutron/plugins/mlnx/mlnx_plugin.py:324 msgid "Invalid vnic_type on port_create" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:329 +#: neutron/plugins/mlnx/mlnx_plugin.py:326 msgid "vnic_type is not defined in port profile" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:373 +#: neutron/plugins/mlnx/mlnx_plugin.py:370 msgid "Update network" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:386 +#: neutron/plugins/mlnx/mlnx_plugin.py:383 msgid "Delete network" msgstr "" -#: neutron/plugins/mlnx/mlnx_plugin.py:434 +#: neutron/plugins/mlnx/mlnx_plugin.py:431 #, python-format msgid "create_port with %s" msgstr "" @@ -10260,7 +10033,7 @@ msgstr "" msgid "Port Release for %(port_mac)s on fabric %(fabric)s" msgstr "" -#: neutron/plugins/mlnx/common/comm_utils.py:57 +#: neutron/plugins/mlnx/common/comm_utils.py:56 #, python-format msgid "Request timeout - call again after %s seconds" msgstr "" @@ -10351,6 +10124,10 @@ msgstr "" msgid "vlan_id %(seg_id)s on physical network %(phy_net)s not found" msgstr "" +#: neutron/plugins/mlnx/db/mlnx_db_v2.py:212 +msgid "get_port_from_device() called" +msgstr "" + #: neutron/plugins/mlnx/db/mlnx_db_v2.py:239 msgid "Get_port_from_device_mac() called" msgstr "" @@ -10360,112 +10137,112 @@ msgstr "" msgid "Set_port_status as %s called" msgstr "" -#: neutron/plugins/nec/nec_plugin.py:206 +#: neutron/plugins/nec/nec_plugin.py:204 #, python-format msgid "_cleanup_ofc_tenant: No OFC tenant for %s" msgstr "" -#: neutron/plugins/nec/nec_plugin.py:209 +#: neutron/plugins/nec/nec_plugin.py:207 #, python-format msgid "delete_ofc_tenant() failed due to %s" msgstr "" -#: neutron/plugins/nec/nec_plugin.py:225 +#: neutron/plugins/nec/nec_plugin.py:223 msgid "activate_port_if_ready(): skip, port.admin_state_up is False." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:229 +#: neutron/plugins/nec/nec_plugin.py:227 msgid "activate_port_if_ready(): skip, network.admin_state_up is False." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:233 +#: neutron/plugins/nec/nec_plugin.py:231 msgid "activate_port_if_ready(): skip, no portinfo for this port." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:237 +#: neutron/plugins/nec/nec_plugin.py:235 msgid "activate_port_if_ready(): skip, ofc_port already exists." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:245 +#: neutron/plugins/nec/nec_plugin.py:243 #, python-format msgid "create_ofc_port() failed due to %s" msgstr "" -#: neutron/plugins/nec/nec_plugin.py:258 +#: neutron/plugins/nec/nec_plugin.py:256 #, python-format msgid "deactivate_port(): skip, ofc_port for port=%s does not exist." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:277 +#: neutron/plugins/nec/nec_plugin.py:275 #, python-format msgid "deactivate_port(): OFC port for port=%s is already removed." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:285 +#: neutron/plugins/nec/nec_plugin.py:283 #, python-format msgid "Failed to delete port=%(port)s from OFC: %(exc)s" msgstr "" -#: neutron/plugins/nec/nec_plugin.py:304 +#: neutron/plugins/nec/nec_plugin.py:302 #, python-format msgid "NECPluginV2.create_network() called, network=%s ." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:321 +#: neutron/plugins/nec/nec_plugin.py:319 #, python-format msgid "Failed to create network id=%(id)s on OFC: %(exc)s" msgstr "" -#: neutron/plugins/nec/nec_plugin.py:337 +#: neutron/plugins/nec/nec_plugin.py:335 #, python-format msgid "NECPluginV2.update_network() called, id=%(id)s network=%(network)s ." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:381 +#: neutron/plugins/nec/nec_plugin.py:379 #, python-format msgid "NECPluginV2.delete_network() called, id=%s ." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:415 +#: neutron/plugins/nec/nec_plugin.py:413 #, python-format msgid "delete_network() failed due to %s" msgstr "" -#: neutron/plugins/nec/nec_plugin.py:556 +#: neutron/plugins/nec/nec_plugin.py:554 #, python-format msgid "NECPluginV2.create_port() called, port=%s ." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:620 +#: neutron/plugins/nec/nec_plugin.py:618 #, python-format msgid "NECPluginV2.update_port() called, id=%(id)s port=%(port)s ." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:648 +#: neutron/plugins/nec/nec_plugin.py:646 #, python-format msgid "NECPluginV2.delete_port() called, id=%s ." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:715 +#: neutron/plugins/nec/nec_plugin.py:713 #, python-format msgid "NECPluginV2RPCCallbacks.update_ports() called, kwargs=%s ." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:725 +#: neutron/plugins/nec/nec_plugin.py:723 #, python-format msgid "" "update_ports(): ignore unchanged portinfo in port_added message " "(port_id=%s)." msgstr "" -#: neutron/plugins/nec/nec_plugin.py:745 +#: neutron/plugins/nec/nec_plugin.py:743 #, python-format msgid "" "update_ports(): ignore port_removed message due to portinfo for " "port_id=%s was not registered" msgstr "" -#: neutron/plugins/nec/nec_plugin.py:750 +#: neutron/plugins/nec/nec_plugin.py:748 #, python-format msgid "" "update_ports(): ignore port_removed message received from different host " @@ -10473,361 +10250,360 @@ msgid "" "received_datapath_id=%(received)s)." msgstr "" -#: neutron/plugins/nec/nec_router.py:58 +#: neutron/plugins/nec/nec_router.py:56 #, python-format msgid "RouterMixin.create_router() called, router=%s ." msgstr "" -#: neutron/plugins/nec/nec_router.py:84 +#: neutron/plugins/nec/nec_router.py:82 #, python-format msgid "RouterMixin.update_router() called, id=%(id)s, router=%(router)s ." msgstr "" -#: neutron/plugins/nec/nec_router.py:102 +#: neutron/plugins/nec/nec_router.py:100 #, python-format msgid "RouterMixin.delete_router() called, id=%s." msgstr "" -#: neutron/plugins/nec/nec_router.py:121 +#: neutron/plugins/nec/nec_router.py:119 #, python-format msgid "" "RouterMixin.add_router_interface() called, id=%(id)s, " "interface=%(interface)s." msgstr "" -#: neutron/plugins/nec/nec_router.py:128 +#: neutron/plugins/nec/nec_router.py:126 #, python-format msgid "" "RouterMixin.remove_router_interface() called, id=%(id)s, " "interface=%(interface)s." msgstr "" -#: neutron/plugins/nec/nec_router.py:311 +#: neutron/plugins/nec/nec_router.py:310 #, python-format msgid "" "OFC does not support router with provider=%(provider)s, so removed it " "from supported provider (new router driver map=%(driver_map)s)" msgstr "" -#: neutron/plugins/nec/nec_router.py:319 +#: neutron/plugins/nec/nec_router.py:318 #, python-format msgid "" "default_router_provider %(default)s is supported! Please specify one of " "%(supported)s" msgstr "" -#: neutron/plugins/nec/nec_router.py:333 +#: neutron/plugins/nec/nec_router.py:332 #, python-format msgid "Enabled router drivers: %s" msgstr "" -#: neutron/plugins/nec/nec_router.py:336 +#: neutron/plugins/nec/nec_router.py:335 #, python-format msgid "" "No router provider is enabled. neutron-server terminated! " "(supported=%(supported)s, configured=%(config)s)" msgstr "" -#: neutron/plugins/nec/packet_filter.py:40 +#: neutron/plugins/nec/packet_filter.py:39 msgid "Disabled packet-filter extension." msgstr "" -#: neutron/plugins/nec/packet_filter.py:45 +#: neutron/plugins/nec/packet_filter.py:44 #, python-format msgid "create_packet_filter() called, packet_filter=%s ." msgstr "" -#: neutron/plugins/nec/packet_filter.py:61 +#: neutron/plugins/nec/packet_filter.py:60 #, python-format msgid "update_packet_filter() called, id=%(id)s packet_filter=%(packet_filter)s ." msgstr "" -#: neutron/plugins/nec/packet_filter.py:134 -#: neutron/plugins/nec/packet_filter.py:187 +#: neutron/plugins/nec/packet_filter.py:133 +#: neutron/plugins/nec/packet_filter.py:186 #, python-format msgid "Failed to create packet_filter id=%(id)s on OFC: %(exc)s" msgstr "" -#: neutron/plugins/nec/packet_filter.py:144 +#: neutron/plugins/nec/packet_filter.py:143 #, python-format msgid "delete_packet_filter() called, id=%s ." msgstr "" -#: neutron/plugins/nec/packet_filter.py:162 +#: neutron/plugins/nec/packet_filter.py:161 #, python-format msgid "activate_packet_filter_if_ready() called, packet_filter=%s." msgstr "" -#: neutron/plugins/nec/packet_filter.py:171 +#: neutron/plugins/nec/packet_filter.py:170 #, python-format msgid "" "activate_packet_filter_if_ready(): skip pf_id=%s, " "packet_filter.admin_state_up is False." msgstr "" -#: neutron/plugins/nec/packet_filter.py:174 +#: neutron/plugins/nec/packet_filter.py:173 #, python-format msgid "" "activate_packet_filter_if_ready(): skip pf_id=%s, no portinfo for the " "in_port." msgstr "" -#: neutron/plugins/nec/packet_filter.py:177 +#: neutron/plugins/nec/packet_filter.py:176 msgid "" "_activate_packet_filter_if_ready(): skip, ofc_packet_filter already " "exists." msgstr "" -#: neutron/plugins/nec/packet_filter.py:180 +#: neutron/plugins/nec/packet_filter.py:179 #, python-format msgid "activate_packet_filter_if_ready(): create packet_filter id=%s on OFC." msgstr "" -#: neutron/plugins/nec/packet_filter.py:200 +#: neutron/plugins/nec/packet_filter.py:199 #, python-format msgid "deactivate_packet_filter_if_ready() called, packet_filter=%s." msgstr "" -#: neutron/plugins/nec/packet_filter.py:205 +#: neutron/plugins/nec/packet_filter.py:204 #, python-format msgid "" "deactivate_packet_filter(): skip, Not found OFC Mapping for packet_filter" " id=%s." msgstr "" -#: neutron/plugins/nec/packet_filter.py:210 +#: neutron/plugins/nec/packet_filter.py:209 #, python-format msgid "deactivate_packet_filter(): deleting packet_filter id=%s from OFC." msgstr "" -#: neutron/plugins/nec/packet_filter.py:219 +#: neutron/plugins/nec/packet_filter.py:218 #, python-format msgid "Failed to delete packet_filter id=%(id)s from OFC: %(exc)s" msgstr "" -#: neutron/plugins/nec/packet_filter.py:250 +#: neutron/plugins/nec/packet_filter.py:249 #, python-format msgid "Error occurred while disabling packet filter(s) for port %s" msgstr "" -#: neutron/plugins/nec/router_drivers.py:125 +#: neutron/plugins/nec/router_drivers.py:123 #, python-format msgid "create_router() failed due to %s" msgstr "" -#: neutron/plugins/nec/router_drivers.py:154 +#: neutron/plugins/nec/router_drivers.py:152 #, python-format msgid "_update_ofc_routes() failed due to %s" msgstr "" -#: neutron/plugins/nec/router_drivers.py:169 +#: neutron/plugins/nec/router_drivers.py:167 #, python-format msgid "delete_router() failed due to %s" msgstr "" -#: neutron/plugins/nec/router_drivers.py:180 +#: neutron/plugins/nec/router_drivers.py:178 #, python-format msgid "" "RouterOpenFlowDriver.add_interface(): the requested port has no subnet. " "add_interface() is skipped. router_id=%(id)s, port=%(port)s)" msgstr "" -#: neutron/plugins/nec/router_drivers.py:200 +#: neutron/plugins/nec/router_drivers.py:198 #, python-format msgid "add_router_interface() failed due to %s" msgstr "" -#: neutron/plugins/nec/router_drivers.py:218 +#: neutron/plugins/nec/router_drivers.py:216 #, python-format msgid "delete_router_interface() failed due to %s" msgstr "" -#: neutron/plugins/nec/agent/nec_neutron_agent.py:53 +#: neutron/plugins/nec/agent/nec_neutron_agent.py:51 #, python-format msgid "Update ports: added=%(added)s, removed=%(removed)s" msgstr "" -#: neutron/plugins/nec/agent/nec_neutron_agent.py:76 -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:51 +#: neutron/plugins/nec/agent/nec_neutron_agent.py:74 +#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:49 #, python-format msgid "port_update received: %s" msgstr "" -#: neutron/plugins/nec/agent/nec_neutron_agent.py:220 +#: neutron/plugins/nec/agent/nec_neutron_agent.py:218 msgid "No port changed." msgstr "" -#: neutron/plugins/nec/common/config.py:35 +#: neutron/plugins/nec/common/config.py:34 msgid "Host to connect to." msgstr "" -#: neutron/plugins/nec/common/config.py:37 +#: neutron/plugins/nec/common/config.py:36 msgid "Base URL of OFC REST API. It is prepended to each API request." msgstr "" -#: neutron/plugins/nec/common/config.py:40 +#: neutron/plugins/nec/common/config.py:39 msgid "Port to connect to." msgstr "" -#: neutron/plugins/nec/common/config.py:42 +#: neutron/plugins/nec/common/config.py:41 msgid "Driver to use." msgstr "" -#: neutron/plugins/nec/common/config.py:44 +#: neutron/plugins/nec/common/config.py:43 msgid "Enable packet filter." msgstr "" -#: neutron/plugins/nec/common/config.py:46 +#: neutron/plugins/nec/common/config.py:45 msgid "Use SSL to connect." msgstr "" -#: neutron/plugins/nec/common/config.py:48 +#: neutron/plugins/nec/common/config.py:47 msgid "Location of key file." msgstr "" -#: neutron/plugins/nec/common/config.py:50 +#: neutron/plugins/nec/common/config.py:49 msgid "Location of certificate file." msgstr "" -#: neutron/plugins/nec/common/config.py:52 +#: neutron/plugins/nec/common/config.py:51 msgid "Disable SSL certificate verification." msgstr "" -#: neutron/plugins/nec/common/config.py:54 +#: neutron/plugins/nec/common/config.py:53 msgid "" "Maximum attempts per OFC API request. NEC plugin retries API request to " "OFC when OFC returns ServiceUnavailable (503). The value must be greater " "than 0." msgstr "" -#: neutron/plugins/nec/common/config.py:63 +#: neutron/plugins/nec/common/config.py:62 msgid "Default router provider to use." msgstr "" -#: neutron/plugins/nec/common/config.py:66 +#: neutron/plugins/nec/common/config.py:65 msgid "List of enabled router providers." msgstr "" -#: neutron/plugins/nec/common/exceptions.py:20 +#: neutron/plugins/nec/common/exceptions.py:19 #, python-format msgid "An OFC exception has occurred: %(reason)s" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:30 +#: neutron/plugins/nec/common/exceptions.py:29 #, python-format msgid "The specified OFC resource (%(resource)s) is not found." msgstr "" -#: neutron/plugins/nec/common/exceptions.py:34 +#: neutron/plugins/nec/common/exceptions.py:33 #, python-format msgid "An exception occurred in NECPluginV2 DB: %(reason)s" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:38 +#: neutron/plugins/nec/common/exceptions.py:37 #, python-format msgid "" "Neutron-OFC resource mapping for %(resource)s %(neutron_id)s is not " "found. It may be deleted during processing." msgstr "" -#: neutron/plugins/nec/common/exceptions.py:44 +#: neutron/plugins/nec/common/exceptions.py:43 #, python-format msgid "OFC returns Server Unavailable (503) (Retry-After=%(retry_after)s)" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:53 +#: neutron/plugins/nec/common/exceptions.py:52 #, python-format msgid "PortInfo %(id)s could not be found" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:57 +#: neutron/plugins/nec/common/exceptions.py:56 msgid "" "Invalid input for operation: datapath_id should be a hex string with at " "most 8 bytes" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:63 +#: neutron/plugins/nec/common/exceptions.py:62 msgid "Invalid input for operation: port_no should be [0:65535]" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:68 +#: neutron/plugins/nec/common/exceptions.py:67 #, python-format msgid "Router (provider=%(provider)s) does not support an external network" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:73 +#: neutron/plugins/nec/common/exceptions.py:72 #, python-format msgid "Provider %(provider)s could not be found" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:77 +#: neutron/plugins/nec/common/exceptions.py:76 #, python-format msgid "Cannot create more routers with provider=%(provider)s" msgstr "" -#: neutron/plugins/nec/common/exceptions.py:81 +#: neutron/plugins/nec/common/exceptions.py:80 #, python-format msgid "" "Provider of Router %(router_id)s is %(provider)s. This operation is " "supported only for router provider %(expected_provider)s." msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:54 +#: neutron/plugins/nec/common/ofc_client.py:53 #, python-format msgid "Operation on OFC failed: %(status)s%(msg)s" msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:78 +#: neutron/plugins/nec/common/ofc_client.py:77 #, python-format msgid "Client request: %(host)s:%(port)s %(method)s %(action)s [%(body)s]" msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:87 +#: neutron/plugins/nec/common/ofc_client.py:86 #, python-format msgid "OFC returns [%(status)s:%(data)s]" msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:104 +#: neutron/plugins/nec/common/ofc_client.py:103 #, python-format msgid "OFC returns ServiceUnavailable (retry-after=%s)" msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:108 +#: neutron/plugins/nec/common/ofc_client.py:107 #, python-format msgid "Specified resource %s does not exist on OFC " msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:112 +#: neutron/plugins/nec/common/ofc_client.py:111 #, python-format msgid "Operation on OFC failed: status=%(status)s, detail=%(detail)s" msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:115 +#: neutron/plugins/nec/common/ofc_client.py:114 msgid "Operation on OFC failed" msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:124 +#: neutron/plugins/nec/common/ofc_client.py:123 #, python-format msgid "Failed to connect OFC : %s" msgstr "" -#: neutron/plugins/nec/common/ofc_client.py:140 +#: neutron/plugins/nec/common/ofc_client.py:139 #, python-format msgid "Waiting for %s seconds due to OFC Service_Unavailable." msgstr "" -#: neutron/plugins/nec/db/api.py:103 +#: neutron/plugins/nec/db/api.py:102 #, python-format msgid "del_ofc_item(): NotFound item (resource=%(resource)s, id=%(id)s) " msgstr "" -#: neutron/plugins/nec/db/api.py:137 +#: neutron/plugins/nec/db/api.py:136 #, python-format msgid "del_portinfo(): NotFound portinfo for port_id: %s" msgstr "" -#: neutron/plugins/nec/db/api.py:158 -#: neutron/plugins/openvswitch/ovs_db_v2.py:317 +#: neutron/plugins/nec/db/api.py:157 #, python-format msgid "get_port_with_securitygroups() called:port_id=%s" msgstr "" @@ -10837,257 +10613,257 @@ msgstr "" msgid "Add provider binding (router=%(router_id)s, provider=%(provider)s)" msgstr "" -#: neutron/plugins/nec/drivers/__init__.py:36 +#: neutron/plugins/nec/drivers/__init__.py:35 #, python-format msgid "Loading OFC driver: %s" msgstr "" -#: neutron/plugins/nec/drivers/pfc.py:33 +#: neutron/plugins/nec/drivers/pfc.py:31 #, python-format msgid "OFC %(resource)s ID has an invalid format: %(ofc_id)s" msgstr "" -#: neutron/plugins/nec/extensions/packetfilter.py:33 +#: neutron/plugins/nec/extensions/packetfilter.py:30 msgid "Number of packet_filters allowed per tenant, -1 for unlimited" msgstr "" -#: neutron/plugins/nec/extensions/packetfilter.py:40 +#: neutron/plugins/nec/extensions/packetfilter.py:37 #, python-format msgid "PacketFilter %(id)s could not be found" msgstr "" -#: neutron/plugins/nec/extensions/packetfilter.py:44 +#: neutron/plugins/nec/extensions/packetfilter.py:41 #, python-format msgid "" "IP version %(version)s is not supported for %(field)s (%(value)s is " "specified)" msgstr "" -#: neutron/plugins/nec/extensions/packetfilter.py:49 +#: neutron/plugins/nec/extensions/packetfilter.py:46 #, python-format msgid "Packet Filter priority should be %(min)s-%(max)s (included)" msgstr "" -#: neutron/plugins/nec/extensions/packetfilter.py:53 +#: neutron/plugins/nec/extensions/packetfilter.py:50 #, python-format msgid "%(field)s field cannot be updated" msgstr "" -#: neutron/plugins/nec/extensions/packetfilter.py:57 +#: neutron/plugins/nec/extensions/packetfilter.py:54 #, python-format msgid "" "The backend does not support duplicated priority. Priority %(priority)s " "is in use" msgstr "" -#: neutron/plugins/nec/extensions/packetfilter.py:62 +#: neutron/plugins/nec/extensions/packetfilter.py:59 #, python-format msgid "" "Ether Type '%(eth_type)s' conflicts with protocol '%(protocol)s'. Update " "or clear protocol before changing ether type." msgstr "" -#: neutron/plugins/nuage/plugin.py:109 +#: neutron/plugins/nuage/plugin.py:113 #, python-format msgid "%(resource)s with id %(resource_id)s does not exist" msgstr "" -#: neutron/plugins/nuage/plugin.py:118 +#: neutron/plugins/nuage/plugin.py:122 #, python-format msgid "" "Either %(resource)s %(req_resource)s not found or you dont have " "credential to access it" msgstr "" -#: neutron/plugins/nuage/plugin.py:124 +#: neutron/plugins/nuage/plugin.py:128 #, python-format msgid "" "More than one entry found for %(resource)s %(req_resource)s. Use id " "instead" msgstr "" -#: neutron/plugins/nuage/plugin.py:154 +#: neutron/plugins/nuage/plugin.py:158 #, python-format msgid "Router for subnet %s not found " msgstr "" -#: neutron/plugins/nuage/plugin.py:271 +#: neutron/plugins/nuage/plugin.py:275 #, python-format msgid "Subnet %s not found on VSD" msgstr "" -#: neutron/plugins/nuage/plugin.py:416 +#: neutron/plugins/nuage/plugin.py:422 #, python-format msgid "provider:network_type %s not supported in VSP" msgstr "" -#: neutron/plugins/nuage/plugin.py:461 +#: neutron/plugins/nuage/plugin.py:469 msgid "External network with subnets can not be changed to non-external network" msgstr "" -#: neutron/plugins/nuage/plugin.py:539 +#: neutron/plugins/nuage/plugin.py:530 msgid "" "Either net_partition is not provided with subnet OR default net_partition" " is not created at the start" msgstr "" -#: neutron/plugins/nuage/plugin.py:556 +#: neutron/plugins/nuage/plugin.py:547 #, python-format msgid "Only one subnet is allowed per Provider network %s" msgstr "" -#: neutron/plugins/nuage/plugin.py:567 +#: neutron/plugins/nuage/plugin.py:558 #, python-format msgid "Only one subnet is allowed per external network %s" msgstr "" -#: neutron/plugins/nuage/plugin.py:697 +#: neutron/plugins/nuage/plugin.py:694 #, python-format msgid "" "Unable to complete operation on subnet %s.One or more ports have an IP " "allocation from this subnet." msgstr "" -#: neutron/plugins/nuage/plugin.py:724 +#: neutron/plugins/nuage/plugin.py:721 #, python-format msgid "" "Router %s does not hold default zone OR domain in VSD. Router-IF add " "failed" msgstr "" -#: neutron/plugins/nuage/plugin.py:736 +#: neutron/plugins/nuage/plugin.py:733 #, python-format msgid "Subnet %s does not hold Nuage VSD reference. Router-IF add failed" msgstr "" -#: neutron/plugins/nuage/plugin.py:746 +#: neutron/plugins/nuage/plugin.py:743 #, python-format msgid "" "Subnet %(subnet)s and Router %(router)s belong to different net_partition" " Router-IF add not permitted" msgstr "" -#: neutron/plugins/nuage/plugin.py:757 +#: neutron/plugins/nuage/plugin.py:754 #, python-format msgid "Subnet %s has one or more active VMs Router-IF add not permitted" msgstr "" -#: neutron/plugins/nuage/plugin.py:809 neutron/plugins/nuage/plugin.py:814 -#: neutron/plugins/nuage/plugin.py:820 +#: neutron/plugins/nuage/plugin.py:806 neutron/plugins/nuage/plugin.py:811 +#: neutron/plugins/nuage/plugin.py:817 #, python-format msgid "No router interface found for Router %s. Router-IF delete failed" msgstr "" -#: neutron/plugins/nuage/plugin.py:836 +#: neutron/plugins/nuage/plugin.py:833 #, python-format msgid "Subnet %s has one or more active VMs Router-IF delete not permitted" msgstr "" -#: neutron/plugins/nuage/plugin.py:845 +#: neutron/plugins/nuage/plugin.py:842 #, python-format msgid "" "Router %s does not hold net_partition assoc on Nuage VSD. Router-IF " "delete failed" msgstr "" -#: neutron/plugins/nuage/plugin.py:886 +#: neutron/plugins/nuage/plugin.py:883 msgid "" "Either net_partition is not provided with router OR default net_partition" " is not created at the start" msgstr "" -#: neutron/plugins/nuage/plugin.py:927 +#: neutron/plugins/nuage/plugin.py:924 msgid "for same subnet, multiple static routes not allowed" msgstr "" -#: neutron/plugins/nuage/plugin.py:944 +#: neutron/plugins/nuage/plugin.py:941 #, python-format msgid "Router %s does not hold net-partition assoc on VSD. extra-route failed" msgstr "" -#: neutron/plugins/nuage/plugin.py:1061 +#: neutron/plugins/nuage/plugin.py:1057 #, python-format msgid "One or more router still attached to net_partition %s." msgstr "" -#: neutron/plugins/nuage/plugin.py:1066 +#: neutron/plugins/nuage/plugin.py:1062 #, python-format msgid "NetPartition with %s does not exist" msgstr "" -#: neutron/plugins/nuage/plugin.py:1108 +#: neutron/plugins/nuage/plugin.py:1104 #, python-format msgid "sharedresource %s not found on VSD" msgstr "" -#: neutron/plugins/nuage/plugin.py:1115 neutron/plugins/nuage/plugin.py:1257 +#: neutron/plugins/nuage/plugin.py:1111 neutron/plugins/nuage/plugin.py:1261 #, python-format msgid "router %s is not associated with any net-partition" msgstr "" -#: neutron/plugins/nuage/plugin.py:1148 +#: neutron/plugins/nuage/plugin.py:1144 msgid "Floating IP can not be associated to VM in different router context" msgstr "" -#: neutron/plugins/nuage/common/config.py:22 +#: neutron/plugins/nuage/common/config.py:20 msgid "IP Address and Port of Nuage's VSD server" msgstr "" -#: neutron/plugins/nuage/common/config.py:25 +#: neutron/plugins/nuage/common/config.py:23 msgid "Username and password for authentication" msgstr "" -#: neutron/plugins/nuage/common/config.py:27 +#: neutron/plugins/nuage/common/config.py:25 msgid "Boolean for SSL connection with VSD server" msgstr "" -#: neutron/plugins/nuage/common/config.py:29 +#: neutron/plugins/nuage/common/config.py:27 msgid "Nuage provided base uri to reach out to VSD" msgstr "" -#: neutron/plugins/nuage/common/config.py:31 +#: neutron/plugins/nuage/common/config.py:29 msgid "" "Organization name in which VSD will orchestrate network resources using " "openstack" msgstr "" -#: neutron/plugins/nuage/common/config.py:34 +#: neutron/plugins/nuage/common/config.py:32 msgid "Nuage provided uri for initial authorization to access VSD" msgstr "" -#: neutron/plugins/nuage/common/config.py:38 +#: neutron/plugins/nuage/common/config.py:36 msgid "" "Default Network partition in which VSD will orchestrate network resources" " using openstack" msgstr "" -#: neutron/plugins/nuage/common/config.py:42 +#: neutron/plugins/nuage/common/config.py:40 msgid "Per Net Partition quota of floating ips" msgstr "" -#: neutron/plugins/nuage/common/config.py:47 +#: neutron/plugins/nuage/common/config.py:45 msgid "Nuage plugin will sync resources between openstack and VSD" msgstr "" -#: neutron/plugins/nuage/common/config.py:50 +#: neutron/plugins/nuage/common/config.py:48 msgid "" "Sync interval in seconds between openstack and VSD. It defines how often " "the synchronization is done. If not set, value of 0 is assumed and sync " "will be performed only once, at the Neutron startup time." msgstr "" -#: neutron/plugins/nuage/common/exceptions.py:23 +#: neutron/plugins/nuage/common/exceptions.py:21 #, python-format msgid "Nuage Plugin does not support this operation: %(msg)s" msgstr "" -#: neutron/plugins/nuage/common/exceptions.py:27 +#: neutron/plugins/nuage/common/exceptions.py:25 #, python-format msgid "Bad request: %(msg)s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:988 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1486 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1489 #, python-format msgid "Parsing bridge_mappings failed: %s." msgstr "" @@ -11103,7 +10879,7 @@ msgid "Invalid tunnel type specificed: %s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:1017 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1514 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1517 msgid "Tunneling cannot be enabled without a valid local_ip." msgstr "" @@ -11111,32 +10887,32 @@ msgstr "" msgid "Number of seconds to retry acquiring an Open vSwitch datapath" msgstr "" -#: neutron/plugins/oneconvergence/plugin.py:238 +#: neutron/plugins/oneconvergence/plugin.py:236 msgid "Failed to create subnet, deleting it from neutron" msgstr "" -#: neutron/plugins/oneconvergence/plugin.py:302 +#: neutron/plugins/oneconvergence/plugin.py:300 #, python-format msgid "Deleting newly created neutron port %s" msgstr "" -#: neutron/plugins/oneconvergence/plugin.py:375 +#: neutron/plugins/oneconvergence/plugin.py:373 msgid "Failed to create floatingip" msgstr "" -#: neutron/plugins/oneconvergence/plugin.py:414 +#: neutron/plugins/oneconvergence/plugin.py:412 msgid "Failed to create router" msgstr "" -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:154 +#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:152 msgid "Port list is updated" msgstr "" -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:161 +#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:159 msgid "AGENT looping....." msgstr "" -#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:173 +#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:171 msgid "NVSD Agent initialized successfully, now running... " msgstr "" @@ -11211,274 +10987,193 @@ msgstr "" msgid "Internal Server Error from NVSD controller: %(reason)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:55 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:53 #, python-format msgid "Could not create a %(resource)s under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:59 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:57 #, python-format msgid "Failed to %(method)s %(resource)s id=%(resource_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:65 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:63 #, python-format msgid "Failed to %(method)s %(resource)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:110 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:108 #, python-format msgid "Network %(id)s created under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:127 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:125 #, python-format msgid "Network %(id)s updated under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:148 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:146 #, python-format msgid "Network %(id)s deleted under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:161 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:159 #, python-format msgid "Subnet %(id)s created under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:175 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:173 #, python-format msgid "Subnet %(id)s deleted under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:191 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:189 #, python-format msgid "Subnet %(id)s updated under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:223 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:221 #, python-format msgid "Port %(id)s created under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:247 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:245 #, python-format msgid "Port %(id)s updated under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:260 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:258 #, python-format msgid "Port %(id)s deleted under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:282 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:280 #, python-format msgid "Flatingip %(id)s created under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:300 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:298 #, python-format msgid "Flatingip %(id)s updated under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:314 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:312 #, python-format msgid "Flatingip %(id)s deleted under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:327 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:325 #, python-format msgid "Router %(id)s created under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:343 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:341 #, python-format msgid "Router %(id)s updated under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/nvsdlib.py:353 +#: neutron/plugins/oneconvergence/lib/nvsdlib.py:351 #, python-format msgid "Router %(id)s deleted under tenant %(tenant_id)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:81 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:79 #, python-format msgid "Unable to connect to NVSD controller. Exiting after %(retries)s attempts" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:90 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:88 #, python-format msgid "Login Failed: %s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:91 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:89 #, python-format msgid "Unable to establish connection with Controller %s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:93 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:91 msgid "Retrying after 1 second..." msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:97 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:95 #, python-format msgid "Login Successful %(uri)s %(status)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:101 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:99 #, python-format msgid "AuthToken = %s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:103 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:101 msgid "login failed" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:111 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:109 msgid "No Token, Re-login" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:127 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:125 #, python-format msgid "request: %(method)s %(uri)s successful" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:134 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:132 #, python-format msgid "request: Request failed from Controller side :%s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:139 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:137 #, python-format msgid "Response is Null, Request timed out: %(method)s to %(uri)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:151 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:149 #, python-format msgid "Request %(method)s %(uri)s body = %(body)s failed with status %(status)s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:155 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:153 #, python-format msgid "%s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:159 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:157 #, python-format msgid "%(method)s to %(url)s, unexpected response code: %(status)d" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:165 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:163 #, python-format msgid "Request failed from Controller side with Status=%s" msgstr "" -#: neutron/plugins/oneconvergence/lib/plugin_helper.py:169 +#: neutron/plugins/oneconvergence/lib/plugin_helper.py:167 #, python-format msgid "Success: %(method)s %(url)s status=%(status)s" msgstr "" -#: neutron/plugins/openvswitch/ovs_db_v2.py:210 -#, python-format -msgid "Skipping unreasonable tunnel ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:229 -#, python-format -msgid "Removing tunnel %s from pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:258 -#, python-format -msgid "Reserving tunnel %s from pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:273 -#, python-format -msgid "Reserving specific tunnel %s from pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:276 -#, python-format -msgid "Reserving specific tunnel %s outside pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:299 -#, python-format -msgid "Releasing tunnel %s outside pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:301 -#, python-format -msgid "Releasing tunnel %s to pool" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:303 -#, python-format -msgid "tunnel_id %s not found" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:375 -#, python-format -msgid "Adding a tunnel endpoint for %s" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:391 -#, python-format -msgid "" -"Adding a tunnel endpoint failed due to a concurrenttransaction had been " -"committed (%s attempts left)" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_db_v2.py:396 -msgid "Unable to generate a new tunnel id" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:309 -#, python-format -msgid "Invalid tenant_network_type: %s. Server terminated!" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:326 -#, python-format -msgid "Tunneling disabled but tenant_network_type is '%s'. Server terminated!" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:375 -#, python-format -msgid "Invalid tunnel ID range: '%(range)s' - %(e)s. Server terminated!" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:379 -#, python-format -msgid "Tunnel ID ranges: %s" -msgstr "" - -#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:434 -#, python-format -msgid "%s networks are not enabled" -msgstr "" - -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:159 +#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:158 msgid "DVR: Failed to obtain local DVR Mac address" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:292 +#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:291 #, python-format msgid "DVR: Duplicate DVR router interface detected for subnet %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:300 +#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:299 #, python-format msgid "DVR: Unable to retrieve subnet information for subnet_id %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:459 +#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:458 #, python-format msgid "Centralized-SNAT port %s already seen on " msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:461 +#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:460 #, python-format msgid "a different subnet %s" msgstr "" @@ -11490,180 +11185,180 @@ msgid "" "error: %(error)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:305 -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:557 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:308 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:560 #, python-format msgid "Network %s not used on agent." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:314 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:317 #, python-format msgid "port_update message processed for port %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:317 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:320 msgid "tunnel_update received" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:326 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:329 msgid "No tunnel_type specified, cannot create tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:329 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:332 #, python-format msgid "tunnel_type %s not supported by agent" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:437 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:440 #, python-format msgid "Action %s not supported" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:458 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:461 #, python-format msgid "No local VLAN available for net-id=%s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:466 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:469 #, 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:495 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:498 #, 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:514 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:517 #, 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:534 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:537 #, 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:543 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:546 #, 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:560 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:563 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:601 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:604 #, 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:655 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:658 #, python-format msgid "port_unbound(): net_uuid %s not in local_vlan_map" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:728 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:731 #, python-format msgid "Adding %s to list of bridges." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:749 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:752 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:843 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:846 #, 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:864 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:867 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:870 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:873 #, 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:974 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:977 #, python-format msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1003 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1006 #, 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:1013 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1016 #, python-format msgid "No VIF port for port %s defined on agent." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1026 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1029 #: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:799 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1248 +#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1287 msgid "ofport should have a value that can be interpreted as an integer" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1029 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1032 #: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:782 #: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:802 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1231 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1251 -#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1268 +#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1270 +#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1290 +#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1307 #, python-format msgid "Failed to set-up %(type)s tunnel port to %(ip)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1094 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1097 #, 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:1117 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1120 #, python-format msgid "Setting status for %s to UP" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1121 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1124 #, python-format msgid "Setting status for %s to DOWN" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1124 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1127 #, python-format msgid "Configuration for device %s completed." msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1143 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1146 #, python-format msgid "Ancillary Port %s added" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1215 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1218 #, python-format msgid "" "process_network_ports - iteration:%(iter_num)d " @@ -11672,116 +11367,116 @@ msgid "" "%(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1231 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1234 #, python-format msgid "" "process_network_ports - iteration:%d - failure while retrieving port " "details from server" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1238 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1241 #, python-format msgid "" "process_network_ports - iteration:%(iter_num)d -treat_devices_removed " "completed in %(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1252 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1255 #, python-format msgid "" "process_ancillary_network_ports - iteration: %(iter_num)d - " "treat_ancillary_devices_added completed in %(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1260 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1263 #, 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:1268 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1271 #, python-format msgid "" "process_ancillary_network_ports - iteration: %(iter_num)d - " "treat_ancillary_devices_removed completed in %(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1281 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1284 #, python-format msgid "Unable to create tunnel port. Invalid remote IP: %s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1310 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1313 #, python-format msgid "Unable to sync tunnel IP %(local_ip)s: %(e)s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1347 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1350 #, python-format msgid "Agent rpc_loop - iteration:%d started" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1369 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1372 msgid "Agent tunnel out of sync with plugin!" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1373 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1376 msgid "Error while synchronizing tunnels" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1377 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1380 #, python-format msgid "" "Agent rpc_loop - iteration:%(iter_num)d - starting polling. " "Elapsed:%(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1389 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1392 #, python-format msgid "" "Agent rpc_loop - iteration:%(iter_num)d - port information retrieved. " "Elapsed:%(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1399 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1402 #, python-format msgid "Starting to process devices in:%s" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1404 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1407 #, python-format msgid "" "Agent rpc_loop - iteration:%(iter_num)d -ports processed. " "Elapsed:%(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1419 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1422 #, python-format msgid "" "Agent rpc_loop - iteration:%(iter_num)d -ancillary port info retrieved. " "Elapsed:%(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1428 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1431 #, python-format msgid "" "Agent rpc_loop - iteration:%(iter_num)d - ancillary ports processed. " "Elapsed:%(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1442 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1445 msgid "Error while processing VIF ports" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1449 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1452 #, python-format msgid "" "Agent rpc_loop - iteration:%(iter_num)d completed. Processed ports " "statistics: %(port_stats)s. Elapsed:%(elapsed).3f" msgstr "" -#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1511 +#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1514 #, python-format msgid "Invalid tunnel type specified: %s" msgstr "" @@ -11811,54 +11506,36 @@ msgid "List of :. Deprecated for ofagent." msgstr "" #: neutron/plugins/openvswitch/common/config.py:47 -msgid "Network type for tenant networks (local, vlan, gre, vxlan, or none)." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:51 -msgid "List of :: or ." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:55 -msgid "List of :." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:57 -msgid "" -"The type of tunnels to use when utilizing tunnels, either 'gre' or " -"'vxlan'." -msgstr "" - -#: neutron/plugins/openvswitch/common/config.py:60 msgid "" "Use veths instead of patch ports to interconnect the integration bridge " "to physical bridges." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:70 +#: neutron/plugins/openvswitch/common/config.py:57 msgid "Minimize polling by monitoring ovsdb for interface changes." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:74 +#: neutron/plugins/openvswitch/common/config.py:61 msgid "" "The number of seconds to wait before respawning the ovsdb monitor after " "losing communication with it." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:77 +#: neutron/plugins/openvswitch/common/config.py:64 msgid "Network types supported by the agent (gre and/or vxlan)." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:82 +#: neutron/plugins/openvswitch/common/config.py:69 msgid "MTU size of veth interfaces" msgstr "" -#: neutron/plugins/openvswitch/common/config.py:84 +#: neutron/plugins/openvswitch/common/config.py:71 msgid "" "Use ML2 l2population mechanism driver to learn remote MAC and IPs and " "improve tunnel scalability." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:87 +#: neutron/plugins/openvswitch/common/config.py:74 msgid "" "Enable local ARP responder if it is supported. Requires OVS 2.1 and ML2 " "l2population driver. Allows the switch (when supporting an overlay) to " @@ -11866,131 +11543,131 @@ msgid "" "broadcast into the overlay." msgstr "" -#: neutron/plugins/openvswitch/common/config.py:93 +#: neutron/plugins/openvswitch/common/config.py:80 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:96 +#: neutron/plugins/openvswitch/common/config.py:83 msgid "Make the l2 agent run in DVR mode." msgstr "" -#: neutron/plugins/plumgrid/common/exceptions.py:24 +#: neutron/plugins/plumgrid/common/exceptions.py:22 #, python-format msgid "PLUMgrid Plugin Error: %(err_msg)s" msgstr "" -#: neutron/plugins/plumgrid/common/exceptions.py:28 +#: neutron/plugins/plumgrid/common/exceptions.py:26 #, python-format msgid "Connection failed with PLUMgrid Director: %(err_msg)s" msgstr "" -#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:31 +#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:29 msgid "Python PLUMgrid Fake Library Started " msgstr "" -#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:36 +#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:34 #, python-format msgid "Fake Director: %s" msgstr "" -#: neutron/plugins/plumgrid/drivers/plumlib.py:37 +#: neutron/plugins/plumgrid/drivers/plumlib.py:35 msgid "Python PLUMgrid Library Started " msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:46 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:44 msgid "PLUMgrid Director server to connect to" msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:48 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:46 msgid "PLUMgrid Director server port to connect to" msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:50 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:48 msgid "PLUMgrid Director admin username" msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:52 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:50 msgid "PLUMgrid Director admin password" msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:54 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:52 msgid "PLUMgrid Director server timeout" msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:57 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:55 msgid "PLUMgrid Driver" msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:75 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:73 msgid "Neutron PLUMgrid Director: Starting Plugin" msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:93 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:91 #, python-format msgid "Neutron PLUMgrid Director: %s" msgstr "" -#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:770 +#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:768 msgid "" "Networks with admin_state_up=False are not supported by PLUMgrid plugin " "yet." msgstr "" -#: neutron/plugins/ryu/ryu_neutron_plugin.py:68 +#: neutron/plugins/ryu/ryu_neutron_plugin.py:67 #, python-format msgid "get_ofp_rest_api: %s" msgstr "" -#: neutron/plugins/ryu/ryu_neutron_plugin.py:125 +#: neutron/plugins/ryu/ryu_neutron_plugin.py:124 msgid "Invalid configuration. check ryu.ini" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:95 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:94 #, python-format msgid "Could not get IPv4 address from %(nic)s: %(cfg)s" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:161 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:160 #, python-format msgid "External port %s" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:169 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:168 msgid "Get Ryu rest API address" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:216 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:215 msgid "Ryu rest API port isn't specified" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:217 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:216 #, python-format msgid "Going to ofp controller mode %s" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:293 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:292 #, python-format msgid "tunnel_ip %s" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:295 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:294 #, python-format msgid "ovsdb_port %s" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:297 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:296 #, python-format msgid "ovsdb_ip %s" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:303 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:302 #, python-format msgid "Initialization failed: %s" msgstr "" -#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:306 +#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:305 msgid "" "Ryu initialization on the node is done. Agent initialized successfully, " "now running..." @@ -12054,42 +11731,42 @@ msgstr "" msgid "Transaction retry exhausted (%d). Abandoned tunnel key allocation." msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:46 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:44 #, python-format msgid "Failed to get devices for %s" msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:48 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:46 msgid "Device not found" msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:62 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:60 msgid "Device has no virtual functions" msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:141 -#: neutron/plugins/sriovnicagent/eswitch_manager.py:154 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:139 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:152 #, python-format msgid "Cannot find vf index for pci slot %s" msgstr "" -#: neutron/plugins/sriovnicagent/eswitch_manager.py:279 +#: neutron/plugins/sriovnicagent/eswitch_manager.py:277 #, python-format msgid "device pci mismatch: %(device_mac)s - %(pci_slot)s" msgstr "" -#: neutron/plugins/sriovnicagent/pci_lib.py:58 -#: neutron/plugins/sriovnicagent/pci_lib.py:81 -#: neutron/plugins/sriovnicagent/pci_lib.py:108 +#: neutron/plugins/sriovnicagent/pci_lib.py:56 +#: neutron/plugins/sriovnicagent/pci_lib.py:79 +#: neutron/plugins/sriovnicagent/pci_lib.py:106 msgid "Failed executing ip command" msgstr "" -#: neutron/plugins/sriovnicagent/pci_lib.py:129 +#: neutron/plugins/sriovnicagent/pci_lib.py:127 #, python-format msgid "Cannot find vfs %(vfs)s in device %(dev_name)s" msgstr "" -#: neutron/plugins/sriovnicagent/pci_lib.py:145 +#: neutron/plugins/sriovnicagent/pci_lib.py:143 #, python-format msgid "failed to parse vf link show line %(line)s: for %(device)s" msgstr "" @@ -12245,26 +11922,26 @@ msgid "" "cluster" msgstr "" -#: neutron/plugins/vmware/api_client/base.py:150 +#: neutron/plugins/vmware/api_client/base.py:151 #, python-format msgid "[%(rid)d] Connection returned in bad state, reconnecting to %(conn)s" msgstr "" -#: neutron/plugins/vmware/api_client/base.py:176 +#: neutron/plugins/vmware/api_client/base.py:173 #, python-format msgid "[%(rid)d] Released connection %(conn)s. %(qsize)d connection(s) available." msgstr "" -#: neutron/plugins/vmware/api_client/base.py:186 +#: neutron/plugins/vmware/api_client/base.py:183 #, python-format msgid "Login request for an invalid connection: '%s'" msgstr "" -#: neutron/plugins/vmware/api_client/base.py:197 +#: neutron/plugins/vmware/api_client/base.py:194 msgid "Waiting for auth to complete" msgstr "" -#: neutron/plugins/vmware/api_client/base.py:239 +#: neutron/plugins/vmware/api_client/base.py:236 #, python-format msgid "Invalid conn_params value: '%s'" msgstr "" @@ -13527,103 +13204,71 @@ msgid "" "for NSX communication errors." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:213 +#: neutron/plugins/vmware/plugins/base.py:212 #, python-format msgid "Unable to process default l2 gw service:%s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:248 -#, python-format -msgid "Created NSX router port:%s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:250 +#: neutron/plugins/vmware/plugins/base.py:249 #: neutron/plugins/vmware/plugins/service.py:439 #, python-format msgid "Unable to create port on NSX logical router %s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:253 +#: neutron/plugins/vmware/plugins/base.py:252 #, python-format msgid "" "Unable to create logical router port for neutron port id %(port_id)s on " "router %(nsx_router_id)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:332 -#, python-format -msgid "Attached %(att)s to NSX router port %(port)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:338 +#: neutron/plugins/vmware/plugins/base.py:337 #, python-format msgid "" "Unable to plug attachment in NSX logical router port %(r_port_id)s, " "associated with Neutron %(q_port_id)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:344 +#: neutron/plugins/vmware/plugins/base.py:343 #, python-format msgid "" "Unable to plug attachment in router port %(r_port_id)s for neutron port " "id %(q_port_id)s on router %(router_id)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:390 +#: neutron/plugins/vmware/plugins/base.py:389 msgid "An exception occurred while selecting logical switch for the port" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:430 +#: neutron/plugins/vmware/plugins/base.py:429 #, python-format msgid "" "An exception occurred while creating the neutron port %s on the NSX " "plaform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:442 -#: neutron/plugins/vmware/plugins/base.py:494 -#: neutron/plugins/vmware/plugins/base.py:692 +#: neutron/plugins/vmware/plugins/base.py:441 +#: neutron/plugins/vmware/plugins/base.py:493 +#: neutron/plugins/vmware/plugins/base.py:691 #, python-format msgid "" "NSX plugin does not support regular VIF ports on external networks. Port " "%s will be down." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:463 -#, python-format -msgid "" -"_nsx_create_port completed for port %(name)s on network %(network_id)s. " -"The new port id is %(id)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:474 +#: neutron/plugins/vmware/plugins/base.py:473 #, python-format msgid "" "Concurrent network deletion detected; Back-end Port %(nsx_id)s creation " "to be rolled back for Neutron port: %(neutron_id)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:486 -#, python-format -msgid "NSX Port %s already gone" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:501 -#, python-format -msgid "Port '%s' was already deleted on NSX platform" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:508 -#, python-format -msgid "_nsx_delete_port completed for port %(port_id)s on network %(net_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:513 +#: neutron/plugins/vmware/plugins/base.py:512 #, python-format msgid "Port %s not found in NSX" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:522 +#: neutron/plugins/vmware/plugins/base.py:521 #, python-format msgid "" "Neutron port %(port_id)s not found on NSX backend. Terminating delete " @@ -13631,329 +13276,266 @@ msgid "" "%(router_id)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:537 +#: neutron/plugins/vmware/plugins/base.py:536 #, python-format msgid "" "Ignoring exception as this means the peer for port '%s' has already been " "deleted." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:549 +#: neutron/plugins/vmware/plugins/base.py:548 #, python-format msgid "" "It is not allowed to create router interface ports on external networks " "as '%s'" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:574 -#, python-format -msgid "" -"_nsx_create_router_port completed for port %(name)s on network " -"%(network_id)s. The new port id is %(id)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:587 +#: neutron/plugins/vmware/plugins/base.py:586 #, python-format msgid "" "device_id field must be populated in order to create an external gateway " "port for network %s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:597 +#: neutron/plugins/vmware/plugins/base.py:596 #, python-format msgid "The gateway port for the NSX router %s was not found on the backend" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:638 -#, python-format -msgid "" -"_nsx_create_ext_gw_port completed on external network %(ext_net_id)s, " -"attached to router:%(router_id)s. NSX port id is %(nsx_port_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:673 -#: neutron/plugins/vmware/plugins/base.py:1739 +#: neutron/plugins/vmware/plugins/base.py:672 +#: neutron/plugins/vmware/plugins/base.py:1748 #, python-format msgid "Logical router resource %s not found on NSX platform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:677 -#: neutron/plugins/vmware/plugins/base.py:1743 +#: neutron/plugins/vmware/plugins/base.py:676 +#: neutron/plugins/vmware/plugins/base.py:1752 msgid "Unable to update logical routeron NSX Platform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:679 -#, python-format -msgid "" -"_nsx_delete_ext_gw_port completed on external network %(ext_net_id)s, " -"attached to NSX router:%(router_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:721 -#, python-format -msgid "" -"_nsx_create_l2_gw_port completed for port %(name)s on network " -"%(network_id)s. The new port id is %(id)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:765 +#: neutron/plugins/vmware/plugins/base.py:764 #, python-format msgid "%s required" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:770 +#: neutron/plugins/vmware/plugins/base.py:769 msgid "Segmentation ID cannot be specified with flat network type" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:774 +#: neutron/plugins/vmware/plugins/base.py:773 msgid "Segmentation ID must be specified with vlan network type" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:778 -#: neutron/plugins/vmware/plugins/base.py:794 +#: neutron/plugins/vmware/plugins/base.py:777 +#: neutron/plugins/vmware/plugins/base.py:793 #, python-format msgid "%(segmentation_id)s out of range (%(min_id)s through %(max_id)s)" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:800 +#: neutron/plugins/vmware/plugins/base.py:799 #, python-format msgid "%(net_type_param)s %(net_type_value)s not supported" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:845 -#, python-format -msgid "No switch has available ports (%d checked)" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:879 +#: neutron/plugins/vmware/plugins/base.py:882 #, python-format msgid "Maximum number of logical ports reached for logical network %s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:925 +#: neutron/plugins/vmware/plugins/base.py:928 #, python-format msgid "" "Network with admin_state_up=False are not yet supported by this plugin. " "Ignoring setting for network %s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1003 +#: neutron/plugins/vmware/plugins/base.py:1006 #, python-format msgid "The following logical switches were not found on the NSX backend:%s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1040 +#: neutron/plugins/vmware/plugins/base.py:1043 msgid "admin_state_up=False networks are not supported." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1060 +#: neutron/plugins/vmware/plugins/base.py:1063 #, python-format msgid "Unable to find NSX mappings for neutron network:%s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1067 +#: neutron/plugins/vmware/plugins/base.py:1070 #, python-format msgid "" "Logical switch update on NSX backend failed. Neutron network " "id:%(net_id)s; NSX lswitch id:%(lswitch_id)s;Error:%(error)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1138 -#, python-format -msgid "port created on NSX backend for tenant %(tenant_id)s: (%(id)s)" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1141 +#: neutron/plugins/vmware/plugins/base.py:1150 #, python-format msgid "Logical switch for network %s was not found in NSX." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1152 +#: neutron/plugins/vmware/plugins/base.py:1161 msgid "Unable to create port or set port attachment in NSX." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1240 -#, python-format -msgid "Updating port: %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1275 +#: neutron/plugins/vmware/plugins/base.py:1284 #, python-format msgid "Unable to update port id: %s." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1358 +#: neutron/plugins/vmware/plugins/base.py:1367 msgid "" "Cannot create a distributed router with the NSX platform currently in " "execution. Please, try without specifying the 'distributed' attribute." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1364 +#: neutron/plugins/vmware/plugins/base.py:1373 msgid "Unable to create logical router on NSX Platform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1375 +#: neutron/plugins/vmware/plugins/base.py:1384 #, python-format msgid "" "Unable to create L3GW port on logical router %(router_uuid)s. Verify " "Default Layer-3 Gateway service %(def_l3_gw_svc)s id is correct" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1385 +#: neutron/plugins/vmware/plugins/base.py:1394 #, python-format msgid "Unable to create router %s on NSX backend" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1414 -#: neutron/plugins/vmware/plugins/base.py:1499 +#: neutron/plugins/vmware/plugins/base.py:1423 +#: neutron/plugins/vmware/plugins/base.py:1508 #: neutron/plugins/vmware/plugins/service.py:201 #: neutron/plugins/vmware/plugins/service.py:1240 #, python-format msgid "Network '%s' is not a valid external network" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1463 +#: neutron/plugins/vmware/plugins/base.py:1472 #, python-format msgid "Failed to set gateway info for router being created:%s - removing router" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1466 +#: neutron/plugins/vmware/plugins/base.py:1475 #, python-format msgid "" "Create router failed while setting external gateway. Router:%s has been " "removed from DB and backend" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1508 +#: neutron/plugins/vmware/plugins/base.py:1517 msgid "" "'routes' cannot contain route '0.0.0.0/0', this must be updated through " "the default gateway attribute" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1524 +#: neutron/plugins/vmware/plugins/base.py:1533 #, python-format msgid "Logical router %s not found on NSX Platform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1528 +#: neutron/plugins/vmware/plugins/base.py:1537 msgid "Unable to update logical router on NSX Platform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1530 +#: neutron/plugins/vmware/plugins/base.py:1539 msgid "" "Request cannot contain 'routes' with the NSX platform currently in " "execution. Please, try without specifying the static routes." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1587 +#: neutron/plugins/vmware/plugins/base.py:1596 #, python-format msgid "Logical router '%s' not found on NSX Platform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1591 +#: neutron/plugins/vmware/plugins/base.py:1600 #, python-format msgid "Unable to delete logical router '%s' on NSX Platform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1601 +#: neutron/plugins/vmware/plugins/base.py:1610 #, python-format msgid "" "Unable to remove NSX mapping for Neutron router %(router_id)s because of " "the following exception:%(d_exc)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1676 -#, python-format -msgid "" -"Add_router_interface completed for subnet:%(subnet_id)s and " -"router:%(router_id)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1775 +#: neutron/plugins/vmware/plugins/base.py:1784 #, python-format msgid "" "An error occurred while removing NAT rules on the NSX platform for " "floating ip:%s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1780 +#: neutron/plugins/vmware/plugins/base.py:1789 msgid "An incorrect number of matching NAT rules was found on the NSX platform" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1922 +#: neutron/plugins/vmware/plugins/base.py:1931 #, python-format msgid "" "An error occurred while creating NAT rules on the NSX platform for " "floating ip:%(floating_ip)s mapped to internal ip:%(internal_ip)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1928 +#: neutron/plugins/vmware/plugins/base.py:1937 msgid "Failed to update NAT rules for floatingip update" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:1967 -#, python-format -msgid "The port '%s' is not associated with floating IPs" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:1970 +#: neutron/plugins/vmware/plugins/base.py:1979 #, python-format msgid "Nat rules not found in nsx for port: %s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2010 +#: neutron/plugins/vmware/plugins/base.py:2019 #, python-format msgid "Unable to create l2_gw_service for: %s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2033 +#: neutron/plugins/vmware/plugins/base.py:2042 msgid "" "Unable to remove gateway service from NSX plaform - the resource was not " "found" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2062 +#: neutron/plugins/vmware/plugins/base.py:2071 #, python-format msgid "Unable to update name on NSX backend for network gateway: %s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2134 -#: neutron/plugins/vmware/plugins/base.py:2172 -#, python-format -msgid "" -"Neutron gateway device: %(neutron_id)s; NSX transport node identifier: " -"%(nsx_id)s; Operational status: %(status)s." -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2269 +#: neutron/plugins/vmware/plugins/base.py:2278 #, python-format msgid "" "Removal of gateway device: %(neutron_id)s failed on NSX backend (NSX " "id:%(nsx_id)s) because the NSX resource was not found" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2276 +#: neutron/plugins/vmware/plugins/base.py:2285 #, python-format msgid "" "Removal of gateway device: %(neutron_id)s failed on NSX backend (NSX " "id:%(nsx_id)s). Neutron and NSX states have diverged." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2324 +#: neutron/plugins/vmware/plugins/base.py:2333 #, python-format msgid "" "Error while updating security profile %(uuid)s with name %(name)s: " "%(error)s." msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2356 +#: neutron/plugins/vmware/plugins/base.py:2365 #, python-format msgid "" "The NSX security profile %(sec_profile_id)s, associated with the Neutron " "security group %(sec_group_id)s was not found on the backend" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2364 +#: neutron/plugins/vmware/plugins/base.py:2373 #, python-format msgid "" "An exception occurred while removing the NSX security profile " @@ -13961,34 +13543,16 @@ msgid "" "%(sec_group_id)s" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2371 +#: neutron/plugins/vmware/plugins/base.py:2380 #, python-format msgid "Unable to remove security group %s from backend" msgstr "" -#: neutron/plugins/vmware/plugins/base.py:2384 +#: neutron/plugins/vmware/plugins/base.py:2393 #, python-format msgid "Port values not valid for protocol: %s" msgstr "" -#: neutron/plugins/vmware/plugins/service.py:144 -#, python-format -msgid "EDGE: router = %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:175 -msgid "EDGE: _vcns_create_ext_gw_port" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:184 -msgid "EDGE: _vcns_delete_ext_gw_port" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:339 -#, python-format -msgid "VCNS: delete default gateway %s" -msgstr "" - #: neutron/plugins/vmware/plugins/service.py:424 #, python-format msgid "An exception occurred while creating a port on lswitch %s" @@ -14064,10 +13628,6 @@ msgstr "" msgid "Failed to create pool on vshield edge" msgstr "" -#: neutron/plugins/vmware/plugins/service.py:1223 -msgid "create_vip() called" -msgstr "" - #: neutron/plugins/vmware/plugins/service.py:1231 #, python-format msgid "router_id: %s is not an advanced router!" @@ -14137,70 +13697,16 @@ msgid "" "%(vpnservice_id)s on vShield Edge: %(edge_id)s" msgstr "" -#: neutron/plugins/vmware/plugins/service.py:1611 -msgid "create_vpnservice() called" -msgstr "" - #: neutron/plugins/vmware/plugins/service.py:1619 #, python-format msgid "a vpnservice is already associated with the router: %s" msgstr "" -#: neutron/plugins/vmware/plugins/service.py:1732 -#, python-format -msgid "Start deploying %(edge_id)s for router %(name)s" -msgstr "" - #: neutron/plugins/vmware/plugins/service.py:1756 #, python-format msgid "Router %s not found" msgstr "" -#: neutron/plugins/vmware/plugins/service.py:1759 -#, python-format -msgid "Successfully deployed %(edge_id)s for router %(name)s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1775 -#, python-format -msgid "Failed to deploy Edge for router %s" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1791 -#, python-format -msgid "interface_update_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1794 -#, python-format -msgid "snat_create_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1797 -#, python-format -msgid "snat_delete_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1800 -#, python-format -msgid "dnat_create_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1803 -#, python-format -msgid "dnat_delete_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1806 -#, python-format -msgid "routes_update_result %d" -msgstr "" - -#: neutron/plugins/vmware/plugins/service.py:1809 -#, python-format -msgid "nat_update_result %d" -msgstr "" - #: neutron/plugins/vmware/shell/commands.py:24 #, python-format msgid "" @@ -14236,251 +13742,168 @@ msgstr "" msgid "Migration has been successful:\n" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:135 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:132 #, python-format msgid "" "VCNS: Failed to get edge status:\n" "%s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:162 -#, python-format -msgid "VCNS: start updating vnic %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:167 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:164 #, python-format msgid "" "VCNS: Failed to update vnic %(config)s:\n" "%(response)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:173 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:170 #, python-format msgid "VCNS: Failed to update vnic %d" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:181 -#, python-format -msgid "VCNS: update vnic %(index)d: %(addr)s %(netmask)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:190 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:187 #, python-format msgid "Vnic %d currently not supported" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:211 -#, python-format -msgid "VCNS: start deploying edge %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:219 -#, python-format -msgid "VCNS: deploying edge %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:224 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:221 #, python-format msgid "VCNS: deploy edge failed for router %s." msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:243 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:240 #, python-format msgid "VCNS: Edge %s status query failed." msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:248 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:245 #, python-format msgid "VCNS: Unable to retrieve edge %(edge_id)s status. Retry %(retries)d." msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:255 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:252 #, python-format msgid "VCNS: Unable to retrieve edge %s status. Abort." msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:259 -#, python-format -msgid "VCNS: Edge %s status" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:266 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:263 #, python-format msgid "VCNS: Failed to deploy edge %(edge_id)s for %(name)s, status %(status)d" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:273 -#, python-format -msgid "VCNS: Edge %(edge_id)s deployed for router %(name)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:280 -#, python-format -msgid "VCNS: start destroying edge %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:288 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:285 #, python-format msgid "" "VCNS: Failed to delete %(edge_id)s:\n" "%(response)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:294 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:291 #, python-format msgid "VCNS: Failed to delete %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:304 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:301 #, python-format msgid "" "VCNS: Failed to get edges:\n" "%s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:382 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:379 #, python-format msgid "" "VCNS: Failed to get nat config:\n" "%s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:389 -#, python-format -msgid "VCNS: start creating nat rules: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:405 -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:530 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:402 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:527 #, python-format msgid "" "VCNS: Failed to create snat rule:\n" "%s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:413 -#, python-format -msgid "VCNS: create snat rule %(src)s/%(translated)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:436 -#, python-format -msgid "VCNS: start deleting %(type)s rules: %(addr)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:447 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:444 #, python-format msgid "" "VCNS: Failed to delete snat rule:\n" "%s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:454 -#, python-format -msgid "VCNS: delete snat rule %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:472 -#, python-format -msgid "VCNS: create dnat rule %(dst)s/%(translated)s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:493 -#, python-format -msgid "VCNS: delete dnat rule %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:517 -#, python-format -msgid "VCNS: start updating nat rules: %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:538 -#, python-format -msgid "" -"VCNS: update nat rule\n" -"SNAT:%(snat)s\n" -"DNAT:%(dnat)s\n" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:576 -#, python-format -msgid "VCNS: start updating routes for %s" -msgstr "" - -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:600 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:597 #, python-format msgid "" "VCNS: Failed to update routes:\n" "%s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:652 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:649 msgid "Failed to get service config" msgstr "" -#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:664 +#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:661 msgid "Failed to enable loadbalancer service config" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:41 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:39 #, python-format msgid "Invalid action value %s in a firewall rule" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:50 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:48 #, python-format msgid "Invalid action value %s in a vshield firewall rule" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:190 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:188 #, python-format msgid "Failed to get firewall with edge id: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:208 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:206 #, python-format msgid "No rule id:%s found in the edge_firewall_binding" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:218 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:216 #, python-format msgid "Failed to get firewall rule: %(rule_id)s with edge_id: %(edge_id)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:234 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:232 #, python-format msgid "Failed to update firewall with edge_id: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:246 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:244 #, python-format msgid "Failed to delete firewall with edge_id:%s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:260 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:258 #, python-format msgid "Failed to update firewall rule: %(rule_id)s with edge_id: %(edge_id)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:273 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:271 #, python-format msgid "Failed to delete firewall rule: %(rule_id)s with edge_id: %(edge_id)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:290 -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:318 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:288 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:316 #, python-format msgid "Failed to add firewall rule above: %(rule_id)s with edge_id: %(edge_id)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:329 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:327 #, python-format msgid "Failed to append a firewall rulewith edge_id: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:350 +#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:348 msgid "Can't execute insert rule operation without reference rule_id" msgstr "" @@ -14538,156 +13961,141 @@ msgstr "" msgid "Failed to delete ipsec vpn configuration with edge_id: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:154 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:152 #, python-format msgid "Invalid %(protocol)s persistence method: %(type)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:180 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:178 #, python-format msgid "Failed to create app profile on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:191 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:189 #, python-format msgid "Failed to create vip on vshield edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:209 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:207 #, python-format msgid "vip_binding not found with id: %(id)s edge_id: %(edge_id)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:226 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:224 msgid "Failed to get vip on edge" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:243 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:241 #, python-format msgid "Failed to update app profile on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:251 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:249 #, python-format msgid "Failed to update vip on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:262 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:260 #, python-format msgid "vip not found on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:265 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:263 #, python-format msgid "Failed to delete vip on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:270 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:268 #, python-format msgid "app profile not found on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:273 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:271 #, python-format msgid "Failed to delete app profile on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:284 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:282 msgid "Failed to create pool" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:301 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:299 #, python-format msgid "pool_binding not found with id: %(id)s edge_id: %(edge_id)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:311 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:309 msgid "Failed to get pool on edge" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:323 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:321 msgid "Failed to update pool" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:333 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:331 msgid "Failed to delete pool" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:343 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:341 #, python-format msgid "Failed to create monitor on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:361 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:359 #, python-format msgid "monitor_binding not found with id: %(id)s edge_id: %(edge_id)s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:371 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:369 #, python-format msgid "Failed to get monitor on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:388 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:386 #, python-format msgid "Failed to update monitor on edge: %s" msgstr "" -#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:399 +#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:397 msgid "Failed to delete monitor" msgstr "" -#: neutron/plugins/vmware/vshield/vcns.py:54 -#, python-format -msgid "VcnsApiHelper('%(method)s', '%(uri)s', '%(body)s')" -msgstr "" - -#: neutron/plugins/vmware/vshield/vcns.py:62 -#, python-format -msgid "Header: '%s'" -msgstr "" - -#: neutron/plugins/vmware/vshield/vcns.py:63 -#, python-format -msgid "Content: '%s'" -msgstr "" - -#: neutron/plugins/vmware/vshield/common/exceptions.py:35 +#: neutron/plugins/vmware/vshield/common/exceptions.py:33 #, python-format msgid "%(resource)s not found: %(msg)s" msgstr "" -#: neutron/plugins/vmware/vshield/common/exceptions.py:39 +#: neutron/plugins/vmware/vshield/common/exceptions.py:37 #, python-format msgid "An unknown exception %(status)s occurred: %(response)s." msgstr "" -#: neutron/plugins/vmware/vshield/common/exceptions.py:50 +#: neutron/plugins/vmware/vshield/common/exceptions.py:48 #, python-format msgid "Resource %(uri)s has been redirected" msgstr "" -#: neutron/plugins/vmware/vshield/common/exceptions.py:54 +#: neutron/plugins/vmware/vshield/common/exceptions.py:52 #, python-format msgid "Request %(uri)s is Bad, response %(response)s" msgstr "" -#: neutron/plugins/vmware/vshield/common/exceptions.py:58 +#: neutron/plugins/vmware/vshield/common/exceptions.py:56 #, python-format msgid "Forbidden: %(uri)s" msgstr "" -#: neutron/plugins/vmware/vshield/common/exceptions.py:62 +#: neutron/plugins/vmware/vshield/common/exceptions.py:60 #, python-format msgid "Resource %(uri)s not found" msgstr "" -#: neutron/plugins/vmware/vshield/common/exceptions.py:66 +#: neutron/plugins/vmware/vshield/common/exceptions.py:64 #, python-format msgid "Media Type %(uri)s is not supported" msgstr "" -#: neutron/plugins/vmware/vshield/common/exceptions.py:70 +#: neutron/plugins/vmware/vshield/common/exceptions.py:68 #, python-format msgid "Service Unavailable: %(uri)s" msgstr "" @@ -14719,12 +14127,6 @@ msgstr "" msgid "Task %(task)s encountered exception in %(cb)s" msgstr "" -#: neutron/plugins/vmware/vshield/tasks/tasks.py:194 -#: neutron/plugins/vmware/vshield/tasks/tasks.py:213 -#, python-format -msgid "Task %(task)s return %(status)s" -msgstr "" - #: neutron/plugins/vmware/vshield/tasks/tasks.py:296 msgid "Stopping TaskManager" msgstr "" @@ -14885,372 +14287,372 @@ msgstr "" msgid "Default provider is not specified for service type %s" msgstr "" -#: neutron/services/firewall/fwaas_plugin.py:42 +#: neutron/services/firewall/fwaas_plugin.py:40 msgid "set_firewall_status() called" msgstr "" -#: neutron/services/firewall/fwaas_plugin.py:50 +#: neutron/services/firewall/fwaas_plugin.py:48 #, python-format msgid "Firewall %(fw_id)s in PENDING_DELETE state, not changing to %(status)s" msgstr "" -#: neutron/services/firewall/fwaas_plugin.py:63 +#: neutron/services/firewall/fwaas_plugin.py:61 msgid "firewall_deleted() called" msgstr "" -#: neutron/services/firewall/fwaas_plugin.py:71 +#: neutron/services/firewall/fwaas_plugin.py:69 #, python-format msgid "Firewall %(fw)s unexpectedly deleted by agent, status was %(status)s" msgstr "" -#: neutron/services/firewall/fwaas_plugin.py:79 +#: neutron/services/firewall/fwaas_plugin.py:77 msgid "get_firewalls_for_tenant() called" msgstr "" -#: neutron/services/firewall/fwaas_plugin.py:88 +#: neutron/services/firewall/fwaas_plugin.py:86 msgid "get_firewalls_for_tenant_without_rules() called" msgstr "" -#: neutron/services/firewall/fwaas_plugin.py:94 +#: neutron/services/firewall/fwaas_plugin.py:92 msgid "get_tenants_with_firewalls() called" msgstr "" -#: neutron/services/firewall/fwaas_plugin.py:139 +#: neutron/services/firewall/fwaas_plugin.py:137 #, python-format msgid "" "Exceeded allowed count of firewalls for tenant %(tenant_id)s. Only one " "firewall is supported per tenant." msgstr "" -#: neutron/services/firewall/agents/firewall_agent_api.py:31 +#: neutron/services/firewall/agents/firewall_agent_api.py:27 msgid "Name of the FWaaS Driver" msgstr "" -#: neutron/services/firewall/agents/firewall_agent_api.py:35 +#: neutron/services/firewall/agents/firewall_agent_api.py:31 msgid "Enable FWaaS" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:43 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:39 msgid "Retrieve Firewall with rules from Plugin" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:51 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:47 msgid "Retrieve Tenants with Firewalls configured from Plugin" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:62 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:58 msgid "Initializing firewall agent" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:73 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:69 msgid "" "FWaaS plugin is configured in the server side, but FWaaS is disabled in " "L3-agent." msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:83 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:79 #, python-format msgid "FWaaS Driver Loaded: '%s'" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:86 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:82 #, python-format msgid "Error importing FWaaS device driver: %s" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:123 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:119 #, python-format msgid "%(func_name)s from agent for fw: %(fwid)s" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:131 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:127 #, python-format msgid "No Routers on tenant: %s" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:138 -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:278 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:134 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:274 #, python-format msgid "Apply fw on Router List: '%s'" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:151 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:147 #, python-format msgid "Firewall Driver Error for %(func_name)s for fw: %(fwid)s" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:166 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:162 #, python-format msgid "FWaaS RPC failure in %(func_name)s for fw: %(fwid)s" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:186 -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:205 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:182 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:201 #, python-format msgid "Firewall Driver Error on fw state %(fwmsg)s for fw: %(fwid)s" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:217 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:213 #, python-format msgid "Process router add, router_id: '%s'" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:228 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:224 #, python-format msgid "Process router add, fw_list: '%s'" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:245 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:241 #, python-format msgid "FWaaS RPC info call failed for '%s'." msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:260 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:256 #, python-format msgid "Tenants with Firewalls: '%s'" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:270 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:266 #, python-format msgid "Router List: '%s'" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:272 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:268 #, python-format msgid "fw_list: '%s'" msgstr "" -#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:289 +#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:285 msgid "Failed fwaas process services sync" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:29 +#: neutron/services/firewall/agents/varmour/varmour_api.py:27 msgid "vArmour director ip" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:31 +#: neutron/services/firewall/agents/varmour/varmour_api.py:29 msgid "vArmour director port" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:33 +#: neutron/services/firewall/agents/varmour/varmour_api.py:31 msgid "vArmour director username" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:35 +#: neutron/services/firewall/agents/varmour/varmour_api.py:33 msgid "vArmour director password" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:45 +#: neutron/services/firewall/agents/varmour/varmour_api.py:43 msgid "An unknown exception." msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:59 +#: neutron/services/firewall/agents/varmour/varmour_api.py:57 msgid "Invalid login credential." msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:65 +#: neutron/services/firewall/agents/varmour/varmour_api.py:63 msgid "vArmourRestAPI: started" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:98 +#: neutron/services/firewall/agents/varmour/varmour_api.py:96 #, python-format msgid "vArmourRestAPI: %(server)s %(port)s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:104 +#: neutron/services/firewall/agents/varmour/varmour_api.py:102 #, python-format msgid "vArmourRestAPI Sending: %(method)s %(action)s %(headers)s %(body_data)s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:115 +#: neutron/services/firewall/agents/varmour/varmour_api.py:113 #, python-format msgid "vArmourRestAPI Response: %(status)s %(resp_str)s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_api.py:123 +#: neutron/services/firewall/agents/varmour/varmour_api.py:121 msgid "vArmourRestAPI: Could not establish HTTP connection" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:50 +#: neutron/services/firewall/agents/varmour/varmour_router.py:47 msgid "vArmourL3NATAgent: __init__" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:64 +#: neutron/services/firewall/agents/varmour/varmour_router.py:61 #, python-format msgid "_router_added: %s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:71 +#: neutron/services/firewall/agents/varmour/varmour_router.py:68 #, python-format msgid "_router_removed: %s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:112 +#: neutron/services/firewall/agents/varmour/varmour_router.py:109 #, python-format msgid "_va_unset_zone_interfaces: %s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:144 +#: neutron/services/firewall/agents/varmour/varmour_router.py:141 #, python-format msgid "_va_set_interface_ip: %(pif)s %(cidr)s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:164 +#: neutron/services/firewall/agents/varmour/varmour_router.py:161 #, python-format msgid "_va_config_trusted_zone: %s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:195 +#: neutron/services/firewall/agents/varmour/varmour_router.py:192 #, python-format msgid "_va_config_untrusted_zone: %s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:210 +#: neutron/services/firewall/agents/varmour/varmour_router.py:207 #, python-format msgid "_va_config_untrusted_zone: gw=%r" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:223 +#: neutron/services/firewall/agents/varmour/varmour_router.py:220 #, python-format msgid "_va_config_router_snat_rules: %s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:255 +#: neutron/services/firewall/agents/varmour/varmour_router.py:252 #, python-format msgid "_va_config_floating_ips: %s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:277 +#: neutron/services/firewall/agents/varmour/varmour_router.py:274 #, python-format msgid "process_router: %s" msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:288 +#: neutron/services/firewall/agents/varmour/varmour_router.py:285 msgid "Unable to parse interface mapping." msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:291 +#: neutron/services/firewall/agents/varmour/varmour_router.py:288 msgid "Unable to read interface mapping." msgstr "" -#: neutron/services/firewall/agents/varmour/varmour_router.py:310 +#: neutron/services/firewall/agents/varmour/varmour_router.py:307 #, python-format msgid "external_gateway_added: %s" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:51 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:49 msgid "Initializing fwaas iptables driver" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:54 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:52 #, python-format msgid "Creating firewall %(fw_id)s for tenant %(tid)s)" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:63 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:61 #, python-format msgid "Failed to create firewall: %s" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:92 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:90 #, python-format msgid "Deleting firewall %(fw_id)s for tenant %(tid)s)" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:107 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:105 #, python-format msgid "Failed to delete firewall: %s" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:111 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:109 #, python-format msgid "Updating firewall %(fw_id)s for tenant %(tid)s)" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:120 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:118 #, python-format msgid "Failed to update firewall: %s" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:124 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:122 #, python-format msgid "Applying firewall %(fw_id)s for tenant %(tid)s)" msgstr "" -#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:145 +#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:143 #, python-format msgid "Failed to apply default policy on firewall: %s" msgstr "" -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:28 +#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:26 msgid "Initializing fwaas vArmour driver" msgstr "" -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:33 +#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:31 #, python-format msgid "create_firewall (%s)" msgstr "" -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:38 +#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:36 #, python-format msgid "update_firewall (%s)" msgstr "" -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:46 +#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:44 #, python-format msgid "delete_firewall (%s)" msgstr "" -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:51 +#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:49 #, python-format msgid "apply_default_policy (%s)" msgstr "" -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:61 +#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:59 #, python-format msgid "Updating firewall (%s)" msgstr "" -#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:110 +#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:108 msgid "Unsupported IP version rule." msgstr "" -#: neutron/services/l3_router/l3_apic.py:60 +#: neutron/services/l3_router/l3_apic.py:57 msgid "L3 Router Service Plugin for basic L3 using the APIC" msgstr "" -#: neutron/services/l3_router/l3_arista.py:116 +#: neutron/services/l3_router/l3_arista.py:112 #, python-format msgid "Error creating router on Arista HW router=%s " msgstr "" -#: neutron/services/l3_router/l3_arista.py:139 +#: neutron/services/l3_router/l3_arista.py:135 #, python-format msgid "Error updating router on Arista HW router=%s " msgstr "" -#: neutron/services/l3_router/l3_arista.py:154 +#: neutron/services/l3_router/l3_arista.py:150 #, python-format msgid "Error deleting router on Arista HW router %(r)s exception=%(e)s" msgstr "" -#: neutron/services/l3_router/l3_arista.py:200 +#: neutron/services/l3_router/l3_arista.py:196 #, python-format msgid "Error Adding subnet %(subnet)s to router %(router_id)s on Arista HW" msgstr "" -#: neutron/services/l3_router/l3_arista.py:234 +#: neutron/services/l3_router/l3_arista.py:230 #, python-format msgid "" "Error removing interface %(interface)s from router %(router_id)s on " "Arista HWException =(exc)s" msgstr "" -#: neutron/services/l3_router/l3_arista.py:249 +#: neutron/services/l3_router/l3_arista.py:245 msgid "Syncing Neutron Router DB <-> EOS" msgstr "" -#: neutron/services/l3_router/l3_arista.py:280 +#: neutron/services/l3_router/l3_arista.py:276 #, python-format msgid "Error Adding interface %(subnet_id)s to router %(router_id)s on Arista HW" msgstr "" @@ -15312,226 +14714,226 @@ msgstr "" msgid "Pool %(pool_id)s is scheduled to lbaas agent %(agent_id)s" msgstr "" -#: neutron/services/loadbalancer/plugin.py:80 +#: neutron/services/loadbalancer/plugin.py:78 #, python-format msgid "Delete associated loadbalancer pools before removing providers %s" msgstr "" -#: neutron/services/loadbalancer/plugin.py:89 +#: neutron/services/loadbalancer/plugin.py:87 #, python-format msgid "Error retrieving driver for provider %s" msgstr "" -#: neutron/services/loadbalancer/plugin.py:97 +#: neutron/services/loadbalancer/plugin.py:95 #, python-format msgid "Error retrieving provider for pool %s" msgstr "" -#: neutron/services/loadbalancer/plugin.py:188 +#: neutron/services/loadbalancer/plugin.py:186 #, python-format msgid "Failed to delete pool %s, putting it in ERROR state" msgstr "" -#: neutron/services/loadbalancer/agent/agent.py:36 +#: neutron/services/loadbalancer/agent/agent.py:34 msgid "Seconds between periodic task runs" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:39 +#: neutron/services/loadbalancer/agent/agent_manager.py:37 msgid "Drivers used to manage loadbalancing devices" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:45 +#: neutron/services/loadbalancer/agent/agent_manager.py:43 #, python-format msgid "Unknown device with pool_id %(pool_id)s" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:94 +#: neutron/services/loadbalancer/agent/agent_manager.py:92 #, python-format msgid "Error importing loadbalancer device driver: %s" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:101 +#: neutron/services/loadbalancer/agent/agent_manager.py:99 #, python-format msgid "Multiple device drivers with the same name found: %s" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:141 +#: neutron/services/loadbalancer/agent/agent_manager.py:139 #, python-format msgid "Error updating statistics on pool %s" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:157 +#: neutron/services/loadbalancer/agent/agent_manager.py:155 msgid "Unable to retrieve ready devices" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:174 -#: neutron/services/loadbalancer/agent/agent_manager.py:239 +#: neutron/services/loadbalancer/agent/agent_manager.py:172 +#: neutron/services/loadbalancer/agent/agent_manager.py:237 #, python-format msgid "No device driver on agent: %s." msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:184 +#: neutron/services/loadbalancer/agent/agent_manager.py:182 #, python-format msgid "Unable to deploy instance for pool: %s" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:194 +#: neutron/services/loadbalancer/agent/agent_manager.py:192 #, python-format msgid "Unable to destroy device for pool: %s" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:207 +#: neutron/services/loadbalancer/agent/agent_manager.py:205 #, python-format msgid "%(operation)s %(obj)s %(id)s failed on device driver %(driver)s" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:333 +#: neutron/services/loadbalancer/agent/agent_manager.py:331 #, python-format msgid "Destroying pool %s due to agent disabling" msgstr "" -#: neutron/services/loadbalancer/agent/agent_manager.py:336 +#: neutron/services/loadbalancer/agent/agent_manager.py:334 #, python-format msgid "Agent_updated by server side %s!" msgstr "" -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:40 +#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:38 msgid "Driver to use for scheduling pool to a default loadbalancer agent" msgstr "" -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:48 +#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:46 msgid "Device driver for agent should be specified in plugin driver." msgstr "" -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:72 +#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:70 #, python-format msgid "Multiple lbaas agents found on host %s" msgstr "" -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:152 +#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:150 #, python-format msgid "Unknown object type: %s" msgstr "" -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:163 +#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:161 #, python-format msgid "" "Cannot update status: %(obj_type)s %(obj_id)s not found in the DB, it was" " probably deleted concurrently" msgstr "" -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:186 +#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:184 #, python-format msgid "Unable to find port %s to plug." msgstr "" -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:210 -#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:227 +#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:208 +#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:225 #, python-format msgid "" "Unable to find port %s to unplug. This can occur when the Vip has been " "deleted first." msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/config.py:32 +#: neutron/services/loadbalancer/drivers/embrane/config.py:30 msgid "Load Balancer image id (Embrane LB)" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/config.py:34 +#: neutron/services/loadbalancer/drivers/embrane/config.py:32 msgid "In band Security Zone id for LBs" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/config.py:36 +#: neutron/services/loadbalancer/drivers/embrane/config.py:34 msgid "Out of band Security Zone id for LBs" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/config.py:38 +#: neutron/services/loadbalancer/drivers/embrane/config.py:36 msgid "Management Security Zone id for LBs" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/config.py:40 +#: neutron/services/loadbalancer/drivers/embrane/config.py:38 msgid "Dummy user traffic Security Zone id for LBs" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/config.py:44 +#: neutron/services/loadbalancer/drivers/embrane/config.py:42 msgid "choose LB image flavor to use, accepted values: small, medium" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/config.py:47 +#: neutron/services/loadbalancer/drivers/embrane/config.py:45 msgid "resource synchronization interval in seconds" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/constants.py:51 +#: neutron/services/loadbalancer/drivers/embrane/constants.py:49 #, python-format msgid "%s, probably was cancelled through the heleos UI" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/constants.py:58 +#: neutron/services/loadbalancer/drivers/embrane/constants.py:56 #, python-format msgid "" "Failed to delete the backend load balancer for reason %s. Please remove " "it manually through the heleos UI" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/constants.py:61 +#: neutron/services/loadbalancer/drivers/embrane/constants.py:59 #, python-format msgid "" "No subnet is associated to member %s (required to identify the proper " "load balancer port)" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/driver.py:87 +#: neutron/services/loadbalancer/drivers/embrane/driver.py:85 msgid "Connection limit is not supported by Embrane LB" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/driver.py:93 +#: neutron/services/loadbalancer/drivers/embrane/driver.py:91 #, python-format msgid "Session persistence %s not supported by Embrane LBaaS" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/driver.py:131 +#: neutron/services/loadbalancer/drivers/embrane/driver.py:129 #, python-format msgid "Subnet assigned to pool %s doesn't exist, backend port can't be created" msgstr "" -#: neutron/services/loadbalancer/drivers/embrane/agent/lb_operations.py:111 +#: neutron/services/loadbalancer/drivers/embrane/agent/lb_operations.py:109 #, python-format msgid "" "The load balancer %s had no physical representation, likely already " "deleted" msgstr "" -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:46 +#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:45 msgid "Location to store config and state files" msgstr "" -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:53 +#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:52 msgid "The user group" msgstr "" -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:59 +#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:58 msgid "" "When delete and re-add the same vip, send this many gratuitous ARPs to " "flush the ARP cache in the Router. Set it below or equal to 0 to disable " "this feature." msgstr "" -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:76 +#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:75 #, python-format msgid "Error importing interface driver: %s" msgstr "" -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:172 +#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:171 #, python-format msgid "Stats socket not found for pool %s" msgstr "" -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:214 +#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:213 #, python-format msgid "Error while connecting to stats socket: %s" msgstr "" -#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:393 +#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:392 #, python-format msgid "Unable to kill haproxy process: %s" msgstr "" @@ -15715,331 +15117,331 @@ msgstr "" msgid "Removing SNAT port for subnet %s as this is the last pool using it..." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:62 +#: neutron/services/loadbalancer/drivers/radware/driver.py:60 msgid "IP address of vDirect server." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:64 +#: neutron/services/loadbalancer/drivers/radware/driver.py:62 msgid "IP address of secondary vDirect server." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:67 +#: neutron/services/loadbalancer/drivers/radware/driver.py:65 msgid "vDirect user name." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:70 +#: neutron/services/loadbalancer/drivers/radware/driver.py:68 msgid "vDirect user password." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:73 +#: neutron/services/loadbalancer/drivers/radware/driver.py:71 msgid "Service ADC type. Default: VA." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:76 +#: neutron/services/loadbalancer/drivers/radware/driver.py:74 msgid "Service ADC version." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:79 +#: neutron/services/loadbalancer/drivers/radware/driver.py:77 msgid "Enables or disables the Service HA pair. Default: False." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:83 +#: neutron/services/loadbalancer/drivers/radware/driver.py:81 msgid "Service throughput. Default: 1000." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:86 +#: neutron/services/loadbalancer/drivers/radware/driver.py:84 msgid "Service SSL throughput. Default: 100." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:89 +#: neutron/services/loadbalancer/drivers/radware/driver.py:87 msgid "Service compression throughput. Default: 100." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:92 +#: neutron/services/loadbalancer/drivers/radware/driver.py:90 msgid "Size of service cache. Default: 20." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:95 +#: neutron/services/loadbalancer/drivers/radware/driver.py:93 msgid "Name of l2_l3 workflow. Default: openstack_l2_l3." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:99 +#: neutron/services/loadbalancer/drivers/radware/driver.py:97 msgid "Name of l4 workflow. Default: openstack_l4." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:107 +#: neutron/services/loadbalancer/drivers/radware/driver.py:105 msgid "Parameter for l2_l3 workflow constructor." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:114 +#: neutron/services/loadbalancer/drivers/radware/driver.py:112 msgid "Parameter for l2_l3 workflow setup." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:117 +#: neutron/services/loadbalancer/drivers/radware/driver.py:115 msgid "List of actions that are not pushed to the completion queue." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:121 +#: neutron/services/loadbalancer/drivers/radware/driver.py:119 msgid "Name of the l4 workflow action. Default: BaseCreate." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:125 +#: neutron/services/loadbalancer/drivers/radware/driver.py:123 msgid "Resource pool IDs." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:128 +#: neutron/services/loadbalancer/drivers/radware/driver.py:126 msgid "A required VLAN for the interswitch link to use." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:131 +#: neutron/services/loadbalancer/drivers/radware/driver.py:129 msgid "" "Enable or disable Alteon interswitch link for stateful session failover. " "Default: False." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:232 +#: neutron/services/loadbalancer/drivers/radware/driver.py:230 #, python-format msgid "" "vip: %(vip)s, extended_vip: %(extended_vip)s, service_name: " "%(service_name)s, " msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:266 +#: neutron/services/loadbalancer/drivers/radware/driver.py:264 #, python-format msgid "Retrieved pip nport: %(port)r for vip: %(vip)s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:274 +#: neutron/services/loadbalancer/drivers/radware/driver.py:272 #, python-format msgid "Found no pip nports associated with vip: %s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:283 +#: neutron/services/loadbalancer/drivers/radware/driver.py:281 #, python-format msgid "Failed to remove workflow %s. Going to set vip to ERROR status" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:297 +#: neutron/services/loadbalancer/drivers/radware/driver.py:295 #, python-format msgid "pip nport id: %s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:301 +#: neutron/services/loadbalancer/drivers/radware/driver.py:299 #, python-format msgid "pip nport delete failed: %r" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:389 +#: neutron/services/loadbalancer/drivers/radware/driver.py:387 #, python-format msgid "" "_handle_pool_health_monitor. health_monitor = %(hm_id)s pool_id = " "%(pool_id)s delete = %(delete)s vip_id = %(vip_id)s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:420 +#: neutron/services/loadbalancer/drivers/radware/driver.py:418 msgid "Starting operation completion handling thread" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:450 +#: neutron/services/loadbalancer/drivers/radware/driver.py:448 #, python-format msgid "_update_workflow response: %s " msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:459 -#: neutron/services/loadbalancer/drivers/radware/driver.py:490 +#: neutron/services/loadbalancer/drivers/radware/driver.py:457 +#: neutron/services/loadbalancer/drivers/radware/driver.py:488 #, python-format msgid "Pushing operation %s to the queue" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:467 +#: neutron/services/loadbalancer/drivers/radware/driver.py:465 #, python-format msgid "Remove the workflow %s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:475 +#: neutron/services/loadbalancer/drivers/radware/driver.py:473 #, python-format msgid "Post-remove workflow function %r completed" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:479 +#: neutron/services/loadbalancer/drivers/radware/driver.py:477 #, python-format msgid "Post-remove workflow function %r failed" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:596 +#: neutron/services/loadbalancer/drivers/radware/driver.py:594 #, python-format msgid "create_workflow response: %s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:650 +#: neutron/services/loadbalancer/drivers/radware/driver.py:648 #, python-format msgid "Could not find or allocate IP address for subnet id %s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:685 +#: neutron/services/loadbalancer/drivers/radware/driver.py:683 #, python-format msgid "" "vDirectRESTClient:init server=%(server)s, secondary " "server=%(sec_server)s, port=%(port)d, ssl=%(ssl)r" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:691 +#: neutron/services/loadbalancer/drivers/radware/driver.py:689 #, python-format msgid "Fliping servers. Current is: %(server)s, switching to %(secondary)s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:704 +#: neutron/services/loadbalancer/drivers/radware/driver.py:702 msgid "" "REST client is not able to recover since only one vDirect server is " "configured." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:712 +#: neutron/services/loadbalancer/drivers/radware/driver.py:710 #, python-format msgid "vDirect server is not responding (%s)." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:716 +#: neutron/services/loadbalancer/drivers/radware/driver.py:714 #, python-format msgid "vDirect server is not active (%s)." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:744 +#: neutron/services/loadbalancer/drivers/radware/driver.py:742 msgid "vdirectRESTClient: Could not establish HTTPS connection" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:751 +#: neutron/services/loadbalancer/drivers/radware/driver.py:749 msgid "vdirectRESTClient: Could not establish HTTP connection" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:768 +#: neutron/services/loadbalancer/drivers/radware/driver.py:766 #, python-format msgid "vdirectRESTClient: %(action)s failure, %(e)r" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:836 +#: neutron/services/loadbalancer/drivers/radware/driver.py:834 #, python-format msgid "" "Operation %(oper)s is completed after %(sec_to_completion)d sec with " "success status: %(success)s :" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:848 +#: neutron/services/loadbalancer/drivers/radware/driver.py:846 #, python-format msgid "Operation %(operation)s failed. Reason: %(msg)s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:880 +#: neutron/services/loadbalancer/drivers/radware/driver.py:878 #, python-format msgid "Operation %s is not completed yet.." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:895 +#: neutron/services/loadbalancer/drivers/radware/driver.py:893 msgid "Exception was thrown inside OperationCompletionHandler" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:904 +#: neutron/services/loadbalancer/drivers/radware/driver.py:902 #, python-format msgid "Post-operation function %(func)r completed after operation %(oper)r" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:910 +#: neutron/services/loadbalancer/drivers/radware/driver.py:908 #, python-format msgid "Post-operation function %(func)r failed after operation %(oper)r" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:951 +#: neutron/services/loadbalancer/drivers/radware/driver.py:949 #, python-format msgid "_update: %s " msgstr "" -#: neutron/services/loadbalancer/drivers/radware/driver.py:991 +#: neutron/services/loadbalancer/drivers/radware/driver.py:989 #, python-format msgid "_remove_object_from_db %s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:22 +#: neutron/services/loadbalancer/drivers/radware/exceptions.py:20 msgid "An unknown exception occurred in Radware LBaaS provider." msgstr "" -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:26 +#: neutron/services/loadbalancer/drivers/radware/exceptions.py:24 msgid "" "vDirect user/password missing. Specify in configuration file, under " "[radware] section" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:31 +#: neutron/services/loadbalancer/drivers/radware/exceptions.py:29 #, python-format msgid "" "Workflow %(workflow)s is missing on vDirect server. Upload missing " "workflow" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:36 +#: neutron/services/loadbalancer/drivers/radware/exceptions.py:34 #, python-format msgid "" "REST request failed with status %(status)s. Reason: %(reason)s, " "Description: %(description)s. Success status codes are %(success_codes)s" msgstr "" -#: neutron/services/loadbalancer/drivers/radware/exceptions.py:42 +#: neutron/services/loadbalancer/drivers/radware/exceptions.py:40 #, python-format msgid "%(operation)s operation is not supported for %(entity)s." msgstr "" -#: neutron/services/metering/agents/metering_agent.py:70 +#: neutron/services/metering/agents/metering_agent.py:68 msgid "Metering driver" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:72 +#: neutron/services/metering/agents/metering_agent.py:70 msgid "Interval between two metering measures" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:74 +#: neutron/services/metering/agents/metering_agent.py:72 msgid "Interval between two metering reports" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:98 +#: neutron/services/metering/agents/metering_agent.py:96 #, python-format msgid "Loading Metering driver %s" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:100 +#: neutron/services/metering/agents/metering_agent.py:98 msgid "A metering driver must be specified" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:115 +#: neutron/services/metering/agents/metering_agent.py:113 #, python-format msgid "Send metering report: %s" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:179 +#: neutron/services/metering/agents/metering_agent.py:177 #, python-format msgid "Driver %(driver)s does not implement %(func)s" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:183 +#: neutron/services/metering/agents/metering_agent.py:181 #, python-format msgid "Driver %(driver)s:%(func)s runtime error" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:218 +#: neutron/services/metering/agents/metering_agent.py:216 msgid "Get router traffic counters" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:222 +#: neutron/services/metering/agents/metering_agent.py:220 msgid "Update metering rules from agent" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:227 +#: neutron/services/metering/agents/metering_agent.py:225 msgid "Creating a metering label from agent" msgstr "" -#: neutron/services/metering/agents/metering_agent.py:234 +#: neutron/services/metering/agents/metering_agent.py:232 msgid "Delete a metering label from agent" msgstr "" -#: neutron/services/metering/drivers/iptables/iptables_driver.py:93 +#: neutron/services/metering/drivers/iptables/iptables_driver.py:91 #, python-format msgid "Loading interface driver %s" msgstr "" @@ -16048,352 +15450,87 @@ msgstr "" msgid "The vpn device drivers Neutron will use" msgstr "" -#: neutron/services/vpn/plugin.py:46 -#, python-format -msgid "VPN plugin using service driver: %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:89 -#, python-format -msgid "RESPONSE: %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:102 -#, python-format -msgid "%(method)s: Request for %(resource)s payload: %(payload)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:109 -#, python-format -msgid "%(method)s Took %(time).2f seconds to process" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:115 -#, python-format -msgid "%(method)s: Request timeout%(ssl)s (%(timeout).3f sec) for CSR(%(host)s)" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:124 -#, python-format -msgid "%(method)s: Unable to connect to CSR(%(host)s)" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:128 -#, python-format -msgid "%(method)s: Unexpected error for CSR (%(host)s): %(error)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:134 -#, python-format -msgid "%(method)s: Completed [%(status)s]" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:149 -#, python-format -msgid "%(auth)s with CSR %(host)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:156 -#, python-format -msgid "Successfully authenticated with CSR %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:158 -#, python-format -msgid "Failed authentication with CSR %(host)s [%(status)s]" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:193 -#, python-format -msgid "%(method)s: Request timeout for CSR(%(host)s)" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:42 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:41 msgid "Status check interval for Cisco CSR IPSec connections" msgstr "" -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:53 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:52 #, python-format msgid "Cisco CSR failed to create %(resource)s (%(which)s)" msgstr "" -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:56 #, python-format msgid "Cisco CSR failed to change %(tunnel)s admin state to %(state)s" msgstr "" -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:62 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:61 #, python-format msgid "" "Required %(resource)s attribute %(attr)s mapping for Cisco CSR is missing" " in device driver" msgstr "" -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:67 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:66 #, python-format msgid "" "Device driver does not have a mapping of '%(value)s for attribute " "%(attr)s of %(resource)s" msgstr "" -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:130 -#, python-format -msgid "Handling VPN service update notification '%s'" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:152 -#, python-format -msgid "Update: Existing connection %s changed" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:159 -#, python-format -msgid "Update: Connection %s no longer admin down" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:165 -#, python-format -msgid "Update: Connection %s forced to admin down" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:173 -#, python-format -msgid "Update: Created new connection %s in admin down state" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:178 -#, python-format -msgid "Update: Created new connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:189 -#, python-format -msgid "Update: Existing VPN service %s detected" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:193 -#, python-format -msgid "Update: New VPN service %s detected" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:204 -msgid "Update: Completed update processing" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:234 -#, python-format -msgid "Mark: %(service)d VPN services and %(conn)d IPSec connections marked dirty" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:256 -#, python-format -msgid "" -"Sweep: Removed %(service)d dirty VPN service%(splural)s and %(conn)d " -"dirty IPSec connection%(cplural)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:271 -#, python-format -msgid "Report: Collecting status for IPSec connections on VPN service %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:277 -#, python-format -msgid "Connection %s forced down" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:281 -#, python-format -msgid "Connection %(conn)s reported %(status)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:286 -#, python-format -msgid "Report: Adding info for IPSec connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:306 -#, python-format -msgid "Report: Adding info for VPN service %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:328 -msgid "Report: Starting status report processing" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:330 -#, python-format -msgid "Report: Collecting status for VPN service %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:336 -msgid "Sending status report update to plugin" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:338 -msgid "Report: Completed status report processing" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:622 -#, python-format -msgid "Unable to create %(resource)s %(which)s: %(status)d" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:635 -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:663 -#, python-format -msgid "Internal error - '%s' is not defined" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:648 -#, python-format -msgid "Unable to delete %(resource)s %(which)s: %(status)d" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:657 -#, python-format -msgid "Performing rollback action %(action)s for resource %(resource)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:683 -#, python-format -msgid "Creating IPSec connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:716 -#, python-format -msgid "FAILED: Create of IPSec site-to-site connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:719 -#, python-format -msgid "SUCCESS: Created IPSec site-to-site connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:728 -#, python-format -msgid "Deleting IPSec connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:730 -#, python-format -msgid "Unable to find connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:734 -#, python-format -msgid "SUCCESS: Deleted IPSec site-to-site connection %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/cisco_ipsec.py:742 -#, python-format -msgid "Unable to change %(tunnel)s admin state to %(state)s" -msgstr "" - -#: neutron/services/vpn/device_drivers/ipsec.py:46 +#: neutron/services/vpn/device_drivers/ipsec.py:47 msgid "Location to store ipsec server config files" msgstr "" -#: neutron/services/vpn/device_drivers/ipsec.py:49 +#: neutron/services/vpn/device_drivers/ipsec.py:50 msgid "Interval for checking ipsec status" msgstr "" -#: neutron/services/vpn/device_drivers/ipsec.py:59 +#: neutron/services/vpn/device_drivers/ipsec.py:60 msgid "Template file for ipsec configuration" msgstr "" -#: neutron/services/vpn/device_drivers/ipsec.py:65 +#: neutron/services/vpn/device_drivers/ipsec.py:66 msgid "Template file for ipsec secret configuration" msgstr "" -#: neutron/services/vpn/device_drivers/ipsec.py:247 -#, python-format -msgid "Failed to enable vpn process on router %s" -msgstr "" - -#: neutron/services/vpn/device_drivers/ipsec.py:258 -#, python-format -msgid "Failed to disable vpn process on router %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/__init__.py:97 -#, python-format -msgid "Notify agent at %(topic)s.%(host)s the message %(method)s %(args)s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:66 +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:65 #, python-format msgid "Unable to parse config files %s for Cisco CSR info" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:106 -#, python-format -msgid "Ignoring Cisco CSR for subnet %s - REST management is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:46 +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:45 #, python-format msgid "Fatal - %(reason)s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:80 +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:79 #, python-format msgid "No available Cisco CSR %(type)s IDs from %(min)d..%(max)d" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:135 +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:134 #, python-format msgid "" "Database inconsistency between IPSec connection and Cisco CSR mapping " "table (%s)" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:161 -#, python-format -msgid "Reserved new CSR ID %(csr_id)d for %(policy)s ID %(policy_id)s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:188 -#, python-format -msgid "" -"Mappings for IPSec connection %(conn)s - tunnel=%(tunnel)s " -"ike_policy=%(csr_ike)d ipsec_policy=%(csr_ipsec)d" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:197 +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:196 #, python-format msgid "" "Existing entry for IPSec connection %s not found in Cisco CSR mapping " "table" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:224 +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:223 #, python-format msgid "" "Attempt to create duplicate entry in Cisco CSR mapping table for " "connection %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:227 -#, python-format -msgid "" -"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " -"%(ike_id)d and IPSec policy ID %(ipsec_id)d" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_csr_db.py:239 -#, python-format -msgid "Removed mapping for connection %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_ipsec.py:104 -#, python-format -msgid "" -"Notify agent at %(topic)s.%(host)s the message %(method)s %(args)s for " -"router %(router)s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_validator.py:34 +#: neutron/services/vpn/service_drivers/cisco_validator.py:32 #, python-format msgid "" "Cisco CSR does not support %(resource)s attribute %(key)s with value " @@ -16406,35 +15543,35 @@ msgid "" "/proc/cmdline interface." msgstr "" -#: neutron/tests/unit/test_api_v2_resource.py:181 -#: neutron/tests/unit/test_api_v2_resource.py:251 +#: neutron/tests/unit/test_api_v2_resource.py:178 +#: neutron/tests/unit/test_api_v2_resource.py:248 msgid "Unmapped error" msgstr "" -#: neutron/tests/unit/test_api_v2_resource.py:320 +#: neutron/tests/unit/test_api_v2_resource.py:317 msgid "" "The server has either erred or is incapable of performing the requested " "operation." msgstr "" -#: neutron/tests/unit/bigswitch/fake_server.py:72 +#: neutron/tests/unit/bigswitch/fake_server.py:69 #, python-format msgid "" "Request: action=%(action)s, uri=%(uri)r, body=%(body)s, " "headers=%(headers)s" msgstr "" -#: neutron/tests/unit/bigswitch/fake_server.py:124 +#: neutron/tests/unit/bigswitch/fake_server.py:121 #, python-format msgid "No floating IPs in requesturi=%(uri)s, body=%(body)s" msgstr "" -#: neutron/tests/unit/bigswitch/fake_server.py:133 +#: neutron/tests/unit/bigswitch/fake_server.py:130 #, python-format msgid "Expected floating IPs from multiple tenants.uri=%(uri)s, body=%(body)s" msgstr "" -#: neutron/tests/unit/bigswitch/fake_server.py:178 +#: neutron/tests/unit/bigswitch/fake_server.py:175 #, python-format msgid "No host cert for %(server)s in cert %(cert)s" msgstr "" @@ -16474,165 +15611,165 @@ msgstr "" msgid "Adds test attributes to core resources." msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:65 +#: neutron/tests/unit/nec/stub_ofc_driver.py:64 #, python-format msgid "(create_tenant) OFC tenant %s already exists" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:77 +#: neutron/tests/unit/nec/stub_ofc_driver.py:76 #, python-format msgid "(delete_tenant) OFC tenant %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:79 +#: neutron/tests/unit/nec/stub_ofc_driver.py:78 msgid "delete_tenant: SUCCEED" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:86 +#: neutron/tests/unit/nec/stub_ofc_driver.py:85 #, python-format msgid "(create_network) OFC tenant %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:89 +#: neutron/tests/unit/nec/stub_ofc_driver.py:88 #, python-format msgid "(create_network) OFC network %s already exists" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:100 +#: neutron/tests/unit/nec/stub_ofc_driver.py:99 #, python-format msgid "(update_network) OFC network %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:104 +#: neutron/tests/unit/nec/stub_ofc_driver.py:103 msgid "update_network: SUCCEED" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:112 +#: neutron/tests/unit/nec/stub_ofc_driver.py:111 #, python-format msgid "(delete_network) OFC network %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:114 +#: neutron/tests/unit/nec/stub_ofc_driver.py:113 msgid "delete_network: SUCCEED" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:121 +#: neutron/tests/unit/nec/stub_ofc_driver.py:120 #, python-format msgid "(create_port) OFC network %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:124 +#: neutron/tests/unit/nec/stub_ofc_driver.py:123 #, python-format msgid "(create_port) OFC port %s already exists" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:138 +#: neutron/tests/unit/nec/stub_ofc_driver.py:137 #, python-format msgid "(delete_port) OFC port %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:140 +#: neutron/tests/unit/nec/stub_ofc_driver.py:139 msgid "delete_port: SUCCEED" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:173 +#: neutron/tests/unit/nec/stub_ofc_driver.py:172 #, python-format msgid "(create_router) OFC tenant %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:176 +#: neutron/tests/unit/nec/stub_ofc_driver.py:175 #, python-format msgid "(create_router) OFC router %s already exists" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:179 +#: neutron/tests/unit/nec/stub_ofc_driver.py:178 msgid "Operation on OFC is failed" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:193 -#: neutron/tests/unit/nec/stub_ofc_driver.py:283 +#: neutron/tests/unit/nec/stub_ofc_driver.py:192 +#: neutron/tests/unit/nec/stub_ofc_driver.py:282 #, python-format msgid "(delete_router) OFC router %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:195 +#: neutron/tests/unit/nec/stub_ofc_driver.py:194 msgid "delete_router: SUCCEED" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:203 +#: neutron/tests/unit/nec/stub_ofc_driver.py:202 #, python-format msgid "(add_router_interface) ip_address %s is not a valid format (a.b.c.d/N)." msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:208 +#: neutron/tests/unit/nec/stub_ofc_driver.py:207 #, python-format msgid "(add_router_interface) OFC router %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:211 +#: neutron/tests/unit/nec/stub_ofc_driver.py:210 #, python-format msgid "(add_router_interface) OFC network %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:218 +#: neutron/tests/unit/nec/stub_ofc_driver.py:217 #, python-format msgid "add_router_interface: SUCCEED (if_id=%s)" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:226 -#: neutron/tests/unit/nec/stub_ofc_driver.py:243 +#: neutron/tests/unit/nec/stub_ofc_driver.py:225 +#: neutron/tests/unit/nec/stub_ofc_driver.py:242 #, python-format msgid "(delete_router_interface) OFC router interface %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:235 +#: neutron/tests/unit/nec/stub_ofc_driver.py:234 msgid "update_router_route: SUCCEED" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:246 +#: neutron/tests/unit/nec/stub_ofc_driver.py:245 msgid "delete_router_interface: SUCCEED" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:256 +#: neutron/tests/unit/nec/stub_ofc_driver.py:255 #, python-format msgid "(add_router_route) OFC router %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:261 +#: neutron/tests/unit/nec/stub_ofc_driver.py:260 #, python-format msgid "(add_router_route) route to \"%s\" already exists" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:266 +#: neutron/tests/unit/nec/stub_ofc_driver.py:265 #, python-format msgid "add_router_route: SUCCEED (route_id=%s)" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:275 +#: neutron/tests/unit/nec/stub_ofc_driver.py:274 #, python-format msgid "(delete_router_route) OFC router route %s not found" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:277 +#: neutron/tests/unit/nec/stub_ofc_driver.py:276 msgid "delete_router_route: SUCCEED" msgstr "" -#: neutron/tests/unit/nec/stub_ofc_driver.py:290 +#: neutron/tests/unit/nec/stub_ofc_driver.py:289 #, python-format msgid "list_router_routes: routes=%s" msgstr "" -#: neutron/tests/unit/nec/test_ofc_client.py:86 +#: neutron/tests/unit/nec/test_ofc_client.py:84 msgid "The specified OFC resource (/somewhere) is not found." msgstr "" -#: neutron/tests/unit/nec/test_ofc_client.py:90 -#: neutron/tests/unit/nec/test_ofc_client.py:96 -#: neutron/tests/unit/nec/test_ofc_client.py:105 +#: neutron/tests/unit/nec/test_ofc_client.py:88 +#: neutron/tests/unit/nec/test_ofc_client.py:94 +#: neutron/tests/unit/nec/test_ofc_client.py:103 msgid "An OFC exception has occurred: Operation on OFC failed" msgstr "" -#: neutron/tests/unit/nec/test_ofc_client.py:112 +#: neutron/tests/unit/nec/test_ofc_client.py:110 msgid "An OFC exception has occurred: Failed to connect OFC : " msgstr "" diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-error.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 3d75808b74d..00000000000 --- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,265 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-08-26 11:11+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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "" -"Retro compatibilidade não disponível para política deprecada %s. A política " -"não será garantida" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "Erro de verificação de políticas enquanto chamando %s!" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "Exceção original sendo descartada: %s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "Exceção não esperada ocorreu %d vez(es)... tentando novamente." - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "Erro durante %(full_task_name)s: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "Exceção durante limpeza de RPC." - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "Exceção não tratada" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "Pulando faixa irracional do ID GRE %(tun_min)s:%(tun_max)s" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "Pulando faixa irracional do VXLAN VNI %(tun_min)s:%(tun_max)s" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "Erro no loop de eventos do agente" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %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 9c69d687533..d917fbebeb8 100644 --- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/pt_BR/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-08-12 21:40+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "neutron/language/pt_BR/)\n" @@ -19,7 +19,7 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" @@ -27,11 +27,63 @@ msgstr "" "Inserindo política: %(new_policy)s no lugar de política deprecada: " "%(old_policy)s" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "Extensão de grupo de segurança desativada." + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "Preparando filtros para dispositivos %s" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "Regra do grupo de segurança atualizada %r" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "Membro do grupo de segurança atualizado %r" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "Regra do provedor atualizada" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "Remover filtro de dispositivo para %r" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "Atualizar regras de firewall" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "Nenhuma porta aqui para atualizar firewall" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -56,6 +108,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, 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/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "Criado caminho de lock: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -66,72 +133,77 @@ msgstr "Ignorando tarefa periódica %(task)s porque seu intervalo é negativo" 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:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "%s capturadas, saindo" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "Processo pai saiu inesperadamente, saindo" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" -msgstr "" +msgstr "Filho capturado %s, terminando" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Bifurcação muito rápida, suspendendo" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "Filho %d iniciado" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "Iniciando %d trabalhadores" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, 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:360 +#: neutron/openstack/common/service.py:352 #, 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:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "%s capturado, parando filhos" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." -msgstr "" +msgstr "Espera requisitada depois que thread foi morta. Limpando." -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "Aguardando em %d filhos para sair" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +msgstr "%(type)s faixas de ID: %(range)s" + +#: 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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -141,68 +213,55 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "Agente fora de sincronização com o plug-in!" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " -msgstr "" +msgstr "Agente inicializado com êxito; em execução agora... " #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, python-format msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" +msgstr "Designando %(vlan_id)s como vlan local para net-id=%(net_uuid)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" +msgstr "Recuperando vlan = %(vlan_id)s a partir de net-id = %(net_uuid)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "port_unbound() net_uuid %s não em local_vlan_map" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" +msgstr "Mapeamento de rede física %(physical_network)s para a ponte %(bridge)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -214,7 +273,7 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "Porta %(device)s atualizada. Detalhes: %(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format @@ -224,17 +283,53 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "Anexo %s removido" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "Túnel do agente fora de sincronização com o plug-in!" + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index ca8eab6f2ce..00000000000 --- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,159 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-07-18 21:01+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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" -"Encontrada regra deprecada: %s. Por favor considere atualizar seu arquivo de " -"regras de políticas" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" -"Não foi possível encontrar o descritor de tipo de dados para o atributo %s" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d fora da lista de filhos" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/sr/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/sr/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index 4eb04acc207..00000000000 --- a/neutron/locale/sr/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,157 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Serbian (http://www.transifex.com/projects/p/neutron/language/" -"sr/)\n" -"Language: sr\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=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: neutron/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d nije na mladjoj listi" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-critical.po b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-critical.po deleted file mode 100644 index 00199232622..00000000000 --- a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-critical.po +++ /dev/null @@ -1,21 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# rajeshmalisettty , 2014 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-08-01 06:06+0000\n" -"PO-Revision-Date: 2014-07-31 15:31+0000\n" -"Last-Translator: rajeshmalisettty \n" -"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/neutron/" -"language/te_IN/)\n" -"Language: te_IN\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" diff --git a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-error.po b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 4be8143f26b..00000000000 --- a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,266 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# rajeshmalisettty , 2014 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-08-12 21:24+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/neutron/" -"language/te_IN/)\n" -"Language: te_IN\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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "నిరాశపర్చింది విధానం %s కోసం అందుబాటులో వెనుకబడిన అనుకూలత. విధానం అమలు చేయబడదు" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "పాలసీ చెక్ లోపం %s కాల్ఐంది !" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" -"నోవా నోటిఫికేషన్లను ప్రారంభించి, కానీ novaclient ఇన్స్టాల్ కాలేదు. గాని డిసేబుల్ నోవా నోటిఫికేషన్లు లేదా " -"python-novaclient ఇన్స్టాల్." - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "అసలు మినహాయింపు ఔటైన:%s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "ఊహించని మినహాయింపు%d సమయం (s) ఏర్పడింది ... ప్రయత్నించడానికి" - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "సమయంలో లోపం %(full_task_name)s: %(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "RPC క్లీనప్ సమయంలో మినహాయింపు." - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "నిర్వహించని మినహాయింపు" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %s" -msgstr "" diff --git a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-info.po b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-info.po index d2ff5dd2fb7..dbd824f2f20 100644 --- a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/te_IN/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-08-17 05:19+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:35+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Telugu (India) (http://www.transifex.com/projects/p/neutron/" "language/te_IN/)\n" @@ -20,17 +20,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "చేర్చడం విధానం:%(new_policy)s నిరాశపర్చింది విధానం స్థానంలో :%(old_policy)s" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -55,6 +107,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -65,72 +132,77 @@ msgstr "దాని విరామం ప్రతికూల ఎందుక msgid "Skipping periodic task %(task)s because it is disabled" msgstr "అది అసాధ్యమని ఎందుకంటే ఆవర్తన పని %(task)s దాటవేయడం" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "%s క్యాచ్ నిష్క్రమించే" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "parrent ప్రక్రియ నిష్క్రమించే, అనుకోకుండా మరణించాడు," -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "చైల్డ్ నిష్క్రమించే,%s క్యాచ్" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Forking చాలా వేగంగా, పడుకుంది " -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "మొదలైంది పిల్లల%d" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "%d కార్మికులు ప్రారంభిస్తోంది" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "చైల్డ్ %(pid)d సిగ్నల్ ద్వారా హత్య %(sig)d" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "చైల్డ్ %(pid)s స్థితి తో నిష్క్రమించారు %(code)d " -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr " పిల్లలు ఆపటం %s దోరికిను " -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "థ్రెడ్ మృతి తర్వాత అని వేచి. క్లీనింగ్ అప్." -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "%d పిల్లల వెయిటింగ్ నిష్క్రమణ" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -140,41 +212,28 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" @@ -229,11 +288,47 @@ msgstr "" msgid "Agent tunnel out of sync with plugin!" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index f017560b8e1..00000000000 --- a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,158 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# rajeshmalisettty , 2014 -msgid "" -msgstr "" -"Project-Id-Version: Neutron\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-07-23 14:51+0000\n" -"Last-Translator: rajeshmalisettty \n" -"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/neutron/" -"language/te_IN/)\n" -"Language: te_IN\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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" -"చూపిస్తున్న డీప్రికేటెడ్ విధాన నియమం:%s. మీ విధానం ఆకృతీకరణ ఫైలు అప్గ్రేడ్ పరిగణలోకి ఆకృతీకరణ ఫైలు" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "%s యొక్క లక్షణం కోసం డేటా రకం సాధ్యం కాలేదు" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d బాల జాబితా లేదు " - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/vi_VN/LC_MESSAGES/neutron-log-info.po b/neutron/locale/vi_VN/LC_MESSAGES/neutron-log-info.po index cbe139653ae..85658836266 100644 --- a/neutron/locale/vi_VN/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/vi_VN/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-07-18 20:49+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/" "neutron/language/vi_VN/)\n" @@ -19,17 +19,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -54,6 +106,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "Eventlet backdoor lắng nghe trên %(port)s đối với tiến trình %(pid)d" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "Con đường khóa được tạo: %s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "Không thể loại bỏ tập tin %(file)s" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -64,72 +131,77 @@ msgstr "" msgid "Skipping periodic task %(task)s because it is disabled" msgstr "" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "Bắt %s, thoát" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "Tiến trình cha bị chết đột ngột, thoát" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "Tiến trình con bắt %s, thoát" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "Tạo tiến trình con quá nhanh, nghỉ" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "Tiến trình con đã được khởi động %d " -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "Khởi động %d động cơ" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "Tiến trình con %(pid)d bị huỷ bởi tín hiệu %(sig)d" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "Tiến trình con %(pid)s đã thiaast với trạng thái %(code)d" -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "Bắt %s, đang dừng tiến trình con" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "Chờ đợi được gọi sau khi luồng bị huỷ. Làm sạch." -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "Chờ đợi %d tiến trình con để thoát " -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -139,41 +211,28 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" @@ -228,11 +287,47 @@ msgstr "" msgid "Agent tunnel out of sync with plugin!" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-error.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-error.po deleted file mode 100644 index 3a542fad8ed..00000000000 --- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-error.po +++ /dev/null @@ -1,263 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-15 06:11+0000\n" -"PO-Revision-Date: 2014-07-21 17:03+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/policy.py:115 -#, python-format -msgid "" -"Backward compatibility unavailable for deprecated policy %s. The policy will " -"not be enforced" -msgstr "被废弃的策略%s不支持功能回退,这个策略将不再被使用" - -#: neutron/policy.py:280 -#, python-format -msgid "Policy check error while calling %s!" -msgstr "" - -#: neutron/agent/l3_ha_agent.py:136 -#, python-format -msgid "Unable to process HA router %s without ha port" -msgstr "" - -#: neutron/agent/linux/external_process.py:230 -#, 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:250 -#, python-format -msgid "respawning %(service)s for uuid %(uuid)s" -msgstr "" - -#: neutron/agent/linux/external_process.py:256 -msgid "Exiting agent as programmed in check_child_processes_actions" -msgstr "" - -#: neutron/cmd/sanity_check.py:58 -msgid "" -"Nova notifications are enabled, but novaclient is not installed. Either " -"disable nova notifications or install python-novaclient." -msgstr "" - -#: neutron/openstack/common/excutils.py:76 -#, python-format -msgid "Original exception being dropped: %s" -msgstr "正在删除原始异常:%s" - -#: neutron/openstack/common/excutils.py:105 -#, python-format -msgid "Unexpected exception occurred %d time(s)... retrying." -msgstr "意外的异常已发生 %d 次...正在重试。" - -#: neutron/openstack/common/periodic_task.py:202 -#, python-format -msgid "Error during %(full_task_name)s: %(e)s" -msgstr "在 %(full_task_name)s 期间发生错误:%(e)s" - -#: neutron/openstack/common/service.py:188 -msgid "Exception during rpc cleanup." -msgstr "在RPC清除期间发生异常。" - -#: neutron/openstack/common/service.py:277 -msgid "Unhandled exception" -msgstr "存在未处理的异常" - -#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 -#, python-format -msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_gre.py:80 -#, python-format -msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/type_vxlan.py:87 -#, python-format -msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112 -msgid "APIC service agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 -#, python-format -msgid "No such interface (ignored): %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257 -msgid "APIC service agent: exception in LLDP parsing" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 -#, python-format -msgid "APIC service agent: can not get MACaddr for %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328 -msgid "APIC host agent: failed in reporting state" -msgstr "" - -#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386 -msgid "Error in agent event loop" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:56 -#, python-format -msgid "Cannot complete the sync between Neutron and VSD because of error:%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102 -msgid "Agent terminated!: Failed to get a datapath." -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121 -msgid "Agent terminated" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158 -msgid "Agent failed to create agent config map" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283 -msgid "Failed reporting state!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449 -#, python-format -msgid "No local VLAN available for net-id=%s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - " -"tunneling disabled" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475 -#, python-format -msgid "" -"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no " -"bridge for physical_network %(physical_network)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485 -#, python-format -msgid "" -"Cannot provision unknown network type %(network_type)s for net-id=" -"%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523 -#, python-format -msgid "" -"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657 -#, python-format -msgid "" -"Bridge %(bridge)s for physical network %(physical_network)s does not exist. " -"Agent terminated!" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735 -msgid "ofport should have a value that can be interpreted as an integer" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738 -#, python-format -msgid "Failed to set-up %(type)s tunnel port to %(ip)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916 -msgid "Error while synchronizing tunnels" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956 -msgid "Error while processing VIF ports" -msgstr "" - -#: neutron/plugins/vmware/plugins/base.py:2089 -#, python-format -msgid "" -"Rolling back database changes for gateway device %s because of an error in " -"the NSX backend" -msgstr "" - -#: neutron/scheduler/l3_agent_scheduler.py:281 -#, python-format -msgid "Not enough candidates, a HA router needs at least %s agents" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62 -#, python-format -msgid "Config file parse error: %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 -#, python-format -msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 -#, python-format -msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 -#, python-format -msgid "" -"Ignoring Cisco CSR for router %s - timeout is not a floating point number" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113 -#, python-format -msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 -#, python-format -msgid "Malformed interface name for Cisco CSR router entry - %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 -msgid "No routers found in INI file!" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 -#, python-format -msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 -#, python-format -msgid "No matching routers on host %s" -msgstr "" - -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 -#, python-format -msgid "Unable to find host for router %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 index 32ebc2febfb..010daf996d3 100644 --- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/zh_CN/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-08-12 21:40+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:51+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/neutron/" "language/zh_CN/)\n" @@ -19,17 +19,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "在被废弃的策略:%(old_policy)s位置上插入策略:%(new_policy)s " +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "已禁用安全组扩展。" + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "正在为设备 %s 准备过滤器" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "已更新安全组规则 %r" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "已更新安全组成员 %r" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "已更新提供程序规则" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "请为 %r 除去设备过滤器" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "请刷新防火墙规则" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -54,6 +106,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "Eventlet为进程 %(pid)d 在后台监听 %(port)s " + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "已创建锁路径:%s" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "移动文件%(file)s失败" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -64,72 +131,77 @@ msgstr "正在跳过周期性任务 %(task)s,因为其时间间隔为负" msgid "Skipping periodic task %(task)s because it is disabled" msgstr "正在跳过周期性任务 %(task)s,因为它已禁用" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "捕获到 %s,正在退出" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "父进程已意外终止,正在退出" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "派生速度太快,正在休眠" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "已启动子代 %d" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "正在启动 %d 工作程序" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "信号 %(sig)d 已终止子代 %(pid)d" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "子代 %(pid)s 已退出,状态为 %(code)d" -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "捕获到 %s,正在停止子代" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "" -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "正在等待 %d 个子代退出" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -139,68 +211,55 @@ msgstr "" msgid "Agent out of sync with plugin!" msgstr "代理与插件不同步!" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " -msgstr "" +msgstr "代理已成功初始化,现在正在运行..." #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, python-format msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" +msgstr "对于网络标识 %(net_uuid)s,正在将 %(vlan_id)s 分配为本地 vlan" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" +msgstr "正在从网络标识 %(net_uuid)s 恢复 vlan %(vlan_id)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "port_unbound() net_uuid %s 未在 local_vlan_map 中" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" +msgstr "正在将物理网络 %(physical_network)s 映射至网桥 %(bridge)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -212,7 +271,7 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "端口 %(device)s 已更新。详细信息:%(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format @@ -222,17 +281,53 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "已除去附件 %s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "代理隧道与插件不同步!" + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index a48532d58fd..00000000000 --- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "pid %d 没有在子代列表中" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po b/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po index 78044b1fd60..535b7ae53f7 100644 --- a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po +++ b/neutron/locale/zh_TW/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: 2014-09-14 06:10+0000\n" -"PO-Revision-Date: 2014-07-18 20:49+0000\n" +"POT-Creation-Date: 2014-10-22 06:19+0000\n" +"PO-Revision-Date: 2014-10-21 10:35+0000\n" "Last-Translator: openstackjenkins \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/neutron/" "language/zh_TW/)\n" @@ -19,17 +19,69 @@ msgstr "" "Generated-By: Babel 1.3\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: neutron/policy.py:106 +#: neutron/policy.py:110 #, python-format msgid "" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" msgstr "" +#: neutron/agent/securitygroups_rpc.py:80 +msgid "Disabled security-group extension." +msgstr "已停用安全群組延伸。" + +#: neutron/agent/securitygroups_rpc.py:82 +msgid "Disabled allowed-address-pairs extension." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:198 +#, python-format +msgid "" +"Skipping method %s as firewall is disabled or configured as " +"NoopFirewallDriver." +msgstr "" + +#: neutron/agent/securitygroups_rpc.py:209 +#, python-format +msgid "Preparing filters for devices %s" +msgstr "正在準備裝置 %s 的過濾器" + +#: neutron/agent/securitygroups_rpc.py:239 +#, python-format +msgid "Security group rule updated %r" +msgstr "安全群組規則已更新 %r" + +#: neutron/agent/securitygroups_rpc.py:246 +#, python-format +msgid "Security group member updated %r" +msgstr "安全群組成員已更新 %r" + +#: neutron/agent/securitygroups_rpc.py:268 +msgid "Provider rule updated" +msgstr "已更新提供者規則" + +#: neutron/agent/securitygroups_rpc.py:280 +#, python-format +msgid "Remove device filter for %r" +msgstr "移除 %r 的裝置過濾器" + +#: neutron/agent/securitygroups_rpc.py:290 +msgid "Refresh firewall rules" +msgstr "重新整理防火牆規則" + +#: neutron/agent/securitygroups_rpc.py:294 +msgid "No ports here to refresh firewall" +msgstr "" + +#: neutron/agent/linux/ovs_lib.py:422 +#, python-format +msgid "Port %(port_id)s not present in bridge %(br_name)s" +msgstr "" + #: neutron/common/ipv6_utils.py:62 msgid "IPv6 is not enabled on this system." msgstr "" -#: neutron/db/l3_agentschedulers_db.py:82 +#: neutron/db/l3_agentschedulers_db.py:83 msgid "" "Skipping period L3 agent status check because automatic router rescheduling " "is disabled." @@ -54,6 +106,21 @@ msgstr "" msgid "%d probe(s) deleted" msgstr "" +#: neutron/openstack/common/eventlet_backdoor.py:140 +#, python-format +msgid "Eventlet backdoor listening on %(port)s for process %(pid)d" +msgstr "" + +#: neutron/openstack/common/lockutils.py:82 +#, python-format +msgid "Created lock path: %s" +msgstr "" + +#: neutron/openstack/common/lockutils.py:194 +#, python-format +msgid "Failed to remove file %(file)s" +msgstr "" + #: neutron/openstack/common/periodic_task.py:126 #, python-format msgid "Skipping periodic task %(task)s because its interval is negative" @@ -64,72 +131,77 @@ msgstr "正在跳過定期作業 %(task)s,因為其間隔為負數" msgid "Skipping periodic task %(task)s because it is disabled" msgstr "正在跳過定期作業 %(task)s,因為它已停用" -#: neutron/openstack/common/service.py:176 +#: neutron/openstack/common/service.py:174 #, python-format msgid "Caught %s, exiting" msgstr "已捕捉到 %s,正在結束" -#: neutron/openstack/common/service.py:240 +#: neutron/openstack/common/service.py:232 msgid "Parent process has died unexpectedly, exiting" msgstr "母程序已非預期地當掉,正在結束" -#: neutron/openstack/common/service.py:271 +#: neutron/openstack/common/service.py:263 #, python-format msgid "Child caught %s, exiting" msgstr "" -#: neutron/openstack/common/service.py:310 +#: neutron/openstack/common/service.py:302 msgid "Forking too fast, sleeping" msgstr "分岔太快,正在休眠" -#: neutron/openstack/common/service.py:329 +#: neutron/openstack/common/service.py:321 #, python-format msgid "Started child %d" msgstr "已開始子行程 %d" -#: neutron/openstack/common/service.py:339 +#: neutron/openstack/common/service.py:331 #, python-format msgid "Starting %d workers" msgstr "正在啟動 %d 個工作程式" -#: neutron/openstack/common/service.py:356 +#: neutron/openstack/common/service.py:348 #, python-format msgid "Child %(pid)d killed by signal %(sig)d" msgstr "信號 %(sig)d 結束了子項 %(pid)d" -#: neutron/openstack/common/service.py:360 +#: neutron/openstack/common/service.py:352 #, python-format msgid "Child %(pid)s exited with status %(code)d" msgstr "子項 %(pid)s 已結束,狀態為 %(code)d" -#: neutron/openstack/common/service.py:399 +#: neutron/openstack/common/service.py:391 #, python-format msgid "Caught %s, stopping children" msgstr "已捕捉到 %s,正在停止子項" -#: neutron/openstack/common/service.py:408 +#: neutron/openstack/common/service.py:400 msgid "Wait called after thread killed. Cleaning up." msgstr "" -#: neutron/openstack/common/service.py:424 +#: neutron/openstack/common/service.py:416 #, python-format msgid "Waiting on %d children to exit" msgstr "正在等待 %d 個子項結束" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80 +#: neutron/plugins/ml2/drivers/type_tunnel.py:79 +#, python-format +msgid "%(type)s ID ranges: %(range)s" +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:97 +#: 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:191 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189 #, python-format msgid "APIC host agent: agent starting on %s" msgstr "" -#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 +#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209 #, python-format msgid "APIC host agent: started on %s" msgstr "" @@ -137,70 +209,57 @@ msgstr "" #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907 msgid "Agent out of sync with plugin!" -msgstr "" +msgstr "代理程式與外掛程式不同步!" -#: neutron/plugins/nuage/syncmanager.py:47 +#: neutron/plugins/nuage/syncmanager.py:46 msgid "Starting the sync between Neutron and VSD" msgstr "" -#: neutron/plugins/nuage/syncmanager.py:60 +#: neutron/plugins/nuage/syncmanager.py:59 msgid "Sync between Neutron and VSD completed successfully" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:137 +#: neutron/plugins/ofagent/agent/arp_lib.py:142 msgid "No bridge is set" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:140 +#: neutron/plugins/ofagent/agent/arp_lib.py:145 #, python-format msgid "Unknown bridge %(dpid)s ours %(ours)s" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:147 -#, python-format -msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:152 +#: neutron/plugins/ofagent/agent/arp_lib.py:163 msgid "drop non tenant packet" msgstr "" -#: neutron/plugins/ofagent/agent/arp_lib.py:157 -msgid "drop non-ethernet packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:162 -msgid "drop non-arp packet" -msgstr "" - -#: neutron/plugins/ofagent/agent/arp_lib.py:171 +#: neutron/plugins/ofagent/agent/arp_lib.py:182 #, python-format msgid "unknown network %s" msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 msgid "Agent initialized successfully, now running... " -msgstr "" +msgstr "已順利地起始設定代理程式,現正在執行中..." #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #, python-format msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" +msgstr "正在將 %(vlan_id)s 指派為 net-id = %(net_uuid)s 的本端 VLAN" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502 #, python-format msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" +msgstr "正在從 net-id = %(net_uuid)s 收回 VLAN = %(vlan_id)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570 #, python-format msgid "port_unbound() net_uuid %s not in local_vlan_map" -msgstr "" +msgstr "port_unbound() net_uuid %s 不在 local_vlan_map 中" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651 #, python-format msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" +msgstr "正在將實體網路 %(physical_network)s 對映到橋接器 %(bridge)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #, python-format @@ -212,7 +271,7 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #, python-format msgid "Port %(device)s updated. Details: %(details)s" -msgstr "" +msgstr "已更新埠 %(device)s。詳細資料:%(details)s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #, python-format @@ -222,17 +281,53 @@ msgstr "" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #, python-format msgid "Attachment %s removed" -msgstr "" +msgstr "已移除連接裝置 %s" #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 msgid "Agent tunnel out of sync with plugin!" +msgstr "代理程式通道與外掛程式不同步!" + +#: neutron/services/vpn/plugin.py:45 +#, python-format +msgid "VPN plugin using service driver: %s" msgstr "" -#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57 +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335 +msgid "Sending status report update to plugin" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715 +#, python-format +msgid "FAILED: Create of IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718 +#, python-format +msgid "SUCCESS: Created IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733 +#, python-format +msgid "SUCCESS: Deleted IPSec site-to-site connection %s" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56 #, python-format msgid "Scanning config files %s for Cisco CSR configurations" msgstr "" +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226 +#, python-format +msgid "" +"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID " +"%(ike_id)d and IPSec policy ID %(ipsec_id)d" +msgstr "" + +#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238 +#, python-format +msgid "Removed mapping for connection %s" +msgstr "" + #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63 #, python-format msgid "spawned: %d" diff --git a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-warning.po deleted file mode 100644 index 9ce2cc65c0d..00000000000 --- a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-warning.po +++ /dev/null @@ -1,156 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2014 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: 2014-09-14 06:11+0000\n" -"PO-Revision-Date: 2014-06-30 19:27+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/policy.py:94 -#, python-format -msgid "" -"Found deprecated policy rule:%s. Please consider upgrading your policy " -"configuration file" -msgstr "" - -#: neutron/policy.py:137 -#, python-format -msgid "Unable to find data type descriptor for attribute %s" -msgstr "" - -#: neutron/agent/securitygroups_rpc.py:183 -msgid "" -"security_group_info_for_devices rpc call not supported by the server, " -"falling back to old security_group_rules_for_devices which scales worse." -msgstr "" - -#: neutron/agent/linux/keepalived.py:358 -msgid "" -"A previous instance of keepalived seems to be dead, unable to restart it, a " -"new instance will be spawned" -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:105 -msgid "" -"Time since last L3 agent reschedule check has exceeded the interval between " -"checks. Waiting before check to allow agents to send a heartbeat in case " -"there was a clock adjustment." -msgstr "" - -#: neutron/db/l3_agentschedulers_db.py:127 -#, python-format -msgid "" -"Rescheduling router %(router)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_hamode_db.py:404 -#, python-format -msgid "The router %(router_id)s is bound multiple times on the agent %(host)s" -msgstr "" - -#: neutron/openstack/common/service.py:364 -#, python-format -msgid "pid %d not in child list" -msgstr "PID %d 不在子項清單中" - -#: neutron/plugins/ml2/drivers/type_tunnel.py:143 -#, python-format -msgid "%(type)s tunnel %(id)s not found" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68 -#, python-format -msgid "Create network postcommit failed for network %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78 -#, python-format -msgid "Create subnet postcommit failed for subnet %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91 -#, python-format -msgid "Create port postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110 -#, python-format -msgid "Add interface postcommit failed for port %s" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:299 -#, python-format -msgid "Subnet %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:317 -#, python-format -msgid "Router %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:329 -#, python-format -msgid "" -"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for " -"sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:343 -#, python-format -msgid "Security group %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:354 -#, python-format -msgid "Security group rule %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:364 -#, python-format -msgid "Floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:376 -#, python-format -msgid "IP allocation for floating ip %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:387 -#, python-format -msgid "Net-partition %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/nuage/syncmanager.py:397 -#, python-format -msgid "VM port %s not found in neutron for sync" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290 -#, python-format -msgid "Unable to create tunnel port. Invalid remote IP: %s" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713 -#, python-format -msgid "" -"VIF port: %s has no ofport configured, and might not be able to transmit" -msgstr "" - -#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820 -#, python-format -msgid "Device %s not defined on plugin" -msgstr "" diff --git a/neutron/notifiers/nova.py b/neutron/notifiers/nova.py index aa4f1b53e11..2b2bab63d1b 100644 --- a/neutron/notifiers/nova.py +++ b/neutron/notifiers/nova.py @@ -41,12 +41,16 @@ class Notifier(object): def __init__(self): # TODO(arosen): we need to cache the endpoints and figure out # how to deal with different regions here.... - bypass_url = "%s/%s" % (cfg.CONF.nova_url, - cfg.CONF.nova_admin_tenant_id) + if cfg.CONF.nova_admin_tenant_id: + bypass_url = "%s/%s" % (cfg.CONF.nova_url, + cfg.CONF.nova_admin_tenant_id) + else: + bypass_url = None + self.nclient = nclient.Client( username=cfg.CONF.nova_admin_username, api_key=cfg.CONF.nova_admin_password, - project_id=None, + project_id=cfg.CONF.nova_admin_tenant_name, tenant_id=cfg.CONF.nova_admin_tenant_id, auth_url=cfg.CONF.nova_admin_auth_url, cacert=cfg.CONF.nova_ca_certificates_file, diff --git a/neutron/openstack/common/__init__.py b/neutron/openstack/common/__init__.py index d1223eaf765..e69de29bb2d 100644 --- a/neutron/openstack/common/__init__.py +++ b/neutron/openstack/common/__init__.py @@ -1,17 +0,0 @@ -# -# 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 six - - -six.add_move(six.MovedModule('mox', 'mox', 'mox3.mox')) diff --git a/neutron/openstack/common/_i18n.py b/neutron/openstack/common/_i18n.py new file mode 100644 index 00000000000..50a92b19d11 --- /dev/null +++ b/neutron/openstack/common/_i18n.py @@ -0,0 +1,40 @@ +# 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. + +"""oslo.i18n integration module. + +See http://docs.openstack.org/developer/oslo.i18n/usage.html + +""" + +import oslo.i18n + + +# NOTE(dhellmann): This reference to o-s-l-o will be replaced by the +# application name when this module is synced into the separate +# repository. It is OK to have more than one translation function +# using the same domain, since there will still only be one message +# catalog. +_translators = oslo.i18n.TranslatorFactory(domain='neutron') + +# The primary translation function using the well-known name "_" +_ = _translators.primary + +# Translators for log levels. +# +# The abbreviated names are meant to reflect the usual use of a short +# name like '_'. The "L" is for "log" and the other letter comes from +# the level. +_LI = _translators.log_info +_LW = _translators.log_warning +_LE = _translators.log_error +_LC = _translators.log_critical diff --git a/neutron/openstack/common/cache/_backends/memory.py b/neutron/openstack/common/cache/_backends/memory.py index d6f5249fec2..5c02cfc4025 100644 --- a/neutron/openstack/common/cache/_backends/memory.py +++ b/neutron/openstack/common/cache/_backends/memory.py @@ -14,9 +14,10 @@ import collections +from oslo.utils import timeutils + from neutron.openstack.common.cache import backends from neutron.openstack.common import lockutils -from neutron.openstack.common import timeutils class MemoryBackend(backends.BaseCache): @@ -147,7 +148,7 @@ class MemoryBackend(backends.BaseCache): try: # NOTE(flaper87): Keys with ttl == 0 # don't exist in the _keys_expires dict - self._keys_expires[value[0]].remove(value[1]) + self._keys_expires[value[0]].remove(key) except (KeyError, ValueError): pass diff --git a/neutron/openstack/common/cache/backends.py b/neutron/openstack/common/cache/backends.py index 2fa4aaeb274..1bea8912a00 100644 --- a/neutron/openstack/common/cache/backends.py +++ b/neutron/openstack/common/cache/backends.py @@ -26,9 +26,9 @@ class BaseCache(object): :params parsed_url: Parsed url object. :params options: A dictionary with configuration parameters - for the cache. For example: - - default_ttl: An integer defining the default ttl - for keys. + for the cache. For example: + + - default_ttl: An integer defining the default ttl for keys. """ def __init__(self, parsed_url, options=None): @@ -43,20 +43,17 @@ class BaseCache(object): def set(self, key, value, ttl, not_exists=False): """Sets or updates a cache entry - NOTE: Thread-safety is required and has to be - guaranteed by the backend implementation. + .. note:: Thread-safety is required and has to be guaranteed by the + backend implementation. :params key: Item key as string. :type key: `unicode string` - :params value: Value to assign to the key. This - can be anything that is handled - by the current backend. - :params ttl: Key's timeout in seconds. 0 means - no timeout. + :params value: Value to assign to the key. This can be anything that + is handled by the current backend. + :params ttl: Key's timeout in seconds. 0 means no timeout. :type ttl: int - :params not_exists: If True, the key will be set - if it doesn't exist. Otherwise, - it'll always be set. + :params not_exists: If True, the key will be set if it doesn't exist. + Otherwise, it'll always be set. :type not_exists: bool :returns: True if the operation succeeds, False otherwise. @@ -74,9 +71,8 @@ class BaseCache(object): :params key: Item key as string. :type key: `unicode string` - :params value: Value to assign to the key. This - can be anything that is handled - by the current backend. + :params value: Value to assign to the key. This can be anything that + is handled by the current backend. """ try: return self[key] @@ -91,15 +87,14 @@ class BaseCache(object): def get(self, key, default=None): """Gets one item from the cache - NOTE: Thread-safety is required and it has to be - guaranteed by the backend implementation. + .. note:: Thread-safety is required and it has to be guaranteed + by the backend implementation. - :params key: Key for the item to retrieve - from the cache. + :params key: Key for the item to retrieve from the cache. :params default: The default value to return. - :returns: `key`'s value in the cache if it exists, - otherwise `default` should be returned. + :returns: `key`'s value in the cache if it exists, otherwise + `default` should be returned. """ return self._get(key, default) @@ -115,8 +110,8 @@ class BaseCache(object): def __delitem__(self, key): """Removes an item from cache. - NOTE: Thread-safety is required and it has to be - guaranteed by the backend implementation. + .. note:: Thread-safety is required and it has to be guaranteed by + the backend implementation. :params key: The key to remove. @@ -130,8 +125,8 @@ class BaseCache(object): def clear(self): """Removes all items from the cache. - NOTE: Thread-safety is required and it has to be - guaranteed by the backend implementation. + .. note:: Thread-safety is required and it has to be guaranteed by + the backend implementation. """ return self._clear() @@ -143,9 +138,8 @@ class BaseCache(object): """Increments the value for a key :params key: The key for the value to be incremented - :params delta: Number of units by which to increment - the value. Pass a negative number to - decrement the value. + :params delta: Number of units by which to increment the value. + Pass a negative number to decrement the value. :returns: The new value """ @@ -158,10 +152,8 @@ class BaseCache(object): def append_tail(self, key, tail): """Appends `tail` to `key`'s value. - :params key: The key of the value to which - `tail` should be appended. - :params tail: The list of values to append to the - original. + :params key: The key of the value to which `tail` should be appended. + :params tail: The list of values to append to the original. :returns: The new value """ @@ -181,10 +173,8 @@ class BaseCache(object): def append(self, key, value): """Appends `value` to `key`'s value. - :params key: The key of the value to which - `tail` should be appended. - :params value: The value to append to the - original. + :params key: The key of the value to which `tail` should be appended. + :params value: The value to append to the original. :returns: The new value """ @@ -196,8 +186,7 @@ class BaseCache(object): :params key: The key to verify. - :returns: True if the key exists, - otherwise False. + :returns: True if the key exists, otherwise False. """ @abc.abstractmethod @@ -209,9 +198,8 @@ class BaseCache(object): """Gets keys' value from cache :params keys: List of keys to retrieve. - :params default: The default value to return - for each key that is not in - the cache. + :params default: The default value to return for each key that is not + in the cache. :returns: A generator of (key, value) """ @@ -227,13 +215,12 @@ class BaseCache(object): def set_many(self, data, ttl=None): """Puts several items into the cache at once - Depending on the backend, this operation may or may - not be efficient. The default implementation calls - set for each (key, value) pair passed, other backends - support set_many operations as part of their protocols. + Depending on the backend, this operation may or may not be efficient. + The default implementation calls set for each (key, value) pair + passed, other backends support set_many operations as part of their + protocols. - :params data: A dictionary like {key: val} to store - in the cache. + :params data: A dictionary like {key: val} to store in the cache. :params ttl: Key's timeout in seconds. """ diff --git a/neutron/openstack/common/cache/cache.py b/neutron/openstack/common/cache/cache.py index 1247787a28e..70c4545defc 100644 --- a/neutron/openstack/common/cache/cache.py +++ b/neutron/openstack/common/cache/cache.py @@ -24,7 +24,7 @@ from six.moves.urllib import parse from stevedore import driver -def _get_olso_configs(): +def _get_oslo_configs(): """Returns the oslo.config options to register.""" # NOTE(flaper87): Oslo config should be # optional. Instead of doing try / except @@ -45,7 +45,7 @@ def register_oslo_configs(conf): :params conf: Config object. :type conf: `cfg.ConfigOptions` """ - conf.register_opts(_get_olso_configs()) + conf.register_opts(_get_oslo_configs()) def get_cache(url='memory://'): diff --git a/neutron/openstack/common/eventlet_backdoor.py b/neutron/openstack/common/eventlet_backdoor.py index b55b0ceb3b6..850fdd4697c 100644 --- a/neutron/openstack/common/eventlet_backdoor.py +++ b/neutron/openstack/common/eventlet_backdoor.py @@ -29,7 +29,7 @@ import eventlet.backdoor import greenlet from oslo.config import cfg -from neutron.openstack.common.gettextutils import _ +from neutron.openstack.common._i18n import _LI from neutron.openstack.common import log as logging help_for_backdoor_port = ( @@ -41,7 +41,6 @@ help_for_backdoor_port = ( "chosen port is displayed in the service's log file.") eventlet_backdoor_opts = [ cfg.StrOpt('backdoor_port', - default=None, help="Enable eventlet backdoor. %s" % help_for_backdoor_port) ] @@ -137,8 +136,10 @@ def initialize_if_enabled(): # In the case of backdoor port being zero, a port number is assigned by # listen(). In any case, pull the port number out here. port = sock.getsockname()[1] - LOG.info(_('Eventlet backdoor listening on %(port)s for process %(pid)d') % - {'port': port, 'pid': os.getpid()}) + LOG.info( + _LI('Eventlet backdoor listening on %(port)s for process %(pid)d') % + {'port': port, 'pid': os.getpid()} + ) eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, locals=backdoor_locals) return port diff --git a/neutron/openstack/common/fileutils.py b/neutron/openstack/common/fileutils.py index 704af09623e..f91fc32388f 100644 --- a/neutron/openstack/common/fileutils.py +++ b/neutron/openstack/common/fileutils.py @@ -13,14 +13,13 @@ # License for the specific language governing permissions and limitations # under the License. - import contextlib import errno import os import tempfile -from neutron.openstack.common import excutils -from neutron.openstack.common.gettextutils import _ +from oslo.utils import excutils + from neutron.openstack.common import log as logging LOG = logging.getLogger(__name__) @@ -52,15 +51,15 @@ def read_cached_file(filename, force_reload=False): """ global _FILE_CACHE - if force_reload and filename in _FILE_CACHE: - del _FILE_CACHE[filename] + if force_reload: + delete_cached_file(filename) reloaded = False mtime = os.path.getmtime(filename) cache_info = _FILE_CACHE.setdefault(filename, {}) if not cache_info or mtime > cache_info.get('mtime', 0): - LOG.debug(_("Reloading cached file %s") % filename) + LOG.debug("Reloading cached file %s" % filename) with open(filename) as fap: cache_info['data'] = fap.read() cache_info['mtime'] = mtime @@ -68,6 +67,17 @@ def read_cached_file(filename, force_reload=False): return (reloaded, cache_info['data']) +def delete_cached_file(filename): + """Delete cached file if present. + + :param filename: filename to delete + """ + global _FILE_CACHE + + if filename in _FILE_CACHE: + del _FILE_CACHE[filename] + + def delete_if_exists(path, remove=os.unlink): """Delete a file, but ignore file not found error. @@ -101,13 +111,13 @@ def remove_path_on_error(path, remove=delete_if_exists): def file_open(*args, **kwargs): """Open file - see built-in file() documentation for more details + see built-in open() documentation for more details Note: The reason this is kept in a separate module is to easily be able to provide a stub module that doesn't alter system state at all (for unit tests) """ - return file(*args, **kwargs) + return open(*args, **kwargs) def write_to_tempfile(content, path=None, suffix='', prefix='tmp'): diff --git a/neutron/openstack/common/lockutils.py b/neutron/openstack/common/lockutils.py index f0c5cb13c3f..996a810bb6f 100644 --- a/neutron/openstack/common/lockutils.py +++ b/neutron/openstack/common/lockutils.py @@ -13,10 +13,10 @@ # License for the specific language governing permissions and limitations # under the License. - import contextlib import errno import functools +import logging import os import shutil import subprocess @@ -29,9 +29,7 @@ import weakref from oslo.config import cfg from neutron.openstack.common import fileutils -from neutron.openstack.common.gettextutils import _ -from neutron.openstack.common import local -from neutron.openstack.common import log as logging +from neutron.openstack.common._i18n import _, _LE, _LI LOG = logging.getLogger(__name__) @@ -39,10 +37,10 @@ LOG = logging.getLogger(__name__) util_opts = [ cfg.BoolOpt('disable_process_locking', default=False, - help='Whether to disable inter-process locks'), + help='Enables or disables inter-process locks.'), cfg.StrOpt('lock_path', default=os.environ.get("NEUTRON_LOCK_PATH"), - help=('Directory to use for lock files.')) + help='Directory to use for lock files.') ] @@ -54,7 +52,7 @@ def set_defaults(lock_path): cfg.set_defaults(util_opts, lock_path=lock_path) -class _InterProcessLock(object): +class _FileLock(object): """Lock implementation which allows multiple locks, working around issues like bugs.debian.org/cgi-bin/bugreport.cgi?bug=632857 and does not require any cleanup. Since the lock is always held on a file @@ -76,7 +74,13 @@ class _InterProcessLock(object): self.lockfile = None self.fname = name - def __enter__(self): + def acquire(self): + basedir = os.path.dirname(self.fname) + + if not os.path.exists(basedir): + fileutils.ensure_tree(basedir) + LOG.info(_LI('Created lock path: %s'), basedir) + self.lockfile = open(self.fname, 'w') while True: @@ -86,23 +90,39 @@ class _InterProcessLock(object): # Also upon reading the MSDN docs for locking(), it seems # to have a laughable 10 attempts "blocking" mechanism. self.trylock() - return self + LOG.debug('Got file lock "%s"', self.fname) + return True except IOError as e: if e.errno in (errno.EACCES, errno.EAGAIN): # external locks synchronise things like iptables # updates - give it some time to prevent busy spinning time.sleep(0.01) else: - raise + raise threading.ThreadError(_("Unable to acquire lock on" + " `%(filename)s` due to" + " %(exception)s") % + {'filename': self.fname, + 'exception': e}) - def __exit__(self, exc_type, exc_val, exc_tb): + def __enter__(self): + self.acquire() + return self + + def release(self): try: self.unlock() self.lockfile.close() + LOG.debug('Released file lock "%s"', self.fname) except IOError: - LOG.exception(_("Could not release the acquired lock `%s`"), + LOG.exception(_LE("Could not release the acquired lock `%s`"), self.fname) + def __exit__(self, exc_type, exc_val, exc_tb): + self.release() + + def exists(self): + return os.path.exists(self.fname) + def trylock(self): raise NotImplementedError() @@ -110,7 +130,7 @@ class _InterProcessLock(object): raise NotImplementedError() -class _WindowsLock(_InterProcessLock): +class _WindowsLock(_FileLock): def trylock(self): msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_NBLCK, 1) @@ -118,7 +138,7 @@ class _WindowsLock(_InterProcessLock): msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_UNLCK, 1) -class _PosixLock(_InterProcessLock): +class _FcntlLock(_FileLock): def trylock(self): fcntl.lockf(self.lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) @@ -131,12 +151,63 @@ if os.name == 'nt': InterProcessLock = _WindowsLock else: import fcntl - InterProcessLock = _PosixLock + InterProcessLock = _FcntlLock _semaphores = weakref.WeakValueDictionary() _semaphores_lock = threading.Lock() +def _get_lock_path(name, lock_file_prefix, lock_path=None): + # NOTE(mikal): the lock name cannot contain directory + # separators + name = name.replace(os.sep, '_') + if lock_file_prefix: + sep = '' if lock_file_prefix.endswith('-') else '-' + name = '%s%s%s' % (lock_file_prefix, sep, name) + + local_lock_path = lock_path or CONF.lock_path + + if not local_lock_path: + raise cfg.RequiredOptError('lock_path') + + return os.path.join(local_lock_path, name) + + +def external_lock(name, lock_file_prefix=None, lock_path=None): + LOG.debug('Attempting to grab external lock "%(lock)s"', + {'lock': name}) + + lock_file_path = _get_lock_path(name, lock_file_prefix, lock_path) + + return InterProcessLock(lock_file_path) + + +def remove_external_lock_file(name, lock_file_prefix=None): + """Remove an external lock file when it's not used anymore + This will be helpful when we have a lot of lock files + """ + with internal_lock(name): + lock_file_path = _get_lock_path(name, lock_file_prefix) + try: + os.remove(lock_file_path) + except OSError: + LOG.info(_LI('Failed to remove file %(file)s'), + {'file': lock_file_path}) + + +def internal_lock(name): + with _semaphores_lock: + try: + sem = _semaphores[name] + LOG.debug('Using existing semaphore "%s"', name) + except KeyError: + sem = threading.Semaphore() + _semaphores[name] = sem + LOG.debug('Created new semaphore "%s"', name) + + return sem + + @contextlib.contextmanager def lock(name, lock_file_prefix=None, external=False, lock_path=None): """Context based lock @@ -152,67 +223,19 @@ def lock(name, lock_file_prefix=None, external=False, lock_path=None): should work across multiple processes. This means that if two different workers both run a method decorated with @synchronized('mylock', external=True), only one of them will execute at a time. - - :param lock_path: The lock_path keyword argument is used to specify a - special location for external lock files to live. If nothing is set, then - CONF.lock_path is used as a default. """ - with _semaphores_lock: - try: - sem = _semaphores[name] - except KeyError: - sem = threading.Semaphore() - _semaphores[name] = sem - - with sem: - LOG.debug(_('Got semaphore "%(lock)s"'), {'lock': name}) - - # NOTE(mikal): I know this looks odd - if not hasattr(local.strong_store, 'locks_held'): - local.strong_store.locks_held = [] - local.strong_store.locks_held.append(name) - + int_lock = internal_lock(name) + with int_lock: + LOG.debug('Acquired semaphore "%(lock)s"', {'lock': name}) try: if external and not CONF.disable_process_locking: - LOG.debug(_('Attempting to grab file lock "%(lock)s"'), - {'lock': name}) - - # We need a copy of lock_path because it is non-local - local_lock_path = lock_path or CONF.lock_path - if not local_lock_path: - raise cfg.RequiredOptError('lock_path') - - if not os.path.exists(local_lock_path): - fileutils.ensure_tree(local_lock_path) - LOG.info(_('Created lock path: %s'), local_lock_path) - - def add_prefix(name, prefix): - if not prefix: - return name - sep = '' if prefix.endswith('-') else '-' - return '%s%s%s' % (prefix, sep, name) - - # NOTE(mikal): the lock name cannot contain directory - # separators - lock_file_name = add_prefix(name.replace(os.sep, '_'), - lock_file_prefix) - - lock_file_path = os.path.join(local_lock_path, lock_file_name) - - try: - lock = InterProcessLock(lock_file_path) - with lock as lock: - LOG.debug(_('Got file lock "%(lock)s" at %(path)s'), - {'lock': name, 'path': lock_file_path}) - yield lock - finally: - LOG.debug(_('Released file lock "%(lock)s" at %(path)s'), - {'lock': name, 'path': lock_file_path}) + ext_lock = external_lock(name, lock_file_prefix, lock_path) + with ext_lock: + yield ext_lock else: - yield sem - + yield int_lock finally: - local.strong_store.locks_held.remove(name) + LOG.debug('Releasing semaphore "%(lock)s"', {'lock': name}) def synchronized(name, lock_file_prefix=None, external=False, lock_path=None): @@ -244,11 +267,11 @@ def synchronized(name, lock_file_prefix=None, external=False, lock_path=None): def inner(*args, **kwargs): try: with lock(name, lock_file_prefix, external, lock_path): - LOG.debug(_('Got semaphore / lock "%(function)s"'), + LOG.debug('Got semaphore / lock "%(function)s"', {'function': f.__name__}) return f(*args, **kwargs) finally: - LOG.debug(_('Semaphore / lock released "%(function)s"'), + LOG.debug('Semaphore / lock released "%(function)s"', {'function': f.__name__}) return inner return wrap diff --git a/neutron/openstack/common/log.py b/neutron/openstack/common/log.py index d767b898f2d..6d8ca69c357 100644 --- a/neutron/openstack/common/log.py +++ b/neutron/openstack/common/log.py @@ -33,42 +33,24 @@ import logging import logging.config import logging.handlers import os -import re +import socket import sys import traceback from oslo.config import cfg +from oslo.serialization import jsonutils +from oslo.utils import importutils import six from six import moves -from neutron.openstack.common.gettextutils import _ -from neutron.openstack.common import importutils -from neutron.openstack.common import jsonutils +_PY26 = sys.version_info[0:2] == (2, 6) + +from neutron.openstack.common._i18n import _ from neutron.openstack.common import local _DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" -_SANITIZE_KEYS = ['adminPass', 'admin_pass', 'password', 'admin_password'] - -# NOTE(ldbragst): Let's build a list of regex objects using the list of -# _SANITIZE_KEYS we already have. This way, we only have to add the new key -# to the list of _SANITIZE_KEYS and we can generate regular expressions -# for XML and JSON automatically. -_SANITIZE_PATTERNS = [] -_FORMAT_PATTERNS = [r'(%(key)s\s*[=]\s*[\"\']).*?([\"\'])', - r'(<%(key)s>).*?()', - r'([\"\']%(key)s[\"\']\s*:\s*[\"\']).*?([\"\'])', - r'([\'"].*?%(key)s[\'"]\s*:\s*u?[\'"]).*?([\'"])', - r'([\'"].*?%(key)s[\'"]\s*,\s*\'--?[A-z]+\'\s*,\s*u?[\'"])' - '.*?([\'"])', - r'(%(key)s\s*--?[A-z]+\s*).*?([\s])'] - -for key in _SANITIZE_KEYS: - for pattern in _FORMAT_PATTERNS: - reg_ex = re.compile(pattern % {'key': key}, re.DOTALL) - _SANITIZE_PATTERNS.append(reg_ex) - common_cli_opts = [ cfg.BoolOpt('debug', @@ -138,6 +120,14 @@ generic_log_opts = [ help='Log output to standard error.') ] +DEFAULT_LOG_LEVELS = ['amqp=WARN', 'amqplib=WARN', 'boto=WARN', + 'qpid=WARN', 'sqlalchemy=WARN', 'suds=INFO', + 'oslo.messaging=INFO', 'iso8601=WARN', + 'requests.packages.urllib3.connectionpool=WARN', + 'urllib3.connectionpool=WARN', 'websocket=WARN', + "keystonemiddleware=WARN", "routes.middleware=WARN", + "stevedore=WARN"] + log_opts = [ cfg.StrOpt('logging_context_format_string', default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s ' @@ -156,17 +146,7 @@ log_opts = [ '%(instance)s', help='Prefix each line of exception output with this format.'), cfg.ListOpt('default_log_levels', - default=[ - 'amqp=WARN', - 'amqplib=WARN', - 'boto=WARN', - 'qpid=WARN', - 'sqlalchemy=WARN', - 'suds=INFO', - 'oslo.messaging=INFO', - 'iso8601=WARN', - 'requests.packages.urllib3.connectionpool=WARN' - ], + default=DEFAULT_LOG_LEVELS, help='List of logger=LEVEL pairs.'), cfg.BoolOpt('publish_errors', default=False, @@ -181,11 +161,11 @@ log_opts = [ cfg.StrOpt('instance_format', default='[instance: %(uuid)s] ', help='The format for an instance that is passed with the log ' - 'message. '), + 'message.'), cfg.StrOpt('instance_uuid_format', default='[instance: %(uuid)s] ', help='The format for an instance UUID that is passed with the ' - 'log message. '), + 'log message.'), ] CONF = cfg.CONF @@ -244,45 +224,20 @@ def _get_log_file_path(binary=None): return None -def mask_password(message, secret="***"): - """Replace password with 'secret' in message. - - :param message: The string which includes security information. - :param secret: value with which to replace passwords. - :returns: The unicode value of message with the password fields masked. - - For example: - - >>> mask_password("'adminPass' : 'aaaaa'") - "'adminPass' : '***'" - >>> mask_password("'admin_pass' : 'aaaaa'") - "'admin_pass' : '***'" - >>> mask_password('"password" : "aaaaa"') - '"password" : "***"' - >>> mask_password("'original_password' : 'aaaaa'") - "'original_password' : '***'" - >>> mask_password("u'original_password' : u'aaaaa'") - "u'original_password' : u'***'" - """ - message = six.text_type(message) - - # NOTE(ldbragst): Check to see if anything in message contains any key - # specified in _SANITIZE_KEYS, if not then just return the message since - # we don't have to mask any passwords. - if not any(key in message for key in _SANITIZE_KEYS): - return message - - secret = r'\g<1>' + secret + r'\g<2>' - for pattern in _SANITIZE_PATTERNS: - message = re.sub(pattern, secret, message) - return message - - class BaseLoggerAdapter(logging.LoggerAdapter): def audit(self, msg, *args, **kwargs): self.log(logging.AUDIT, msg, *args, **kwargs) + def isEnabledFor(self, level): + if _PY26: + # This method was added in python 2.7 (and it does the exact + # same logic, so we need to do the exact same logic so that + # python 2.6 has this capability as well). + return self.logger.isEnabledFor(level) + else: + return super(BaseLoggerAdapter, self).isEnabledFor(level) + class LazyAdapter(BaseLoggerAdapter): def __init__(self, name='unknown', version='unknown'): @@ -295,6 +250,11 @@ class LazyAdapter(BaseLoggerAdapter): def logger(self): if not self._logger: self._logger = getLogger(self.name, self.version) + if six.PY3: + # In Python 3, the code fails because the 'manager' attribute + # cannot be found when using a LoggerAdapter as the + # underlying logger. Work around this issue. + self._logger.manager = self._logger.logger.manager return self._logger @@ -340,11 +300,10 @@ class ContextAdapter(BaseLoggerAdapter): self.warn(stdmsg, *args, **kwargs) def process(self, msg, kwargs): - # NOTE(mrodden): catch any Message/other object and - # coerce to unicode before they can get - # to the python logging and possibly - # cause string encoding trouble - if not isinstance(msg, six.string_types): + # NOTE(jecarey): If msg is not unicode, coerce it into unicode + # before it can get to the python logging and + # possibly cause string encoding trouble + if not isinstance(msg, six.text_type): msg = six.text_type(msg) if 'extra' not in kwargs: @@ -448,7 +407,7 @@ def _load_log_config(log_config_append): try: logging.config.fileConfig(log_config_append, disable_existing_loggers=False) - except moves.configparser.Error as exc: + except (moves.configparser.Error, KeyError) as exc: raise LogConfigError(log_config_append, six.text_type(exc)) @@ -461,9 +420,20 @@ def setup(product_name, version='unknown'): sys.excepthook = _create_logging_excepthook(product_name) -def set_defaults(logging_context_format_string): - cfg.set_defaults( - log_opts, logging_context_format_string=logging_context_format_string) +def set_defaults(logging_context_format_string=None, + default_log_levels=None): + # Just in case the caller is not setting the + # default_log_level. This is insurance because + # we introduced the default_log_level parameter + # later in a backwards in-compatible change + if default_log_levels is not None: + cfg.set_defaults( + log_opts, + default_log_levels=default_log_levels) + if logging_context_format_string is not None: + cfg.set_defaults( + log_opts, + logging_context_format_string=logging_context_format_string) def _find_facility_from_conf(): @@ -512,18 +482,6 @@ def _setup_logging_from_conf(project, version): for handler in log_root.handlers: log_root.removeHandler(handler) - if CONF.use_syslog: - facility = _find_facility_from_conf() - # TODO(bogdando) use the format provided by RFCSysLogHandler - # after existing syslog format deprecation in J - if CONF.use_syslog_rfc_format: - syslog = RFCSysLogHandler(address='/dev/log', - facility=facility) - else: - syslog = logging.handlers.SysLogHandler(address='/dev/log', - facility=facility) - log_root.addHandler(syslog) - logpath = _get_log_file_path() if logpath: filelog = logging.handlers.WatchedFileHandler(logpath) @@ -582,6 +540,20 @@ def _setup_logging_from_conf(project, version): else: logger.setLevel(level_name) + if CONF.use_syslog: + try: + facility = _find_facility_from_conf() + # TODO(bogdando) use the format provided by RFCSysLogHandler + # after existing syslog format deprecation in J + if CONF.use_syslog_rfc_format: + syslog = RFCSysLogHandler(facility=facility) + else: + syslog = logging.handlers.SysLogHandler(facility=facility) + log_root.addHandler(syslog) + except socket.error: + log_root.error('Unable to add syslog handler. Verify that syslog ' + 'is running.') + _loggers = {} @@ -651,6 +623,12 @@ class ContextFormatter(logging.Formatter): def format(self, record): """Uses contextstring if request_id is set, otherwise default.""" + # NOTE(jecarey): If msg is not unicode, coerce it into unicode + # before it can get to the python logging and + # possibly cause string encoding trouble + if not isinstance(record.msg, six.text_type): + record.msg = six.text_type(record.msg) + # store project info record.project = self.project record.version = self.version diff --git a/neutron/openstack/common/loopingcall.py b/neutron/openstack/common/loopingcall.py index e588c8309b8..1d3bf7fcaa8 100644 --- a/neutron/openstack/common/loopingcall.py +++ b/neutron/openstack/common/loopingcall.py @@ -16,31 +16,36 @@ # under the License. import sys +import time from eventlet import event from eventlet import greenthread -from neutron.openstack.common.gettextutils import _ +from neutron.openstack.common._i18n import _LE, _LW from neutron.openstack.common import log as logging -from neutron.openstack.common import timeutils LOG = logging.getLogger(__name__) +# NOTE(zyluo): This lambda function was declared to avoid mocking collisions +# with time.time() called in the standard logging module +# during unittests. +_ts = lambda: time.time() + class LoopingCallDone(Exception): - """Exception to break out and stop a LoopingCall. + """Exception to break out and stop a LoopingCallBase. - The poll-function passed to LoopingCall can raise this exception to + The poll-function passed to LoopingCallBase can raise this exception to break out of the loop normally. This is somewhat analogous to StopIteration. An optional return-value can be included as the argument to the exception; - this return-value will be returned by LoopingCall.wait() + this return-value will be returned by LoopingCallBase.wait() """ def __init__(self, retvalue=True): - """:param retvalue: Value that LoopingCall.wait() should return.""" + """:param retvalue: Value that LoopingCallBase.wait() should return.""" self.retvalue = retvalue @@ -72,21 +77,22 @@ class FixedIntervalLoopingCall(LoopingCallBase): try: while self._running: - start = timeutils.utcnow() + start = _ts() self.f(*self.args, **self.kw) - end = timeutils.utcnow() + end = _ts() if not self._running: break - delay = interval - timeutils.delta_seconds(start, end) - if delay <= 0: - LOG.warn(_('task run outlasted interval by %s sec') % - -delay) - greenthread.sleep(delay if delay > 0 else 0) + delay = end - start - interval + if delay > 0: + LOG.warn(_LW('task %(func_name)s run outlasted ' + 'interval by %(delay).2f sec'), + {'func_name': repr(self.f), 'delay': delay}) + greenthread.sleep(-delay if delay < 0 else 0) except LoopingCallDone as e: self.stop() done.send(e.retvalue) except Exception: - LOG.exception(_('in fixed duration looping call')) + LOG.exception(_LE('in fixed duration looping call')) done.send_exception(*sys.exc_info()) return else: @@ -98,11 +104,6 @@ class FixedIntervalLoopingCall(LoopingCallBase): return self.done -# TODO(mikal): this class name is deprecated in Havana and should be removed -# in the I release -LoopingCall = FixedIntervalLoopingCall - - class DynamicLoopingCall(LoopingCallBase): """A looping call which sleeps until the next known event. @@ -126,14 +127,15 @@ class DynamicLoopingCall(LoopingCallBase): if periodic_interval_max is not None: idle = min(idle, periodic_interval_max) - LOG.debug(_('Dynamic looping call sleeping for %.02f ' - 'seconds'), idle) + LOG.debug('Dynamic looping call %(func_name)s sleeping ' + 'for %(idle).02f seconds', + {'func_name': repr(self.f), 'idle': idle}) greenthread.sleep(idle) except LoopingCallDone as e: self.stop() done.send(e.retvalue) except Exception: - LOG.exception(_('in dynamic looping call')) + LOG.exception(_LE('in dynamic looping call')) done.send_exception(*sys.exc_info()) return else: diff --git a/neutron/openstack/common/service.py b/neutron/openstack/common/service.py index 79ae9bc5d0d..b71a7843ba4 100644 --- a/neutron/openstack/common/service.py +++ b/neutron/openstack/common/service.py @@ -38,14 +38,12 @@ from eventlet import event from oslo.config import cfg from neutron.openstack.common import eventlet_backdoor -from neutron.openstack.common.gettextutils import _LE, _LI, _LW -from neutron.openstack.common import importutils +from neutron.openstack.common._i18n import _LE, _LI, _LW from neutron.openstack.common import log as logging from neutron.openstack.common import systemd from neutron.openstack.common import threadgroup -rpc = importutils.try_import('neutron.openstack.common.rpc') CONF = cfg.CONF LOG = logging.getLogger(__name__) @@ -180,12 +178,6 @@ class ServiceLauncher(Launcher): status = exc.code finally: self.stop() - if rpc: - try: - rpc.cleanup() - except Exception: - # We're shutting down, so it doesn't matter at this point. - LOG.exception(_LE('Exception during rpc cleanup.')) return status, signo diff --git a/neutron/openstack/common/sslutils.py b/neutron/openstack/common/sslutils.py deleted file mode 100644 index 1d07937949e..00000000000 --- a/neutron/openstack/common/sslutils.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright 2013 IBM Corp. -# -# 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 os -import ssl - -from oslo.config import cfg - -from neutron.openstack.common.gettextutils import _ - - -ssl_opts = [ - cfg.StrOpt('ca_file', - default=None, - help="CA certificate file to use to verify " - "connecting clients"), - cfg.StrOpt('cert_file', - default=None, - help="Certificate file to use when starting " - "the server securely"), - cfg.StrOpt('key_file', - default=None, - help="Private key file to use when starting " - "the server securely"), -] - - -CONF = cfg.CONF -CONF.register_opts(ssl_opts, "ssl") - - -def is_enabled(): - cert_file = CONF.ssl.cert_file - key_file = CONF.ssl.key_file - ca_file = CONF.ssl.ca_file - use_ssl = cert_file or key_file - - if cert_file and not os.path.exists(cert_file): - raise RuntimeError(_("Unable to find cert_file : %s") % cert_file) - - if ca_file and not os.path.exists(ca_file): - raise RuntimeError(_("Unable to find ca_file : %s") % ca_file) - - if key_file and not os.path.exists(key_file): - raise RuntimeError(_("Unable to find key_file : %s") % key_file) - - if use_ssl and (not cert_file or not key_file): - raise RuntimeError(_("When running server in SSL mode, you must " - "specify both a cert_file and key_file " - "option value in your configuration file")) - - return use_ssl - - -def wrap(sock): - ssl_kwargs = { - 'server_side': True, - 'certfile': CONF.ssl.cert_file, - 'keyfile': CONF.ssl.key_file, - 'cert_reqs': ssl.CERT_NONE, - } - - if CONF.ssl.ca_file: - ssl_kwargs['ca_certs'] = CONF.ssl.ca_file - ssl_kwargs['cert_reqs'] = ssl.CERT_REQUIRED - - return ssl.wrap_socket(sock, **ssl_kwargs) - - -_SSL_PROTOCOLS = { - "tlsv1": ssl.PROTOCOL_TLSv1, - "sslv23": ssl.PROTOCOL_SSLv23, - "sslv3": ssl.PROTOCOL_SSLv3 -} - -try: - _SSL_PROTOCOLS["sslv2"] = ssl.PROTOCOL_SSLv2 -except AttributeError: - pass - - -def validate_ssl_version(version): - key = version.lower() - try: - return _SSL_PROTOCOLS[key] - except KeyError: - raise RuntimeError(_("Invalid SSL version : %s") % version) diff --git a/neutron/openstack/common/systemd.py b/neutron/openstack/common/systemd.py index cc02caba3e7..b9a0df97e25 100644 --- a/neutron/openstack/common/systemd.py +++ b/neutron/openstack/common/systemd.py @@ -50,14 +50,16 @@ def _sd_notify(unset_env, msg): def notify(): """Send notification to Systemd that service is ready. + For details see - http://www.freedesktop.org/software/systemd/man/sd_notify.html + http://www.freedesktop.org/software/systemd/man/sd_notify.html """ _sd_notify(False, 'READY=1') def notify_once(): """Send notification once to Systemd that service is ready. + Systemd sets NOTIFY_SOCKET environment variable with the name of the socket listening for notifications from services. This method removes the NOTIFY_SOCKET environment variable to ensure diff --git a/neutron/openstack/common/threadgroup.py b/neutron/openstack/common/threadgroup.py index 5cfd59c94d4..ecf0d4bbed8 100644 --- a/neutron/openstack/common/threadgroup.py +++ b/neutron/openstack/common/threadgroup.py @@ -11,10 +11,10 @@ # 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 threading import eventlet from eventlet import greenpool -from eventlet import greenthread from neutron.openstack.common import log as logging from neutron.openstack.common import loopingcall @@ -51,7 +51,7 @@ class Thread(object): class ThreadGroup(object): - """The point of the ThreadGroup classis to: + """The point of the ThreadGroup class is to: * keep track of timers and greenthreads (making it easier to stop them when need be). @@ -85,8 +85,8 @@ class ThreadGroup(object): def thread_done(self, thread): self.threads.remove(thread) - def stop(self): - current = greenthread.getcurrent() + def _stop_threads(self): + current = threading.current_thread() # Iterate over a copy of self.threads so thread_done doesn't # modify the list while we're iterating @@ -99,6 +99,7 @@ class ThreadGroup(object): except Exception as ex: LOG.exception(ex) + def stop_timers(self): for x in self.timers: try: x.stop() @@ -106,6 +107,23 @@ class ThreadGroup(object): LOG.exception(ex) self.timers = [] + def stop(self, graceful=False): + """stop function has the option of graceful=True/False. + + * In case of graceful=True, wait for all threads to be finished. + Never kill threads. + * In case of graceful=False, kill threads immediately. + """ + self.stop_timers() + if graceful: + # In case of graceful=True, wait for all threads to be + # finished, never kill threads + self.wait() + else: + # In case of graceful=False(Default), kill threads + # immediately + self._stop_threads() + def wait(self): for x in self.timers: try: @@ -114,7 +132,7 @@ class ThreadGroup(object): pass except Exception as ex: LOG.exception(ex) - current = greenthread.getcurrent() + current = threading.current_thread() # Iterate over a copy of self.threads so thread_done doesn't # modify the list while we're iterating diff --git a/neutron/openstack/common/versionutils.py b/neutron/openstack/common/versionutils.py deleted file mode 100644 index 04472a86718..00000000000 --- a/neutron/openstack/common/versionutils.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (c) 2013 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. - -""" -Helpers for comparing version strings. -""" - -import functools -import pkg_resources - -from neutron.openstack.common.gettextutils import _ -from neutron.openstack.common import log as logging - - -LOG = logging.getLogger(__name__) - - -class deprecated(object): - """A decorator to mark callables as deprecated. - - This decorator logs a deprecation message when the callable it decorates is - used. The message will include the release where the callable was - deprecated, the release where it may be removed and possibly an optional - replacement. - - Examples: - - 1. Specifying the required deprecated release - - >>> @deprecated(as_of=deprecated.ICEHOUSE) - ... def a(): pass - - 2. Specifying a replacement: - - >>> @deprecated(as_of=deprecated.ICEHOUSE, in_favor_of='f()') - ... def b(): pass - - 3. Specifying the release where the functionality may be removed: - - >>> @deprecated(as_of=deprecated.ICEHOUSE, remove_in=+1) - ... def c(): pass - - """ - - FOLSOM = 'F' - GRIZZLY = 'G' - HAVANA = 'H' - ICEHOUSE = 'I' - - _RELEASES = { - 'F': 'Folsom', - 'G': 'Grizzly', - 'H': 'Havana', - 'I': 'Icehouse', - } - - _deprecated_msg_with_alternative = _( - '%(what)s is deprecated as of %(as_of)s in favor of ' - '%(in_favor_of)s and may be removed in %(remove_in)s.') - - _deprecated_msg_no_alternative = _( - '%(what)s is deprecated as of %(as_of)s and may be ' - 'removed in %(remove_in)s. It will not be superseded.') - - def __init__(self, as_of, in_favor_of=None, remove_in=2, what=None): - """Initialize decorator - - :param as_of: the release deprecating the callable. Constants - are define in this class for convenience. - :param in_favor_of: the replacement for the callable (optional) - :param remove_in: an integer specifying how many releases to wait - before removing (default: 2) - :param what: name of the thing being deprecated (default: the - callable's name) - - """ - self.as_of = as_of - self.in_favor_of = in_favor_of - self.remove_in = remove_in - self.what = what - - def __call__(self, func): - if not self.what: - self.what = func.__name__ + '()' - - @functools.wraps(func) - def wrapped(*args, **kwargs): - msg, details = self._build_message() - LOG.deprecated(msg, details) - return func(*args, **kwargs) - return wrapped - - def _get_safe_to_remove_release(self, release): - # TODO(dstanek): this method will have to be reimplemented once - # when we get to the X release because once we get to the Y - # release, what is Y+2? - new_release = chr(ord(release) + self.remove_in) - if new_release in self._RELEASES: - return self._RELEASES[new_release] - else: - return new_release - - def _build_message(self): - details = dict(what=self.what, - as_of=self._RELEASES[self.as_of], - remove_in=self._get_safe_to_remove_release(self.as_of)) - - if self.in_favor_of: - details['in_favor_of'] = self.in_favor_of - msg = self._deprecated_msg_with_alternative - else: - msg = self._deprecated_msg_no_alternative - return msg, details - - -def is_compatible(requested_version, current_version, same_major=True): - """Determine whether `requested_version` is satisfied by - `current_version`; in other words, `current_version` is >= - `requested_version`. - - :param requested_version: version to check for compatibility - :param current_version: version to check against - :param same_major: if True, the major version must be identical between - `requested_version` and `current_version`. This is used when a - major-version difference indicates incompatibility between the two - versions. Since this is the common-case in practice, the default is - True. - :returns: True if compatible, False if not - """ - requested_parts = pkg_resources.parse_version(requested_version) - current_parts = pkg_resources.parse_version(current_version) - - if same_major and (requested_parts[0] != current_parts[0]): - return False - - return current_parts >= requested_parts diff --git a/neutron/plugins/bigswitch/__init__.py b/neutron/plugins/bigswitch/__init__.py index 131b31cc305..e69de29bb2d 100644 --- a/neutron/plugins/bigswitch/__init__.py +++ b/neutron/plugins/bigswitch/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012 Big Switch Networks, 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. -# diff --git a/neutron/plugins/bigswitch/db/__init__.py b/neutron/plugins/bigswitch/db/__init__.py index 70cb8a35316..e69de29bb2d 100644 --- a/neutron/plugins/bigswitch/db/__init__.py +++ b/neutron/plugins/bigswitch/db/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Big Switch Networks, 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. diff --git a/neutron/plugins/bigswitch/extensions/__init__.py b/neutron/plugins/bigswitch/extensions/__init__.py index 70cb8a35316..e69de29bb2d 100644 --- a/neutron/plugins/bigswitch/extensions/__init__.py +++ b/neutron/plugins/bigswitch/extensions/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Big Switch Networks, 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. diff --git a/neutron/plugins/bigswitch/plugin.py b/neutron/plugins/bigswitch/plugin.py index 3c35033f9f9..e2e051d751c 100644 --- a/neutron/plugins/bigswitch/plugin.py +++ b/neutron/plugins/bigswitch/plugin.py @@ -112,7 +112,7 @@ class AgentNotifierApi(n_rpc.RpcProxy, class SecurityGroupServerRpcMixin(sg_db_rpc.SecurityGroupServerRpcMixin): def get_port_from_device(self, device): - port_id = re.sub(r"^tap", "", device) + port_id = re.sub(r"^%s" % const.TAP_DEVICE_PREFIX, "", device) port = self.get_port_and_sgs(port_id) if port: port['device'] = device diff --git a/neutron/plugins/bigswitch/servermanager.py b/neutron/plugins/bigswitch/servermanager.py index 6fdbec36a6c..5adb02d5a66 100644 --- a/neutron/plugins/bigswitch/servermanager.py +++ b/neutron/plugins/bigswitch/servermanager.py @@ -447,8 +447,6 @@ class ServerPool(object): if not self.get_topo_function: raise cfg.Error(_('Server requires synchronization, ' 'but no topology function was defined.')) - # The hash was incorrect so it needs to be removed - hash_handler.put_hash('') data = self.get_topo_function(**self.get_topo_function_args) active_server.rest_call('PUT', TOPOLOGY_PATH, data, timeout=None) @@ -639,8 +637,9 @@ class HTTPSConnectionWithValidation(httplib.HTTPSConnection): if self.combined_cert: self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, cert_reqs=ssl.CERT_REQUIRED, - ca_certs=self.combined_cert) + ca_certs=self.combined_cert, + ssl_version=ssl.PROTOCOL_TLSv1) else: - self.sock = ssl.wrap_socket(sock, self.key_file, - self.cert_file, - cert_reqs=ssl.CERT_NONE) + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=ssl.CERT_NONE, + ssl_version=ssl.PROTOCOL_TLSv1) diff --git a/neutron/plugins/bigswitch/tests/__init__.py b/neutron/plugins/bigswitch/tests/__init__.py index 131b31cc305..e69de29bb2d 100644 --- a/neutron/plugins/bigswitch/tests/__init__.py +++ b/neutron/plugins/bigswitch/tests/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012 Big Switch Networks, 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. -# diff --git a/neutron/plugins/brocade/NeutronPlugin.py b/neutron/plugins/brocade/NeutronPlugin.py index 1d8dc37ef15..9b0b308de2c 100644 --- a/neutron/plugins/brocade/NeutronPlugin.py +++ b/neutron/plugins/brocade/NeutronPlugin.py @@ -54,7 +54,6 @@ LOG = logging.getLogger(__name__) PLUGIN_VERSION = 0.88 AGENT_OWNER_PREFIX = "network:" NOS_DRIVER = 'neutron.plugins.brocade.nos.nosdriver.NOSdriver' -TAP_PREFIX_LEN = 3 SWITCH_OPTS = [cfg.StrOpt('address', default='', help=_('The address of the host to SSH to')), @@ -91,7 +90,8 @@ class BridgeRpcCallbacks(n_rpc.RpcCallback): device = kwargs.get('device') LOG.debug(_("Device %(device)s details requested from %(agent_id)s"), {'device': device, 'agent_id': agent_id}) - port = brocade_db.get_port(rpc_context, device[TAP_PREFIX_LEN:]) + port = brocade_db.get_port(rpc_context, + device[len(q_const.TAP_DEVICE_PREFIX):]) if port: entry = {'device': device, 'vlan_id': port.vlan_id, @@ -151,7 +151,7 @@ class SecurityGroupServerRpcMixin(sg_db_rpc.SecurityGroupServerRpcMixin): # Doing what other plugins are doing session = db.get_session() port = brocade_db.get_port_from_device( - session, device[TAP_PREFIX_LEN:]) + session, device[len(q_const.TAP_DEVICE_PREFIX):]) # TODO(shiv): need to extend the db model to include device owners # make it appears that the device owner is of type network diff --git a/neutron/plugins/brocade/__init__.py b/neutron/plugins/brocade/__init__.py index ac50764575b..e69de29bb2d 100644 --- a/neutron/plugins/brocade/__init__.py +++ b/neutron/plugins/brocade/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Brocade Communications System, 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. diff --git a/neutron/plugins/brocade/db/__init__.py b/neutron/plugins/brocade/db/__init__.py index ac50764575b..e69de29bb2d 100644 --- a/neutron/plugins/brocade/db/__init__.py +++ b/neutron/plugins/brocade/db/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Brocade Communications System, 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. diff --git a/neutron/plugins/brocade/nos/__init__.py b/neutron/plugins/brocade/nos/__init__.py index 7f85d6b4fca..e69de29bb2d 100644 --- a/neutron/plugins/brocade/nos/__init__.py +++ b/neutron/plugins/brocade/nos/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 Brocade Communications Systems, 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. diff --git a/neutron/plugins/cisco/__init__.py b/neutron/plugins/cisco/__init__.py index 54aa18193d3..e69de29bb2d 100644 --- a/neutron/plugins/cisco/__init__.py +++ b/neutron/plugins/cisco/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2011 Cisco Systems, 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. diff --git a/neutron/plugins/cisco/cfg_agent/cfg_agent.py b/neutron/plugins/cisco/cfg_agent/cfg_agent.py index d3d9eefb482..7512dee8aea 100644 --- a/neutron/plugins/cisco/cfg_agent/cfg_agent.py +++ b/neutron/plugins/cisco/cfg_agent/cfg_agent.py @@ -127,20 +127,20 @@ class CiscoCfgAgent(manager.Manager): self.devmgr_rpc = CiscoDeviceManagementApi(topics.L3PLUGIN, host) def _initialize_service_helpers(self, host): - svc_helper_class = self.conf.routing_svc_helper_class + svc_helper_class = self.conf.cfg_agent.routing_svc_helper_class try: self.routing_service_helper = importutils.import_object( svc_helper_class, host, self.conf, self) except ImportError as e: LOG.warn(_("Error in loading routing service helper. Class " "specified is %(class)s. Reason:%(reason)s"), - {'class': self.conf.routing_svc_helper_class, + {'class': self.conf.cfg_agent.routing_svc_helper_class, 'reason': e}) self.routing_service_helper = None def _start_periodic_tasks(self): self.loop = loopingcall.FixedIntervalLoopingCall(self.process_services) - self.loop.start(interval=self.conf.rpc_loop_interval) + self.loop.start(interval=self.conf.cfg_agent.rpc_loop_interval) def after_start(self): LOG.info(_("Cisco cfg agent started")) @@ -334,7 +334,7 @@ class CiscoCfgAgentWithStateReport(CiscoCfgAgent): def main(manager='neutron.plugins.cisco.cfg_agent.' 'cfg_agent.CiscoCfgAgentWithStateReport'): conf = cfg.CONF - conf.register_opts(CiscoCfgAgent.OPTS) + conf.register_opts(CiscoCfgAgent.OPTS, "cfg_agent") config.register_agent_state_opts_helper(conf) config.register_root_helper(conf) conf.register_opts(interface.OPTS) diff --git a/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py b/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py index 95d80b7cac1..9993ddb3796 100644 --- a/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py +++ b/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py @@ -55,7 +55,7 @@ class CSR1kvRoutingDriver(devicedriver_api.RoutingDriverBase): if credentials: self._csr_user = credentials['username'] self._csr_password = credentials['password'] - self._timeout = cfg.CONF.device_connection_timeout + self._timeout = cfg.CONF.cfg_agent.device_connection_timeout self._csr_conn = None self._intfs_enabled = False except KeyError as e: diff --git a/neutron/plugins/cisco/cfg_agent/device_status.py b/neutron/plugins/cisco/cfg_agent/device_status.py index ff389fbc623..5bd9fc8af22 100644 --- a/neutron/plugins/cisco/cfg_agent/device_status.py +++ b/neutron/plugins/cisco/cfg_agent/device_status.py @@ -33,7 +33,7 @@ STATUS_OPTS = [ "or high load when the device may not be responding.")), ] -cfg.CONF.register_opts(STATUS_OPTS) +cfg.CONF.register_opts(STATUS_OPTS, "cfg_agent") def _is_pingable(ip): @@ -76,7 +76,7 @@ class DeviceStatus(object): def get_backlogged_hosting_devices_info(self): wait_time = datetime.timedelta( - seconds=cfg.CONF.hosting_device_dead_timeout) + seconds=cfg.CONF.cfg_agent.hosting_device_dead_timeout) resp = [] for hd_id in self.backlog_hosting_devices: hd = self.backlog_hosting_devices[hd_id]['hd'] @@ -158,13 +158,14 @@ class DeviceStatus(object): 'ip': hd['management_ip_address']}) if timeutils.is_older_than( hd['backlog_insertion_ts'], - cfg.CONF.hosting_device_dead_timeout): + cfg.CONF.cfg_agent.hosting_device_dead_timeout): LOG.debug("Hosting device: %(hd_id)s @ %(ip)s hasn't " "been reachable for the last %(time)d seconds. " "Marking it dead.", {'hd_id': hd_id, 'ip': hd['management_ip_address'], - 'time': cfg.CONF.hosting_device_dead_timeout}) + 'time': cfg.CONF.cfg_agent. + hosting_device_dead_timeout}) response_dict['dead'].append(hd_id) hd.pop('backlog_insertion_ts', None) del self.backlog_hosting_devices[hd_id] diff --git a/neutron/plugins/cisco/common/__init__.py b/neutron/plugins/cisco/common/__init__.py index 54aa18193d3..e69de29bb2d 100644 --- a/neutron/plugins/cisco/common/__init__.py +++ b/neutron/plugins/cisco/common/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2011 Cisco Systems, 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. diff --git a/neutron/plugins/cisco/db/__init__.py b/neutron/plugins/cisco/db/__init__.py index 54aa18193d3..e69de29bb2d 100644 --- a/neutron/plugins/cisco/db/__init__.py +++ b/neutron/plugins/cisco/db/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2011 Cisco Systems, 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. diff --git a/neutron/plugins/cisco/db/l3/device_handling_db.py b/neutron/plugins/cisco/db/l3/device_handling_db.py index a2834899182..4e5deccd709 100644 --- a/neutron/plugins/cisco/db/l3/device_handling_db.py +++ b/neutron/plugins/cisco/db/l3/device_handling_db.py @@ -187,30 +187,30 @@ class DeviceHandlingMixin(object): return cls._mgmt_sec_grp_id @classmethod - def get_hosting_device_driver(self): + def get_hosting_device_driver(cls): """Returns device driver.""" - if self._hosting_device_driver: - return self._hosting_device_driver + if cls._hosting_device_driver: + return cls._hosting_device_driver else: try: - self._hosting_device_driver = importutils.import_object( + cls._hosting_device_driver = importutils.import_object( cfg.CONF.hosting_devices.csr1kv_device_driver) except (ImportError, TypeError, n_exc.NeutronException): LOG.exception(_('Error loading hosting device driver')) - return self._hosting_device_driver + return cls._hosting_device_driver @classmethod - def get_hosting_device_plugging_driver(self): + def get_hosting_device_plugging_driver(cls): """Returns plugging driver.""" - if self._plugging_driver: - return self._plugging_driver + if cls._plugging_driver: + return cls._plugging_driver else: try: - self._plugging_driver = importutils.import_object( + cls._plugging_driver = importutils.import_object( cfg.CONF.hosting_devices.csr1kv_plugging_driver) except (ImportError, TypeError, n_exc.NeutronException): LOG.exception(_('Error loading plugging driver')) - return self._plugging_driver + return cls._plugging_driver def get_hosting_devices_qry(self, context, hosting_device_ids, load_agent=True): @@ -432,7 +432,7 @@ class DeviceHandlingMixin(object): with context.session.begin(subtransactions=True): hd_db = l3_models.HostingDevice( id=hd.get('id') or uuidutils.generate_uuid(), - complementary_id = hd.get('complementary_id'), + complementary_id=hd.get('complementary_id'), tenant_id=tenant_id, device_id=hd.get('device_id'), admin_state_up=hd.get('admin_state_up', True), diff --git a/neutron/plugins/cisco/db/n1kv_db_v2.py b/neutron/plugins/cisco/db/n1kv_db_v2.py index d694b236764..d753d1cbc29 100644 --- a/neutron/plugins/cisco/db/n1kv_db_v2.py +++ b/neutron/plugins/cisco/db/n1kv_db_v2.py @@ -943,9 +943,9 @@ def update_profile_binding(db_session, profile_id, tenants, profile_type): profile_id=profile_id, profile_type=profile_type).delete() new_tenants_set = set(tenants) for tenant_id in new_tenants_set: - tenant = n1kv_models_v2.ProfileBinding(profile_type = profile_type, - tenant_id = tenant_id, - profile_id = profile_id) + tenant = n1kv_models_v2.ProfileBinding(profile_type=profile_type, + tenant_id=tenant_id, + profile_id=profile_id) db_session.add(tenant) @@ -957,14 +957,22 @@ def _get_profile_bindings(db_session, profile_type=None): If profile type is None, return profile-tenant binding for all profile types. """ - LOG.debug(_("_get_profile_bindings()")) if profile_type: - profile_bindings = (db_session.query(n1kv_models_v2.ProfileBinding). - filter_by(profile_type=profile_type)) - return profile_bindings + return (db_session.query(n1kv_models_v2.ProfileBinding). + filter_by(profile_type=profile_type)) return db_session.query(n1kv_models_v2.ProfileBinding) +def _get_profile_bindings_by_uuid(db_session, profile_id): + """ + Retrieve a list of profile bindings. + + Get all profile-tenant bindings based on profile UUID. + """ + return (db_session.query(n1kv_models_v2.ProfileBinding). + filter_by(profile_id=profile_id)) + + class NetworkProfile_db_mixin(object): """Network Profile Mixin.""" @@ -1099,8 +1107,10 @@ class NetworkProfile_db_mixin(object): original_net_p = get_network_profile(context.session, id) # Update network profile to tenant id binding. if context.is_admin and c_const.ADD_TENANTS in p: - if context.tenant_id not in p[c_const.ADD_TENANTS]: - p[c_const.ADD_TENANTS].append(context.tenant_id) + profile_bindings = _get_profile_bindings_by_uuid(context.session, + profile_id=id) + for bindings in profile_bindings: + p[c_const.ADD_TENANTS].append(bindings.tenant_id) update_profile_binding(context.session, id, p[c_const.ADD_TENANTS], c_const.NETWORK) is_updated = True diff --git a/neutron/plugins/cisco/extensions/__init__.py b/neutron/plugins/cisco/extensions/__init__.py index 0318309e576..e69de29bb2d 100644 --- a/neutron/plugins/cisco/extensions/__init__.py +++ b/neutron/plugins/cisco/extensions/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/plugins/cisco/extensions/qos.py b/neutron/plugins/cisco/extensions/qos.py index 5d6cb7b6073..db642f1d4b7 100644 --- a/neutron/plugins/cisco/extensions/qos.py +++ b/neutron/plugins/cisco/extensions/qos.py @@ -94,7 +94,7 @@ class QosController(common.NeutronController, wsgi.Controller): result = [builder.build(qos, is_detail)['qos'] for qos in qoss] return dict(qoss=result) - # pylint: disable-msg=E1101 + # pylint: disable=no-member def show(self, request, tenant_id, id): """Returns qos details for the given qos id.""" try: diff --git a/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py b/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py index ffda751c28f..5cd6a1eac9b 100644 --- a/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py +++ b/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py @@ -316,7 +316,7 @@ class N1kvTrunkingPlugDriver(plug.PluginSidePluggingDriver): except exception_type: resource_ids.remove(item_id) except n_exc.NeutronException as e: - LOG.error(_('Failed to delete %(resource_name) %(net_id)s ' + LOG.error(_('Failed to delete %(resource_name)s %(net_id)s ' 'for service vm due to %(err)s'), {'resource_name': name, 'net_id': item_id, 'err': e}) diff --git a/neutron/plugins/cisco/models/__init__.py b/neutron/plugins/cisco/models/__init__.py index 54aa18193d3..e69de29bb2d 100644 --- a/neutron/plugins/cisco/models/__init__.py +++ b/neutron/plugins/cisco/models/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2011 Cisco Systems, 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. diff --git a/neutron/plugins/cisco/n1kv/__init__.py b/neutron/plugins/cisco/n1kv/__init__.py index 73c4997f21d..e69de29bb2d 100644 --- a/neutron/plugins/cisco/n1kv/__init__.py +++ b/neutron/plugins/cisco/n1kv/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 Cisco Systems, 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. diff --git a/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py b/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py index 236822d2173..6e2629adabd 100644 --- a/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py +++ b/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py @@ -838,8 +838,7 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, """ Send delete port request to VSM. - Delete the port on the VSM. If it is the last port on the VM Network, - delete the VM Network. + Delete the port on the VSM. :param context: neutron api request context :param port: port object which is to be deleted :param vm_network: VM network object with which the port is associated @@ -847,8 +846,6 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, LOG.debug(_('_send_delete_port_request: %s'), port['id']) n1kvclient = n1kv_client.Client() n1kvclient.delete_n1kv_port(vm_network['name'], port['id']) - if vm_network['port_count'] == 0: - n1kvclient.delete_vm_network(vm_network['name']) def _get_segmentation_id(self, context, id): """ diff --git a/neutron/plugins/common/__init__.py b/neutron/plugins/common/__init__.py index b706747cf8c..e69de29bb2d 100644 --- a/neutron/plugins/common/__init__.py +++ b/neutron/plugins/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/plugins/embrane/__init__.py b/neutron/plugins/embrane/__init__.py index 5627edf2c91..e69de29bb2d 100644 --- a/neutron/plugins/embrane/__init__.py +++ b/neutron/plugins/embrane/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Embrane, 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. diff --git a/neutron/plugins/embrane/agent/__init__.py b/neutron/plugins/embrane/agent/__init__.py index 5627edf2c91..e69de29bb2d 100644 --- a/neutron/plugins/embrane/agent/__init__.py +++ b/neutron/plugins/embrane/agent/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Embrane, 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. diff --git a/neutron/plugins/embrane/agent/operations/__init__.py b/neutron/plugins/embrane/agent/operations/__init__.py index 5627edf2c91..e69de29bb2d 100644 --- a/neutron/plugins/embrane/agent/operations/__init__.py +++ b/neutron/plugins/embrane/agent/operations/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Embrane, 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. diff --git a/neutron/plugins/embrane/common/__init__.py b/neutron/plugins/embrane/common/__init__.py index 5627edf2c91..e69de29bb2d 100644 --- a/neutron/plugins/embrane/common/__init__.py +++ b/neutron/plugins/embrane/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Embrane, 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. diff --git a/neutron/plugins/embrane/l2base/__init__.py b/neutron/plugins/embrane/l2base/__init__.py index 5627edf2c91..e69de29bb2d 100644 --- a/neutron/plugins/embrane/l2base/__init__.py +++ b/neutron/plugins/embrane/l2base/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Embrane, 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. diff --git a/neutron/plugins/embrane/l2base/fake/__init__.py b/neutron/plugins/embrane/l2base/fake/__init__.py index 5627edf2c91..e69de29bb2d 100644 --- a/neutron/plugins/embrane/l2base/fake/__init__.py +++ b/neutron/plugins/embrane/l2base/fake/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Embrane, 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. diff --git a/neutron/plugins/embrane/plugins/__init__.py b/neutron/plugins/embrane/plugins/__init__.py index 5627edf2c91..e69de29bb2d 100644 --- a/neutron/plugins/embrane/plugins/__init__.py +++ b/neutron/plugins/embrane/plugins/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Embrane, 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. diff --git a/neutron/plugins/hyperv/__init__.py b/neutron/plugins/hyperv/__init__.py index 0089853d728..e69de29bb2d 100644 --- a/neutron/plugins/hyperv/__init__.py +++ b/neutron/plugins/hyperv/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Cloudbase Solutions SRL -# 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. diff --git a/neutron/plugins/hyperv/agent/__init__.py b/neutron/plugins/hyperv/agent/__init__.py index 0089853d728..e69de29bb2d 100644 --- a/neutron/plugins/hyperv/agent/__init__.py +++ b/neutron/plugins/hyperv/agent/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Cloudbase Solutions SRL -# 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. diff --git a/neutron/plugins/hyperv/common/__init__.py b/neutron/plugins/hyperv/common/__init__.py index 0089853d728..e69de29bb2d 100644 --- a/neutron/plugins/hyperv/common/__init__.py +++ b/neutron/plugins/hyperv/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Cloudbase Solutions SRL -# 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. diff --git a/neutron/plugins/linuxbridge/README b/neutron/plugins/linuxbridge/README index 9f7f5d7c5ae..89eb5ece637 100644 --- a/neutron/plugins/linuxbridge/README +++ b/neutron/plugins/linuxbridge/README @@ -1,128 +1,7 @@ # -- Background -The Neutron Linux Bridge plugin is a plugin that allows you to manage -connectivity between VMs on hosts that are capable of running a Linux Bridge. - -The Neutron Linux Bridge plugin consists of three components: - -1) The plugin itself: The plugin uses a database backend (mysql for - now) to store configuration and mappings that are used by the - agent. The mysql server runs on a central server (often the same - host as nova itself). - -2) The neutron service host which will be running neutron. This can - be run on the server running nova. - -3) An agent which runs on the host and communicates with the host operating - system. The agent gathers the configuration and mappings from - the mysql database running on the neutron host. - -The sections below describe how to configure and run the neutron -service with the Linux Bridge plugin. - -# -- Python library dependencies - - Make sure you have the following package(s) installed on neutron server - host as well as any hosts which run the agent: - bridge-utils - python-mysqldb - sqlite3 - -# -- Nova configuration (controller node) - -1) Ensure that the neutron network manager is configured in the - nova.conf on the node that will be running nova-network. - -network_manager=nova.network.neutron.manager.NeutronManager - -# -- Nova configuration (compute node(s)) - -1) Configure the vif driver, and libvirt/vif type - -connection_type=libvirt -libvirt_type=qemu -libvirt_vif_type=ethernet -libvirt_vif_driver=nova.virt.libvirt.vif.NeutronLinuxBridgeVIFDriver -linuxnet_interface_driver=nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver - -2) If you want a DHCP server to be run for the VMs to acquire IPs, - add the following flag to your nova.conf file: - -neutron_use_dhcp=true - -(Note: For more details on how to work with Neutron using Nova, i.e. how to create networks and such, - please refer to the top level Neutron README which points to the relevant documentation.) - -# -- Neutron configuration - -Make the Linux Bridge plugin the current neutron plugin - -- edit neutron.conf and change the core_plugin - -core_plugin = neutron.plugins.linuxbridge.lb_neutron_plugin.LinuxBridgePluginV2 - -# -- Database config. - -(Note: The plugin ships with a default SQLite in-memory database configuration, - and can be used to run tests without performing the suggested DB config below.) - -The Linux Bridge neutron plugin requires access to a mysql database in order -to store configuration and mappings that will be used by the agent. Here is -how to set up the database on the host that you will be running the neutron -service on. - -MySQL should be installed on the host, and all plugins and clients -must be configured with access to the database. - -To prep mysql, run: - -$ mysql -u root -p -e "create database neutron_linux_bridge" - -# log in to mysql service -$ mysql -u root -p -# The Linux Bridge Neutron agent running on each compute node must be able to -# make a mysql connection back to the main database server. -mysql> GRANT USAGE ON *.* to root@'yourremotehost' IDENTIFIED BY 'newpassword'; -# force update of authorization changes -mysql> FLUSH PRIVILEGES; - -(Note: If the remote connection fails to MySQL, you might need to add the IP address, - and/or fully-qualified hostname, and/or unqualified hostname in the above GRANT sql - command. Also, you might need to specify "ALL" instead of "USAGE".) - -# -- Plugin configuration - -- Edit the configuration file: - etc/neutron/plugins/linuxbridge/linuxbridge_conf.ini - Make sure it matches your mysql configuration. This file must be updated - with the addresses and credentials to access the database. - - Note: debug and logging information should be updated in etc/neutron.conf - - Note: When running the tests, set the connection type to sqlite, and when - actually running the server set it to mysql. At any given time, only one - of these should be active in the conf file (you can comment out the other). - -- On the neutron server, network_vlan_ranges must be configured in - linuxbridge_conf.ini to specify the names of the physical networks - managed by the linuxbridge plugin, along with the ranges of VLAN IDs - available on each physical network for allocation to virtual - networks. An entry of the form - "::" specifies a VLAN range on - the named physical network. An entry of the form - "" specifies a named network without making a - range of VLANs available for allocation. Networks specified using - either form are available for adminstrators to create provider flat - networks and provider VLANs. Multiple VLAN ranges can be specified - for the same physical network. - - The following example linuxbridge_conf.ini entry shows three - physical networks that can be used to create provider networks, with - ranges of VLANs available for allocation on two of them: - - [VLANS] - network_vlan_ranges = physnet1:1000:2999,physnet1:3000:3999,physnet2,physnet3:1:4094 - +The Neutron Linux Bridge plugin has removed from the tree in Juno. You must +migrate to ML2 using the script in: neutron/db/migration/migrate_to_ml2.py # -- Agent configuration diff --git a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py index ac586a9cd7b..8011c0d4bde 100755 --- a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py +++ b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py @@ -50,7 +50,6 @@ from neutron.plugins.linuxbridge.common import constants as lconst LOG = logging.getLogger(__name__) BRIDGE_NAME_PREFIX = "brq" -TAP_INTERFACE_PREFIX = "tap" BRIDGE_FS = "/sys/devices/virtual/net/" BRIDGE_NAME_PLACEHOLDER = "bridge_name" BRIDGE_INTERFACES_FS = BRIDGE_FS + BRIDGE_NAME_PLACEHOLDER + "/brif/" @@ -109,7 +108,7 @@ class LinuxBridgeManager: if not interface_id: LOG.warning(_("Invalid Interface ID, will lead to incorrect " "tap device name")) - tap_device_name = TAP_INTERFACE_PREFIX + interface_id[0:11] + tap_device_name = constants.TAP_DEVICE_PREFIX + interface_id[0:11] return tap_device_name def get_vxlan_device_name(self, segmentation_id): @@ -141,7 +140,7 @@ class LinuxBridgeManager: try: if_list = os.listdir(bridge_interface_path) return len([interface for interface in if_list if - interface.startswith(TAP_INTERFACE_PREFIX)]) + interface.startswith(constants.TAP_DEVICE_PREFIX)]) except OSError: return 0 @@ -509,7 +508,7 @@ class LinuxBridgeManager: def get_tap_devices(self): devices = set() for device in os.listdir(BRIDGE_FS): - if device.startswith(TAP_INTERFACE_PREFIX): + if device.startswith(constants.TAP_DEVICE_PREFIX): devices.add(device) return devices diff --git a/neutron/plugins/linuxbridge/common/__init__.py b/neutron/plugins/linuxbridge/common/__init__.py index 1f20c6bd46b..e69de29bb2d 100644 --- a/neutron/plugins/linuxbridge/common/__init__.py +++ b/neutron/plugins/linuxbridge/common/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 Cisco Systems, 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. diff --git a/neutron/plugins/linuxbridge/db/__init__.py b/neutron/plugins/linuxbridge/db/__init__.py index 1f20c6bd46b..e69de29bb2d 100644 --- a/neutron/plugins/linuxbridge/db/__init__.py +++ b/neutron/plugins/linuxbridge/db/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 Cisco Systems, 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. diff --git a/neutron/plugins/linuxbridge/db/l2network_db_v2.py b/neutron/plugins/linuxbridge/db/l2network_db_v2.py deleted file mode 100644 index 416bd2f593e..00000000000 --- a/neutron/plugins/linuxbridge/db/l2network_db_v2.py +++ /dev/null @@ -1,238 +0,0 @@ -# Copyright (c) 2012 OpenStack Foundation. -# -# 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 six import moves -from sqlalchemy.orm import exc - -from neutron.common import exceptions as n_exc -import neutron.db.api as db -from neutron.db import models_v2 -from neutron.db import securitygroups_db as sg_db -from neutron import manager -from neutron.openstack.common import log as logging -from neutron.plugins.linuxbridge.common import config # noqa -from neutron.plugins.linuxbridge.common import constants -from neutron.plugins.linuxbridge.db import l2network_models_v2 - -LOG = logging.getLogger(__name__) - - -def sync_network_states(network_vlan_ranges): - """Synchronize network_states table with current configured VLAN ranges.""" - - session = db.get_session() - with session.begin(): - # get existing allocations for all physical networks - allocations = dict() - states = (session.query(l2network_models_v2.NetworkState). - all()) - for state in states: - if state.physical_network not in allocations: - allocations[state.physical_network] = set() - allocations[state.physical_network].add(state) - - # process vlan ranges for each configured physical network - for physical_network, vlan_ranges in network_vlan_ranges.iteritems(): - # determine current configured allocatable vlans for this - # physical network - vlan_ids = set() - for vlan_range in vlan_ranges: - vlan_ids |= set(moves.xrange(vlan_range[0], vlan_range[1] + 1)) - - # remove from table unallocated vlans not currently allocatable - if physical_network in allocations: - for state in allocations[physical_network]: - try: - # see if vlan is allocatable - vlan_ids.remove(state.vlan_id) - except KeyError: - # it's not allocatable, so check if its allocated - if not state.allocated: - # it's not, so remove it from table - LOG.debug(_("Removing vlan %(vlan_id)s on " - "physical network %(physical_network)s" - " from pool"), - {'vlan_id': state.vlan_id, - 'physical_network': physical_network}) - session.delete(state) - del allocations[physical_network] - - # add missing allocatable vlans to table - for vlan_id in sorted(vlan_ids): - state = l2network_models_v2.NetworkState(physical_network, - vlan_id) - session.add(state) - - # remove from table unallocated vlans for any unconfigured physical - # networks - for states in allocations.itervalues(): - for state in states: - if not state.allocated: - LOG.debug(_("Removing vlan %(vlan_id)s on physical " - "network %(physical_network)s" - " from pool"), - {'vlan_id': state.vlan_id, - 'physical_network': state.physical_network}) - session.delete(state) - - -def get_network_state(physical_network, vlan_id): - """Get state of specified network.""" - - session = db.get_session() - try: - state = (session.query(l2network_models_v2.NetworkState). - filter_by(physical_network=physical_network, - vlan_id=vlan_id). - one()) - return state - except exc.NoResultFound: - return None - - -def reserve_network(session): - with session.begin(subtransactions=True): - state = (session.query(l2network_models_v2.NetworkState). - filter_by(allocated=False). - with_lockmode('update'). - first()) - if not state: - raise n_exc.NoNetworkAvailable() - LOG.debug(_("Reserving vlan %(vlan_id)s on physical network " - "%(physical_network)s from pool"), - {'vlan_id': state.vlan_id, - 'physical_network': state.physical_network}) - state.allocated = True - return (state.physical_network, state.vlan_id) - - -def reserve_specific_network(session, physical_network, vlan_id): - with session.begin(subtransactions=True): - try: - state = (session.query(l2network_models_v2.NetworkState). - filter_by(physical_network=physical_network, - vlan_id=vlan_id). - with_lockmode('update'). - one()) - if state.allocated: - if vlan_id == constants.FLAT_VLAN_ID: - raise n_exc.FlatNetworkInUse( - physical_network=physical_network) - else: - raise n_exc.VlanIdInUse(vlan_id=vlan_id, - physical_network=physical_network) - LOG.debug(_("Reserving specific vlan %(vlan_id)s on physical " - "network %(physical_network)s from pool"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - state.allocated = True - except exc.NoResultFound: - LOG.debug(_("Reserving specific vlan %(vlan_id)s on physical " - "network %(physical_network)s outside pool"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - state = l2network_models_v2.NetworkState(physical_network, vlan_id) - state.allocated = True - session.add(state) - - -def release_network(session, physical_network, vlan_id, network_vlan_ranges): - with session.begin(subtransactions=True): - try: - state = (session.query(l2network_models_v2.NetworkState). - filter_by(physical_network=physical_network, - vlan_id=vlan_id). - with_lockmode('update'). - one()) - state.allocated = False - inside = False - for vlan_range in network_vlan_ranges.get(physical_network, []): - if vlan_id >= vlan_range[0] and vlan_id <= vlan_range[1]: - inside = True - break - if inside: - LOG.debug(_("Releasing vlan %(vlan_id)s on physical network " - "%(physical_network)s to pool"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - else: - LOG.debug(_("Releasing vlan %(vlan_id)s on physical network " - "%(physical_network)s outside pool"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - session.delete(state) - except exc.NoResultFound: - LOG.warning(_("vlan_id %(vlan_id)s on physical network " - "%(physical_network)s not found"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - - -def add_network_binding(session, network_id, physical_network, vlan_id): - with session.begin(subtransactions=True): - binding = l2network_models_v2.NetworkBinding(network_id, - physical_network, vlan_id) - session.add(binding) - - -def get_network_binding(session, network_id): - try: - binding = (session.query(l2network_models_v2.NetworkBinding). - filter_by(network_id=network_id). - one()) - return binding - except exc.NoResultFound: - return - - -def get_port_from_device(device): - """Get port from database.""" - LOG.debug(_("get_port_from_device() called")) - session = db.get_session() - sg_binding_port = sg_db.SecurityGroupPortBinding.port_id - - query = session.query(models_v2.Port, - sg_db.SecurityGroupPortBinding.security_group_id) - query = query.outerjoin(sg_db.SecurityGroupPortBinding, - models_v2.Port.id == sg_binding_port) - query = query.filter(models_v2.Port.id.startswith(device)) - port_and_sgs = query.all() - if not port_and_sgs: - return - port = port_and_sgs[0][0] - plugin = manager.NeutronManager.get_plugin() - port_dict = plugin._make_port_dict(port) - port_dict['security_groups'] = [] - for port_in_db, sg_id in port_and_sgs: - if sg_id: - port_dict['security_groups'].append(sg_id) - port_dict['security_group_rules'] = [] - port_dict['security_group_source_groups'] = [] - port_dict['fixed_ips'] = [ip['ip_address'] - for ip in port['fixed_ips']] - return port_dict - - -def set_port_status(port_id, status): - """Set the port status.""" - LOG.debug(_("set_port_status as %s called"), status) - session = db.get_session() - try: - port = session.query(models_v2.Port).filter_by(id=port_id).one() - port['status'] = status - session.merge(port) - session.flush() - except exc.NoResultFound: - raise n_exc.PortNotFound(port_id=port_id) diff --git a/neutron/plugins/linuxbridge/lb_neutron_plugin.py b/neutron/plugins/linuxbridge/lb_neutron_plugin.py deleted file mode 100644 index 2319f8da960..00000000000 --- a/neutron/plugins/linuxbridge/lb_neutron_plugin.py +++ /dev/null @@ -1,546 +0,0 @@ -# Copyright (c) 2012 OpenStack Foundation. -# -# 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 sys - -from oslo.config import cfg - -from neutron.agent import securitygroups_rpc as sg_rpc -from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api -from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api -from neutron.api.rpc.handlers import dhcp_rpc -from neutron.api.rpc.handlers import l3_rpc -from neutron.api.rpc.handlers import securitygroups_rpc -from neutron.api.v2 import attributes -from neutron.common import constants as q_const -from neutron.common import exceptions as n_exc -from neutron.common import rpc as n_rpc -from neutron.common import topics -from neutron.common import utils -from neutron.db import agents_db -from neutron.db import agentschedulers_db -from neutron.db import api as db_api -from neutron.db import db_base_plugin_v2 -from neutron.db import external_net_db -from neutron.db import extraroute_db -from neutron.db import l3_agentschedulers_db -from neutron.db import l3_gwmode_db -from neutron.db import portbindings_db -from neutron.db import quota_db # noqa -from neutron.db import securitygroups_rpc_base as sg_db_rpc -from neutron.extensions import portbindings -from neutron.extensions import providernet as provider -from neutron import manager -from neutron.openstack.common import importutils -from neutron.openstack.common import log as logging -from neutron.plugins.common import constants as svc_constants -from neutron.plugins.common import utils as plugin_utils -from neutron.plugins.linuxbridge.common import constants -from neutron.plugins.linuxbridge.db import l2network_db_v2 as db - - -LOG = logging.getLogger(__name__) - -# Device names start with "tap" -TAP_PREFIX_LEN = 3 - - -class LinuxBridgeRpcCallbacks(n_rpc.RpcCallback): - - # history - # 1.1 Support Security Group RPC - # 1.2 Support get_devices_details_list - RPC_API_VERSION = '1.2' - - def get_device_details(self, rpc_context, **kwargs): - """Agent requests device details.""" - agent_id = kwargs.get('agent_id') - device = kwargs.get('device') - LOG.debug(_("Device %(device)s details requested from %(agent_id)s"), - {'device': device, 'agent_id': agent_id}) - plugin = manager.NeutronManager.get_plugin() - port = plugin.get_port_from_device(device) - if port: - binding = db.get_network_binding(db_api.get_session(), - port['network_id']) - (network_type, - segmentation_id) = constants.interpret_vlan_id(binding.vlan_id) - entry = {'device': device, - 'network_type': network_type, - 'physical_network': binding.physical_network, - 'segmentation_id': segmentation_id, - 'network_id': port['network_id'], - 'port_id': port['id'], - 'admin_state_up': port['admin_state_up']} - if cfg.CONF.AGENT.rpc_support_old_agents: - entry['vlan_id'] = binding.vlan_id - new_status = (q_const.PORT_STATUS_ACTIVE if port['admin_state_up'] - else q_const.PORT_STATUS_DOWN) - if port['status'] != new_status: - db.set_port_status(port['id'], new_status) - else: - entry = {'device': device} - LOG.debug(_("%s can not be found in database"), device) - return entry - - def get_devices_details_list(self, rpc_context, **kwargs): - return [ - self.get_device_details( - rpc_context, - device=device, - **kwargs - ) - for device in kwargs.pop('devices', []) - ] - - def update_device_down(self, rpc_context, **kwargs): - """Device no longer exists on agent.""" - # TODO(garyk) - live migration and port status - agent_id = kwargs.get('agent_id') - device = kwargs.get('device') - host = kwargs.get('host') - LOG.debug(_("Device %(device)s no longer exists on %(agent_id)s"), - {'device': device, 'agent_id': agent_id}) - plugin = manager.NeutronManager.get_plugin() - port = plugin.get_port_from_device(device) - if port: - entry = {'device': device, - 'exists': True} - if (host and not - plugin.get_port_host(rpc_context, port['id']) == host): - LOG.debug(_("Device %(device)s not bound to the" - " agent host %(host)s"), - {'device': device, 'host': host}) - elif port['status'] != q_const.PORT_STATUS_DOWN: - # Set port status to DOWN - db.set_port_status(port['id'], q_const.PORT_STATUS_DOWN) - else: - entry = {'device': device, - 'exists': False} - LOG.debug(_("%s can not be found in database"), device) - return entry - - def update_device_up(self, rpc_context, **kwargs): - """Device is up on agent.""" - agent_id = kwargs.get('agent_id') - device = kwargs.get('device') - host = kwargs.get('host') - LOG.debug(_("Device %(device)s up on %(agent_id)s"), - {'device': device, 'agent_id': agent_id}) - plugin = manager.NeutronManager.get_plugin() - port = plugin.get_port_from_device(device) - if port: - if (host and - not plugin.get_port_host(rpc_context, port['id']) == host): - LOG.debug(_("Device %(device)s not bound to the" - " agent host %(host)s"), - {'device': device, 'host': host}) - return - elif port['status'] != q_const.PORT_STATUS_ACTIVE: - db.set_port_status(port['id'], - q_const.PORT_STATUS_ACTIVE) - else: - LOG.debug(_("%s can not be found in database"), device) - - -class AgentNotifierApi(n_rpc.RpcProxy, - sg_rpc.SecurityGroupAgentRpcApiMixin): - '''Agent side of the linux bridge rpc API. - - API version history: - 1.0 - Initial version. - 1.1 - Added get_active_networks_info, create_dhcp_port, - and update_dhcp_port methods. - - - ''' - - BASE_RPC_API_VERSION = '1.1' - - def __init__(self, topic): - super(AgentNotifierApi, self).__init__( - topic=topic, default_version=self.BASE_RPC_API_VERSION) - self.topic = topic - self.topic_network_delete = topics.get_topic_name(topic, - topics.NETWORK, - topics.DELETE) - self.topic_port_update = topics.get_topic_name(topic, - topics.PORT, - topics.UPDATE) - - def network_delete(self, context, network_id): - self.fanout_cast(context, - self.make_msg('network_delete', - network_id=network_id), - topic=self.topic_network_delete) - - def port_update(self, context, port, physical_network, vlan_id): - network_type, segmentation_id = constants.interpret_vlan_id(vlan_id) - kwargs = {'port': port, - 'network_type': network_type, - 'physical_network': physical_network, - 'segmentation_id': segmentation_id} - if cfg.CONF.AGENT.rpc_support_old_agents: - kwargs['vlan_id'] = vlan_id - msg = self.make_msg('port_update', **kwargs) - self.fanout_cast(context, msg, - topic=self.topic_port_update) - - -class LinuxBridgePluginV2(db_base_plugin_v2.NeutronDbPluginV2, - external_net_db.External_net_db_mixin, - extraroute_db.ExtraRoute_db_mixin, - l3_gwmode_db.L3_NAT_db_mixin, - sg_db_rpc.SecurityGroupServerRpcMixin, - l3_agentschedulers_db.L3AgentSchedulerDbMixin, - agentschedulers_db.DhcpAgentSchedulerDbMixin, - portbindings_db.PortBindingMixin): - """Implement the Neutron abstractions using Linux bridging. - - A new VLAN is created for each network. An agent is relied upon - to perform the actual Linux bridge configuration on each host. - - The provider extension is also supported. As discussed in - https://bugs.launchpad.net/neutron/+bug/1023156, this class could - be simplified, and filtering on extended attributes could be - handled, by adding support for extended attributes to the - NeutronDbPluginV2 base class. When that occurs, this class should - be updated to take advantage of it. - - The port binding extension enables an external application relay - information to and from the plugin. - """ - - # This attribute specifies whether the plugin supports or not - # bulk/pagination/sorting operations. Name mangling is used in - # order to ensure it is qualified by class - __native_bulk_support = True - __native_pagination_support = True - __native_sorting_support = True - - _supported_extension_aliases = ["provider", "external-net", "router", - "ext-gw-mode", "binding", "quotas", - "security-group", "agent", "extraroute", - "l3_agent_scheduler", - "dhcp_agent_scheduler"] - - @property - def supported_extension_aliases(self): - if not hasattr(self, '_aliases'): - aliases = self._supported_extension_aliases[:] - sg_rpc.disable_security_group_extension_by_config(aliases) - self._aliases = aliases - return self._aliases - - def __init__(self): - super(LinuxBridgePluginV2, self).__init__() - self.base_binding_dict = { - portbindings.VIF_TYPE: portbindings.VIF_TYPE_BRIDGE, - portbindings.VIF_DETAILS: { - # TODO(rkukura): Replace with new VIF security details - portbindings.CAP_PORT_FILTER: - 'security-group' in self.supported_extension_aliases}} - self._parse_network_vlan_ranges() - db.sync_network_states(self.network_vlan_ranges) - self.tenant_network_type = cfg.CONF.VLANS.tenant_network_type - if self.tenant_network_type not in [svc_constants.TYPE_LOCAL, - svc_constants.TYPE_VLAN, - svc_constants.TYPE_NONE]: - LOG.error(_("Invalid tenant_network_type: %s. " - "Service terminated!"), - self.tenant_network_type) - sys.exit(1) - self._setup_rpc() - self.network_scheduler = importutils.import_object( - cfg.CONF.network_scheduler_driver - ) - self.router_scheduler = importutils.import_object( - cfg.CONF.router_scheduler_driver - ) - LOG.debug(_("Linux Bridge Plugin initialization complete")) - - def _setup_rpc(self): - # RPC support - self.service_topics = {svc_constants.CORE: topics.PLUGIN, - svc_constants.L3_ROUTER_NAT: topics.L3PLUGIN} - self.conn = n_rpc.create_connection(new=True) - self.endpoints = [LinuxBridgeRpcCallbacks(), - securitygroups_rpc.SecurityGroupServerRpcCallback(), - dhcp_rpc.DhcpRpcCallback(), - l3_rpc.L3RpcCallback(), - agents_db.AgentExtRpcCallback()] - for svc_topic in self.service_topics.values(): - self.conn.create_consumer(svc_topic, self.endpoints, fanout=False) - # Consume from all consumers in threads - self.conn.consume_in_threads() - self.notifier = AgentNotifierApi(topics.AGENT) - self.agent_notifiers[q_const.AGENT_TYPE_DHCP] = ( - dhcp_rpc_agent_api.DhcpAgentNotifyAPI() - ) - self.agent_notifiers[q_const.AGENT_TYPE_L3] = ( - l3_rpc_agent_api.L3AgentNotifyAPI() - ) - - def _parse_network_vlan_ranges(self): - try: - self.network_vlan_ranges = plugin_utils.parse_network_vlan_ranges( - cfg.CONF.VLANS.network_vlan_ranges) - except Exception as ex: - LOG.error(_("%s. Agent terminated!"), ex) - sys.exit(1) - LOG.info(_("Network VLAN ranges: %s"), self.network_vlan_ranges) - - def _add_network_vlan_range(self, physical_network, vlan_min, vlan_max): - self._add_network(physical_network) - self.network_vlan_ranges[physical_network].append((vlan_min, vlan_max)) - - def _add_network(self, physical_network): - if physical_network not in self.network_vlan_ranges: - self.network_vlan_ranges[physical_network] = [] - - def _extend_network_dict_provider(self, context, network): - binding = db.get_network_binding(context.session, network['id']) - if binding.vlan_id == constants.FLAT_VLAN_ID: - network[provider.NETWORK_TYPE] = svc_constants.TYPE_FLAT - network[provider.PHYSICAL_NETWORK] = binding.physical_network - network[provider.SEGMENTATION_ID] = None - elif binding.vlan_id == constants.LOCAL_VLAN_ID: - network[provider.NETWORK_TYPE] = svc_constants.TYPE_LOCAL - network[provider.PHYSICAL_NETWORK] = None - network[provider.SEGMENTATION_ID] = None - else: - network[provider.NETWORK_TYPE] = svc_constants.TYPE_VLAN - network[provider.PHYSICAL_NETWORK] = binding.physical_network - network[provider.SEGMENTATION_ID] = binding.vlan_id - - def _process_provider_create(self, context, attrs): - network_type = attrs.get(provider.NETWORK_TYPE) - physical_network = attrs.get(provider.PHYSICAL_NETWORK) - segmentation_id = attrs.get(provider.SEGMENTATION_ID) - - network_type_set = attributes.is_attr_set(network_type) - physical_network_set = attributes.is_attr_set(physical_network) - segmentation_id_set = attributes.is_attr_set(segmentation_id) - - if not (network_type_set or physical_network_set or - segmentation_id_set): - return (None, None, None) - - if not network_type_set: - msg = _("provider:network_type required") - raise n_exc.InvalidInput(error_message=msg) - elif network_type == svc_constants.TYPE_FLAT: - if segmentation_id_set: - msg = _("provider:segmentation_id specified for flat network") - raise n_exc.InvalidInput(error_message=msg) - else: - segmentation_id = constants.FLAT_VLAN_ID - elif network_type == svc_constants.TYPE_VLAN: - if not segmentation_id_set: - msg = _("provider:segmentation_id required") - raise n_exc.InvalidInput(error_message=msg) - if not utils.is_valid_vlan_tag(segmentation_id): - msg = (_("provider:segmentation_id out of range " - "(%(min_id)s through %(max_id)s)") % - {'min_id': q_const.MIN_VLAN_TAG, - 'max_id': q_const.MAX_VLAN_TAG}) - raise n_exc.InvalidInput(error_message=msg) - elif network_type == svc_constants.TYPE_LOCAL: - if physical_network_set: - msg = _("provider:physical_network specified for local " - "network") - raise n_exc.InvalidInput(error_message=msg) - else: - physical_network = None - if segmentation_id_set: - msg = _("provider:segmentation_id specified for local " - "network") - raise n_exc.InvalidInput(error_message=msg) - else: - segmentation_id = constants.LOCAL_VLAN_ID - else: - msg = _("provider:network_type %s not supported") % network_type - raise n_exc.InvalidInput(error_message=msg) - - if network_type in [svc_constants.TYPE_VLAN, svc_constants.TYPE_FLAT]: - if physical_network_set: - if physical_network not in self.network_vlan_ranges: - msg = (_("Unknown provider:physical_network %s") % - physical_network) - raise n_exc.InvalidInput(error_message=msg) - elif 'default' in self.network_vlan_ranges: - physical_network = 'default' - else: - msg = _("provider:physical_network required") - raise n_exc.InvalidInput(error_message=msg) - - return (network_type, physical_network, segmentation_id) - - def create_network(self, context, network): - (network_type, physical_network, - vlan_id) = self._process_provider_create(context, - network['network']) - - session = context.session - with session.begin(subtransactions=True): - #set up default security groups - tenant_id = self._get_tenant_id_for_create( - context, network['network']) - self._ensure_default_security_group(context, tenant_id) - - if not network_type: - # tenant network - network_type = self.tenant_network_type - if network_type == svc_constants.TYPE_NONE: - raise n_exc.TenantNetworksDisabled() - elif network_type == svc_constants.TYPE_VLAN: - physical_network, vlan_id = db.reserve_network(session) - else: # TYPE_LOCAL - vlan_id = constants.LOCAL_VLAN_ID - else: - # provider network - if network_type in [svc_constants.TYPE_VLAN, - svc_constants.TYPE_FLAT]: - db.reserve_specific_network(session, physical_network, - vlan_id) - # no reservation needed for TYPE_LOCAL - net = super(LinuxBridgePluginV2, self).create_network(context, - network) - db.add_network_binding(session, net['id'], - physical_network, vlan_id) - self._process_l3_create(context, net, network['network']) - self._extend_network_dict_provider(context, net) - # note - exception will rollback entire transaction - return net - - def update_network(self, context, id, network): - provider._raise_if_updates_provider_attributes(network['network']) - - session = context.session - with session.begin(subtransactions=True): - net = super(LinuxBridgePluginV2, self).update_network(context, id, - network) - self._process_l3_update(context, net, network['network']) - self._extend_network_dict_provider(context, net) - return net - - def delete_network(self, context, id): - session = context.session - with session.begin(subtransactions=True): - binding = db.get_network_binding(session, id) - self._process_l3_delete(context, id) - super(LinuxBridgePluginV2, self).delete_network(context, id) - if binding.vlan_id != constants.LOCAL_VLAN_ID: - db.release_network(session, binding.physical_network, - binding.vlan_id, self.network_vlan_ranges) - # the network_binding record is deleted via cascade from - # the network record, so explicit removal is not necessary - self.notifier.network_delete(context, id) - - def get_network(self, context, id, fields=None): - session = context.session - with session.begin(subtransactions=True): - net = super(LinuxBridgePluginV2, self).get_network(context, - id, None) - self._extend_network_dict_provider(context, net) - return self._fields(net, fields) - - def get_networks(self, context, filters=None, fields=None, - sorts=None, limit=None, marker=None, page_reverse=False): - session = context.session - with session.begin(subtransactions=True): - nets = super(LinuxBridgePluginV2, - self).get_networks(context, filters, None, sorts, - limit, marker, page_reverse) - for net in nets: - self._extend_network_dict_provider(context, net) - - return [self._fields(net, fields) for net in nets] - - def create_port(self, context, port): - session = context.session - port_data = port['port'] - with session.begin(subtransactions=True): - self._ensure_default_security_group_on_port(context, port) - sgids = self._get_security_groups_on_port(context, port) - # Set port status as 'DOWN'. This will be updated by agent - port['port']['status'] = q_const.PORT_STATUS_DOWN - - port = super(LinuxBridgePluginV2, - self).create_port(context, port) - self._process_portbindings_create_and_update(context, - port_data, - port) - self._process_port_create_security_group( - context, port, sgids) - self.notify_security_groups_member_updated(context, port) - return port - - def update_port(self, context, id, port): - original_port = self.get_port(context, id) - session = context.session - need_port_update_notify = False - - with session.begin(subtransactions=True): - updated_port = super(LinuxBridgePluginV2, self).update_port( - context, id, port) - self._process_portbindings_create_and_update(context, - port['port'], - updated_port) - need_port_update_notify = self.update_security_group_on_port( - context, id, port, original_port, updated_port) - - need_port_update_notify |= self.is_security_group_member_updated( - context, original_port, updated_port) - - if original_port['admin_state_up'] != updated_port['admin_state_up']: - need_port_update_notify = True - - if need_port_update_notify: - self._notify_port_updated(context, updated_port) - return updated_port - - def delete_port(self, context, id, l3_port_check=True): - - # if needed, check to see if this is a port owned by - # and l3-router. If so, we should prevent deletion. - if l3_port_check: - self.prevent_l3_port_deletion(context, id) - - session = context.session - with session.begin(subtransactions=True): - router_ids = self.disassociate_floatingips( - context, id, do_notify=False) - port = self.get_port(context, id) - self._delete_port_security_group_bindings(context, id) - super(LinuxBridgePluginV2, self).delete_port(context, id) - - # now that we've left db transaction, we are safe to notify - self.notify_routers_updated(context, router_ids) - self.notify_security_groups_member_updated(context, port) - - def _notify_port_updated(self, context, port): - binding = db.get_network_binding(context.session, - port['network_id']) - self.notifier.port_update(context, port, - binding.physical_network, - binding.vlan_id) - - @classmethod - def get_port_from_device(cls, device): - port = db.get_port_from_device(device[TAP_PREFIX_LEN:]) - if port: - port['device'] = device - return port diff --git a/neutron/plugins/metaplugin/__init__.py b/neutron/plugins/metaplugin/__init__.py index 65685178bf2..e69de29bb2d 100644 --- a/neutron/plugins/metaplugin/__init__.py +++ b/neutron/plugins/metaplugin/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012, Nachi Ueno, NTT MCL, 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. diff --git a/neutron/plugins/metaplugin/common/__init__.py b/neutron/plugins/metaplugin/common/__init__.py index 65685178bf2..e69de29bb2d 100644 --- a/neutron/plugins/metaplugin/common/__init__.py +++ b/neutron/plugins/metaplugin/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012, Nachi Ueno, NTT MCL, 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. diff --git a/neutron/plugins/midonet/__init__.py b/neutron/plugins/midonet/__init__.py index e2cc2a75b7b..e69de29bb2d 100644 --- a/neutron/plugins/midonet/__init__.py +++ b/neutron/plugins/midonet/__init__.py @@ -1,15 +0,0 @@ -# Copyright (C) 2012 Midokura Japan K.K. -# Copyright (C) 2013 Midokura PTE LTD -# 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. diff --git a/neutron/plugins/midonet/agent/__init__.py b/neutron/plugins/midonet/agent/__init__.py index cf581856dda..e69de29bb2d 100644 --- a/neutron/plugins/midonet/agent/__init__.py +++ b/neutron/plugins/midonet/agent/__init__.py @@ -1,14 +0,0 @@ -# Copyright (C) 2013 Midokura PTE LTD -# 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. diff --git a/neutron/plugins/midonet/common/__init__.py b/neutron/plugins/midonet/common/__init__.py index cf581856dda..e69de29bb2d 100644 --- a/neutron/plugins/midonet/common/__init__.py +++ b/neutron/plugins/midonet/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright (C) 2013 Midokura PTE LTD -# 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. diff --git a/neutron/plugins/midonet/midonet_lib.py b/neutron/plugins/midonet/midonet_lib.py index a733eb05747..60dac242504 100644 --- a/neutron/plugins/midonet/midonet_lib.py +++ b/neutron/plugins/midonet/midonet_lib.py @@ -212,7 +212,8 @@ class MidoClient: raise MidonetApiException( msg=_("Tried to delete non-existent DHCP")) for dhcp in dhcp_subnets: - if dhcp.get_subnet_prefix() == net_addr: + if (dhcp.get_subnet_prefix() == net_addr and + dhcp.get_subnet_length() == str(net_len)): dhcp.delete() break diff --git a/neutron/plugins/ml2/__init__.py b/neutron/plugins/ml2/__init__.py index 788cea1f70b..e69de29bb2d 100644 --- a/neutron/plugins/ml2/__init__.py +++ b/neutron/plugins/ml2/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/plugins/ml2/common/__init__.py b/neutron/plugins/ml2/common/__init__.py index 788cea1f70b..e69de29bb2d 100644 --- a/neutron/plugins/ml2/common/__init__.py +++ b/neutron/plugins/ml2/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/plugins/ml2/db.py b/neutron/plugins/ml2/db.py index d8caa9384af..37e91bc791c 100644 --- a/neutron/plugins/ml2/db.py +++ b/neutron/plugins/ml2/db.py @@ -39,7 +39,8 @@ def _make_segment_dict(record): api.SEGMENTATION_ID: record.segmentation_id} -def add_network_segment(session, network_id, segment, is_dynamic=False): +def add_network_segment(session, network_id, segment, segment_index=0, + is_dynamic=False): with session.begin(subtransactions=True): record = models.NetworkSegment( id=uuidutils.generate_uuid(), @@ -47,6 +48,7 @@ def add_network_segment(session, network_id, segment, is_dynamic=False): network_type=segment.get(api.NETWORK_TYPE), physical_network=segment.get(api.PHYSICAL_NETWORK), segmentation_id=segment.get(api.SEGMENTATION_ID), + segment_index=segment_index, is_dynamic=is_dynamic ) session.add(record) @@ -61,7 +63,8 @@ def add_network_segment(session, network_id, segment, is_dynamic=False): def get_network_segments(session, network_id, filter_dynamic=False): with session.begin(subtransactions=True): query = (session.query(models.NetworkSegment). - filter_by(network_id=network_id)) + filter_by(network_id=network_id). + order_by(models.NetworkSegment.segment_index)) if filter_dynamic is not None: query = query.filter_by(is_dynamic=filter_dynamic) records = query.all() diff --git a/neutron/plugins/ml2/drivers/__init__.py b/neutron/plugins/ml2/drivers/__init__.py index 788cea1f70b..e69de29bb2d 100644 --- a/neutron/plugins/ml2/drivers/__init__.py +++ b/neutron/plugins/ml2/drivers/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/plugins/ml2/drivers/arista/__init__.py b/neutron/plugins/ml2/drivers/arista/__init__.py index 788cea1f70b..e69de29bb2d 100644 --- a/neutron/plugins/ml2/drivers/arista/__init__.py +++ b/neutron/plugins/ml2/drivers/arista/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py b/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py index aac24410f02..0d3190eddcf 100644 --- a/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py +++ b/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py @@ -33,6 +33,8 @@ VIRTUAL_ROUTER_MAC = '00:11:22:33:44:55' IPV4_BITS = 32 IPV6_BITS = 128 +# This string-format-at-a-distance confuses pylint :( +# pylint: disable=too-many-format-args router_in_vrf = { 'router': {'create': ['vrf definition {0}', 'rd {1}', @@ -247,16 +249,38 @@ class AristaL3Driver(object): rdm = str(int(hashlib.sha256(router_name).hexdigest(), 16) % 6553) + mlag_peer_failed = False for s in self._servers: - self.create_router_on_eos(router_name, rdm, s) + try: + self.create_router_on_eos(router_name, rdm, s) + mlag_peer_failed = False + except Exception: + if self.mlag_configured and not mlag_peer_failed: + mlag_peer_failed = True + else: + msg = (_('Failed to create router %s on EOS') % + router_name) + LOG.exception(msg) + raise arista_exc.AristaServicePluginRpcError(msg=msg) def delete_router(self, context, tenant_id, router_id, router): """Deletes a router from Arista Switch.""" if router: + router_name = self._arista_router_name(tenant_id, router['name']) + mlag_peer_failed = False for s in self._servers: - self.delete_router_from_eos(self._arista_router_name( - tenant_id, router['name']), s) + try: + self.delete_router_from_eos(router_name, s) + mlag_peer_failed = False + except Exception: + if self.mlag_configured and not mlag_peer_failed: + mlag_peer_failed = True + else: + msg = (_('Failed to create router %s on EOS') % + router_name) + LOG.exception(msg) + raise arista_exc.AristaServicePluginRpcError(msg=msg) def update_router(self, context, router_id, original_router, new_router): """Updates a router which is already created on Arista Switch. @@ -279,15 +303,27 @@ class AristaL3Driver(object): if self.mlag_configured: # For MLAG, we send a specific IP address as opposed to cidr # For now, we are using x.x.x.253 and x.x.x.254 as virtual IP + mlag_peer_failed = False for i, server in enumerate(self._servers): #get appropriate virtual IP address for this router router_ip = self._get_router_ip(cidr, i, router_info['ip_version']) - self.add_interface_to_router(router_info['seg_id'], - router_name, - router_info['gip'], - router_ip, subnet_mask, - server) + try: + self.add_interface_to_router(router_info['seg_id'], + router_name, + router_info['gip'], + router_ip, subnet_mask, + server) + mlag_peer_failed = False + except Exception: + if not mlag_peer_failed: + mlag_peer_failed = True + else: + msg = (_('Failed to add interface to router ' + '%s on EOS') % router_name) + LOG.exception(msg) + raise arista_exc.AristaServicePluginRpcError( + msg=msg) else: for s in self._servers: @@ -304,9 +340,21 @@ class AristaL3Driver(object): if router_info: router_name = self._arista_router_name(router_info['tenant_id'], router_info['name']) + mlag_peer_failed = False for s in self._servers: - self.delete_interface_from_router(router_info['seg_id'], - router_name, s) + try: + self.delete_interface_from_router(router_info['seg_id'], + router_name, s) + if self.mlag_configured: + mlag_peer_failed = False + except Exception: + if self.mlag_configured and not mlag_peer_failed: + mlag_peer_failed = True + else: + msg = (_('Failed to add interface to router ' + '%s on EOS') % router_name) + LOG.exception(msg) + raise arista_exc.AristaServicePluginRpcError(msg=msg) def _run_openstack_l3_cmds(self, commands, server): """Execute/sends a CAPI (Command API) command to EOS. diff --git a/neutron/plugins/ml2/drivers/l2pop/__init__.py b/neutron/plugins/ml2/drivers/l2pop/__init__.py index e82932559d4..e69de29bb2d 100644 --- a/neutron/plugins/ml2/drivers/l2pop/__init__.py +++ b/neutron/plugins/ml2/drivers/l2pop/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/plugins/ml2/drivers/l2pop/mech_driver.py b/neutron/plugins/ml2/drivers/l2pop/mech_driver.py index a98a27fd7d5..c85acb1c73f 100644 --- a/neutron/plugins/ml2/drivers/l2pop/mech_driver.py +++ b/neutron/plugins/ml2/drivers/l2pop/mech_driver.py @@ -38,32 +38,18 @@ class L2populationMechanismDriver(api.MechanismDriver, LOG.debug(_("Experimental L2 population driver")) self.rpc_ctx = n_context.get_admin_context_without_session() self.migrated_ports = {} - self.remove_fdb_entries = {} def _get_port_fdb_entries(self, port): return [[port['mac_address'], ip['ip_address']] for ip in port['fixed_ips']] - def delete_port_precommit(self, context): - port = context.current - agent_host = context.host - - if port['id'] not in self.remove_fdb_entries: - self.remove_fdb_entries[port['id']] = {} - - self.remove_fdb_entries[port['id']][agent_host] = ( - self._update_port_down(context, port, agent_host, 1)) - def delete_port_postcommit(self, context): port = context.current agent_host = context.host - if port['id'] in self.remove_fdb_entries: - for agent_host in list(self.remove_fdb_entries[port['id']]): - self.L2populationAgentNotify.remove_fdb_entries( - self.rpc_ctx, - self.remove_fdb_entries[port['id']][agent_host]) - self.remove_fdb_entries[port['id']].pop(agent_host, 0) - self.remove_fdb_entries.pop(port['id'], 0) + + fdb_entries = self._update_port_down(context, port, agent_host) + self.L2populationAgentNotify.remove_fdb_entries(self.rpc_ctx, + fdb_entries) def _get_diff_ips(self, orig, port): orig_ips = set([ip['ip_address'] for ip in orig['fixed_ips']]) @@ -260,8 +246,7 @@ class L2populationMechanismDriver(api.MechanismDriver, self.L2populationAgentNotify.add_fdb_entries(self.rpc_ctx, other_fdb_entries) - def _update_port_down(self, context, port, agent_host, - agent_active_ports_count_for_flooding=0): + def _update_port_down(self, context, port, agent_host): port_infos = self._get_port_infos(context, port, agent_host) if not port_infos: return @@ -277,7 +262,7 @@ class L2populationMechanismDriver(api.MechanismDriver, {'segment_id': segment['segmentation_id'], 'network_type': segment['network_type'], 'ports': {agent_ip: []}}} - if agent_active_ports == agent_active_ports_count_for_flooding: + if agent_active_ports == 0: # Agent is removing its last activated port in this network, # other agents needs to be notified to delete their flooding entry. other_fdb_entries[network_id]['ports'][agent_ip].append( diff --git a/neutron/plugins/ml2/drivers/mechanism_odl.py b/neutron/plugins/ml2/drivers/mechanism_odl.py index 18b12a65a6b..05ca33bb7fa 100644 --- a/neutron/plugins/ml2/drivers/mechanism_odl.py +++ b/neutron/plugins/ml2/drivers/mechanism_odl.py @@ -30,11 +30,8 @@ from neutron.plugins.ml2 import driver_api as api LOG = log.getLogger(__name__) -ODL_NETWORK = 'network' ODL_NETWORKS = 'networks' -ODL_SUBNET = 'subnet' ODL_SUBNETS = 'subnets' -ODL_PORT = 'port' ODL_PORTS = 'ports' odl_opts = [ @@ -97,11 +94,10 @@ class JsessionId(requests.auth.AuthBase): r = requests.get(self.url, auth=(self.username, self.password)) r.raise_for_status() except requests.exceptions.HTTPError as e: - raise OpendaylightAuthError(msg=_("Failed to authenticate with " - "OpenDaylight: %s") % e) + raise OpendaylightAuthError(msg="Failed to authenticate with " + "OpenDaylight: %s" % e) except requests.exceptions.Timeout as e: - raise OpendaylightAuthError(msg=_("Authentication Timed" - " Out: %s") % e) + raise OpendaylightAuthError(msg="Authentication Timed Out: %s" % e) jsessionid = r.cookies.get('JSESSIONID') jsessionidsso = r.cookies.get('JSESSIONIDSSO') @@ -179,24 +175,26 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): else: self.sync_single_resource(operation, object_type, context) - def filter_create_network_attributes(self, network, context, dbcontext): + @staticmethod + def filter_create_network_attributes(network, context): """Filter out network attributes not required for a create.""" try_del(network, ['status', 'subnets']) - def filter_create_subnet_attributes(self, subnet, context, dbcontext): + @staticmethod + def filter_create_subnet_attributes(subnet, context): """Filter out subnet attributes not required for a create.""" pass - def filter_create_port_attributes(self, port, context, dbcontext): + @classmethod + def filter_create_port_attributes(cls, port, context): """Filter out port attributes not required for a create.""" - self.add_security_groups(context, dbcontext, port) + cls.add_security_groups(port, context) # TODO(kmestery): Converting to uppercase due to ODL bug # https://bugs.opendaylight.org/show_bug.cgi?id=477 port['mac_address'] = port['mac_address'].upper() try_del(port, ['status']) - def sync_resources(self, resource_name, collection_name, resources, - context, dbcontext, attr_filter): + def sync_resources(self, collection_name, context): """Sync objects from Neutron over to OpenDaylight. This will handle syncing networks, subnets, and ports from Neutron to @@ -204,6 +202,9 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): valid for create API operations. """ to_be_synced = [] + dbcontext = context._plugin_context + obj_getter = getattr(context._plugin, 'get_%s' % collection_name) + resources = obj_getter(dbcontext) for resource in resources: try: urlpath = collection_name + '/' + resource['id'] @@ -211,11 +212,12 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): except requests.exceptions.HTTPError as e: with excutils.save_and_reraise_exception() as ctx: if e.response.status_code == requests.codes.not_found: - attr_filter(resource, context, dbcontext) + attr_filter = self.create_object_map[collection_name] + attr_filter(resource, context) to_be_synced.append(resource) ctx.reraise = False - - key = resource_name if len(to_be_synced) == 1 else collection_name + key = collection_name[:-1] if len(to_be_synced) == 1 else ( + collection_name) # 400 errors are returned if an object exists, which we ignore. self.sendjson('post', collection_name, {key: to_be_synced}, @@ -230,45 +232,28 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): """ if not self.out_of_sync: return - dbcontext = context._plugin_context - networks = context._plugin.get_networks(dbcontext) - subnets = context._plugin.get_subnets(dbcontext) - ports = context._plugin.get_ports(dbcontext) - - self.sync_resources(ODL_NETWORK, ODL_NETWORKS, networks, - context, dbcontext, - self.filter_create_network_attributes) - self.sync_resources(ODL_SUBNET, ODL_SUBNETS, subnets, - context, dbcontext, - self.filter_create_subnet_attributes) - self.sync_resources(ODL_PORT, ODL_PORTS, ports, - context, dbcontext, - self.filter_create_port_attributes) + for collection_name in [ODL_NETWORKS, ODL_SUBNETS, ODL_PORTS]: + self.sync_resources(collection_name, context) self.out_of_sync = False - def filter_update_network_attributes(self, network, context, dbcontext): + @staticmethod + def filter_update_network_attributes(network, context): """Filter out network attributes for an update operation.""" try_del(network, ['id', 'status', 'subnets', 'tenant_id']) - def filter_update_subnet_attributes(self, subnet, context, dbcontext): + @staticmethod + def filter_update_subnet_attributes(subnet, context): """Filter out subnet attributes for an update operation.""" try_del(subnet, ['id', 'network_id', 'ip_version', 'cidr', 'allocation_pools', 'tenant_id']) - def filter_update_port_attributes(self, port, context, dbcontext): + @classmethod + def filter_update_port_attributes(cls, port, context): """Filter out port attributes for an update operation.""" - self.add_security_groups(context, dbcontext, port) + cls.add_security_groups(port, context) try_del(port, ['network_id', 'id', 'status', 'mac_address', 'tenant_id', 'fixed_ips']) - create_object_map = {ODL_NETWORKS: filter_create_network_attributes, - ODL_SUBNETS: filter_create_subnet_attributes, - ODL_PORTS: filter_create_port_attributes} - - update_object_map = {ODL_NETWORKS: filter_update_network_attributes, - ODL_SUBNETS: filter_update_subnet_attributes, - ODL_PORTS: filter_update_port_attributes} - def sync_single_resource(self, operation, object_type, context): """Sync over a single resource from Neutron to OpenDaylight. @@ -290,7 +275,7 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): method = 'put' attr_filter = self.update_object_map[object_type] resource = context.current.copy() - attr_filter(self, resource, context, context._plugin_context) + attr_filter(resource, context) # 400 errors are returned if an object exists, which we ignore. self.sendjson(method, urlpath, {object_type[:-1]: resource}, [requests.codes.bad_request]) @@ -298,20 +283,21 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): with excutils.save_and_reraise_exception(): self.out_of_sync = True - def add_security_groups(self, context, dbcontext, port): + @staticmethod + def add_security_groups(port, context): """Populate the 'security_groups' field with entire records.""" + dbcontext = context._plugin_context groups = [context._plugin.get_security_group(dbcontext, sg) for sg in port['security_groups']] port['security_groups'] = groups def sendjson(self, method, urlpath, obj, ignorecodes=[]): """Send json to the OpenDaylight controller.""" - headers = {'Content-Type': 'application/json'} data = jsonutils.dumps(obj, indent=2) if obj else None url = '/'.join([self.url, urlpath]) - LOG.debug(_('ODL-----> sending URL (%s) <-----ODL') % url) - LOG.debug(_('ODL-----> sending JSON (%s) <-----ODL') % obj) + LOG.debug("Sending METHOD (%(method)s) URL (%(url)s) JSON (%(obj)s)", + {'method': method, 'url': url, 'obj': obj}) r = requests.request(method, url=url, headers=headers, data=data, auth=self.auth, timeout=self.timeout) @@ -322,8 +308,8 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): r.raise_for_status() def bind_port(self, context): - LOG.debug(_("Attempting to bind port %(port)s on " - "network %(network)s"), + LOG.debug("Attempting to bind port %(port)s on " + "network %(network)s", {'port': context.current['id'], 'network': context.network.current['id']}) for segment in context.network.network_segments: @@ -332,12 +318,12 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): self.vif_type, self.vif_details, status=n_const.PORT_STATUS_ACTIVE) - LOG.debug(_("Bound using segment: %s"), segment) + LOG.debug("Bound using segment: %s", segment) return else: - LOG.debug(_("Refusing to bind port for segment ID %(id)s, " - "segment %(seg)s, phys net %(physnet)s, and " - "network type %(nettype)s"), + LOG.debug("Refusing to bind port for segment ID %(id)s, " + "segment %(seg)s, phys net %(physnet)s, and " + "network type %(nettype)s", {'id': segment[api.ID], 'seg': segment[api.SEGMENTATION_ID], 'physnet': segment[api.PHYSICAL_NETWORK], @@ -352,3 +338,14 @@ class OpenDaylightMechanismDriver(api.MechanismDriver): network_type = segment[api.NETWORK_TYPE] return network_type in [constants.TYPE_LOCAL, constants.TYPE_GRE, constants.TYPE_VXLAN, constants.TYPE_VLAN] + + +OpenDaylightMechanismDriver.create_object_map = { + ODL_NETWORKS: OpenDaylightMechanismDriver.filter_create_network_attributes, + ODL_SUBNETS: OpenDaylightMechanismDriver.filter_create_subnet_attributes, + ODL_PORTS: OpenDaylightMechanismDriver.filter_create_port_attributes} + +OpenDaylightMechanismDriver.update_object_map = { + ODL_NETWORKS: OpenDaylightMechanismDriver.filter_update_network_attributes, + ODL_SUBNETS: OpenDaylightMechanismDriver.filter_update_subnet_attributes, + ODL_PORTS: OpenDaylightMechanismDriver.filter_update_port_attributes} diff --git a/neutron/plugins/ml2/managers.py b/neutron/plugins/ml2/managers.py index 9c6c6fc514e..8700934fe64 100644 --- a/neutron/plugins/ml2/managers.py +++ b/neutron/plugins/ml2/managers.py @@ -152,10 +152,11 @@ class TypeManager(stevedore.named.NamedExtensionManager): with session.begin(subtransactions=True): network_id = network['id'] if segments: - for segment in segments: + for segment_index, segment in enumerate(segments): segment = self.reserve_provider_segment( session, segment) - db.add_network_segment(session, network_id, segment) + db.add_network_segment(session, network_id, + segment, segment_index) else: segment = self.allocate_tenant_segment(session) db.add_network_segment(session, network_id, segment) diff --git a/neutron/plugins/ml2/models.py b/neutron/plugins/ml2/models.py index 80ae1bbb6a3..350c34e4f77 100644 --- a/neutron/plugins/ml2/models.py +++ b/neutron/plugins/ml2/models.py @@ -41,6 +41,7 @@ class NetworkSegment(model_base.BASEV2, models_v2.HasId): segmentation_id = sa.Column(sa.Integer) is_dynamic = sa.Column(sa.Boolean, default=False, nullable=False, server_default=sa.sql.false()) + segment_index = sa.Column(sa.Integer, nullable=False, server_default='0') class PortBinding(model_base.BASEV2): diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 8547d18d8f6..5b9a7eb05b9 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -45,6 +45,7 @@ from neutron.db import quota_db # noqa from neutron.db import securitygroups_rpc_base as sg_db_rpc from neutron.extensions import allowedaddresspairs as addr_pair from neutron.extensions import extra_dhcp_opt as edo_ext +from neutron.extensions import l3agentscheduler from neutron.extensions import portbindings from neutron.extensions import providernet as provider from neutron import manager @@ -72,9 +73,6 @@ MAX_BIND_TRIES = 10 # providernet.py? TYPE_MULTI_SEGMENT = 'multi-segment' -TAP_DEVICE_PREFIX = 'tap' -TAP_DEVICE_PREFIX_LENGTH = 3 - class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, dvr_mac_db.DVRDbMixin, @@ -159,7 +157,27 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, # TODO(rkukura): Implement filtering. return nets - def _process_port_binding(self, mech_context, context, attrs): + def _notify_l3_agent_new_port(self, context, port): + if not port: + return + + # Whenever a DVR serviceable port comes up on a + # node, it has to be communicated to the L3 Plugin + # and agent for creating the respective namespaces. + if (utils.is_dvr_serviced(port['device_owner'])): + l3plugin = manager.NeutronManager.get_service_plugins().get( + service_constants.L3_ROUTER_NAT) + if (utils.is_extension_supported( + l3plugin, const.L3_DISTRIBUTED_EXT_ALIAS)): + l3plugin.dvr_update_router_addvm(context, port) + + def _get_host_port_if_changed(self, mech_context, attrs): + binding = mech_context._binding + host = attrs and attrs.get(portbindings.HOST_ID) + if (attributes.is_attr_set(host) and binding.host != host): + return mech_context.current + + def _process_port_binding(self, mech_context, attrs): binding = mech_context._binding port = mech_context.current changes = False @@ -169,15 +187,6 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, binding.host != host): binding.host = host changes = True - # Whenever a DVR serviceable port comes up on a - # node, it has to be communicated to the L3 Plugin - # and agent for creating the respective namespaces. - if (utils.is_dvr_serviced(port['device_owner'])): - l3plugin = manager.NeutronManager.get_service_plugins().get( - service_constants.L3_ROUTER_NAT) - if (utils.is_extension_supported( - l3plugin, const.L3_DISTRIBUTED_EXT_ALIAS)): - l3plugin.dvr_update_router_addvm(context, port) vnic_type = attrs and attrs.get(portbindings.VNIC_TYPE) if (attributes.is_attr_set(vnic_type) and @@ -572,9 +581,15 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, # to prevent deadlock waiting to acquire a DB lock # held by another thread in the same process, leading # to 'lock wait timeout' errors. + # + # Process L3 first, since, depending on the L3 plugin, it may + # involve locking the db-access semaphore, sending RPC + # notifications, and/or calling delete_port on this plugin. + # Additionally, a rollback may not be enough to undo the + # deletion of a floating IP with certain L3 backends. + self._process_l3_delete(context, id) with contextlib.nested(lockutils.lock('db-access'), session.begin(subtransactions=True)): - self._process_l3_delete(context, id) # Get ports to auto-delete. ports = (session.query(models_v2.Port). enable_eagerloads(False). @@ -770,7 +785,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, binding = db.add_port_binding(session, result['id']) mech_context = driver_context.PortContext(self, context, result, network, binding) - self._process_port_binding(mech_context, context, attrs) + new_host_port = self._get_host_port_if_changed(mech_context, attrs) + self._process_port_binding(mech_context, attrs) result[addr_pair.ADDRESS_PAIRS] = ( self._process_create_allowed_address_pairs( @@ -780,6 +796,9 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, dhcp_opts) self.mechanism_manager.create_port_precommit(mech_context) + # Notification must be sent after the above transaction is complete + self._notify_l3_agent_new_port(context, new_host_port) + try: self.mechanism_manager.create_port_postcommit(mech_context) except ml2_exc.MechanismDriverError: @@ -834,10 +853,14 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, mech_context = driver_context.PortContext( self, context, updated_port, network, binding, original_port=original_port) + new_host_port = self._get_host_port_if_changed(mech_context, attrs) need_port_update_notify |= self._process_port_binding( - mech_context, context, attrs) + mech_context, attrs) self.mechanism_manager.update_port_precommit(mech_context) + # Notification must be sent after the above transaction is complete + self._notify_l3_agent_new_port(context, new_host_port) + # TODO(apech) - handle errors raised by update_port, potentially # by re-calling update_port with the previous attributes. For # now the error is propogated to the caller, which is expected to @@ -967,45 +990,51 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, port = self._make_port_dict(port_db) network = self.get_network(context, port['network_id']) - mech_context = None - if port['device_owner'] == const.DEVICE_OWNER_DVR_INTERFACE: + bound_mech_contexts = [] + device_owner = port['device_owner'] + if device_owner == const.DEVICE_OWNER_DVR_INTERFACE: bindings = db.get_dvr_port_bindings(context.session, id) for bind in bindings: mech_context = driver_context.DvrPortContext( self, context, port, network, bind) self.mechanism_manager.delete_port_precommit(mech_context) + bound_mech_contexts.append(mech_context) else: mech_context = driver_context.PortContext(self, context, port, network, binding) - if "compute:" in port['device_owner'] and is_dvr_enabled: - router_info = l3plugin.dvr_deletens_if_no_vm(context, id) - removed_routers += router_info + if is_dvr_enabled and utils.is_dvr_serviced(device_owner): + removed_routers = l3plugin.dvr_deletens_if_no_port( + context, id) self.mechanism_manager.delete_port_precommit(mech_context) + bound_mech_contexts.append(mech_context) self._delete_port_security_group_bindings(context, id) if l3plugin: router_ids = l3plugin.disassociate_floatingips( context, id, do_notify=False) - if is_dvr_enabled: - l3plugin.dvr_vmarp_table_update(context, id, "del") LOG.debug("Calling delete_port for %(port_id)s owned by %(owner)s" - % {"port_id": id, "owner": port['device_owner']}) + % {"port_id": id, "owner": device_owner}) super(Ml2Plugin, self).delete_port(context, id) # now that we've left db transaction, we are safe to notify if l3plugin: + if is_dvr_enabled: + l3plugin.dvr_vmarp_table_update(context, port, "del") l3plugin.notify_routers_updated(context, router_ids) for router in removed_routers: - l3plugin.remove_router_from_l3_agent( - context, router['agent_id'], router['router_id']) - + try: + l3plugin.remove_router_from_l3_agent( + context, router['agent_id'], router['router_id']) + except l3agentscheduler.RouterNotHostedByL3Agent: + # router may have been removed by another process + LOG.debug("Router %(id)s not hosted by L3 agent %(agent)s", + {'id': router['router_id'], + 'agent': router['agent_id']}) try: - # for both normal and DVR Interface ports, only one invocation of - # delete_port_postcommit. We use gather/scatter technique for DVR - # interface ports, where the bindings are gathered in - # delete_port_precommit() call earlier and scattered as l2pop - # rules to cloud nodes in delete_port_postcommit() here - if mech_context: + # Note that DVR Interface ports will have bindings on + # multiple hosts, and so will have multiple mech_contexts, + # while other ports typically have just one. + for mech_context in bound_mech_contexts: self.mechanism_manager.delete_port_postcommit(mech_context) except ml2_exc.MechanismDriverError: # TODO(apech) - One or more mechanism driver failed to @@ -1138,8 +1167,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, # REVISIT(rkukura): Consider calling into MechanismDrivers to # process device names, or having MechanismDrivers supply list # of device prefixes to strip. - if device.startswith(TAP_DEVICE_PREFIX): - return device[TAP_DEVICE_PREFIX_LENGTH:] + if device.startswith(const.TAP_DEVICE_PREFIX): + return device[len(const.TAP_DEVICE_PREFIX):] else: # REVISIT(irenab): Consider calling into bound MD to # handle the get_device_details RPC, then remove the 'else' clause diff --git a/neutron/plugins/ml2/rpc.py b/neutron/plugins/ml2/rpc.py index d9cb07efd46..d962c1d2286 100644 --- a/neutron/plugins/ml2/rpc.py +++ b/neutron/plugins/ml2/rpc.py @@ -165,7 +165,8 @@ class RpcCallbacks(n_rpc.RpcCallback, utils.is_extension_supported(l3plugin, q_const.L3_DISTRIBUTED_EXT_ALIAS)): try: - l3plugin.dvr_vmarp_table_update(rpc_context, port_id, "add") + port = plugin._get_port(rpc_context, port_id) + l3plugin.dvr_vmarp_table_update(rpc_context, port, "add") except exceptions.PortNotFound: LOG.debug('Port %s not found during ARP update', port_id) diff --git a/neutron/plugins/mlnx/__init__.py b/neutron/plugins/mlnx/__init__.py index 7182ac41479..e69de29bb2d 100644 --- a/neutron/plugins/mlnx/__init__.py +++ b/neutron/plugins/mlnx/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Mellanox Technologies, Ltd -# -# 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. diff --git a/neutron/plugins/mlnx/agent/__init__.py b/neutron/plugins/mlnx/agent/__init__.py index 7182ac41479..e69de29bb2d 100644 --- a/neutron/plugins/mlnx/agent/__init__.py +++ b/neutron/plugins/mlnx/agent/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Mellanox Technologies, Ltd -# -# 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. diff --git a/neutron/plugins/mlnx/common/__init__.py b/neutron/plugins/mlnx/common/__init__.py index 7182ac41479..e69de29bb2d 100644 --- a/neutron/plugins/mlnx/common/__init__.py +++ b/neutron/plugins/mlnx/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Mellanox Technologies, Ltd -# -# 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. diff --git a/neutron/plugins/mlnx/common/comm_utils.py b/neutron/plugins/mlnx/common/comm_utils.py index 834b5a2cb12..f426908f282 100644 --- a/neutron/plugins/mlnx/common/comm_utils.py +++ b/neutron/plugins/mlnx/common/comm_utils.py @@ -35,7 +35,6 @@ class RetryDecorator(object): :param retries: number of times to try before giving up :raises: exceptionToCheck """ - sleep_fn = time.sleep def __init__(self, exceptionToCheck, interval=cfg.CONF.ESWITCH.request_timeout / 1000, @@ -56,7 +55,7 @@ class RetryDecorator(object): except self.exc: LOG.debug(_("Request timeout - call again after " "%s seconds"), sleep_interval) - RetryDecorator.sleep_fn(sleep_interval) + time.sleep(sleep_interval) num_of_iter -= 1 sleep_interval *= self.backoff_rate diff --git a/neutron/plugins/mlnx/db/__init__.py b/neutron/plugins/mlnx/db/__init__.py index 7182ac41479..e69de29bb2d 100644 --- a/neutron/plugins/mlnx/db/__init__.py +++ b/neutron/plugins/mlnx/db/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Mellanox Technologies, Ltd -# -# 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. diff --git a/neutron/plugins/mlnx/mlnx_plugin.py b/neutron/plugins/mlnx/mlnx_plugin.py index 0a8ed5b7612..155b85d972d 100644 --- a/neutron/plugins/mlnx/mlnx_plugin.py +++ b/neutron/plugins/mlnx/mlnx_plugin.py @@ -52,9 +52,6 @@ from neutron.plugins.mlnx import rpc_callbacks LOG = logging.getLogger(__name__) -#to be compatible with Linux Bridge Agent on Network Node -TAP_PREFIX_LEN = 3 - class MellanoxEswitchPlugin(db_base_plugin_v2.NeutronDbPluginV2, external_net_db.External_net_db_mixin, @@ -529,7 +526,8 @@ class MellanoxEswitchPlugin(db_base_plugin_v2.NeutronDbPluginV2, services get device either by linux bridge plugin device name convention or by mac address """ - port = db.get_port_from_device(device[TAP_PREFIX_LEN:]) + port = db.get_port_from_device( + device[len(q_const.TAP_DEVICE_PREFIX):]) if port: port['device'] = device else: diff --git a/neutron/plugins/nec/__init__.py b/neutron/plugins/nec/__init__.py index cff1fb258c7..e69de29bb2d 100644 --- a/neutron/plugins/nec/__init__.py +++ b/neutron/plugins/nec/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 NEC Corporation. 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. diff --git a/neutron/plugins/nec/agent/__init__.py b/neutron/plugins/nec/agent/__init__.py index cff1fb258c7..e69de29bb2d 100644 --- a/neutron/plugins/nec/agent/__init__.py +++ b/neutron/plugins/nec/agent/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 NEC Corporation. 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. diff --git a/neutron/plugins/nec/common/__init__.py b/neutron/plugins/nec/common/__init__.py index cff1fb258c7..e69de29bb2d 100644 --- a/neutron/plugins/nec/common/__init__.py +++ b/neutron/plugins/nec/common/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 NEC Corporation. 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. diff --git a/neutron/plugins/nec/db/__init__.py b/neutron/plugins/nec/db/__init__.py index cff1fb258c7..e69de29bb2d 100644 --- a/neutron/plugins/nec/db/__init__.py +++ b/neutron/plugins/nec/db/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 NEC Corporation. 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. diff --git a/neutron/plugins/nec/extensions/__init__.py b/neutron/plugins/nec/extensions/__init__.py index cff1fb258c7..e69de29bb2d 100644 --- a/neutron/plugins/nec/extensions/__init__.py +++ b/neutron/plugins/nec/extensions/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 NEC Corporation. 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. diff --git a/neutron/plugins/nuage/nuage_models.py b/neutron/plugins/nuage/nuage_models.py index 5d30dbcb06c..59c773951ff 100644 --- a/neutron/plugins/nuage/nuage_models.py +++ b/neutron/plugins/nuage/nuage_models.py @@ -14,6 +14,7 @@ # under the License. import sqlalchemy as sa +from sqlalchemy import orm from neutron.db import model_base from neutron.db import models_v2 @@ -49,6 +50,11 @@ class ProviderNetBinding(model_base.BASEV2): physical_network = sa.Column(sa.String(64), nullable=False) vlan_id = sa.Column(sa.Integer, nullable=False) + network = orm.relationship( + models_v2.Network, + backref=orm.backref("pnetbinding", lazy='joined', + uselist=False, cascade='delete')) + class SubnetL2Domain(model_base.BASEV2): __tablename__ = 'nuage_subnet_l2dom_mapping' diff --git a/neutron/plugins/nuage/nuagedb.py b/neutron/plugins/nuage/nuagedb.py index 1fc261371db..1a3210bc237 100644 --- a/neutron/plugins/nuage/nuagedb.py +++ b/neutron/plugins/nuage/nuagedb.py @@ -203,6 +203,7 @@ def add_network_binding(session, network_id, network_type, physical_network, physical_network=physical_network, vlan_id=vlan_id) session.add(binding) + return binding def get_network_binding(session, network_id): diff --git a/neutron/plugins/nuage/plugin.py b/neutron/plugins/nuage/plugin.py index cd8c9e2d25b..995a8fa8d38 100644 --- a/neutron/plugins/nuage/plugin.py +++ b/neutron/plugins/nuage/plugin.py @@ -78,6 +78,9 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2, self.syncmanager = syncmanager.SyncManager(self.nuageclient) self._synchronization_thread() + db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs( + attributes.NETWORKS, ['_extend_network_dict_provider_nuage']) + def nuageclient_init(self): server = cfg.CONF.RESTPROXY.server serverauth = cfg.CONF.RESTPROXY.serverauth @@ -392,8 +395,9 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2, subnets = self.get_subnets(context, filters=filters) return bool(routers or subnets) - def _extend_network_dict_provider(self, context, network): - binding = nuagedb.get_network_binding(context.session, network['id']) + def _extend_network_dict_provider_nuage(self, network, net_db, + net_binding=None): + binding = net_db.pnetbinding if net_db else net_binding if binding: network[pnet.NETWORK_TYPE] = binding.network_type network[pnet.PHYSICAL_NETWORK] = binding.physical_network @@ -432,6 +436,7 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2, return network_type, physical_network, segmentation_id def create_network(self, context, network): + binding = None (network_type, physical_network, vlan_id) = self._process_provider_create(context, network['network']) @@ -444,10 +449,11 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2, network) self._process_l3_create(context, net, network['network']) if network_type == 'vlan': - nuagedb.add_network_binding(context.session, net['id'], + binding = nuagedb.add_network_binding(context.session, + net['id'], network_type, physical_network, vlan_id) - self._extend_network_dict_provider(context, net) + self._extend_network_dict_provider_nuage(net, None, binding) return net def _validate_update_network(self, context, id, network): @@ -473,23 +479,6 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2, raise n_exc.NetworkInUse(net_id=id) return (is_external_set, subnet) - def get_network(self, context, net_id, fields=None): - net = super(NuagePlugin, self).get_network(context, - net_id, - None) - self._extend_network_dict_provider(context, net) - return self._fields(net, fields) - - def get_networks(self, context, filters=None, fields=None, - sorts=None, limit=None, marker=None, page_reverse=False): - nets = super(NuagePlugin, - self).get_networks(context, filters, None, sorts, - limit, marker, page_reverse) - for net in nets: - self._extend_network_dict_provider(context, net) - - return [self._fields(net, fields) for net in nets] - def update_network(self, context, id, network): pnet._raise_if_updates_provider_attributes(network['network']) with context.session.begin(subtransactions=True): @@ -998,8 +987,7 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2, super(NuagePlugin, self).delete_router(context, id) - nuage_zone = self.nuageclient.get_zone_by_routerid(id) - if nuage_zone and not self._check_router_subnet_for_tenant( + if not self._check_router_subnet_for_tenant( context, neutron_router['tenant_id']): user_id, group_id = self.nuageclient.get_usergroup( neutron_router['tenant_id'], diff --git a/neutron/plugins/ofagent/agent/arp_lib.py b/neutron/plugins/ofagent/agent/arp_lib.py index c83e9435287..c6ceea71a26 100644 --- a/neutron/plugins/ofagent/agent/arp_lib.py +++ b/neutron/plugins/ofagent/agent/arp_lib.py @@ -120,7 +120,12 @@ class ArpLib(object): @log.log def del_arp_table_entry(self, network, ip): - del self._arp_tbl[network][ip] + if network not in self._arp_tbl: + LOG.debug("removal of unknown network %s", network) + return + if self._arp_tbl[network].pop(ip, None) is None: + LOG.debug("removal of unknown ip %s", ip) + return if not self._arp_tbl[network]: del self._arp_tbl[network] @@ -143,10 +148,16 @@ class ArpLib(object): ofp = datapath.ofproto port = msg.match['in_port'] metadata = msg.match.get('metadata') - pkt = packet.Packet(msg.data) - LOG.info(_LI("packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"), - {'dpid': dpid_lib.dpid_to_str(datapath.id), - 'port': port, 'pkt': pkt}) + # NOTE(yamamoto): Ryu packet library can raise various exceptions + # on a corrupted packet. + try: + pkt = packet.Packet(msg.data) + except Exception as e: + LOG.debug("Unparsable packet: got exception %s", e) + return + LOG.debug("packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s", + {'dpid': dpid_lib.dpid_to_str(datapath.id), + 'port': port, 'pkt': pkt}) if metadata is None: LOG.info(_LI("drop non tenant packet")) @@ -154,12 +165,12 @@ class ArpLib(object): network = metadata & meta.NETWORK_MASK pkt_ethernet = pkt.get_protocol(ethernet.ethernet) if not pkt_ethernet: - LOG.info(_LI("drop non-ethernet packet")) + LOG.debug("drop non-ethernet packet") return pkt_vlan = pkt.get_protocol(vlan.vlan) pkt_arp = pkt.get_protocol(arp.arp) if not pkt_arp: - LOG.info(_LI("drop non-arp packet")) + LOG.debug("drop non-arp packet") return arptbl = self._arp_tbl.get(network) diff --git a/neutron/plugins/ofagent/agent/ports.py b/neutron/plugins/ofagent/agent/ports.py index 4389b795742..218dc5eceed 100644 --- a/neutron/plugins/ofagent/agent/ports.py +++ b/neutron/plugins/ofagent/agent/ports.py @@ -14,6 +14,8 @@ # License for the specific language governing permissions and limitations # under the License. +from neutron.common import constants as n_const + class OFPort(object): def __init__(self, port_name, ofport): @@ -28,7 +30,7 @@ class OFPort(object): PORT_NAME_LEN = 14 PORT_NAME_PREFIXES = [ - "tap", # common cases, including ovs_use_veth=True + n_const.TAP_DEVICE_PREFIX, # common cases, including ovs_use_veth=True "qvo", # nova hybrid interface driver "qr-", # l3-agent INTERNAL_DEV_PREFIX (ovs_use_veth=False) "qg-", # l3-agent EXTERNAL_DEV_PREFIX (ovs_use_veth=False) @@ -61,7 +63,7 @@ def get_normalized_port_name(interface_id): use "tap" prefix throughout the agent and plugin for simplicity. Some care should be taken when talking to the switch. """ - return ("tap" + interface_id)[0:PORT_NAME_LEN] + return (n_const.TAP_DEVICE_PREFIX + interface_id)[0:PORT_NAME_LEN] def _normalize_port_name(name): @@ -71,7 +73,7 @@ def _normalize_port_name(name): """ for pref in PORT_NAME_PREFIXES: if name.startswith(pref): - return "tap" + name[len(pref):] + return n_const.TAP_DEVICE_PREFIX + name[len(pref):] return name diff --git a/neutron/plugins/openvswitch/README b/neutron/plugins/openvswitch/README index b8991ad0a27..005aca36fdd 100644 --- a/neutron/plugins/openvswitch/README +++ b/neutron/plugins/openvswitch/README @@ -1,6 +1,4 @@ -The Open vSwitch (OVS) Neutron plugin is a simple plugin to manage OVS -features using a local agent running on each hypervisor. +The Open vSwitch (OVS) Neutron plugin has been removed and replaced by ML2. You +must run the migration manually to upgrade to Juno. -For details on how to configure and use the plugin, see: - -http://openvswitch.org/openstack/documentation/ +See neutron/db/migration/migrate_to_ml2.py diff --git a/neutron/plugins/openvswitch/common/__init__.py b/neutron/plugins/openvswitch/common/__init__.py index 8ac9340e9fd..e69de29bb2d 100644 --- a/neutron/plugins/openvswitch/common/__init__.py +++ b/neutron/plugins/openvswitch/common/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 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. diff --git a/neutron/plugins/openvswitch/common/config.py b/neutron/plugins/openvswitch/common/config.py index d9e0454839c..03e4d884ff2 100644 --- a/neutron/plugins/openvswitch/common/config.py +++ b/neutron/plugins/openvswitch/common/config.py @@ -43,19 +43,6 @@ ovs_opts = [ default=DEFAULT_BRIDGE_MAPPINGS, help=_("List of :. " "Deprecated for ofagent.")), - cfg.StrOpt('tenant_network_type', default='local', - help=_("Network type for tenant networks " - "(local, vlan, gre, vxlan, or none).")), - cfg.ListOpt('network_vlan_ranges', - default=DEFAULT_VLAN_RANGES, - help=_("List of :: " - "or .")), - cfg.ListOpt('tunnel_id_ranges', - default=DEFAULT_TUNNEL_RANGES, - help=_("List of :.")), - cfg.StrOpt('tunnel_type', default='', - help=_("The type of tunnels to use when utilizing tunnels, " - "either 'gre' or 'vxlan'.")), cfg.BoolOpt('use_veth_interconnection', default=False, help=_("Use veths instead of patch ports to interconnect the " "integration bridge to physical bridges.")), diff --git a/neutron/plugins/openvswitch/ovs_db_v2.py b/neutron/plugins/openvswitch/ovs_db_v2.py deleted file mode 100644 index c9820ce3bb0..00000000000 --- a/neutron/plugins/openvswitch/ovs_db_v2.py +++ /dev/null @@ -1,396 +0,0 @@ -# Copyright 2011 VMware, 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. - -from oslo.db import exception as db_exc -from six import moves -from sqlalchemy import func -from sqlalchemy.orm import exc - -from neutron.common import exceptions as n_exc -import neutron.db.api as db -from neutron.db import models_v2 -from neutron.db import securitygroups_db as sg_db -from neutron.extensions import securitygroup as ext_sg -from neutron import manager -from neutron.openstack.common import log as logging -from neutron.plugins.openvswitch.common import constants -from neutron.plugins.openvswitch import ovs_models_v2 - -LOG = logging.getLogger(__name__) - - -def get_network_binding(session, network_id): - session = session or db.get_session() - try: - binding = (session.query(ovs_models_v2.NetworkBinding). - filter_by(network_id=network_id). - one()) - return binding - except exc.NoResultFound: - return - - -def add_network_binding(session, network_id, network_type, - physical_network, segmentation_id): - with session.begin(subtransactions=True): - binding = ovs_models_v2.NetworkBinding(network_id, network_type, - physical_network, - segmentation_id) - session.add(binding) - return binding - - -def sync_vlan_allocations(network_vlan_ranges): - """Synchronize vlan_allocations table with configured VLAN ranges.""" - - session = db.get_session() - with session.begin(): - # get existing allocations for all physical networks - allocations = dict() - allocs = (session.query(ovs_models_v2.VlanAllocation). - all()) - for alloc in allocs: - if alloc.physical_network not in allocations: - allocations[alloc.physical_network] = set() - allocations[alloc.physical_network].add(alloc) - - # process vlan ranges for each configured physical network - for physical_network, vlan_ranges in network_vlan_ranges.iteritems(): - # determine current configured allocatable vlans for this - # physical network - vlan_ids = set() - for vlan_range in vlan_ranges: - vlan_ids |= set(moves.xrange(vlan_range[0], vlan_range[1] + 1)) - - # remove from table unallocated vlans not currently allocatable - if physical_network in allocations: - for alloc in allocations[physical_network]: - try: - # see if vlan is allocatable - vlan_ids.remove(alloc.vlan_id) - except KeyError: - # it's not allocatable, so check if its allocated - if not alloc.allocated: - # it's not, so remove it from table - LOG.debug(_("Removing vlan %(vlan_id)s on " - "physical network " - "%(physical_network)s from pool"), - {'vlan_id': alloc.vlan_id, - 'physical_network': physical_network}) - session.delete(alloc) - del allocations[physical_network] - - # add missing allocatable vlans to table - for vlan_id in sorted(vlan_ids): - alloc = ovs_models_v2.VlanAllocation(physical_network, vlan_id) - session.add(alloc) - - # remove from table unallocated vlans for any unconfigured physical - # networks - for allocs in allocations.itervalues(): - for alloc in allocs: - if not alloc.allocated: - LOG.debug(_("Removing vlan %(vlan_id)s on physical " - "network %(physical_network)s from pool"), - {'vlan_id': alloc.vlan_id, - 'physical_network': alloc.physical_network}) - session.delete(alloc) - - -def get_vlan_allocation(physical_network, vlan_id): - session = db.get_session() - try: - alloc = (session.query(ovs_models_v2.VlanAllocation). - filter_by(physical_network=physical_network, - vlan_id=vlan_id). - one()) - return alloc - except exc.NoResultFound: - return - - -def reserve_vlan(session): - with session.begin(subtransactions=True): - alloc = (session.query(ovs_models_v2.VlanAllocation). - filter_by(allocated=False). - with_lockmode('update'). - first()) - if alloc: - LOG.debug(_("Reserving vlan %(vlan_id)s on physical network " - "%(physical_network)s from pool"), - {'vlan_id': alloc.vlan_id, - 'physical_network': alloc.physical_network}) - alloc.allocated = True - return (alloc.physical_network, alloc.vlan_id) - raise n_exc.NoNetworkAvailable() - - -def reserve_specific_vlan(session, physical_network, vlan_id): - with session.begin(subtransactions=True): - try: - alloc = (session.query(ovs_models_v2.VlanAllocation). - filter_by(physical_network=physical_network, - vlan_id=vlan_id). - with_lockmode('update'). - one()) - if alloc.allocated: - if vlan_id == constants.FLAT_VLAN_ID: - raise n_exc.FlatNetworkInUse( - physical_network=physical_network) - else: - raise n_exc.VlanIdInUse(vlan_id=vlan_id, - physical_network=physical_network) - LOG.debug(_("Reserving specific vlan %(vlan_id)s on physical " - "network %(physical_network)s from pool"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - alloc.allocated = True - except exc.NoResultFound: - LOG.debug(_("Reserving specific vlan %(vlan_id)s on physical " - "network %(physical_network)s outside pool"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - alloc = ovs_models_v2.VlanAllocation(physical_network, vlan_id) - alloc.allocated = True - session.add(alloc) - - -def release_vlan(session, physical_network, vlan_id, network_vlan_ranges): - with session.begin(subtransactions=True): - try: - alloc = (session.query(ovs_models_v2.VlanAllocation). - filter_by(physical_network=physical_network, - vlan_id=vlan_id). - with_lockmode('update'). - one()) - alloc.allocated = False - inside = False - for vlan_range in network_vlan_ranges.get(physical_network, []): - if vlan_id >= vlan_range[0] and vlan_id <= vlan_range[1]: - inside = True - break - if not inside: - session.delete(alloc) - LOG.debug(_("Releasing vlan %(vlan_id)s on physical network " - "%(physical_network)s outside pool"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - else: - LOG.debug(_("Releasing vlan %(vlan_id)s on physical network " - "%(physical_network)s to pool"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - except exc.NoResultFound: - LOG.warning(_("vlan_id %(vlan_id)s on physical network " - "%(physical_network)s not found"), - {'vlan_id': vlan_id, - 'physical_network': physical_network}) - - -def sync_tunnel_allocations(tunnel_id_ranges): - """Synchronize tunnel_allocations table with configured tunnel ranges.""" - - # determine current configured allocatable tunnels - tunnel_ids = set() - for tunnel_id_range in tunnel_id_ranges: - tun_min, tun_max = tunnel_id_range - if tun_max + 1 - tun_min > 1000000: - LOG.error(_("Skipping unreasonable tunnel ID range " - "%(tun_min)s:%(tun_max)s"), - {'tun_min': tun_min, 'tun_max': tun_max}) - else: - tunnel_ids |= set(moves.xrange(tun_min, tun_max + 1)) - - session = db.get_session() - with session.begin(): - # remove from table unallocated tunnels not currently allocatable - allocs = (session.query(ovs_models_v2.TunnelAllocation). - all()) - for alloc in allocs: - try: - # see if tunnel is allocatable - tunnel_ids.remove(alloc.tunnel_id) - except KeyError: - # it's not allocatable, so check if its allocated - if not alloc.allocated: - # it's not, so remove it from table - LOG.debug(_("Removing tunnel %s from pool"), - alloc.tunnel_id) - session.delete(alloc) - - # add missing allocatable tunnels to table - for tunnel_id in sorted(tunnel_ids): - alloc = ovs_models_v2.TunnelAllocation(tunnel_id) - session.add(alloc) - - -def get_tunnel_allocation(tunnel_id): - session = db.get_session() - try: - alloc = (session.query(ovs_models_v2.TunnelAllocation). - filter_by(tunnel_id=tunnel_id). - with_lockmode('update'). - one()) - return alloc - except exc.NoResultFound: - return - - -def reserve_tunnel(session): - with session.begin(subtransactions=True): - alloc = (session.query(ovs_models_v2.TunnelAllocation). - filter_by(allocated=False). - with_lockmode('update'). - first()) - if alloc: - LOG.debug(_("Reserving tunnel %s from pool"), alloc.tunnel_id) - alloc.allocated = True - return alloc.tunnel_id - raise n_exc.NoNetworkAvailable() - - -def reserve_specific_tunnel(session, tunnel_id): - with session.begin(subtransactions=True): - try: - alloc = (session.query(ovs_models_v2.TunnelAllocation). - filter_by(tunnel_id=tunnel_id). - with_lockmode('update'). - one()) - if alloc.allocated: - raise n_exc.TunnelIdInUse(tunnel_id=tunnel_id) - LOG.debug(_("Reserving specific tunnel %s from pool"), tunnel_id) - alloc.allocated = True - except exc.NoResultFound: - LOG.debug(_("Reserving specific tunnel %s outside pool"), - tunnel_id) - alloc = ovs_models_v2.TunnelAllocation(tunnel_id) - alloc.allocated = True - session.add(alloc) - - -def release_tunnel(session, tunnel_id, tunnel_id_ranges): - with session.begin(subtransactions=True): - try: - alloc = (session.query(ovs_models_v2.TunnelAllocation). - filter_by(tunnel_id=tunnel_id). - with_lockmode('update'). - one()) - alloc.allocated = False - inside = False - for tunnel_id_range in tunnel_id_ranges: - if (tunnel_id >= tunnel_id_range[0] - and tunnel_id <= tunnel_id_range[1]): - inside = True - break - if not inside: - session.delete(alloc) - LOG.debug(_("Releasing tunnel %s outside pool"), tunnel_id) - else: - LOG.debug(_("Releasing tunnel %s to pool"), tunnel_id) - except exc.NoResultFound: - LOG.warning(_("tunnel_id %s not found"), tunnel_id) - - -def get_port(port_id): - session = db.get_session() - try: - port = session.query(models_v2.Port).filter_by(id=port_id).one() - except exc.NoResultFound: - port = None - return port - - -def get_port_from_device(port_id): - """Get port from database.""" - LOG.debug(_("get_port_with_securitygroups() called:port_id=%s"), port_id) - session = db.get_session() - sg_binding_port = sg_db.SecurityGroupPortBinding.port_id - - query = session.query(models_v2.Port, - sg_db.SecurityGroupPortBinding.security_group_id) - query = query.outerjoin(sg_db.SecurityGroupPortBinding, - models_v2.Port.id == sg_binding_port) - query = query.filter(models_v2.Port.id == port_id) - port_and_sgs = query.all() - if not port_and_sgs: - return None - port = port_and_sgs[0][0] - plugin = manager.NeutronManager.get_plugin() - port_dict = plugin._make_port_dict(port) - port_dict[ext_sg.SECURITYGROUPS] = [ - sg_id for port_, sg_id in port_and_sgs if sg_id] - port_dict['security_group_rules'] = [] - port_dict['security_group_source_groups'] = [] - port_dict['fixed_ips'] = [ip['ip_address'] - for ip in port['fixed_ips']] - return port_dict - - -def set_port_status(port_id, status): - session = db.get_session() - try: - port = session.query(models_v2.Port).filter_by(id=port_id).one() - port['status'] = status - session.merge(port) - session.flush() - except exc.NoResultFound: - raise n_exc.PortNotFound(port_id=port_id) - - -def get_tunnel_endpoints(): - session = db.get_session() - - tunnels = session.query(ovs_models_v2.TunnelEndpoint) - return [{'id': tunnel.id, - 'ip_address': tunnel.ip_address} for tunnel in tunnels] - - -def _generate_tunnel_id(session): - max_tunnel_id = session.query( - func.max(ovs_models_v2.TunnelEndpoint.id)).scalar() or 0 - return max_tunnel_id + 1 - - -def add_tunnel_endpoint(ip, max_retries=10): - """Return the endpoint of the given IP address or generate a new one.""" - - # NOTE(rpodolyaka): generation of a new tunnel endpoint must be put into a - # repeatedly executed transactional block to ensure it - # doesn't conflict with any other concurrently executed - # DB transactions in spite of the specified transactions - # isolation level value - for i in moves.xrange(max_retries): - LOG.debug(_('Adding a tunnel endpoint for %s'), ip) - try: - session = db.get_session() - with session.begin(subtransactions=True): - tunnel = (session.query(ovs_models_v2.TunnelEndpoint). - filter_by(ip_address=ip).with_lockmode('update'). - first()) - - if tunnel is None: - tunnel_id = _generate_tunnel_id(session) - tunnel = ovs_models_v2.TunnelEndpoint(ip, tunnel_id) - session.add(tunnel) - - return tunnel - except db_exc.DBDuplicateEntry: - # a concurrent transaction has been committed, try again - LOG.debug(_('Adding a tunnel endpoint failed due to a concurrent' - 'transaction had been committed (%s attempts left)'), - max_retries - (i + 1)) - - raise n_exc.NeutronException( - message=_('Unable to generate a new tunnel id')) diff --git a/neutron/plugins/openvswitch/ovs_neutron_plugin.py b/neutron/plugins/openvswitch/ovs_neutron_plugin.py deleted file mode 100644 index 7dad9b66d9a..00000000000 --- a/neutron/plugins/openvswitch/ovs_neutron_plugin.py +++ /dev/null @@ -1,651 +0,0 @@ -# Copyright 2011 VMware, 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 sys - -from oslo.config import cfg - -from neutron.agent import securitygroups_rpc as sg_rpc -from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api -from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api -from neutron.api.rpc.handlers import dhcp_rpc -from neutron.api.rpc.handlers import l3_rpc -from neutron.api.rpc.handlers import securitygroups_rpc -from neutron.api.v2 import attributes -from neutron.common import constants as q_const -from neutron.common import exceptions as n_exc -from neutron.common import rpc as n_rpc -from neutron.common import topics -from neutron.common import utils -from neutron.db import agents_db -from neutron.db import agentschedulers_db -from neutron.db import allowedaddresspairs_db as addr_pair_db -from neutron.db import db_base_plugin_v2 -from neutron.db import external_net_db -from neutron.db import extradhcpopt_db -from neutron.db import extraroute_db -from neutron.db import l3_agentschedulers_db -from neutron.db import l3_gwmode_db -from neutron.db import portbindings_db -from neutron.db import quota_db # noqa -from neutron.db import securitygroups_rpc_base as sg_db_rpc -from neutron.extensions import allowedaddresspairs as addr_pair -from neutron.extensions import extra_dhcp_opt as edo_ext -from neutron.extensions import portbindings -from neutron.extensions import providernet as provider -from neutron.extensions import securitygroup as ext_sg -from neutron import manager -from neutron.openstack.common import importutils -from neutron.openstack.common import log as logging -from neutron.plugins.common import constants as svc_constants -from neutron.plugins.common import utils as plugin_utils -from neutron.plugins.openvswitch.common import config # noqa -from neutron.plugins.openvswitch.common import constants -from neutron.plugins.openvswitch import ovs_db_v2 - - -LOG = logging.getLogger(__name__) - - -class OVSRpcCallbacks(n_rpc.RpcCallback): - - # history - # 1.0 Initial version - # 1.1 Support Security Group RPC - # 1.2 Support get_devices_details_list - - RPC_API_VERSION = '1.2' - - def __init__(self, notifier, tunnel_type): - super(OVSRpcCallbacks, self).__init__() - self.notifier = notifier - self.tunnel_type = tunnel_type - - def get_device_details(self, rpc_context, **kwargs): - """Agent requests device details.""" - agent_id = kwargs.get('agent_id') - device = kwargs.get('device') - LOG.debug(_("Device %(device)s details requested from %(agent_id)s"), - {'device': device, 'agent_id': agent_id}) - port = ovs_db_v2.get_port(device) - if port: - binding = ovs_db_v2.get_network_binding(None, port['network_id']) - entry = {'device': device, - 'network_id': port['network_id'], - 'port_id': port['id'], - 'admin_state_up': port['admin_state_up'], - 'network_type': binding.network_type, - 'segmentation_id': binding.segmentation_id, - 'physical_network': binding.physical_network} - new_status = (q_const.PORT_STATUS_ACTIVE if port['admin_state_up'] - else q_const.PORT_STATUS_DOWN) - if port['status'] != new_status: - ovs_db_v2.set_port_status(port['id'], new_status) - else: - entry = {'device': device} - LOG.debug(_("%s can not be found in database"), device) - return entry - - def get_devices_details_list(self, rpc_context, **kwargs): - return [ - self.get_device_details( - rpc_context, - device=device, - **kwargs - ) - for device in kwargs.pop('devices', []) - ] - - def update_device_down(self, rpc_context, **kwargs): - """Device no longer exists on agent.""" - agent_id = kwargs.get('agent_id') - device = kwargs.get('device') - host = kwargs.get('host') - port = ovs_db_v2.get_port(device) - LOG.debug(_("Device %(device)s no longer exists on %(agent_id)s"), - {'device': device, 'agent_id': agent_id}) - if port: - entry = {'device': device, - 'exists': True} - plugin = manager.NeutronManager.get_plugin() - if (host and - not plugin.get_port_host(rpc_context, port['id']) == host): - LOG.debug(_("Device %(device)s not bound to the" - " agent host %(host)s"), - {'device': device, 'host': host}) - elif port['status'] != q_const.PORT_STATUS_DOWN: - # Set port status to DOWN - ovs_db_v2.set_port_status(port['id'], - q_const.PORT_STATUS_DOWN) - else: - entry = {'device': device, - 'exists': False} - LOG.debug(_("%s can not be found in database"), device) - return entry - - def update_device_up(self, rpc_context, **kwargs): - """Device is up on agent.""" - agent_id = kwargs.get('agent_id') - device = kwargs.get('device') - host = kwargs.get('host') - port = ovs_db_v2.get_port(device) - LOG.debug(_("Device %(device)s up on %(agent_id)s"), - {'device': device, 'agent_id': agent_id}) - plugin = manager.NeutronManager.get_plugin() - if port: - if (host and - not plugin.get_port_host(rpc_context, port['id']) == host): - LOG.debug(_("Device %(device)s not bound to the" - " agent host %(host)s"), - {'device': device, 'host': host}) - return - elif port['status'] != q_const.PORT_STATUS_ACTIVE: - ovs_db_v2.set_port_status(port['id'], - q_const.PORT_STATUS_ACTIVE) - else: - LOG.debug(_("%s can not be found in database"), device) - - def tunnel_sync(self, rpc_context, **kwargs): - """Update new tunnel. - - Updates the datbase with the tunnel IP. All listening agents will also - be notified about the new tunnel IP. - """ - tunnel_ip = kwargs.get('tunnel_ip') - # Update the database with the IP - tunnel = ovs_db_v2.add_tunnel_endpoint(tunnel_ip) - tunnels = ovs_db_v2.get_tunnel_endpoints() - entry = dict() - entry['tunnels'] = tunnels - # Notify all other listening agents - self.notifier.tunnel_update(rpc_context, tunnel.ip_address, - tunnel.id, self.tunnel_type) - # Return the list of tunnels IP's to the agent - return entry - - -class SecurityGroupServerRpcMixin(sg_db_rpc.SecurityGroupServerRpcMixin): - - @classmethod - def get_port_from_device(cls, device): - port = ovs_db_v2.get_port_from_device(device) - if port: - port['device'] = device - return port - - -class AgentNotifierApi(n_rpc.RpcProxy, - sg_rpc.SecurityGroupAgentRpcApiMixin): - '''Agent side of the openvswitch rpc API. - - API version history: - 1.0 - Initial version. - - ''' - - BASE_RPC_API_VERSION = '1.0' - - def __init__(self, topic): - super(AgentNotifierApi, self).__init__( - topic=topic, default_version=self.BASE_RPC_API_VERSION) - self.topic_network_delete = topics.get_topic_name(topic, - topics.NETWORK, - topics.DELETE) - self.topic_port_update = topics.get_topic_name(topic, - topics.PORT, - topics.UPDATE) - self.topic_tunnel_update = topics.get_topic_name(topic, - constants.TUNNEL, - topics.UPDATE) - - def network_delete(self, context, network_id): - self.fanout_cast(context, - self.make_msg('network_delete', - network_id=network_id), - topic=self.topic_network_delete) - - def port_update(self, context, port, network_type, segmentation_id, - physical_network): - self.fanout_cast(context, - self.make_msg('port_update', - port=port, - network_type=network_type, - segmentation_id=segmentation_id, - physical_network=physical_network), - topic=self.topic_port_update) - - def tunnel_update(self, context, tunnel_ip, tunnel_id, tunnel_type): - self.fanout_cast(context, - self.make_msg('tunnel_update', - tunnel_ip=tunnel_ip, - tunnel_id=tunnel_id, - tunnel_type=tunnel_type), - topic=self.topic_tunnel_update) - - -class OVSNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2, - external_net_db.External_net_db_mixin, - extraroute_db.ExtraRoute_db_mixin, - l3_gwmode_db.L3_NAT_db_mixin, - SecurityGroupServerRpcMixin, - l3_agentschedulers_db.L3AgentSchedulerDbMixin, - agentschedulers_db.DhcpAgentSchedulerDbMixin, - portbindings_db.PortBindingMixin, - extradhcpopt_db.ExtraDhcpOptMixin, - addr_pair_db.AllowedAddressPairsMixin): - - """Implement the Neutron abstractions using Open vSwitch. - - Depending on whether tunneling is enabled, either a GRE, VXLAN tunnel or - a new VLAN is created for each network. An agent is relied upon to - perform the actual OVS configuration on each host. - - The provider extension is also supported. As discussed in - https://bugs.launchpad.net/neutron/+bug/1023156, this class could - be simplified, and filtering on extended attributes could be - handled, by adding support for extended attributes to the - NeutronDbPluginV2 base class. When that occurs, this class should - be updated to take advantage of it. - - The port binding extension enables an external application relay - information to and from the plugin. - """ - - # This attribute specifies whether the plugin supports or not - # bulk/pagination/sorting operations. Name mangling is used in - # order to ensure it is qualified by class - __native_bulk_support = True - __native_pagination_support = True - __native_sorting_support = True - - _supported_extension_aliases = ["provider", "external-net", "router", - "ext-gw-mode", "binding", "quotas", - "security-group", "agent", "extraroute", - "l3_agent_scheduler", - "dhcp_agent_scheduler", - "extra_dhcp_opt", - "allowed-address-pairs"] - - @property - def supported_extension_aliases(self): - if not hasattr(self, '_aliases'): - aliases = self._supported_extension_aliases[:] - sg_rpc.disable_security_group_extension_by_config(aliases) - self._aliases = aliases - return self._aliases - - db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs( - attributes.NETWORKS, ['_extend_network_dict_provider_ovs']) - - def __init__(self, configfile=None): - super(OVSNeutronPluginV2, self).__init__() - self.base_binding_dict = { - portbindings.VIF_TYPE: portbindings.VIF_TYPE_OVS, - portbindings.VIF_DETAILS: { - # TODO(rkukura): Replace with new VIF security details - portbindings.CAP_PORT_FILTER: - 'security-group' in self.supported_extension_aliases, - portbindings.OVS_HYBRID_PLUG: True}} - self._parse_network_vlan_ranges() - ovs_db_v2.sync_vlan_allocations(self.network_vlan_ranges) - self.tenant_network_type = cfg.CONF.OVS.tenant_network_type - if self.tenant_network_type not in [svc_constants.TYPE_LOCAL, - svc_constants.TYPE_VLAN, - svc_constants.TYPE_GRE, - svc_constants.TYPE_VXLAN, - svc_constants.TYPE_NONE]: - LOG.error(_("Invalid tenant_network_type: %s. " - "Server terminated!"), - self.tenant_network_type) - sys.exit(1) - self.enable_tunneling = cfg.CONF.OVS.enable_tunneling - self.tunnel_type = None - if self.enable_tunneling: - self.tunnel_type = (cfg.CONF.OVS.tunnel_type or - svc_constants.TYPE_GRE) - elif cfg.CONF.OVS.tunnel_type: - self.tunnel_type = cfg.CONF.OVS.tunnel_type - self.enable_tunneling = True - self.tunnel_id_ranges = [] - if self.enable_tunneling: - self._parse_tunnel_id_ranges() - ovs_db_v2.sync_tunnel_allocations(self.tunnel_id_ranges) - elif self.tenant_network_type in constants.TUNNEL_NETWORK_TYPES: - LOG.error(_("Tunneling disabled but tenant_network_type is '%s'. " - "Server terminated!"), self.tenant_network_type) - sys.exit(1) - self.setup_rpc() - self.network_scheduler = importutils.import_object( - cfg.CONF.network_scheduler_driver - ) - self.router_scheduler = importutils.import_object( - cfg.CONF.router_scheduler_driver - ) - - def setup_rpc(self): - # RPC support - self.service_topics = {svc_constants.CORE: topics.PLUGIN, - svc_constants.L3_ROUTER_NAT: topics.L3PLUGIN} - self.conn = n_rpc.create_connection(new=True) - self.notifier = AgentNotifierApi(topics.AGENT) - self.agent_notifiers[q_const.AGENT_TYPE_DHCP] = ( - dhcp_rpc_agent_api.DhcpAgentNotifyAPI() - ) - self.agent_notifiers[q_const.AGENT_TYPE_L3] = ( - l3_rpc_agent_api.L3AgentNotifyAPI() - ) - self.endpoints = [OVSRpcCallbacks(self.notifier, self.tunnel_type), - securitygroups_rpc.SecurityGroupServerRpcCallback(), - dhcp_rpc.DhcpRpcCallback(), - l3_rpc.L3RpcCallback(), - agents_db.AgentExtRpcCallback()] - for svc_topic in self.service_topics.values(): - self.conn.create_consumer(svc_topic, self.endpoints, fanout=False) - # Consume from all consumers in threads - self.conn.consume_in_threads() - - def _parse_network_vlan_ranges(self): - try: - self.network_vlan_ranges = plugin_utils.parse_network_vlan_ranges( - cfg.CONF.OVS.network_vlan_ranges) - except Exception as ex: - LOG.error(_("%s. Server terminated!"), ex) - sys.exit(1) - LOG.info(_("Network VLAN ranges: %s"), self.network_vlan_ranges) - - def _parse_tunnel_id_ranges(self): - for entry in cfg.CONF.OVS.tunnel_id_ranges: - entry = entry.strip() - try: - tun_min, tun_max = entry.split(':') - self.tunnel_id_ranges.append((int(tun_min), int(tun_max))) - except ValueError as ex: - LOG.error(_("Invalid tunnel ID range: " - "'%(range)s' - %(e)s. Server terminated!"), - {'range': entry, 'e': ex}) - sys.exit(1) - LOG.info(_("Tunnel ID ranges: %s"), self.tunnel_id_ranges) - - def _extend_network_dict_provider_ovs(self, network, net_db, - net_binding=None): - # this method used in two cases: when binding is provided explicitly - # and when it is a part of db model object - binding = net_db.binding if net_db else net_binding - network[provider.NETWORK_TYPE] = binding.network_type - if binding.network_type in constants.TUNNEL_NETWORK_TYPES: - network[provider.PHYSICAL_NETWORK] = None - network[provider.SEGMENTATION_ID] = binding.segmentation_id - elif binding.network_type == svc_constants.TYPE_FLAT: - network[provider.PHYSICAL_NETWORK] = binding.physical_network - network[provider.SEGMENTATION_ID] = None - elif binding.network_type == svc_constants.TYPE_VLAN: - network[provider.PHYSICAL_NETWORK] = binding.physical_network - network[provider.SEGMENTATION_ID] = binding.segmentation_id - elif binding.network_type == svc_constants.TYPE_LOCAL: - network[provider.PHYSICAL_NETWORK] = None - network[provider.SEGMENTATION_ID] = None - - def _process_provider_create(self, context, attrs): - network_type = attrs.get(provider.NETWORK_TYPE) - physical_network = attrs.get(provider.PHYSICAL_NETWORK) - segmentation_id = attrs.get(provider.SEGMENTATION_ID) - - network_type_set = attributes.is_attr_set(network_type) - physical_network_set = attributes.is_attr_set(physical_network) - segmentation_id_set = attributes.is_attr_set(segmentation_id) - - if not (network_type_set or physical_network_set or - segmentation_id_set): - return (None, None, None) - - if not network_type_set: - msg = _("provider:network_type required") - raise n_exc.InvalidInput(error_message=msg) - elif network_type == svc_constants.TYPE_FLAT: - if segmentation_id_set: - msg = _("provider:segmentation_id specified for flat network") - raise n_exc.InvalidInput(error_message=msg) - else: - segmentation_id = constants.FLAT_VLAN_ID - elif network_type == svc_constants.TYPE_VLAN: - if not segmentation_id_set: - msg = _("provider:segmentation_id required") - raise n_exc.InvalidInput(error_message=msg) - if not utils.is_valid_vlan_tag(segmentation_id): - msg = (_("provider:segmentation_id out of range " - "(%(min_id)s through %(max_id)s)") % - {'min_id': q_const.MIN_VLAN_TAG, - 'max_id': q_const.MAX_VLAN_TAG}) - raise n_exc.InvalidInput(error_message=msg) - elif network_type in constants.TUNNEL_NETWORK_TYPES: - if not self.enable_tunneling: - msg = _("%s networks are not enabled") % network_type - raise n_exc.InvalidInput(error_message=msg) - if physical_network_set: - msg = _("provider:physical_network specified for %s " - "network") % network_type - raise n_exc.InvalidInput(error_message=msg) - else: - physical_network = None - if not segmentation_id_set: - msg = _("provider:segmentation_id required") - raise n_exc.InvalidInput(error_message=msg) - elif network_type == svc_constants.TYPE_LOCAL: - if physical_network_set: - msg = _("provider:physical_network specified for local " - "network") - raise n_exc.InvalidInput(error_message=msg) - else: - physical_network = None - if segmentation_id_set: - msg = _("provider:segmentation_id specified for local " - "network") - raise n_exc.InvalidInput(error_message=msg) - else: - segmentation_id = None - else: - msg = _("provider:network_type %s not supported") % network_type - raise n_exc.InvalidInput(error_message=msg) - - if network_type in [svc_constants.TYPE_VLAN, svc_constants.TYPE_FLAT]: - if physical_network_set: - if physical_network not in self.network_vlan_ranges: - msg = _("Unknown provider:physical_network " - "%s") % physical_network - raise n_exc.InvalidInput(error_message=msg) - elif 'default' in self.network_vlan_ranges: - physical_network = 'default' - else: - msg = _("provider:physical_network required") - raise n_exc.InvalidInput(error_message=msg) - - return (network_type, physical_network, segmentation_id) - - def create_network(self, context, network): - (network_type, physical_network, - segmentation_id) = self._process_provider_create(context, - network['network']) - - session = context.session - #set up default security groups - tenant_id = self._get_tenant_id_for_create( - context, network['network']) - self._ensure_default_security_group(context, tenant_id) - - with session.begin(subtransactions=True): - if not network_type: - # tenant network - network_type = self.tenant_network_type - if network_type == svc_constants.TYPE_NONE: - raise n_exc.TenantNetworksDisabled() - elif network_type == svc_constants.TYPE_VLAN: - (physical_network, - segmentation_id) = ovs_db_v2.reserve_vlan(session) - elif network_type in constants.TUNNEL_NETWORK_TYPES: - segmentation_id = ovs_db_v2.reserve_tunnel(session) - # no reservation needed for TYPE_LOCAL - else: - # provider network - if network_type in [svc_constants.TYPE_VLAN, - svc_constants.TYPE_FLAT]: - ovs_db_v2.reserve_specific_vlan(session, physical_network, - segmentation_id) - elif network_type in constants.TUNNEL_NETWORK_TYPES: - ovs_db_v2.reserve_specific_tunnel(session, segmentation_id) - # no reservation needed for TYPE_LOCAL - net = super(OVSNeutronPluginV2, self).create_network(context, - network) - binding = ovs_db_v2.add_network_binding(session, net['id'], - network_type, - physical_network, - segmentation_id) - - self._process_l3_create(context, net, network['network']) - # passing None as db model to use binding object - self._extend_network_dict_provider_ovs(net, None, binding) - # note - exception will rollback entire transaction - LOG.debug(_("Created network: %s"), net['id']) - return net - - def update_network(self, context, id, network): - provider._raise_if_updates_provider_attributes(network['network']) - - session = context.session - with session.begin(subtransactions=True): - net = super(OVSNeutronPluginV2, self).update_network(context, id, - network) - self._process_l3_update(context, net, network['network']) - return net - - def delete_network(self, context, id): - session = context.session - with session.begin(subtransactions=True): - binding = ovs_db_v2.get_network_binding(session, id) - self._process_l3_delete(context, id) - super(OVSNeutronPluginV2, self).delete_network(context, id) - if binding.network_type in constants.TUNNEL_NETWORK_TYPES: - ovs_db_v2.release_tunnel(session, binding.segmentation_id, - self.tunnel_id_ranges) - elif binding.network_type in [svc_constants.TYPE_VLAN, - svc_constants.TYPE_FLAT]: - ovs_db_v2.release_vlan(session, binding.physical_network, - binding.segmentation_id, - self.network_vlan_ranges) - # the network_binding record is deleted via cascade from - # the network record, so explicit removal is not necessary - self.notifier.network_delete(context, id) - - def get_network(self, context, id, fields=None): - session = context.session - with session.begin(subtransactions=True): - net = super(OVSNeutronPluginV2, self).get_network(context, - id, None) - return self._fields(net, fields) - - def get_networks(self, context, filters=None, fields=None, - sorts=None, - limit=None, marker=None, page_reverse=False): - session = context.session - with session.begin(subtransactions=True): - nets = super(OVSNeutronPluginV2, - self).get_networks(context, filters, None, sorts, - limit, marker, page_reverse) - - return [self._fields(net, fields) for net in nets] - - def create_port(self, context, port): - # Set port status as 'DOWN'. This will be updated by agent - port['port']['status'] = q_const.PORT_STATUS_DOWN - port_data = port['port'] - session = context.session - with session.begin(subtransactions=True): - self._ensure_default_security_group_on_port(context, port) - sgids = self._get_security_groups_on_port(context, port) - dhcp_opts = port['port'].get(edo_ext.EXTRADHCPOPTS, []) - port = super(OVSNeutronPluginV2, self).create_port(context, port) - self._process_portbindings_create_and_update(context, - port_data, port) - self._process_port_create_security_group(context, port, sgids) - self._process_port_create_extra_dhcp_opts(context, port, - dhcp_opts) - port[addr_pair.ADDRESS_PAIRS] = ( - self._process_create_allowed_address_pairs( - context, port, - port_data.get(addr_pair.ADDRESS_PAIRS))) - self.notify_security_groups_member_updated(context, port) - return port - - def update_port(self, context, id, port): - session = context.session - need_port_update_notify = False - with session.begin(subtransactions=True): - original_port = super(OVSNeutronPluginV2, self).get_port( - context, id) - updated_port = super(OVSNeutronPluginV2, self).update_port( - context, id, port) - if addr_pair.ADDRESS_PAIRS in port['port']: - need_port_update_notify |= ( - self.update_address_pairs_on_port(context, id, port, - original_port, - updated_port)) - need_port_update_notify |= self.update_security_group_on_port( - context, id, port, original_port, updated_port) - self._process_portbindings_create_and_update(context, - port['port'], - updated_port) - need_port_update_notify |= self._update_extra_dhcp_opts_on_port( - context, id, port, updated_port) - - secgrp_member_updated = self.is_security_group_member_updated( - context, original_port, updated_port) - need_port_update_notify |= secgrp_member_updated - if original_port['admin_state_up'] != updated_port['admin_state_up']: - need_port_update_notify = True - - if need_port_update_notify: - binding = ovs_db_v2.get_network_binding(None, - updated_port['network_id']) - self.notifier.port_update(context, updated_port, - binding.network_type, - binding.segmentation_id, - binding.physical_network) - - if secgrp_member_updated: - old_set = set(original_port.get(ext_sg.SECURITYGROUPS)) - new_set = set(updated_port.get(ext_sg.SECURITYGROUPS)) - self.notifier.security_groups_member_updated( - context, - old_set ^ new_set) - - return updated_port - - def delete_port(self, context, id, l3_port_check=True): - - # if needed, check to see if this is a port owned by - # and l3-router. If so, we should prevent deletion. - if l3_port_check: - self.prevent_l3_port_deletion(context, id) - - session = context.session - with session.begin(subtransactions=True): - router_ids = self.disassociate_floatingips( - context, id, do_notify=False) - port = self.get_port(context, id) - self._delete_port_security_group_bindings(context, id) - super(OVSNeutronPluginV2, self).delete_port(context, id) - - # now that we've left db transaction, we are safe to notify - self.notify_routers_updated(context, router_ids) - self.notify_security_groups_member_updated(context, port) diff --git a/neutron/plugins/plumgrid/__init__.py b/neutron/plugins/plumgrid/__init__.py index f34feeeec96..e69de29bb2d 100644 --- a/neutron/plugins/plumgrid/__init__.py +++ b/neutron/plugins/plumgrid/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 PLUMgrid, 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. diff --git a/neutron/plugins/plumgrid/common/__init__.py b/neutron/plugins/plumgrid/common/__init__.py index f34feeeec96..e69de29bb2d 100644 --- a/neutron/plugins/plumgrid/common/__init__.py +++ b/neutron/plugins/plumgrid/common/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 PLUMgrid, 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. diff --git a/neutron/plugins/plumgrid/drivers/__init__.py b/neutron/plugins/plumgrid/drivers/__init__.py index f34feeeec96..e69de29bb2d 100644 --- a/neutron/plugins/plumgrid/drivers/__init__.py +++ b/neutron/plugins/plumgrid/drivers/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 PLUMgrid, 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. diff --git a/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py b/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py index f34feeeec96..e69de29bb2d 100644 --- a/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py +++ b/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 PLUMgrid, 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. diff --git a/neutron/plugins/ryu/common/__init__.py b/neutron/plugins/ryu/common/__init__.py index 8ac9340e9fd..e69de29bb2d 100644 --- a/neutron/plugins/ryu/common/__init__.py +++ b/neutron/plugins/ryu/common/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 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. diff --git a/neutron/plugins/vmware/api_client/base.py b/neutron/plugins/vmware/api_client/base.py index e8998b5cdc9..31a3657e1c7 100644 --- a/neutron/plugins/vmware/api_client/base.py +++ b/neutron/plugins/vmware/api_client/base.py @@ -145,6 +145,7 @@ class ApiClientBase(object): elif hasattr(http_conn, "no_release"): return + priority = http_conn.priority if bad_state: # Reconnect to provider. LOG.warn(_("[%(rid)d] Connection returned in bad state, " @@ -152,8 +153,6 @@ class ApiClientBase(object): {'rid': rid, 'conn': api_client.ctrl_conn_to_str(http_conn)}) http_conn = self._create_connection(*self._conn_params(http_conn)) - priority = self._next_conn_priority - self._next_conn_priority += 1 elif service_unavail: # http_conn returned a service unaviable response, put other # connections to the same controller at end of priority queue, @@ -169,8 +168,6 @@ class ApiClientBase(object): # put http_conn at end of queue also priority = self._next_conn_priority self._next_conn_priority += 1 - else: - priority = http_conn.priority self._conn_pool.put((priority, http_conn)) LOG.debug(_("[%(rid)d] Released connection %(conn)s. %(qsize)d " diff --git a/neutron/plugins/vmware/common/utils.py b/neutron/plugins/vmware/common/utils.py index fb21e55e699..fd5f2fc2956 100644 --- a/neutron/plugins/vmware/common/utils.py +++ b/neutron/plugins/vmware/common/utils.py @@ -40,7 +40,7 @@ def get_tags(**kwargs): tags = ([dict(tag=value, scope=key) for key, value in kwargs.iteritems()]) tags.append({"tag": NEUTRON_VERSION, "scope": "quantum"}) - return tags + return sorted(tags) def device_id_to_vm_id(device_id, obfuscate=False): diff --git a/neutron/plugins/vmware/dhcp_meta/__init__.py b/neutron/plugins/vmware/dhcp_meta/__init__.py index 75afea8bff6..e69de29bb2d 100644 --- a/neutron/plugins/vmware/dhcp_meta/__init__.py +++ b/neutron/plugins/vmware/dhcp_meta/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 VMware, 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. diff --git a/neutron/plugins/vmware/extensions/distributedrouter.py b/neutron/plugins/vmware/extensions/distributedrouter.py deleted file mode 100644 index 0ec4af439af..00000000000 --- a/neutron/plugins/vmware/extensions/distributedrouter.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2013 VMware, 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. - -# TODO(armando-migliaccio): This is deprecated in Juno, and -# to be removed in Kilo. - -from neutron.extensions import dvr - - -class Distributedrouter(dvr.Dvr): - """(Deprecated) Extension class supporting distributed router.""" - - @classmethod - def get_name(cls): - return "Distributed Router" - - @classmethod - def get_alias(cls): - return "dist-router" - - @classmethod - def get_description(cls): - return ("Enables configuration of NSX " - "Distributed routers (Deprecated).") - - @classmethod - def get_namespace(cls): - return "http://docs.openstack.org/ext/dist-router/api/v1.0" diff --git a/neutron/plugins/vmware/nsxlib/l2gateway.py b/neutron/plugins/vmware/nsxlib/l2gateway.py index f5a6e3053b7..0848ed591fb 100644 --- a/neutron/plugins/vmware/nsxlib/l2gateway.py +++ b/neutron/plugins/vmware/nsxlib/l2gateway.py @@ -149,7 +149,7 @@ def create_gateway_device(cluster, tenant_id, display_name, neutron_id, try: return nsxlib.do_request( HTTP_POST, nsxlib._build_uri_path(TRANSPORTNODE_RESOURCE), - jsonutils.dumps(body), cluster=cluster) + jsonutils.dumps(body, sort_keys=True), cluster=cluster) except api_exc.InvalidSecurityCertificate: raise nsx_exc.InvalidSecurityCertificate() @@ -166,7 +166,7 @@ def update_gateway_device(cluster, gateway_id, tenant_id, HTTP_PUT, nsxlib._build_uri_path(TRANSPORTNODE_RESOURCE, resource_id=gateway_id), - jsonutils.dumps(body), cluster=cluster) + jsonutils.dumps(body, sort_keys=True), cluster=cluster) except api_exc.InvalidSecurityCertificate: raise nsx_exc.InvalidSecurityCertificate() diff --git a/neutron/plugins/vmware/plugins/base.py b/neutron/plugins/vmware/plugins/base.py index 6dbf8ae3568..c6a629a6af6 100644 --- a/neutron/plugins/vmware/plugins/base.py +++ b/neutron/plugins/vmware/plugins/base.py @@ -103,7 +103,6 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, supported_extension_aliases = ["allowed-address-pairs", "binding", "dvr", - "dist-router", "ext-gw-mode", "extraroute", "mac-learning", @@ -245,7 +244,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, port_data.get('id', 'fake'), port_data.get('name', 'fake'), port_data.get('admin_state_up', True), ip_addresses, port_data.get('mac_address')) - LOG.debug(_("Created NSX router port:%s"), lrouter_port['uuid']) + LOG.debug("Created NSX router port:%s", lrouter_port['uuid']) except api_exc.NsxApiException: LOG.exception(_("Unable to create port on NSX logical router %s"), nsx_router_id) @@ -329,7 +328,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, attachment, attachment_type, attachment_vlan) - LOG.debug(_("Attached %(att)s to NSX router port %(port)s"), + LOG.debug("Attached %(att)s to NSX router port %(port)s", {'att': attachment, 'port': nsx_router_port_id}) except api_exc.NsxApiException: # Must remove NSX logical port @@ -460,9 +459,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, switchlib.plug_vif_interface( self.cluster, selected_lswitch['uuid'], lport['uuid'], "VifAttachment", port_data['id']) - LOG.debug(_("_nsx_create_port completed for port %(name)s " - "on network %(network_id)s. The new port id is " - "%(id)s."), port_data) + LOG.debug("_nsx_create_port completed for port %(name)s " + "on network %(network_id)s. The new port id is " + "%(id)s.", port_data) except (api_exc.NsxApiException, n_exc.NeutronException): self._handle_create_port_exception( context, port_data['id'], @@ -483,7 +482,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, selected_lswitch['uuid'], lport['uuid']) except n_exc.NotFound: - LOG.debug(_("NSX Port %s already gone"), lport['uuid']) + LOG.debug("NSX Port %s already gone", lport['uuid']) def _nsx_delete_port(self, context, port_data): # FIXME(salvatore-orlando): On the NSX platform we do not really have @@ -498,15 +497,15 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, nsx_switch_id, nsx_port_id = nsx_utils.get_nsx_switch_and_port_id( context.session, self.cluster, port_data['id']) if not nsx_port_id: - LOG.debug(_("Port '%s' was already deleted on NSX platform"), id) + LOG.debug("Port '%s' was already deleted on NSX platform", id) return # TODO(bgh): if this is a bridged network and the lswitch we just got # back will have zero ports after the delete we should garbage collect # the lswitch. try: switchlib.delete_port(self.cluster, nsx_switch_id, nsx_port_id) - LOG.debug(_("_nsx_delete_port completed for port %(port_id)s " - "on network %(net_id)s"), + LOG.debug("_nsx_delete_port completed for port %(port_id)s " + "on network %(net_id)s", {'port_id': port_data['id'], 'net_id': port_data['network_id']}) except n_exc.NotFound: @@ -571,9 +570,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, nsx_db.add_neutron_nsx_port_mapping( context.session, port_data['id'], selected_lswitch['uuid'], ls_port['uuid']) - LOG.debug(_("_nsx_create_router_port completed for port " - "%(name)s on network %(network_id)s. The new " - "port id is %(id)s."), + LOG.debug("_nsx_create_router_port completed for port " + "%(name)s on network %(network_id)s. The new " + "port id is %(id)s.", port_data) except (api_exc.NsxApiException, n_exc.NeutronException): self._handle_create_port_exception( @@ -635,9 +634,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, physical_network, ext_network[pnet.SEGMENTATION_ID]) - LOG.debug(_("_nsx_create_ext_gw_port completed on external network " - "%(ext_net_id)s, attached to router:%(router_id)s. " - "NSX port id is %(nsx_port_id)s"), + LOG.debug("_nsx_create_ext_gw_port completed on external network " + "%(ext_net_id)s, attached to router:%(router_id)s. " + "NSX port id is %(nsx_port_id)s", {'ext_net_id': port_data['network_id'], 'router_id': nsx_router_id, 'nsx_port_id': lr_port['uuid']}) @@ -676,8 +675,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, raise nsx_exc.NsxPluginException( err_msg=_("Unable to update logical router" "on NSX Platform")) - LOG.debug(_("_nsx_delete_ext_gw_port completed on external network " - "%(ext_net_id)s, attached to NSX router:%(router_id)s"), + LOG.debug("_nsx_delete_ext_gw_port completed on external network " + "%(ext_net_id)s, attached to NSX router:%(router_id)s", {'ext_net_id': port_data['network_id'], 'router_id': nsx_router_id}) @@ -718,9 +717,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, switchlib.delete_port(self.cluster, selected_lswitch['uuid'], lport['uuid']) - LOG.debug(_("_nsx_create_l2_gw_port completed for port %(name)s " - "on network %(network_id)s. The new port id " - "is %(id)s."), port_data) + LOG.debug("_nsx_create_l2_gw_port completed for port %(name)s " + "on network %(network_id)s. The new port id " + "is %(id)s.", port_data) def _nsx_create_fip_port(self, context, port_data): # As we do not create ports for floating IPs in NSX, @@ -846,7 +845,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, ['lport_count'] < max_ports)].pop(0) except IndexError: # Too bad, no switch available - LOG.debug(_("No switch has available ports (%d checked)"), + LOG.debug("No switch has available ports (%d checked)", len(lswitches)) if allow_extra_lswitches: # The 'main' logical switch is either the only one available @@ -1145,8 +1144,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, port_data['device_owner'], self._port_drivers['create']['default']) port_create_func(context, port_data) - LOG.debug(_("port created on NSX backend for tenant " - "%(tenant_id)s: (%(id)s)"), port_data) + LOG.debug("port created on NSX backend for tenant " + "%(tenant_id)s: (%(id)s)", port_data) except n_exc.NotFound: LOG.warning(_("Logical switch for network %s was not " "found in NSX."), port_data['network_id']) @@ -1247,7 +1246,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, self._delete_port_queue_mapping(context, ret_port['id']) self._process_port_queue_mapping(context, ret_port, port_queue_id) - LOG.debug(_("Updating port: %s"), port) + LOG.debug("Updating port: %s", port) nsx_switch_id, nsx_port_id = nsx_utils.get_nsx_switch_and_port_id( context.session, self.cluster, id) # Convert Neutron security groups identifiers into NSX security @@ -1683,8 +1682,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, # if needed. self.handle_router_metadata_access( context, router_id, interface=router_iface_info) - LOG.debug(_("Add_router_interface completed for subnet:%(subnet_id)s " - "and router:%(router_id)s"), + LOG.debug("Add_router_interface completed for subnet:%(subnet_id)s " + "and router:%(router_id)s", {'subnet_id': subnet_id, 'router_id': router_id}) return router_iface_info @@ -1974,7 +1973,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, min_num_rules_expected=1) self._remove_floatingip_address(context, fip_db) except sa_exc.NoResultFound: - LOG.debug(_("The port '%s' is not associated with floating IPs"), + LOG.debug("The port '%s' is not associated with floating IPs", port_id) except n_exc.NotFound: LOG.warning(_("Nat rules not found in nsx for port: %s"), id) @@ -2141,9 +2140,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, query.update({'status': device_status, 'nsx_id': nsx_res['uuid']}, synchronize_session=False) - LOG.debug(_("Neutron gateway device: %(neutron_id)s; " - "NSX transport node identifier: %(nsx_id)s; " - "Operational status: %(status)s."), + LOG.debug("Neutron gateway device: %(neutron_id)s; " + "NSX transport node identifier: %(nsx_id)s; " + "Operational status: %(status)s.", {'neutron_id': neutron_id, 'nsx_id': nsx_res['uuid'], 'status': device_status}) @@ -2179,9 +2178,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, networkgw_db.NetworkGatewayDevice.id == neutron_id) query.update({'status': device_status}, synchronize_session=False) - LOG.debug(_("Neutron gateway device: %(neutron_id)s; " - "NSX transport node identifier: %(nsx_id)s; " - "Operational status: %(status)s."), + LOG.debug("Neutron gateway device: %(neutron_id)s; " + "NSX transport node identifier: %(nsx_id)s; " + "Operational status: %(status)s.", {'neutron_id': neutron_id, 'nsx_id': nsx_id, 'status': device_status}) diff --git a/neutron/plugins/vmware/plugins/service.py b/neutron/plugins/vmware/plugins/service.py index 1f5e503b61f..d7e32e2f22c 100644 --- a/neutron/plugins/vmware/plugins/service.py +++ b/neutron/plugins/vmware/plugins/service.py @@ -141,7 +141,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, return self._router_type[router_id] router = self._get_router(context, router_id) - LOG.debug(_("EDGE: router = %s"), router) + LOG.debug("EDGE: router = %s", router) if router['extra_attributes']['service_router']: router_type = ROUTER_TYPE_ADVANCED else: @@ -172,7 +172,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, # NOP for Edge because currently the port will be create internally # by VSM - LOG.debug(_("EDGE: _vcns_create_ext_gw_port")) + LOG.debug("EDGE: _vcns_create_ext_gw_port") def _vcns_delete_ext_gw_port(self, context, port_data): router_id = port_data['device_id'] @@ -181,7 +181,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, return # NOP for Edge - LOG.debug(_("EDGE: _vcns_delete_ext_gw_port")) + LOG.debug("EDGE: _vcns_delete_ext_gw_port") def _get_external_attachment_info(self, context, router): gw_port = router.gw_port @@ -336,7 +336,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, if new_ext_net_id != org_ext_net_id and orgnexthop: # network changed, need to remove default gateway before vnic # can be configured - LOG.debug(_("VCNS: delete default gateway %s"), orgnexthop) + LOG.debug("VCNS: delete default gateway %s", orgnexthop) self._vcns_update_static_routes(context, router=router, edge_id=binding['edge_id'], @@ -904,7 +904,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, self.vcns_driver.delete_firewall(context, edge_id) def create_firewall(self, context, firewall): - LOG.debug(_("create_firewall() called")) + LOG.debug("create_firewall() called") router_id = firewall['firewall'].get(vcns_const.ROUTER_ID) if not router_id: msg = _("router_id is not provided!") @@ -938,7 +938,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, return fw def update_firewall(self, context, id, firewall): - LOG.debug(_("update_firewall() called")) + LOG.debug("update_firewall() called") self._ensure_firewall_update_allowed(context, id) service_router_binding = self._get_resource_router_id_binding( context, firewall_db.Firewall, resource_id=id) @@ -964,7 +964,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, return fw def delete_firewall(self, context, id): - LOG.debug(_("delete_firewall() called")) + LOG.debug("delete_firewall() called") self._firewall_set_status( context, id, service_constants.PENDING_DELETE) service_router_binding = self._get_resource_router_id_binding( @@ -1000,7 +1000,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, return fws def update_firewall_rule(self, context, id, firewall_rule): - LOG.debug(_("update_firewall_rule() called")) + LOG.debug("update_firewall_rule() called") self._ensure_update_or_delete_firewall_rule(context, id) fwr_pre = self.get_firewall_rule(context, id) fwr = super(NsxAdvancedPlugin, self).update_firewall_rule( @@ -1026,7 +1026,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, return fwr def update_firewall_policy(self, context, id, firewall_policy): - LOG.debug(_("update_firewall_policy() called")) + LOG.debug("update_firewall_policy() called") self._ensure_firewall_policy_update_allowed(context, id) firewall_rules_pre = self._make_firewall_rule_list_by_policy_id( context, id) @@ -1053,7 +1053,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, return fwp def insert_rule(self, context, id, rule_info): - LOG.debug(_("insert_rule() called")) + LOG.debug("insert_rule() called") self._ensure_firewall_policy_update_allowed(context, id) fwp = super(NsxAdvancedPlugin, self).insert_rule( context, id, rule_info) @@ -1082,7 +1082,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, return fwp def remove_rule(self, context, id, rule_info): - LOG.debug(_("remove_rule() called")) + LOG.debug("remove_rule() called") self._ensure_firewall_policy_update_allowed(context, id) fwp = super(NsxAdvancedPlugin, self).remove_rule( context, id, rule_info) @@ -1220,7 +1220,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, self.vcns_driver.update_pool(context, edge_id, pool, members) def create_vip(self, context, vip): - LOG.debug(_("create_vip() called")) + LOG.debug("create_vip() called") router_id = vip['vip'].get(vcns_const.ROUTER_ID) if not router_id: msg = _("router_id is not provided!") @@ -1608,7 +1608,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, LOG.exception(msg) def create_vpnservice(self, context, vpnservice): - LOG.debug(_("create_vpnservice() called")) + LOG.debug("create_vpnservice() called") router_id = vpnservice['vpnservice'].get('router_id') if not self._is_advanced_service_router(context, router_id): msg = _("router_id:%s is not an advanced router!") % router_id @@ -1729,7 +1729,7 @@ class VcnsCallbacks(object): neutron_router_id = jobdata['neutron_router_id'] name = task.userdata['router_name'] if edge_id: - LOG.debug(_("Start deploying %(edge_id)s for router %(name)s"), { + LOG.debug("Start deploying %(edge_id)s for router %(name)s", { 'edge_id': edge_id, 'name': name}) vcns_db.update_vcns_router_binding( @@ -1756,10 +1756,10 @@ class VcnsCallbacks(object): LOG.exception(_("Router %s not found"), lrouter['uuid']) if task.status == tasks_const.TaskStatus.COMPLETED: - LOG.debug(_("Successfully deployed %(edge_id)s for " - "router %(name)s"), { - 'edge_id': task.userdata['edge_id'], - 'name': name}) + LOG.debug("Successfully deployed %(edge_id)s for " + "router %(name)s", { + 'edge_id': task.userdata['edge_id'], + 'name': name}) if (router_db and router_db['status'] == service_constants.PENDING_CREATE): router_db['status'] = service_constants.ACTIVE @@ -1772,7 +1772,7 @@ class VcnsCallbacks(object): context.session, neutron_router_id, status=service_constants.ACTIVE) else: - LOG.debug(_("Failed to deploy Edge for router %s"), name) + LOG.debug("Failed to deploy Edge for router %s", name) if router_db: router_db['status'] = service_constants.ERROR vcns_db.update_vcns_router_binding( @@ -1788,25 +1788,25 @@ class VcnsCallbacks(object): router_id) def interface_update_result(self, task): - LOG.debug(_("interface_update_result %d"), task.status) + LOG.debug("interface_update_result %d", task.status) def snat_create_result(self, task): - LOG.debug(_("snat_create_result %d"), task.status) + LOG.debug("snat_create_result %d", task.status) def snat_delete_result(self, task): - LOG.debug(_("snat_delete_result %d"), task.status) + LOG.debug("snat_delete_result %d", task.status) def dnat_create_result(self, task): - LOG.debug(_("dnat_create_result %d"), task.status) + LOG.debug("dnat_create_result %d", task.status) def dnat_delete_result(self, task): - LOG.debug(_("dnat_delete_result %d"), task.status) + LOG.debug("dnat_delete_result %d", task.status) def routes_update_result(self, task): - LOG.debug(_("routes_update_result %d"), task.status) + LOG.debug("routes_update_result %d", task.status) def nat_update_result(self, task): - LOG.debug(_("nat_update_result %d"), task.status) + LOG.debug("nat_update_result %d", task.status) def _process_base_create_lswitch_args(*args, **kwargs): diff --git a/neutron/plugins/vmware/vshield/__init__.py b/neutron/plugins/vmware/vshield/__init__.py index db5f20ea937..e69de29bb2d 100644 --- a/neutron/plugins/vmware/vshield/__init__.py +++ b/neutron/plugins/vmware/vshield/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 VMware, 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. diff --git a/neutron/plugins/vmware/vshield/edge_appliance_driver.py b/neutron/plugins/vmware/vshield/edge_appliance_driver.py index 5b71b097232..700b989190f 100644 --- a/neutron/plugins/vmware/vshield/edge_appliance_driver.py +++ b/neutron/plugins/vmware/vshield/edge_appliance_driver.py @@ -16,9 +16,7 @@ from neutron.openstack.common import excutils from neutron.openstack.common import jsonutils from neutron.openstack.common import log as logging from neutron.plugins.vmware.common import utils -from neutron.plugins.vmware.vshield.common import ( - constants as vcns_const) -from neutron.plugins.vmware.vshield.common import constants as common_constants +from neutron.plugins.vmware.vshield.common import constants as vcns_const from neutron.plugins.vmware.vshield.common import exceptions from neutron.plugins.vmware.vshield.tasks import constants from neutron.plugins.vmware.vshield.tasks import tasks @@ -108,11 +106,11 @@ class EdgeApplianceDriver(object): def _edge_status_to_level(self, status): if status == 'GREEN': - status_level = common_constants.RouterStatus.ROUTER_STATUS_ACTIVE + status_level = vcns_const.RouterStatus.ROUTER_STATUS_ACTIVE elif status in ('GREY', 'YELLOW'): - status_level = common_constants.RouterStatus.ROUTER_STATUS_DOWN + status_level = vcns_const.RouterStatus.ROUTER_STATUS_DOWN else: - status_level = common_constants.RouterStatus.ROUTER_STATUS_ERROR + status_level = vcns_const.RouterStatus.ROUTER_STATUS_ERROR return status_level def _enable_loadbalancer(self, edge): @@ -131,13 +129,13 @@ class EdgeApplianceDriver(object): except exceptions.VcnsApiException as e: LOG.exception(_("VCNS: Failed to get edge status:\n%s"), e.response) - status_level = common_constants.RouterStatus.ROUTER_STATUS_ERROR + status_level = vcns_const.RouterStatus.ROUTER_STATUS_ERROR try: desc = jsonutils.loads(e.response) if desc.get('errorCode') == ( vcns_const.VCNS_ERROR_CODE_EDGE_NOT_RUNNING): status_level = ( - common_constants.RouterStatus.ROUTER_STATUS_DOWN) + vcns_const.RouterStatus.ROUTER_STATUS_DOWN) except ValueError: LOG.exception(e.response) @@ -156,7 +154,7 @@ class EdgeApplianceDriver(object): def _update_interface(self, task): edge_id = task.userdata['edge_id'] config = task.userdata['config'] - LOG.debug(_("VCNS: start updating vnic %s"), config) + LOG.debug("VCNS: start updating vnic %s", config) try: self.vcns.update_interface(edge_id, config) except exceptions.VcnsApiException as e: @@ -175,7 +173,7 @@ class EdgeApplianceDriver(object): def update_interface(self, router_id, edge_id, index, network, address=None, netmask=None, secondary=None, jobdata=None): - LOG.debug(_("VCNS: update vnic %(index)d: %(addr)s %(netmask)s"), { + LOG.debug("VCNS: update vnic %(index)d: %(addr)s %(netmask)s", { 'index': index, 'addr': address, 'netmask': netmask}) if index == vcns_const.EXTERNAL_VNIC_INDEX: name = vcns_const.EXTERNAL_VNIC_NAME @@ -205,7 +203,7 @@ class EdgeApplianceDriver(object): def _deploy_edge(self, task): userdata = task.userdata name = userdata['router_name'] - LOG.debug(_("VCNS: start deploying edge %s"), name) + LOG.debug("VCNS: start deploying edge %s", name) request = userdata['request'] try: header = self.vcns.deploy_edge(request)[0] @@ -213,7 +211,7 @@ class EdgeApplianceDriver(object): job_id = objuri[objuri.rfind("/") + 1:] response = self.vcns.get_edge_id(job_id)[1] edge_id = response['edgeId'] - LOG.debug(_("VCNS: deploying edge %s"), edge_id) + LOG.debug("VCNS: deploying edge %s", edge_id) userdata['edge_id'] = edge_id status = constants.TaskStatus.PENDING except exceptions.VcnsApiException: @@ -253,7 +251,7 @@ class EdgeApplianceDriver(object): "Abort.") % edge_id LOG.exception(msg) status = constants.TaskStatus.ERROR - LOG.debug(_("VCNS: Edge %s status"), edge_id) + LOG.debug("VCNS: Edge %s status", edge_id) return status def _result_edge(self, task): @@ -267,14 +265,14 @@ class EdgeApplianceDriver(object): 'status': task.status }) else: - LOG.debug(_("VCNS: Edge %(edge_id)s deployed for " - "router %(name)s"), { - 'edge_id': edge_id, 'name': router_name - }) + LOG.debug("VCNS: Edge %(edge_id)s deployed for " + "router %(name)s", { + 'edge_id': edge_id, 'name': router_name + }) def _delete_edge(self, task): edge_id = task.userdata['edge_id'] - LOG.debug(_("VCNS: start destroying edge %s"), edge_id) + LOG.debug("VCNS: start destroying edge %s", edge_id) status = constants.TaskStatus.COMPLETED if edge_id: try: @@ -383,7 +381,7 @@ class EdgeApplianceDriver(object): # TODO(fank): use POST for optimization # return rule_id for future reference rule = task.userdata['rule'] - LOG.debug(_("VCNS: start creating nat rules: %s"), rule) + LOG.debug("VCNS: start creating nat rules: %s", rule) edge_id = task.userdata['edge_id'] nat = self.get_nat_config(edge_id) location = task.userdata['location'] @@ -407,7 +405,7 @@ class EdgeApplianceDriver(object): def create_snat_rule(self, router_id, edge_id, src, translated, jobdata=None, location=None): - LOG.debug(_("VCNS: create snat rule %(src)s/%(translated)s"), { + LOG.debug("VCNS: create snat rule %(src)s/%(translated)s", { 'src': src, 'translated': translated}) snat_rule = self._assemble_nat_rule("snat", src, translated) userdata = { @@ -430,7 +428,7 @@ class EdgeApplianceDriver(object): edge_id = task.userdata['edge_id'] address = task.userdata['address'] addrtype = task.userdata['addrtype'] - LOG.debug(_("VCNS: start deleting %(type)s rules: %(addr)s"), { + LOG.debug("VCNS: start deleting %(type)s rules: %(addr)s", { 'type': addrtype, 'addr': address}) nat = self.get_nat_config(edge_id) del nat['version'] @@ -448,7 +446,7 @@ class EdgeApplianceDriver(object): return status def delete_snat_rule(self, router_id, edge_id, src, jobdata=None): - LOG.debug(_("VCNS: delete snat rule %s"), src) + LOG.debug("VCNS: delete snat rule %s", src) userdata = { 'edge_id': edge_id, 'address': src, @@ -466,7 +464,7 @@ class EdgeApplianceDriver(object): jobdata=None, location=None): # TODO(fank): use POST for optimization # return rule_id for future reference - LOG.debug(_("VCNS: create dnat rule %(dst)s/%(translated)s"), { + LOG.debug("VCNS: create dnat rule %(dst)s/%(translated)s", { 'dst': dst, 'translated': translated}) dnat_rule = self._assemble_nat_rule( "dnat", dst, translated) @@ -487,7 +485,7 @@ class EdgeApplianceDriver(object): def delete_dnat_rule(self, router_id, edge_id, translated, jobdata=None): # TODO(fank): pass in rule_id for optimization - LOG.debug(_("VCNS: delete dnat rule %s"), translated) + LOG.debug("VCNS: delete dnat rule %s", translated) userdata = { 'edge_id': edge_id, 'address': translated, @@ -511,7 +509,7 @@ class EdgeApplianceDriver(object): return constants.TaskStatus.ABORT rules = task.userdata['rules'] - LOG.debug(_("VCNS: start updating nat rules: %s"), rules) + LOG.debug("VCNS: start updating nat rules: %s", rules) nat = { 'featureType': 'nat', @@ -532,10 +530,10 @@ class EdgeApplianceDriver(object): def update_nat_rules(self, router_id, edge_id, snats, dnats, jobdata=None): - LOG.debug(_("VCNS: update nat rule\n" - "SNAT:%(snat)s\n" - "DNAT:%(dnat)s\n"), { - 'snat': snats, 'dnat': dnats}) + LOG.debug("VCNS: update nat rule\n" + "SNAT:%(snat)s\n" + "DNAT:%(dnat)s\n", { + 'snat': snats, 'dnat': dnats}) nat_rules = [] for dnat in dnats: @@ -570,7 +568,7 @@ class EdgeApplianceDriver(object): return constants.TaskStatus.ABORT gateway = task.userdata['gateway'] routes = task.userdata['routes'] - LOG.debug(_("VCNS: start updating routes for %s"), edge_id) + LOG.debug("VCNS: start updating routes for %s", edge_id) static_routes = [] for route in routes: static_routes.append({ diff --git a/neutron/plugins/vmware/vshield/tasks/tasks.py b/neutron/plugins/vmware/vshield/tasks/tasks.py index 7037c430dd4..424736f71e6 100644 --- a/neutron/plugins/vmware/vshield/tasks/tasks.py +++ b/neutron/plugins/vmware/vshield/tasks/tasks.py @@ -191,7 +191,7 @@ class TaskManager(): LOG.exception(msg) status = constants.TaskStatus.ERROR - LOG.debug(_("Task %(task)s return %(status)s"), { + LOG.debug("Task %(task)s return %(status)s", { 'task': str(task), 'status': status}) @@ -210,7 +210,7 @@ class TaskManager(): 'cb': str(task._result_callback)} LOG.exception(msg) - LOG.debug(_("Task %(task)s return %(status)s"), + LOG.debug("Task %(task)s return %(status)s", {'task': str(task), 'status': task.status}) task._finished() diff --git a/neutron/plugins/vmware/vshield/vcns.py b/neutron/plugins/vmware/vshield/vcns.py index ec3923c3a68..6c2835ea231 100644 --- a/neutron/plugins/vmware/vshield/vcns.py +++ b/neutron/plugins/vmware/vshield/vcns.py @@ -49,7 +49,7 @@ class Vcns(object): password, 'json') def do_request(self, method, uri, params=None, format='json', **kwargs): - LOG.debug(_("VcnsApiHelper('%(method)s', '%(uri)s', '%(body)s')"), { + LOG.debug("VcnsApiHelper('%(method)s', '%(uri)s', '%(body)s')", { 'method': method, 'uri': uri, 'body': jsonutils.dumps(params)}) @@ -57,8 +57,8 @@ class Vcns(object): header, content = self.jsonapi_client.request(method, uri, params) else: header, content = self.xmlapi_client.request(method, uri, params) - LOG.debug(_("Header: '%s'"), header) - LOG.debug(_("Content: '%s'"), content) + LOG.debug("Header: '%s'", header) + LOG.debug("Content: '%s'", content) if content == '': return header, {} if kwargs.get('decode', True): diff --git a/neutron/policy.py b/neutron/policy.py index 562ee036303..4a521617ebc 100644 --- a/neutron/policy.py +++ b/neutron/policy.py @@ -16,22 +16,26 @@ """ Policy engine for neutron. Largely copied from nova. """ + +import collections import itertools +import logging import re from oslo.config import cfg from neutron.api.v2 import attributes +from neutron.common import constants as const from neutron.common import exceptions import neutron.common.utils as utils from neutron.openstack.common import excutils from neutron.openstack.common.gettextutils import _LE, _LI, _LW from neutron.openstack.common import importutils -from neutron.openstack.common import log as logging +from neutron.openstack.common import log from neutron.openstack.common import policy -LOG = logging.getLogger(__name__) +LOG = log.getLogger(__name__) _POLICY_PATH = None _POLICY_CACHE = {} ADMIN_CTX_POLICY = 'context_is_admin' @@ -118,14 +122,28 @@ def _set_rules(data): policy.set_rules(policies) -def _is_attribute_explicitly_set(attribute_name, resource, target): - """Verify that an attribute is present and has a non-default value.""" +def _is_attribute_explicitly_set(attribute_name, resource, target, action): + """Verify that an attribute is present and is explicitly set.""" + if 'update' in action: + # In the case of update, the function should not pay attention to a + # default value of an attribute, but check whether it was explicitly + # marked as being updated instead. + return (attribute_name in target[const.ATTRIBUTES_TO_UPDATE] and + target[attribute_name] is not attributes.ATTR_NOT_SPECIFIED) return ('default' in resource[attribute_name] and attribute_name in target and target[attribute_name] is not attributes.ATTR_NOT_SPECIFIED and target[attribute_name] != resource[attribute_name]['default']) +def _should_validate_sub_attributes(attribute, sub_attr): + """Verify that sub-attributes are iterable and should be validated.""" + validate = attribute.get('validate') + return (validate and isinstance(sub_attr, collections.Iterable) and + any([k.startswith('type:dict') and + v for (k, v) in validate.iteritems()])) + + def _build_subattr_match_rule(attr_name, attr, action, target): """Create the rule to match for sub-attribute policy checks.""" # TODO(salv-orlando): Instead of relying on validator info, introduce @@ -151,6 +169,16 @@ def _build_subattr_match_rule(attr_name, attr, action, target): return policy.AndCheck(sub_attr_rules) +def _process_rules_list(rules, match_rule): + """Recursively walk a policy rule to extract a list of match entries.""" + if isinstance(match_rule, policy.RuleCheck): + rules.append(match_rule.match) + elif isinstance(match_rule, policy.AndCheck): + for rule in match_rule.rules: + _process_rules_list(rules, rule) + return rules + + def _build_match_rule(action, target): """Create the rule to match for a given action. @@ -173,21 +201,24 @@ def _build_match_rule(action, target): for attribute_name in res_map[resource]: if _is_attribute_explicitly_set(attribute_name, res_map[resource], - target): + target, action): attribute = res_map[resource][attribute_name] if 'enforce_policy' in attribute: attr_rule = policy.RuleCheck('rule', '%s:%s' % (action, attribute_name)) - # Build match entries for sub-attributes, if present - validate = attribute.get('validate') - if (validate and any([k.startswith('type:dict') and v - for (k, v) in - validate.iteritems()])): + # Build match entries for sub-attributes + if _should_validate_sub_attributes( + attribute, target[attribute_name]): attr_rule = policy.AndCheck( [attr_rule, _build_subattr_match_rule( attribute_name, attribute, action, target)]) match_rule = policy.AndCheck([match_rule, attr_rule]) + # Check that the logger has a DEBUG log level + if (cfg.CONF.debug and LOG.logger.level == logging.NOTSET or + LOG.logger.level == logging.DEBUG): + rules = _process_rules_list([], match_rule) + LOG.debug("Enforcing rules: %s", rules) return match_rule diff --git a/neutron/scheduler/__init__.py b/neutron/scheduler/__init__.py index e82932559d4..e69de29bb2d 100644 --- a/neutron/scheduler/__init__.py +++ b/neutron/scheduler/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/service.py b/neutron/service.py index 820364f7c10..eb48687cb37 100644 --- a/neutron/service.py +++ b/neutron/service.py @@ -40,7 +40,7 @@ service_opts = [ help=_('Seconds between running periodic tasks')), cfg.IntOpt('api_workers', default=0, - help=_('Number of separate worker processes for service')), + help=_('Number of separate API worker processes for service')), cfg.IntOpt('rpc_workers', default=0, help=_('Number of RPC worker processes for service')), diff --git a/neutron/services/__init__.py b/neutron/services/__init__.py index b706747cf8c..e69de29bb2d 100644 --- a/neutron/services/__init__.py +++ b/neutron/services/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/services/firewall/__init__.py b/neutron/services/firewall/__init__.py index a6a8955d8b3..e69de29bb2d 100644 --- a/neutron/services/firewall/__init__.py +++ b/neutron/services/firewall/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/services/firewall/agents/__init__.py b/neutron/services/firewall/agents/__init__.py index a6a8955d8b3..e69de29bb2d 100644 --- a/neutron/services/firewall/agents/__init__.py +++ b/neutron/services/firewall/agents/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/services/firewall/agents/l3reference/__init__.py b/neutron/services/firewall/agents/l3reference/__init__.py index a6a8955d8b3..e69de29bb2d 100644 --- a/neutron/services/firewall/agents/l3reference/__init__.py +++ b/neutron/services/firewall/agents/l3reference/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/services/firewall/agents/varmour/__init__.py b/neutron/services/firewall/agents/varmour/__init__.py index a6a8955d8b3..e69de29bb2d 100755 --- a/neutron/services/firewall/agents/varmour/__init__.py +++ b/neutron/services/firewall/agents/varmour/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/services/firewall/drivers/__init__.py b/neutron/services/firewall/drivers/__init__.py index a6a8955d8b3..e69de29bb2d 100644 --- a/neutron/services/firewall/drivers/__init__.py +++ b/neutron/services/firewall/drivers/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/services/firewall/drivers/linux/__init__.py b/neutron/services/firewall/drivers/linux/__init__.py index a6a8955d8b3..e69de29bb2d 100644 --- a/neutron/services/firewall/drivers/linux/__init__.py +++ b/neutron/services/firewall/drivers/linux/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/services/firewall/drivers/varmour/__init__.py b/neutron/services/firewall/drivers/varmour/__init__.py index a6a8955d8b3..e69de29bb2d 100755 --- a/neutron/services/firewall/drivers/varmour/__init__.py +++ b/neutron/services/firewall/drivers/varmour/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/services/l3_router/__init__.py b/neutron/services/l3_router/__init__.py index e82932559d4..e69de29bb2d 100644 --- a/neutron/services/l3_router/__init__.py +++ b/neutron/services/l3_router/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/services/l3_router/brocade/l3_router_plugin.py b/neutron/services/l3_router/brocade/l3_router_plugin.py index 56428c8c2f8..1826b83a6ae 100644 --- a/neutron/services/l3_router/brocade/l3_router_plugin.py +++ b/neutron/services/l3_router/brocade/l3_router_plugin.py @@ -101,15 +101,13 @@ class BrocadeSVIPlugin(router.L3RouterPlugin): """ delete a vrf on NOS device.""" router = super(BrocadeSVIPlugin, self).get_router(context, router_id) super(BrocadeSVIPlugin, self).delete_router(context, router_id) - try: - switch = self._switch - self._driver.delete_router(switch['address'], - switch['username'], - switch['password'], - switch['rbridge_id'], - str(router['id'])) - except Exception: - excutils.save_and_reraise_exception() + + switch = self._switch + self._driver.delete_router(switch['address'], + switch['username'], + switch['password'], + switch['rbridge_id'], + str(router['id'])) def add_router_interface(self, context, router_id, interface_info): """creates svi on NOS device and assigns ip addres to SVI.""" diff --git a/neutron/services/l3_router/l3_arista.py b/neutron/services/l3_router/l3_arista.py index 2c6cf9cc701..89fc98b37e9 100644 --- a/neutron/services/l3_router/l3_arista.py +++ b/neutron/services/l3_router/l3_arista.py @@ -32,8 +32,7 @@ from neutron.openstack.common import excutils from neutron.openstack.common import log as logging from neutron.plugins.common import constants from neutron.plugins.ml2.driver_context import NetworkContext # noqa -from neutron.plugins.ml2.drivers.arista.arista_l3_driver import AristaL3Driver # noqa -from neutron.plugins.ml2.drivers.arista.arista_l3_driver import NeutronNets # noqa +from neutron.plugins.ml2.drivers.arista import arista_l3_driver LOG = logging.getLogger(__name__) @@ -54,8 +53,8 @@ class AristaL3ServicePlugin(db_base_plugin_v2.NeutronDbPluginV2, def __init__(self, driver=None): - self.driver = driver or AristaL3Driver() - self.ndb = NeutronNets() + self.driver = driver or arista_l3_driver.AristaL3Driver() + self.ndb = arista_l3_driver.NeutronNets() self.setup_rpc() self.sync_timeout = cfg.CONF.l3_arista.l3_sync_interval self.sync_lock = threading.Lock() diff --git a/neutron/services/loadbalancer/__init__.py b/neutron/services/loadbalancer/__init__.py index a6a8955d8b3..e69de29bb2d 100644 --- a/neutron/services/loadbalancer/__init__.py +++ b/neutron/services/loadbalancer/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/services/loadbalancer/drivers/__init__.py b/neutron/services/loadbalancer/drivers/__init__.py index 69bb9f63237..e69de29bb2d 100644 --- a/neutron/services/loadbalancer/drivers/__init__.py +++ b/neutron/services/loadbalancer/drivers/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 New Dream Network, LLC (DreamHost) -# -# 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. diff --git a/neutron/services/loadbalancer/drivers/haproxy/__init__.py b/neutron/services/loadbalancer/drivers/haproxy/__init__.py index 69bb9f63237..e69de29bb2d 100644 --- a/neutron/services/loadbalancer/drivers/haproxy/__init__.py +++ b/neutron/services/loadbalancer/drivers/haproxy/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 New Dream Network, LLC (DreamHost) -# -# 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. diff --git a/neutron/services/loadbalancer/drivers/radware/__init__.py b/neutron/services/loadbalancer/drivers/radware/__init__.py index 762b3f3336b..e69de29bb2d 100644 --- a/neutron/services/loadbalancer/drivers/radware/__init__.py +++ b/neutron/services/loadbalancer/drivers/radware/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 Radware LLC (Radware) -# -# 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. diff --git a/neutron/services/metering/__init__.py b/neutron/services/metering/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/services/metering/__init__.py +++ b/neutron/services/metering/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/services/metering/agents/__init__.py b/neutron/services/metering/agents/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/services/metering/agents/__init__.py +++ b/neutron/services/metering/agents/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/services/metering/drivers/__init__.py b/neutron/services/metering/drivers/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/services/metering/drivers/__init__.py +++ b/neutron/services/metering/drivers/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/services/metering/drivers/iptables/__init__.py b/neutron/services/metering/drivers/iptables/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/services/metering/drivers/iptables/__init__.py +++ b/neutron/services/metering/drivers/iptables/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/services/metering/drivers/noop/__init__.py b/neutron/services/metering/drivers/noop/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/services/metering/drivers/noop/__init__.py +++ b/neutron/services/metering/drivers/noop/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/services/vpn/__init__.py b/neutron/services/vpn/__init__.py index f560154933f..e69de29bb2d 100644 --- a/neutron/services/vpn/__init__.py +++ b/neutron/services/vpn/__init__.py @@ -1,14 +0,0 @@ -# (c) Copyright 2013 Hewlett-Packard Development Company, L.P. -# 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. diff --git a/neutron/services/vpn/agent.py b/neutron/services/vpn/agent.py index 284e02aacd6..6f67ccf1f00 100644 --- a/neutron/services/vpn/agent.py +++ b/neutron/services/vpn/agent.py @@ -130,15 +130,15 @@ class VPNAgent(l3_agent.L3NATAgentWithStateReport): for device in self.devices: device.destroy_router(router_id) - def _process_routers(self, routers, all_routers=False): + def _process_router_if_compatible(self, router): """Router sync event. This method overwrites parent class method. - :param routers: list of routers + :param router: a router """ - super(VPNAgent, self)._process_routers(routers, all_routers) + super(VPNAgent, self)._process_router_if_compatible(router) for device in self.devices: - device.sync(self.context, routers) + device.sync(self.context, [router]) def main(): diff --git a/neutron/services/vpn/common/__init__.py b/neutron/services/vpn/common/__init__.py index 46d9c1bed8e..e69de29bb2d 100644 --- a/neutron/services/vpn/common/__init__.py +++ b/neutron/services/vpn/common/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013, Nachi Ueno, NTT I3, 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. diff --git a/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py b/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py index 04241b743cb..8ddefb1f15c 100644 --- a/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py +++ b/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py @@ -19,6 +19,7 @@ import requests from requests import exceptions as r_exc from neutron.openstack.common import jsonutils +from neutron.openstack.common.gettextutils import _LE, _LW from neutron.openstack.common import log as logging @@ -84,7 +85,7 @@ class CsrRestClient(object): and 'detail' fields). """ if method in ('POST', 'GET') and self.status == requests.codes.OK: - LOG.debug(_('RESPONSE: %s'), response.json()) + LOG.debug('RESPONSE: %s', response.json()) return response.json() if method == 'POST' and self.status == requests.codes.CREATED: return response.headers.get('location', '') @@ -97,21 +98,21 @@ class CsrRestClient(object): def _request(self, method, url, **kwargs): """Perform REST request and save response info.""" try: - LOG.debug(_("%(method)s: Request for %(resource)s payload: " - "%(payload)s"), + LOG.debug("%(method)s: Request for %(resource)s payload: " + "%(payload)s", {'method': method.upper(), 'resource': url, 'payload': kwargs.get('data')}) start_time = time.time() response = self.session.request(method, url, verify=False, timeout=self.timeout, **kwargs) - LOG.debug(_("%(method)s Took %(time).2f seconds to process"), + LOG.debug("%(method)s Took %(time).2f seconds to process", {'method': method.upper(), 'time': time.time() - start_time}) except (r_exc.Timeout, r_exc.SSLError) as te: # Should never see SSLError, unless requests package is old (<2.0) timeout_val = 0.0 if self.timeout is None else self.timeout - LOG.warning(_("%(method)s: Request timeout%(ssl)s " - "(%(timeout).3f sec) for CSR(%(host)s)"), + LOG.warning(_LW("%(method)s: Request timeout%(ssl)s " + "(%(timeout).3f sec) for CSR(%(host)s)"), {'method': method, 'timeout': timeout_val, 'ssl': '(SSLError)' @@ -119,17 +120,18 @@ class CsrRestClient(object): 'host': self.host}) self.status = requests.codes.REQUEST_TIMEOUT except r_exc.ConnectionError: - LOG.exception(_("%(method)s: Unable to connect to CSR(%(host)s)"), + LOG.exception(_LE("%(method)s: Unable to connect to " + "CSR(%(host)s)"), {'method': method, 'host': self.host}) self.status = requests.codes.NOT_FOUND except Exception as e: - LOG.error(_("%(method)s: Unexpected error for CSR (%(host)s): " - "%(error)s"), + LOG.error(_LE("%(method)s: Unexpected error for CSR (%(host)s): " + "%(error)s"), {'method': method, 'host': self.host, 'error': e}) self.status = requests.codes.INTERNAL_SERVER_ERROR else: self.status = response.status_code - LOG.debug(_("%(method)s: Completed [%(status)s]"), + LOG.debug("%(method)s: Completed [%(status)s]", {'method': method, 'status': self.status}) return self._response_info_for(response, method) @@ -144,16 +146,16 @@ class CsrRestClient(object): headers = {'Content-Length': '0', 'Accept': 'application/json'} headers.update(HEADER_CONTENT_TYPE_JSON) - LOG.debug(_("%(auth)s with CSR %(host)s"), + LOG.debug("%(auth)s with CSR %(host)s", {'auth': 'Authenticating' if self.token is None else 'Reauthenticating', 'host': self.host}) self.token = None response = self._request("POST", url, headers=headers, auth=self.auth) if response: self.token = response['token-id'] - LOG.debug(_("Successfully authenticated with CSR %s"), self.host) + LOG.debug("Successfully authenticated with CSR %s", self.host) return True - LOG.error(_("Failed authentication with CSR %(host)s [%(status)s]"), + LOG.error(_LE("Failed authentication with CSR %(host)s [%(status)s]"), {'host': self.host, 'status': self.status}) def _do_request(self, method, resource, payload=None, more_headers=None, @@ -188,7 +190,7 @@ class CsrRestClient(object): headers=headers) if self.status != requests.codes.REQUEST_TIMEOUT: return response - LOG.error(_("%(method)s: Request timeout for CSR(%(host)s)"), + LOG.error(_LE("%(method)s: Request timeout for CSR(%(host)s)"), {'method': method, 'host': self.host}) def get_request(self, resource, full_url=False): diff --git a/neutron/services/vpn/device_drivers/cisco_ipsec.py b/neutron/services/vpn/device_drivers/cisco_ipsec.py index b024f333aa4..0eb3871d181 100644 --- a/neutron/services/vpn/device_drivers/cisco_ipsec.py +++ b/neutron/services/vpn/device_drivers/cisco_ipsec.py @@ -23,6 +23,7 @@ import six from neutron.common import exceptions from neutron.common import rpc as n_rpc from neutron import context as ctx +from neutron.openstack.common.gettextutils import _LE, _LI, _LW from neutron.openstack.common import lockutils from neutron.openstack.common import log as logging from neutron.openstack.common import loopingcall @@ -125,7 +126,7 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): def vpnservice_updated(self, context, **kwargs): """Handle VPNaaS service driver change notifications.""" - LOG.debug(_("Handling VPN service update notification '%s'"), + LOG.debug("Handling VPN service update notification '%s'", kwargs.get('reason', '')) self.sync(context, []) @@ -147,20 +148,20 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): ipsec_conn = vpn_service.conn_state[conn_id] config_changed = ipsec_conn.check_for_changes(conn_data) if config_changed: - LOG.debug(_("Update: Existing connection %s changed"), conn_id) + LOG.debug("Update: Existing connection %s changed", conn_id) ipsec_conn.delete_ipsec_site_connection(context, conn_id) ipsec_conn.create_ipsec_site_connection(context, conn_data) ipsec_conn.conn_info = conn_data if ipsec_conn.forced_down: if vpn_service.is_admin_up and conn_is_admin_up: - LOG.debug(_("Update: Connection %s no longer admin down"), + LOG.debug("Update: Connection %s no longer admin down", conn_id) ipsec_conn.set_admin_state(is_up=True) ipsec_conn.forced_down = False else: if not vpn_service.is_admin_up or not conn_is_admin_up: - LOG.debug(_("Update: Connection %s forced to admin down"), + LOG.debug("Update: Connection %s forced to admin down", conn_id) ipsec_conn.set_admin_state(is_up=False) ipsec_conn.forced_down = True @@ -168,12 +169,12 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): ipsec_conn = vpn_service.create_connection(conn_data) ipsec_conn.create_ipsec_site_connection(context, conn_data) if not vpn_service.is_admin_up or not conn_is_admin_up: - LOG.debug(_("Update: Created new connection %s in admin down " - "state"), conn_id) + LOG.debug("Update: Created new connection %s in admin down " + "state", conn_id) ipsec_conn.set_admin_state(is_up=False) ipsec_conn.forced_down = True else: - LOG.debug(_("Update: Created new connection %s"), conn_id) + LOG.debug("Update: Created new connection %s", conn_id) ipsec_conn.is_dirty = False ipsec_conn.last_status = conn_data['status'] @@ -184,11 +185,11 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): """Handle notification for a single VPN Service and its connections.""" vpn_service_id = service_data['id'] if vpn_service_id in self.service_state: - LOG.debug(_("Update: Existing VPN service %s detected"), + LOG.debug("Update: Existing VPN service %s detected", vpn_service_id) vpn_service = self.service_state[vpn_service_id] else: - LOG.debug(_("Update: New VPN service %s detected"), vpn_service_id) + LOG.debug("Update: New VPN service %s detected", vpn_service_id) vpn_service = self.create_vpn_service(service_data) if not vpn_service: return @@ -199,7 +200,7 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): vpn_service.is_admin_up = service_data[u'admin_state_up'] for conn_data in service_data['ipsec_conns']: self.update_connection(context, vpn_service_id, conn_data) - LOG.debug(_("Update: Completed update processing")) + LOG.debug("Update: Completed update processing") return vpn_service def update_all_services_and_connections(self, context): @@ -229,9 +230,9 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): for conn_id in service_state.conn_state: service_state.conn_state[conn_id].is_dirty = True connection_count += 1 - LOG.debug(_("Mark: %(service)d VPN services and %(conn)d IPSec " - "connections marked dirty"), {'service': service_count, - 'conn': connection_count}) + LOG.debug("Mark: %(service)d VPN services and %(conn)d IPSec " + "connections marked dirty", {'service': service_count, + 'conn': connection_count}) def remove_unknown_connections(self, context): """Remove connections that are not known by service driver.""" @@ -251,8 +252,8 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): del self.service_state[vpn_service_id] elif dirty: self.connections_removed = True - LOG.debug(_("Sweep: Removed %(service)d dirty VPN service%(splural)s " - "and %(conn)d dirty IPSec connection%(cplural)s"), + LOG.debug("Sweep: Removed %(service)d dirty VPN service%(splural)s " + "and %(conn)d dirty IPSec connection%(cplural)s", {'service': service_count, 'conn': connection_count, 'splural': 's'[service_count == 1:], 'cplural': 's'[connection_count == 1:]}) @@ -266,22 +267,22 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): report info will be created for the connection. The combined report data is returned. """ - LOG.debug(_("Report: Collecting status for IPSec connections on VPN " - "service %s"), vpn_service.service_id) + LOG.debug("Report: Collecting status for IPSec connections on VPN " + "service %s", vpn_service.service_id) tunnels = vpn_service.get_ipsec_connections_status() report = {} for connection in vpn_service.conn_state.values(): if connection.forced_down: - LOG.debug(_("Connection %s forced down"), connection.conn_id) + LOG.debug("Connection %s forced down", connection.conn_id) current_status = constants.DOWN else: current_status = connection.find_current_status_in(tunnels) - LOG.debug(_("Connection %(conn)s reported %(status)s"), + LOG.debug("Connection %(conn)s reported %(status)s", {'conn': connection.conn_id, 'status': current_status}) frag = connection.update_status_and_build_report(current_status) if frag: - LOG.debug(_("Report: Adding info for IPSec connection %s"), + LOG.debug("Report: Adding info for IPSec connection %s", connection.conn_id) report.update(frag) return report @@ -301,7 +302,7 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): pending_handled = plugin_utils.in_pending_status( vpn_service.last_status) vpn_service.update_last_status() - LOG.debug(_("Report: Adding info for VPN service %s"), + LOG.debug("Report: Adding info for VPN service %s", vpn_service.service_id) return {u'id': vpn_service.service_id, u'status': vpn_service.last_status, @@ -323,17 +324,17 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver): def report_status_internal(self, context): """Generate report and send to plugin, if anything changed.""" service_report = [] - LOG.debug(_("Report: Starting status report processing")) + LOG.debug("Report: Starting status report processing") for vpn_service_id, vpn_service in self.service_state.items(): - LOG.debug(_("Report: Collecting status for VPN service %s"), + LOG.debug("Report: Collecting status for VPN service %s", vpn_service_id) report = self.build_report_for_service(vpn_service) if report: service_report.append(report) if service_report: - LOG.info(_("Sending status report update to plugin")) + LOG.info(_LI("Sending status report update to plugin")) self.agent_rpc.update_status(context, service_report) - LOG.debug(_("Report: Completed status report processing")) + LOG.debug("Report: Completed status report processing") return service_report @lockutils.synchronized('vpn-agent', 'neutron-') @@ -617,8 +618,8 @@ class CiscoCsrIPSecConnection(object): LOG.debug("%(resource)s %(which)s is configured", {'resource': resource, 'which': which}) return - LOG.error(_("Unable to create %(resource)s %(which)s: " - "%(status)d"), + LOG.error(_LE("Unable to create %(resource)s %(which)s: " + "%(status)d"), {'resource': resource, 'which': which, 'status': self.csr.status}) # ToDO(pcm): Set state to error @@ -630,7 +631,7 @@ class CiscoCsrIPSecConnection(object): try: getattr(self.csr, create_action)(info) except AttributeError: - LOG.exception(_("Internal error - '%s' is not defined"), + LOG.exception(_LE("Internal error - '%s' is not defined"), create_action) raise CsrResourceCreateFailure(resource=title, which=resource_id) @@ -643,22 +644,22 @@ class CiscoCsrIPSecConnection(object): LOG.debug("%(resource)s configuration %(which)s was removed", {'resource': resource, 'which': which}) else: - LOG.warning(_("Unable to delete %(resource)s %(which)s: " - "%(status)d"), {'resource': resource, - 'which': which, - 'status': status}) + LOG.warning(_LW("Unable to delete %(resource)s %(which)s: " + "%(status)d"), {'resource': resource, + 'which': which, + 'status': status}) def do_rollback(self): """Undo create steps that were completed successfully.""" for step in reversed(self.steps): delete_action = 'delete_%s' % step.action - LOG.debug(_("Performing rollback action %(action)s for " - "resource %(resource)s"), {'action': delete_action, - 'resource': step.title}) + LOG.debug("Performing rollback action %(action)s for " + "resource %(resource)s", {'action': delete_action, + 'resource': step.title}) try: getattr(self.csr, delete_action)(step.resource_id) except AttributeError: - LOG.exception(_("Internal error - '%s' is not defined"), + LOG.exception(_LE("Internal error - '%s' is not defined"), delete_action) raise CsrResourceCreateFailure(resource=step.title, which=step.resource_id) @@ -678,7 +679,7 @@ class CiscoCsrIPSecConnection(object): ike_policy_id = conn_info['cisco']['ike_policy_id'] ipsec_policy_id = conn_info['cisco']['ipsec_policy_id'] - LOG.debug(_('Creating IPSec connection %s'), conn_id) + LOG.debug('Creating IPSec connection %s', conn_id) # Get all the attributes needed to create try: psk_info = self.create_psk_info(psk_id, conn_info) @@ -711,10 +712,10 @@ class CiscoCsrIPSecConnection(object): route_id, 'Static Route') except CsrResourceCreateFailure: self.do_rollback() - LOG.info(_("FAILED: Create of IPSec site-to-site connection %s"), + LOG.info(_LI("FAILED: Create of IPSec site-to-site connection %s"), conn_id) else: - LOG.info(_("SUCCESS: Created IPSec site-to-site connection %s"), + LOG.info(_LI("SUCCESS: Created IPSec site-to-site connection %s"), conn_id) def delete_ipsec_site_connection(self, context, conn_id): @@ -723,13 +724,13 @@ class CiscoCsrIPSecConnection(object): This will be best effort and will continue, if there are any failures. """ - LOG.debug(_('Deleting IPSec connection %s'), conn_id) + LOG.debug('Deleting IPSec connection %s', conn_id) if not self.steps: - LOG.warning(_('Unable to find connection %s'), conn_id) + LOG.warning(_LW('Unable to find connection %s'), conn_id) else: self.do_rollback() - LOG.info(_("SUCCESS: Deleted IPSec site-to-site connection %s"), + LOG.info(_LI("SUCCESS: Deleted IPSec site-to-site connection %s"), conn_id) def set_admin_state(self, is_up): @@ -737,6 +738,7 @@ class CiscoCsrIPSecConnection(object): self.csr.set_ipsec_connection_state(self.tunnel, admin_up=is_up) if self.csr.status != requests.codes.NO_CONTENT: state = "UP" if is_up else "DOWN" - LOG.error(_("Unable to change %(tunnel)s admin state to " - "%(state)s"), {'tunnel': self.tunnel, 'state': state}) + LOG.error(_LE("Unable to change %(tunnel)s admin state to " + "%(state)s"), {'tunnel': self.tunnel, + 'state': state}) raise CsrAdminStateChangeFailure(tunnel=self.tunnel, state=state) diff --git a/neutron/services/vpn/device_drivers/ipsec.py b/neutron/services/vpn/device_drivers/ipsec.py index c19b61ec25f..a3375fb0eac 100644 --- a/neutron/services/vpn/device_drivers/ipsec.py +++ b/neutron/services/vpn/device_drivers/ipsec.py @@ -28,6 +28,7 @@ from neutron.agent.linux import ip_lib from neutron.agent.linux import utils from neutron.common import rpc as n_rpc from neutron import context +from neutron.openstack.common.gettextutils import _LE from neutron.openstack.common import lockutils from neutron.openstack.common import log as logging from neutron.openstack.common import loopingcall @@ -244,7 +245,7 @@ class BaseSwanProcess(): self.start() except RuntimeError: LOG.exception( - _("Failed to enable vpn process on router %s"), + _LE("Failed to enable vpn process on router %s"), self.id) def disable(self): @@ -255,7 +256,7 @@ class BaseSwanProcess(): self.remove_config() except RuntimeError: LOG.exception( - _("Failed to disable vpn process on router %s"), + _LE("Failed to disable vpn process on router %s"), self.id) @abc.abstractmethod diff --git a/neutron/services/vpn/plugin.py b/neutron/services/vpn/plugin.py index 9353d6c5711..c260386103a 100644 --- a/neutron/services/vpn/plugin.py +++ b/neutron/services/vpn/plugin.py @@ -15,6 +15,7 @@ # under the License. from neutron.db.vpn import vpn_db +from neutron.openstack.common.gettextutils import _LI from neutron.openstack.common import log as logging from neutron.plugins.common import constants from neutron.services import service_base @@ -41,7 +42,7 @@ class VPNDriverPlugin(VPNPlugin, vpn_db.VPNPluginRpcDbMixin): # Load the service driver from neutron.conf. drivers, default_provider = service_base.load_drivers( constants.VPN, self) - LOG.info(_("VPN plugin using service driver: %s"), default_provider) + LOG.info(_LI("VPN plugin using service driver: %s"), default_provider) self.ipsec_driver = drivers[default_provider] def _get_driver_for_vpnservice(self, vpnservice): diff --git a/neutron/services/vpn/service_drivers/__init__.py b/neutron/services/vpn/service_drivers/__init__.py index e6f2551a742..8703ebf35ee 100644 --- a/neutron/services/vpn/service_drivers/__init__.py +++ b/neutron/services/vpn/service_drivers/__init__.py @@ -94,8 +94,8 @@ class BaseIPsecVpnAgentApi(n_rpc.RpcProxy): admin_state_up=True, active=True) for l3_agent in l3_agents: - LOG.debug(_('Notify agent at %(topic)s.%(host)s the message ' - '%(method)s %(args)s'), + LOG.debug('Notify agent at %(topic)s.%(host)s the message ' + '%(method)s %(args)s', {'topic': self.topic, 'host': l3_agent.host, 'method': method, diff --git a/neutron/services/vpn/service_drivers/cisco_cfg_loader.py b/neutron/services/vpn/service_drivers/cisco_cfg_loader.py index 771007dd414..d8665083452 100644 --- a/neutron/services/vpn/service_drivers/cisco_cfg_loader.py +++ b/neutron/services/vpn/service_drivers/cisco_cfg_loader.py @@ -32,8 +32,7 @@ from oslo.config import cfg from neutron.db import l3_db from neutron.db import models_v2 -from neutron.openstack.common.gettextutils import _LE -from neutron.openstack.common.gettextutils import _LI +from neutron.openstack.common.gettextutils import _LE, _LI from neutron.openstack.common import log as logging from neutron.services.vpn.device_drivers import ( cisco_csr_rest_client as csr_client) @@ -103,8 +102,8 @@ def get_available_csrs_from_config(config_files): try: netaddr.IPAddress(rest_mgmt_ip) except netaddr.core.AddrFormatError: - LOG.error(_("Ignoring Cisco CSR for subnet %s - " - "REST management is not an IP address"), + LOG.error(_LE("Ignoring Cisco CSR for subnet %s - " + "REST management is not an IP address"), for_router) continue try: diff --git a/neutron/services/vpn/service_drivers/cisco_csr_db.py b/neutron/services/vpn/service_drivers/cisco_csr_db.py index f29bec5fe34..37f9a8490d0 100644 --- a/neutron/services/vpn/service_drivers/cisco_csr_db.py +++ b/neutron/services/vpn/service_drivers/cisco_csr_db.py @@ -20,6 +20,7 @@ from neutron.common import exceptions from neutron.db import model_base from neutron.db import models_v2 from neutron.db.vpn import vpn_db +from neutron.openstack.common.gettextutils import _LI from neutron.openstack.common import log as logging LOG = logging.getLogger(__name__) @@ -156,10 +157,10 @@ def determine_csr_policy_id(policy_type, conn_policy_field, map_policy_field, then call lookup_policy() to find the current mapping for that ID. """ csr_id = get_next_available_id(session, map_policy_field, policy_type) - LOG.debug(_("Reserved new CSR ID %(csr_id)d for %(policy)s " - "ID %(policy_id)s"), {'csr_id': csr_id, - 'policy': policy_type, - 'policy_id': policy_id}) + LOG.debug("Reserved new CSR ID %(csr_id)d for %(policy)s " + "ID %(policy_id)s", {'csr_id': csr_id, + 'policy': policy_type, + 'policy_id': policy_id}) return csr_id @@ -183,9 +184,9 @@ def get_tunnel_mapping_for(conn_id, session): try: entry = session.query(IdentifierMap).filter_by( ipsec_site_conn_id=conn_id).one() - LOG.debug(_("Mappings for IPSec connection %(conn)s - " - "tunnel=%(tunnel)s ike_policy=%(csr_ike)d " - "ipsec_policy=%(csr_ipsec)d"), + LOG.debug("Mappings for IPSec connection %(conn)s - " + "tunnel=%(tunnel)s ike_policy=%(csr_ike)d " + "ipsec_policy=%(csr_ipsec)d", {'conn': conn_id, 'tunnel': entry.csr_tunnel_id, 'csr_ike': entry.csr_ike_policy_id, 'csr_ipsec': entry.csr_ipsec_policy_id}) @@ -222,9 +223,9 @@ def create_tunnel_mapping(context, conn_info): msg = _("Attempt to create duplicate entry in Cisco CSR " "mapping table for connection %s") % conn_id raise CsrInternalError(reason=msg) - LOG.info(_("Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d " - "using IKE policy ID %(ike_id)d and IPSec policy " - "ID %(ipsec_id)d"), + LOG.info(_LI("Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d " + "using IKE policy ID %(ike_id)d and IPSec policy " + "ID %(ipsec_id)d"), {'conn_id': conn_id, 'tunnel_id': csr_tunnel_id, 'ike_id': csr_ike_id, 'ipsec_id': csr_ipsec_id}) @@ -234,4 +235,4 @@ def delete_tunnel_mapping(context, conn_info): with context.session.begin(): sess_qry = context.session.query(IdentifierMap) sess_qry.filter_by(ipsec_site_conn_id=conn_id).delete() - LOG.info(_("Removed mapping for connection %s"), conn_id) + LOG.info(_LI("Removed mapping for connection %s"), conn_id) diff --git a/neutron/services/vpn/service_drivers/cisco_ipsec.py b/neutron/services/vpn/service_drivers/cisco_ipsec.py index 55b478b9abe..28e3d589fe1 100644 --- a/neutron/services/vpn/service_drivers/cisco_ipsec.py +++ b/neutron/services/vpn/service_drivers/cisco_ipsec.py @@ -101,8 +101,8 @@ class CiscoCsrIPsecVpnAgentApi(service_drivers.BaseIPsecVpnAgentApi, # NOTE: This is a config error for workaround. At this point we # can't set state of resource to error. return - LOG.debug(_('Notify agent at %(topic)s.%(host)s the message ' - '%(method)s %(args)s for router %(router)s'), + LOG.debug('Notify agent at %(topic)s.%(host)s the message ' + '%(method)s %(args)s for router %(router)s', {'topic': self.topic, 'host': host, 'method': method, diff --git a/neutron/tests/__init__.py b/neutron/tests/__init__.py index c11422ed49f..e69de29bb2d 100644 --- a/neutron/tests/__init__.py +++ b/neutron/tests/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2011 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. diff --git a/neutron/tests/base.py b/neutron/tests/base.py index adda2a0bd81..dae1320de5c 100644 --- a/neutron/tests/base.py +++ b/neutron/tests/base.py @@ -125,11 +125,25 @@ class BaseTestCase(testtools.TestCase): 'neutron.common.exceptions.NeutronException.use_fatal_exceptions', fake_use_fatal_exceptions)) + self.setup_rpc_mocks() + + if sys.version_info < (2, 7) and getattr(self, 'fmt', '') == 'xml': + raise self.skipException('XML Testing Skipped in Py26') + + self.setup_config() + self.addOnException(self.check_for_systemexit) + + def setup_rpc_mocks(self): # don't actually start RPC listeners when testing self.useFixture(fixtures.MonkeyPatch( 'neutron.common.rpc.Connection.consume_in_threads', fake_consume_in_threads)) + # immediately return RPC calls + self.useFixture(fixtures.MonkeyPatch( + 'neutron.common.rpc.RpcProxy._RpcProxy__call_rpc_method', + mock.MagicMock())) + self.useFixture(fixtures.MonkeyPatch( 'oslo.messaging.Notifier', fake_notifier.FakeNotifier)) @@ -144,12 +158,6 @@ class BaseTestCase(testtools.TestCase): self.addCleanup(n_rpc.cleanup) n_rpc.init(CONF) - if sys.version_info < (2, 7) and getattr(self, 'fmt', '') == 'xml': - raise self.skipException('XML Testing Skipped in Py26') - - self.setup_config() - self.addOnException(self.check_for_systemexit) - def check_for_systemexit(self, exc_info): if isinstance(exc_info[1], SystemExit): self.fail("A SystemExit was raised during the test. %s" diff --git a/neutron/tests/etc/neutron.conf.test b/neutron/tests/etc/neutron.conf.test index 45fcf29411e..c636bd2721d 100644 --- a/neutron/tests/etc/neutron.conf.test +++ b/neutron/tests/etc/neutron.conf.test @@ -12,7 +12,7 @@ bind_host = 0.0.0.0 bind_port = 9696 # Path to the extensions -api_extensions_path = unit/extensions +api_extensions_path = neutron/tests/unit/extensions # Paste configuration file api_paste_config = api-paste.ini.test diff --git a/neutron/tests/functional/__init__.py b/neutron/tests/functional/__init__.py index e744db95dc3..e69de29bb2d 100644 --- a/neutron/tests/functional/__init__.py +++ b/neutron/tests/functional/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/tests/functional/agent/__init__.py b/neutron/tests/functional/agent/__init__.py index e744db95dc3..e69de29bb2d 100644 --- a/neutron/tests/functional/agent/__init__.py +++ b/neutron/tests/functional/agent/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/tests/functional/agent/linux/__init__.py b/neutron/tests/functional/agent/linux/__init__.py index e744db95dc3..e69de29bb2d 100644 --- a/neutron/tests/functional/agent/linux/__init__.py +++ b/neutron/tests/functional/agent/linux/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/tests/functional/agent/linux/test_process_monitor.py b/neutron/tests/functional/agent/linux/test_process_monitor.py index 8327a38b1ef..4d3b69d279e 100644 --- a/neutron/tests/functional/agent/linux/test_process_monitor.py +++ b/neutron/tests/functional/agent/linux/test_process_monitor.py @@ -29,7 +29,6 @@ class BaseTestProcessMonitor(base.BaseSudoTestCase): def setUp(self): super(BaseTestProcessMonitor, self).setUp() self._exit_handler_called = False - cfg.CONF.set_override('check_child_processes', True) cfg.CONF.set_override('check_child_processes_interval', 1) self._child_processes = [] self._ext_processes = None diff --git a/neutron/tests/unit/agent/__init__.py b/neutron/tests/unit/agent/__init__.py index e744db95dc3..e69de29bb2d 100644 --- a/neutron/tests/unit/agent/__init__.py +++ b/neutron/tests/unit/agent/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/tests/unit/agent/linux/__init__.py b/neutron/tests/unit/agent/linux/__init__.py index e744db95dc3..e69de29bb2d 100644 --- a/neutron/tests/unit/agent/linux/__init__.py +++ b/neutron/tests/unit/agent/linux/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/tests/unit/agent/linux/test_ovs_lib.py b/neutron/tests/unit/agent/linux/test_ovs_lib.py index 8d2444acce9..5af128cd9bc 100644 --- a/neutron/tests/unit/agent/linux/test_ovs_lib.py +++ b/neutron/tests/unit/agent/linux/test_ovs_lib.py @@ -822,8 +822,10 @@ class OVS_Lib_Test(base.BaseTestCase): with testtools.ExpectedException(Exception): self.br.get_local_port_mac() - def _test_get_vif_port_by_id(self, iface_id, data, br_name=None): + def _test_get_vif_port_by_id(self, iface_id, data, br_name=None, + extra_calls_and_values=None): headings = ['external_ids', 'name', 'ofport'] + # Each element is a tuple of (expected mock call, return_value) expected_calls_and_values = [ (mock.call(["ovs-vsctl", self.TO, "--format=json", @@ -836,9 +838,15 @@ class OVS_Lib_Test(base.BaseTestCase): if not br_name: br_name = self.BR_NAME + # Only the last information list in 'data' is used, so if more + # than one vif is described in data, the rest must be declared + # in the argument 'expected_calls_and_values'. + if extra_calls_and_values: + expected_calls_and_values.extend(extra_calls_and_values) + expected_calls_and_values.append( (mock.call(["ovs-vsctl", self.TO, - "iface-to-br", data[0][headings.index('name')]], + "iface-to-br", data[-1][headings.index('name')]], root_helper=self.root_helper), br_name)) tools.setup_mock_calls(self.execute, expected_calls_and_values) @@ -847,6 +855,15 @@ class OVS_Lib_Test(base.BaseTestCase): tools.verify_mock_calls(self.execute, expected_calls_and_values) return vif_port + def _assert_vif_port(self, vif_port, ofport=None, mac=None): + if not ofport or ofport == -1 or not mac: + self.assertIsNone(vif_port) + return + self.assertEqual('tap99id', vif_port.vif_id) + self.assertEqual(mac, vif_port.vif_mac) + self.assertEqual('tap99', vif_port.port_name) + self.assertEqual(ofport, vif_port.ofport) + def _test_get_vif_port_by_id_with_data(self, ofport=None, mac=None): external_ids = [["iface-id", "tap99id"], ["iface-status", "active"]] @@ -855,13 +872,7 @@ class OVS_Lib_Test(base.BaseTestCase): data = [[["map", external_ids], "tap99", ofport if ofport else '["set",[]]']] vif_port = self._test_get_vif_port_by_id('tap99id', data) - if not ofport or ofport == -1 or not mac: - self.assertIsNone(vif_port) - return - self.assertEqual(vif_port.vif_id, 'tap99id') - self.assertEqual(vif_port.vif_mac, 'aa:bb:cc:dd:ee:ff') - self.assertEqual(vif_port.port_name, 'tap99') - self.assertEqual(vif_port.ofport, ofport) + self._assert_vif_port(vif_port, ofport, mac) def test_get_vif_by_port_id_with_ofport(self): self._test_get_vif_port_by_id_with_data( @@ -887,6 +898,22 @@ class OVS_Lib_Test(base.BaseTestCase): self.assertIsNone(self._test_get_vif_port_by_id('tap99id', data, "br-ext")) + def test_get_vif_by_port_id_multiple_vifs(self): + external_ids = [["iface-id", "tap99id"], + ["iface-status", "active"], + ["attached-mac", "de:ad:be:ef:13:37"]] + data = [[["map", external_ids], "dummytap", 1], + [["map", external_ids], "tap99", 1337]] + extra_calls_and_values = [ + (mock.call(["ovs-vsctl", self.TO, + "iface-to-br", "dummytap"], + root_helper=self.root_helper), + "br-ext")] + + vif_port = self._test_get_vif_port_by_id( + 'tap99id', data, extra_calls_and_values=extra_calls_and_values) + self._assert_vif_port(vif_port, ofport=1337, mac="de:ad:be:ef:13:37") + class TestDeferredOVSBridge(base.BaseTestCase): diff --git a/neutron/tests/unit/agent/test_l2population_rpc.py b/neutron/tests/unit/agent/test_l2population_rpc.py index 7b1e0534497..563c53b19db 100644 --- a/neutron/tests/unit/agent/test_l2population_rpc.py +++ b/neutron/tests/unit/agent/test_l2population_rpc.py @@ -234,3 +234,17 @@ class TestL2populationRpcCallBackTunnelMixin( upd_fdb_entry_val, self.local_ip, self.local_vlan_map1) self.assertFalse(m_setup_entry_for_arp_reply.call_count) + + def test_fdb_chg_ip_tun_empty_before_after(self): + upd_fdb_entry_val = { + self.lvms[0].net: { + self.local_ip: {}, + }, + } + m_setup_entry_for_arp_reply = mock.Mock() + self.fakeagent.setup_entry_for_arp_reply = m_setup_entry_for_arp_reply + # passing non-local ip + self.fakeagent.fdb_chg_ip_tun('context', self.fakebr, + upd_fdb_entry_val, "8.8.8.8", + self.local_vlan_map1) + self.assertFalse(m_setup_entry_for_arp_reply.call_count) diff --git a/neutron/tests/unit/bigswitch/__init__.py b/neutron/tests/unit/bigswitch/__init__.py index b706747cf8c..e69de29bb2d 100644 --- a/neutron/tests/unit/bigswitch/__init__.py +++ b/neutron/tests/unit/bigswitch/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/tests/unit/bigswitch/test_restproxy_plugin.py b/neutron/tests/unit/bigswitch/test_restproxy_plugin.py index 4d1845fce9a..87391cf945e 100644 --- a/neutron/tests/unit/bigswitch/test_restproxy_plugin.py +++ b/neutron/tests/unit/bigswitch/test_restproxy_plugin.py @@ -155,9 +155,10 @@ class TestBigSwitchProxyPortsV2(test_plugin.TestPortsV2, # stop normal patch self.httpPatch.stop() with patch(HTTPCON, new=fake_server.HTTPConnectionMock500): - self._delete('ports', port['port']['id'], - expected_code= - webob.exc.HTTPInternalServerError.code) + self._delete( + 'ports', + port['port']['id'], + expected_code=webob.exc.HTTPInternalServerError.code) self.httpPatch.start() port = self._get_ports(n['network']['id'])[0] self.assertEqual('BUILD', port['status']) diff --git a/neutron/tests/unit/bigswitch/test_servermanager.py b/neutron/tests/unit/bigswitch/test_servermanager.py index 43723fe8f98..efab0c41ede 100644 --- a/neutron/tests/unit/bigswitch/test_servermanager.py +++ b/neutron/tests/unit/bigswitch/test_servermanager.py @@ -465,7 +465,8 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase): ('www.example.org', 443), 90, '127.0.0.1' )]) self.wrap_mock.assert_has_calls([mock.call( - self.socket_mock(), None, None, cert_reqs=ssl.CERT_NONE + self.socket_mock(), None, None, cert_reqs=ssl.CERT_NONE, + ssl_version=ssl.PROTOCOL_TLSv1 )]) self.assertEqual(con.sock, self.wrap_mock()) @@ -480,7 +481,8 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase): )]) self.wrap_mock.assert_has_calls([mock.call( self.socket_mock(), None, None, ca_certs='SOMECERTS.pem', - cert_reqs=ssl.CERT_REQUIRED + cert_reqs=ssl.CERT_REQUIRED, + ssl_version=ssl.PROTOCOL_TLSv1 )]) self.assertEqual(con.sock, self.wrap_mock()) @@ -500,7 +502,8 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase): ('www.example.org', 443), 90, '127.0.0.1' )]) self.wrap_mock.assert_has_calls([mock.call( - self.socket_mock(), None, None, cert_reqs=ssl.CERT_NONE + self.socket_mock(), None, None, cert_reqs=ssl.CERT_NONE, + ssl_version=ssl.PROTOCOL_TLSv1 )]) # _tunnel() doesn't take any args tunnel_mock.assert_has_calls([mock.call()]) diff --git a/neutron/tests/unit/brocade/__init__.py b/neutron/tests/unit/brocade/__init__.py index b9eda04a0e8..e69de29bb2d 100644 --- a/neutron/tests/unit/brocade/__init__.py +++ b/neutron/tests/unit/brocade/__init__.py @@ -1,15 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/tests/unit/cisco/__init__.py b/neutron/tests/unit/cisco/__init__.py index b706747cf8c..e69de29bb2d 100644 --- a/neutron/tests/unit/cisco/__init__.py +++ b/neutron/tests/unit/cisco/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py b/neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py index 48c7b4866e3..e9df1a09022 100644 --- a/neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py +++ b/neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py @@ -71,7 +71,7 @@ class TestCiscoCfgAgentWIthStateReporting(base.BaseTestCase): self.conf = cfg.ConfigOpts() config.register_agent_state_opts_helper(cfg.CONF) self.conf.register_opts(base_config.core_opts) - self.conf.register_opts(cfg_agent.CiscoCfgAgent.OPTS) + self.conf.register_opts(cfg_agent.CiscoCfgAgent.OPTS, "cfg_agent") cfg.CONF.set_override('report_interval', 0, 'AGENT') super(TestCiscoCfgAgentWIthStateReporting, self).setUp() self.devmgr_plugin_api_cls_p = mock.patch( diff --git a/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py b/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py index f30b60f24bd..23c8f6fb5ca 100644 --- a/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py +++ b/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py @@ -326,7 +326,7 @@ class RouterSchedulingTestCase(L3RouterApplianceTestCaseBase, self.assertIsNotNone(hosting_device_1) cfg_dh_rpc.report_non_responding_hosting_devices( self.adminContext, - host = None, + host=None, hosting_device_ids=[hosting_device_1['id']]) self.assertEqual(1, mock_notify.call_count) mock_notify.assert_called_with( diff --git a/neutron/tests/unit/cisco/n1kv/__init__.py b/neutron/tests/unit/cisco/n1kv/__init__.py index 73c4997f21d..e69de29bb2d 100644 --- a/neutron/tests/unit/cisco/n1kv/__init__.py +++ b/neutron/tests/unit/cisco/n1kv/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 Cisco Systems, 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. diff --git a/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py b/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py index e412dfc7e68..8b898b62411 100644 --- a/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py +++ b/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py @@ -587,7 +587,7 @@ class TestN1kvNetworkProfiles(N1kvPluginTestCase): net_p_req = self.new_create_request('network_profiles', data) net_p_req.environ['neutron.context'] = context.Context('', self.tenant_id, - is_admin = True) + is_admin=True) res = net_p_req.get_response(self.ext_api) self.assertEqual(201, res.status_int) net_p = self.deserialize(self.fmt, res) @@ -612,7 +612,7 @@ class TestN1kvNetworkProfiles(N1kvPluginTestCase): net_p['network_profile']['id']) update_req.environ['neutron.context'] = context.Context('', self.tenant_id, - is_admin = True) + is_admin=True) update_res = update_req.get_response(self.ext_api) self.assertEqual(200, update_res.status_int) db_session = db.get_session() @@ -623,7 +623,7 @@ class TestN1kvNetworkProfiles(N1kvPluginTestCase): net_p['network_profile']['id']) self.assertRaises(c_exc.ProfileTenantBindingNotFound, n1kv_db_v2.get_profile_binding, - db_session, 'tenant2', + db_session, 'tenant4', net_p['network_profile']['id']) tenant3 = n1kv_db_v2.get_profile_binding(db_session, 'tenant3', net_p['network_profile']['id']) @@ -637,24 +637,39 @@ class TestN1kvNetworkProfiles(N1kvPluginTestCase): net_p['network_profile']['id']) update_req.environ['neutron.context'] = context.Context('', self.tenant_id, - is_admin = True) + is_admin=True) update_res = update_req.get_response(self.ext_api) self.assertEqual(200, update_res.status_int) # current tenant_id should always present tenant_id = n1kv_db_v2.get_profile_binding(db_session, self.tenant_id, net_p['network_profile']['id']) + self.assertIsNotNone(tenant_id) self.assertRaises(c_exc.ProfileTenantBindingNotFound, n1kv_db_v2.get_profile_binding, db_session, 'tenant1', net_p['network_profile']['id']) self.assertRaises(c_exc.ProfileTenantBindingNotFound, n1kv_db_v2.get_profile_binding, - db_session, 'tenant2', + db_session, 'tenant4', net_p['network_profile']['id']) tenant3 = n1kv_db_v2.get_profile_binding(db_session, 'tenant3', net_p['network_profile']['id']) - self.assertIsNotNone(tenant_id) self.assertIsNotNone(tenant3) + # Add new tenant4 to network profile and make sure existing tenants + # are not deleted. + data = {'network_profile': {c_const.ADD_TENANTS: + ['tenant4']}} + update_req = self.new_update_request('network_profiles', + data, + net_p['network_profile']['id']) + update_req.environ['neutron.context'] = context.Context('', + self.tenant_id, + is_admin=True) + update_res = update_req.get_response(self.ext_api) + self.assertEqual(200, update_res.status_int) + tenant4 = n1kv_db_v2.get_profile_binding(db_session, 'tenant4', + net_p['network_profile']['id']) + self.assertIsNotNone(tenant4) class TestN1kvBasicGet(test_plugin.TestBasicGet, @@ -793,6 +808,24 @@ class TestN1kvPorts(test_plugin.TestPortsV2, # for network object clean up to succeed. client_patch.stop() + def test_delete_last_port_vmnetwork_cleanup(self): + """Test whether VMNetwork is cleaned up from db on last port delete.""" + db_session = db.get_session() + with self.port() as port: + pt = port['port'] + self.assertIsNotNone(n1kv_db_v2. + get_vm_network(db_session, + pt['n1kv:profile_id'], + pt['network_id'])) + req = self.new_delete_request('ports', port['port']['id']) + req.get_response(self.api) + # Verify VMNetwork is cleaned up from the database on port delete. + self.assertRaises(c_exc.VMNetworkNotFound, + n1kv_db_v2.get_vm_network, + db_session, + pt['n1kv:profile_id'], + pt['network_id']) + class TestN1kvPolicyProfiles(N1kvPluginTestCase): def setUp(self): diff --git a/neutron/tests/unit/db/__init__.py b/neutron/tests/unit/db/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/tests/unit/db/__init__.py +++ b/neutron/tests/unit/db/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/db/firewall/__init__.py b/neutron/tests/unit/db/firewall/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/tests/unit/db/firewall/__init__.py +++ b/neutron/tests/unit/db/firewall/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/db/firewall/test_db_firewall.py b/neutron/tests/unit/db/firewall/test_db_firewall.py index 0fc3c2c61ea..efd99366938 100644 --- a/neutron/tests/unit/db/firewall/test_db_firewall.py +++ b/neutron/tests/unit/db/firewall/test_db_firewall.py @@ -335,6 +335,17 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): for k, v in attrs.iteritems(): self.assertEqual(fwp['firewall_policy'][k], v) + def test_create_admin_firewall_policy_with_other_tenant_rules(self): + with self.firewall_rule(shared=False) as fr: + fw_rule_ids = [fr['firewall_rule']['id']] + res = self._create_firewall_policy(None, 'firewall_policy1', + description=DESCRIPTION, + shared=SHARED, + firewall_rules=fw_rule_ids, + audited=AUDITED, + tenant_id='admin-tenant') + self.assertEqual(webob.exc.HTTPConflict.code, res.status_int) + def test_create_firewall_policy_with_previously_associated_rule(self): with self.firewall_rule() as fwr: fw_rule_ids = [fwr['firewall_rule']['id']] @@ -562,6 +573,16 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): res = req.get_response(self.ext_api) self.assertEqual(webob.exc.HTTPConflict.code, res.status_int) + def test_update_firewall_policy_assoc_with_other_tenant_firewall(self): + with self.firewall_policy(shared=True, tenant_id='tenant1') as fwp: + fwp_id = fwp['firewall_policy']['id'] + with self.firewall(firewall_policy_id=fwp_id): + data = {'firewall_policy': {'shared': False}} + req = self.new_update_request('firewall_policies', data, + fwp['firewall_policy']['id']) + res = req.get_response(self.ext_api) + self.assertEqual(webob.exc.HTTPConflict.code, res.status_int) + def test_delete_firewall_policy(self): ctx = context.get_admin_context() with self.firewall_policy(do_delete=False) as fwp: @@ -603,9 +624,9 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - ADMIN_STATE_UP): + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=ADMIN_STATE_UP): req = self.new_delete_request('firewall_policies', fwp_id) res = req.get_response(self.ext_api) self.assertEqual(res.status_int, 409) @@ -834,6 +855,17 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): [fwr_id]) self.assertEqual(res['firewall_policy']['audited'], False) + def test_update_firewall_rule_associated_with_other_tenant_policy(self): + with self.firewall_rule(shared=True, tenant_id='tenant1') as fwr: + fwr_id = [fwr['firewall_rule']['id']] + with self.firewall_policy(shared=False, + firewall_rules=fwr_id): + data = {'firewall_rule': {'shared': False}} + req = self.new_update_request('firewall_rules', data, + fwr['firewall_rule']['id']) + res = req.get_response(self.ext_api) + self.assertEqual(webob.exc.HTTPConflict.code, res.status_int) + def test_delete_firewall_rule(self): ctx = context.get_admin_context() with self.firewall_rule(do_delete=False) as fwr: @@ -864,10 +896,11 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(name=attrs['name'], - firewall_policy_id=fwp_id, - admin_state_up= - ADMIN_STATE_UP) as firewall: + with self.firewall( + name=attrs['name'], + firewall_policy_id=fwp_id, + admin_state_up=ADMIN_STATE_UP + ) as firewall: for k, v in attrs.iteritems(): self.assertEqual(firewall['firewall'][k], v) @@ -887,10 +920,10 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(name=name, - firewall_policy_id=fwp_id, - admin_state_up= - ADMIN_STATE_UP) as firewall: + with self.firewall( + name=name, + firewall_policy_id=fwp_id, + admin_state_up=ADMIN_STATE_UP) as firewall: req = self.new_show_request('firewalls', firewall['firewall']['id'], fmt=self.fmt) @@ -921,9 +954,9 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - ADMIN_STATE_UP) as firewall: + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=ADMIN_STATE_UP) as firewall: data = {'firewall': {'name': name}} req = self.new_update_request('firewalls', data, firewall['firewall']['id']) @@ -1057,6 +1090,18 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): expected_code=webob.exc.HTTPBadRequest.code, expected_body=None) + def test_insert_rule_for_policy_of_other_tenant(self): + with self.firewall_rule(tenant_id='tenant-2', shared=False) as fwr: + fwr_id = fwr['firewall_rule']['id'] + with self.firewall_policy(name='firewall_policy') as fwp: + fwp_id = fwp['firewall_policy']['id'] + insert_data = {'firewall_rule_id': fwr_id} + self._rule_action( + 'insert', fwp_id, fwr_id, insert_before=None, + insert_after=None, + expected_code=webob.exc.HTTPConflict.code, + expected_body=None, body_data=insert_data) + def test_insert_rule_in_policy(self): attrs = self._get_test_firewall_policy_attrs() attrs['audited'] = False diff --git a/neutron/tests/unit/db/loadbalancer/__init__.py b/neutron/tests/unit/db/loadbalancer/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/tests/unit/db/loadbalancer/__init__.py +++ b/neutron/tests/unit/db/loadbalancer/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/db/metering/__init__.py b/neutron/tests/unit/db/metering/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/tests/unit/db/metering/__init__.py +++ b/neutron/tests/unit/db/metering/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/tests/unit/db/test_l3_dvr_db.py b/neutron/tests/unit/db/test_l3_dvr_db.py index 6ef9b1a5b0c..b9b8b3bba4e 100644 --- a/neutron/tests/unit/db/test_l3_dvr_db.py +++ b/neutron/tests/unit/db/test_l3_dvr_db.py @@ -256,3 +256,52 @@ class L3DvrTestCase(testlib_api.SqlTestCase): } mock_fip_clear = self._delete_floatingip_test_setup(floatingip) self.assertTrue(mock_fip_clear.called) + + def _floatingip_on_port_test_setup(self, hostid): + router = {'id': 'foo_router_id', 'distributed': True} + floatingip = { + 'id': _uuid(), + 'port_id': _uuid(), + 'router_id': 'foo_router_id' + } + routers = { + 'foo_router_id': router + } + fipagent = { + 'id': _uuid() + } + + # NOTE: mock.patch is not needed here since self.mixin is created fresh + # for each test. It doesn't work with some methods since the mixin is + # tested in isolation (e.g. _get_agent_by_type_and_host). + self.mixin.get_vm_port_hostid = mock.Mock(return_value=hostid) + self.mixin._get_agent_by_type_and_host = mock.Mock( + return_value=fipagent) + self.mixin.get_fip_sync_interfaces = mock.Mock( + return_value='fip_interface') + + self.mixin._process_floating_ips(self.ctx, routers, [floatingip]) + return (router, floatingip) + + def test_floatingip_on_port_no_host(self): + router, fip = self._floatingip_on_port_test_setup(None) + + self.assertTrue(self.mixin.get_vm_port_hostid.called) + self.assertFalse(self.mixin._get_agent_by_type_and_host.called) + self.assertFalse(self.mixin.get_fip_sync_interfaces.called) + + self.assertNotIn(l3_const.FLOATINGIP_KEY, router) + self.assertNotIn(l3_const.FLOATINGIP_AGENT_INTF_KEY, router) + + def test_floatingip_on_port_with_host(self): + router, fip = self._floatingip_on_port_test_setup(_uuid()) + + self.assertTrue(self.mixin.get_vm_port_hostid.called) + self.assertTrue(self.mixin._get_agent_by_type_and_host.called) + self.assertTrue(self.mixin.get_fip_sync_interfaces.called) + + self.assertIn(l3_const.FLOATINGIP_KEY, router) + self.assertIn(l3_const.FLOATINGIP_AGENT_INTF_KEY, router) + self.assertIn(fip, router[l3_const.FLOATINGIP_KEY]) + self.assertIn('fip_interface', + router[l3_const.FLOATINGIP_AGENT_INTF_KEY]) diff --git a/neutron/tests/unit/db/test_l3_ha_db.py b/neutron/tests/unit/db/test_l3_ha_db.py index 4616612bbd8..807436caa70 100644 --- a/neutron/tests/unit/db/test_l3_ha_db.py +++ b/neutron/tests/unit/db/test_l3_ha_db.py @@ -55,12 +55,13 @@ class L3HATestFramework(testlib_api.SqlTestCase, cfg.CONF.set_override('allow_overlapping_ips', True) def _create_router(self, ha=True, tenant_id='tenant1', distributed=None): + self.admin_ctx.tenant_id = tenant_id router = {'name': 'router1', 'admin_state_up': True} if ha is not None: router['ha'] = ha if distributed is not None: router['distributed'] = distributed - return self.plugin._create_router_db(self.admin_ctx, router, tenant_id) + return self.plugin.create_router(self.admin_ctx, {'router': router}) def _update_router(self, router_id, ha=True, distributed=None): data = {'ha': ha} if ha is not None else {} @@ -100,7 +101,7 @@ class L3HAGetSyncDataTestCase(L3HATestFramework): def test_l3_agent_routers_query_interface(self): router = self._create_router() - self._bind_router(router.id) + self._bind_router(router['id']) routers = self.plugin.get_ha_sync_data_for_host(self.admin_ctx, self.agent1['host']) self.assertEqual(1, len(routers)) @@ -117,13 +118,13 @@ class L3HAGetSyncDataTestCase(L3HATestFramework): def test_update_state(self): router = self._create_router() - self._bind_router(router.id) + self._bind_router(router['id']) routers = self.plugin.get_ha_sync_data_for_host(self.admin_ctx, self.agent1['host']) state = routers[0].get(constants.HA_ROUTER_STATE_KEY) self.assertEqual('standby', state) - self.plugin.update_router_state(self.admin_ctx, router.id, 'active', + self.plugin.update_router_state(self.admin_ctx, router['id'], 'active', self.agent1['host']) routers = self.plugin.get_ha_sync_data_for_host(self.admin_ctx, @@ -163,7 +164,7 @@ class L3HATestCase(L3HATestFramework): def test_ha_router_create(self): router = self._create_router() - self.assertTrue(router.extra_attributes['ha']) + self.assertTrue(router['ha']) def test_ha_router_create_with_distributed(self): self.assertRaises(l3_ext_ha_mode.DistributedHARouterNotSupported, @@ -172,37 +173,37 @@ class L3HATestCase(L3HATestFramework): def test_no_ha_router_create(self): router = self._create_router(ha=False) - self.assertFalse(router.extra_attributes['ha']) + self.assertFalse(router['ha']) def test_router_create_with_ha_conf_enabled(self): cfg.CONF.set_override('l3_ha', True) router = self._create_router(ha=None) - self.assertTrue(router.extra_attributes['ha']) + self.assertTrue(router['ha']) def test_migration_from_ha(self): router = self._create_router() - self.assertTrue(router.extra_attributes['ha']) + self.assertTrue(router['ha']) - router = self._update_router(router.id, ha=False) + router = self._update_router(router['id'], ha=False) self.assertFalse(router.extra_attributes['ha']) self.assertIsNone(router.extra_attributes['ha_vr_id']) def test_migration_to_ha(self): router = self._create_router(ha=False) - self.assertFalse(router.extra_attributes['ha']) + self.assertFalse(router['ha']) - router = self._update_router(router.id, ha=True) + router = self._update_router(router['id'], ha=True) self.assertTrue(router.extra_attributes['ha']) self.assertIsNotNone(router.extra_attributes['ha_vr_id']) def test_migrate_ha_router_to_distributed(self): router = self._create_router() - self.assertTrue(router.extra_attributes['ha']) + self.assertTrue(router['ha']) self.assertRaises(l3_ext_ha_mode.DistributedHARouterNotSupported, self._update_router, - router.id, + router['id'], distributed=True) def test_unique_ha_network_per_tenant(self): @@ -247,7 +248,7 @@ class L3HATestCase(L3HATestFramework): def test_update_router_to_ha_notifies_agent(self): router = self._create_router(ha=False) self.notif_m.reset_mock() - self._update_router(router.id, ha=True) + self._update_router(router['id'], ha=True) self.assertTrue(self.notif_m.called) def test_unique_vr_id_between_routers(self): @@ -272,18 +273,20 @@ class L3HATestCase(L3HATestFramework): @mock.patch('neutron.db.l3_hamode_db.MAX_ALLOCATION_TRIES', new=2) def test_vr_id_allocation_contraint_conflict(self): router = self._create_router() - network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id) + network = self.plugin.get_ha_network(self.admin_ctx, + router['tenant_id']) with mock.patch.object(self.plugin, '_get_allocated_vr_id', return_value=set()) as alloc: self.assertRaises(l3_ext_ha_mode.MaxVRIDAllocationTriesReached, self.plugin._allocate_vr_id, self.admin_ctx, - network.network_id, router.id) + network.network_id, router['id']) self.assertEqual(2, len(alloc.mock_calls)) def test_vr_id_allocation_delete_router(self): router = self._create_router() - network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id) + network = self.plugin.get_ha_network(self.admin_ctx, + router['tenant_id']) allocs_before = self.plugin._get_allocated_vr_id(self.admin_ctx, network.network_id) @@ -292,19 +295,20 @@ class L3HATestCase(L3HATestFramework): network.network_id) self.assertNotEqual(allocs_before, allocs_current) - self.plugin.delete_router(self.admin_ctx, router.id) + self.plugin.delete_router(self.admin_ctx, router['id']) allocs_after = self.plugin._get_allocated_vr_id(self.admin_ctx, network.network_id) self.assertEqual(allocs_before, allocs_after) def test_vr_id_allocation_router_migration(self): router = self._create_router() - network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id) + network = self.plugin.get_ha_network(self.admin_ctx, + router['tenant_id']) allocs_before = self.plugin._get_allocated_vr_id(self.admin_ctx, network.network_id) router = self._create_router() - self._update_router(router.id, ha=False) + self._update_router(router['id'], ha=False) allocs_after = self.plugin._get_allocated_vr_id(self.admin_ctx, network.network_id) self.assertEqual(allocs_before, allocs_after) @@ -321,16 +325,17 @@ class L3HATestCase(L3HATestFramework): def test_add_ha_port_binding_failure_rolls_back_port(self): router = self._create_router() - device_filter = {'device_id': [router.id]} + device_filter = {'device_id': [router['id']]} ports_before = self.core_plugin.get_ports( self.admin_ctx, filters=device_filter) - network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id) + network = self.plugin.get_ha_network(self.admin_ctx, + router['tenant_id']) with mock.patch.object(self.plugin, '_create_ha_port_binding', side_effect=ValueError): self.assertRaises(ValueError, self.plugin.add_ha_port, - self.admin_ctx, router.id, network.network_id, - router.tenant_id) + self.admin_ctx, router['id'], network.network_id, + router['tenant_id']) ports_after = self.core_plugin.get_ports( self.admin_ctx, filters=device_filter) @@ -362,15 +367,17 @@ class L3HATestCase(L3HATestFramework): def test_create_ha_interfaces_binding_failure_rolls_back_ports(self): router = self._create_router() - network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id) - device_filter = {'device_id': [router.id]} + network = self.plugin.get_ha_network(self.admin_ctx, + router['tenant_id']) + device_filter = {'device_id': [router['id']]} ports_before = self.core_plugin.get_ports( self.admin_ctx, filters=device_filter) + router_db = self.plugin._get_router(self.admin_ctx, router['id']) with mock.patch.object(self.plugin, '_create_ha_port_binding', side_effect=ValueError): self.assertRaises(ValueError, self.plugin._create_ha_interfaces, - self.admin_ctx, router, network) + self.admin_ctx, router_db, network) ports_after = self.core_plugin.get_ports( self.admin_ctx, filters=device_filter) diff --git a/neutron/tests/unit/db/test_migration.py b/neutron/tests/unit/db/test_migration.py new file mode 100644 index 00000000000..3e699df2eca --- /dev/null +++ b/neutron/tests/unit/db/test_migration.py @@ -0,0 +1,343 @@ +# Copyright 2014 OpenStack Foundation +# +# 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 collections +import logging +import pprint + +import alembic +import alembic.autogenerate +import alembic.migration +import mock +from oslo.config import cfg +from oslo.db.sqlalchemy import test_base +from oslo.db.sqlalchemy import test_migrations +from oslo.db.sqlalchemy import utils +import pkg_resources as pkg +import sqlalchemy +import sqlalchemy.sql.expression as expr +import testscenarios + +from neutron.db.migration import cli as migration +from neutron.db.migration.models import head as head_models +from neutron.openstack.common.fixture import config + +LOG = logging.getLogger(__name__) + + +cfg.CONF.import_opt('core_plugin', 'neutron.common.config') +cfg.CONF.import_opt('service_plugins', 'neutron.common.config') + + +def _discover_plugins(plugin_type): + return [ + '%s.%s' % (entrypoint.module_name, entrypoint.attrs[0]) + for entrypoint in + pkg.iter_entry_points(plugin_type) + ] + +SERVICE_PLUGINS = _discover_plugins("neutron.service_plugins") +CORE_PLUGINS = _discover_plugins('neutron.core_plugins') + + +class _TestModelsMigrations(test_migrations.ModelsMigrationsSync): + '''Test for checking of equality models state and migrations. + + For the opportunistic testing you need to set up a db named + 'openstack_citest' with user 'openstack_citest' and password + 'openstack_citest' on localhost. + The test will then use that db and user/password combo to run the tests. + + For PostgreSQL on Ubuntu this can be done with the following commands:: + + sudo -u postgres psql + postgres=# create user openstack_citest with createdb login password + 'openstack_citest'; + postgres=# create database openstack_citest with owner + openstack_citest; + + For MySQL on Ubuntu this can be done with the following commands:: + + mysql -u root + >create database openstack_citest; + >grant all privileges on openstack_citest.* to + openstack_citest@localhost identified by 'openstack_citest'; + + Output is a list that contains information about differences between db and + models. Output example:: + + [('add_table', + Table('bat', MetaData(bind=None), + Column('info', String(), table=), schema=None)), + ('remove_table', + Table(u'bar', MetaData(bind=None), + Column(u'data', VARCHAR(), table=), schema=None)), + ('add_column', + None, + 'foo', + Column('data', Integer(), table=)), + ('remove_column', + None, + 'foo', + Column(u'old_data', VARCHAR(), table=None)), + [('modify_nullable', + None, + 'foo', + u'x', + {'existing_server_default': None, + 'existing_type': INTEGER()}, + True, + False)]] + + * ``remove_*`` means that there is extra table/column/constraint in db; + + * ``add_*`` means that it is missing in db; + + * ``modify_*`` means that on column in db is set wrong + type/nullable/server_default. Element contains information: + * what should be modified, + * schema, + * table, + * column, + * existing correct column parameters, + * right value, + * wrong value. + + ''' + + def setUp(self): + patch = mock.patch.dict('sys.modules', { + 'ryu': mock.MagicMock(), + 'ryu.app': mock.MagicMock(), + 'heleosapi': mock.MagicMock(), + 'midonetclient': mock.MagicMock(), + 'midonetclient.neutron': mock.MagicMock(), + }) + patch.start() + self.addCleanup(patch.stop) + super(_TestModelsMigrations, self).setUp() + self.cfg = self.useFixture(config.Config()) + self.cfg.config(service_plugins=SERVICE_PLUGINS, + core_plugin=self.core_plugin) + self.alembic_config = migration.get_alembic_config() + self.alembic_config.neutron_config = cfg.CONF + + def db_sync(self, engine): + cfg.CONF.set_override('connection', engine.url, group='database') + migration.do_alembic_command(self.alembic_config, 'upgrade', 'head') + cfg.CONF.clear_override('connection', group='database') + + def get_engine(self): + return self.engine + + def get_metadata(self): + return head_models.get_metadata() + + def include_object(self, object_, name, type_, reflected, compare_to): + if type_ == 'table' and name == 'alembic_version': + return False + + return super(_TestModelsMigrations, self).include_object( + object_, name, type_, reflected, compare_to) + + def compare_server_default(self, ctxt, ins_col, meta_col, + insp_def, meta_def, rendered_meta_def): + return self._compare_server_default(ctxt.bind, meta_col, insp_def, + meta_def) + + # TODO(akamyshnikova):remove _compare_server_default methods when it + # appears in oslo.db(version>1.0.0) + @utils.DialectFunctionDispatcher.dispatch_for_dialect("*") + def _compare_server_default(bind, meta_col, insp_def, meta_def): + pass + + @_compare_server_default.dispatch_for('mysql') + def _compare_server_default(bind, meta_col, insp_def, meta_def): + if isinstance(meta_col.type, sqlalchemy.Boolean): + if meta_def is None or insp_def is None: + return meta_def != insp_def + return not ( + isinstance(meta_def.arg, expr.True_) and insp_def == "'1'" or + isinstance(meta_def.arg, expr.False_) and insp_def == "'0'" + ) + + if isinstance(meta_col.type, sqlalchemy.Integer): + if meta_def is None or insp_def is None: + return meta_def != insp_def + return meta_def.arg == insp_def + + @_compare_server_default.dispatch_for('postgresql') + def _compare_server_default(bind, meta_col, insp_def, meta_def): + if isinstance(meta_col.type, sqlalchemy.Enum): + if meta_def is None or insp_def is None: + return meta_def != insp_def + return insp_def != "'%s'::%s" % (meta_def.arg, meta_col.type.name) + elif isinstance(meta_col.type, sqlalchemy.String): + if meta_def is None or insp_def is None: + return meta_def != insp_def + return insp_def != "'%s'::character varying" % meta_def.arg + + def test_models_sync(self): + # drop all tables after a test run + self.addCleanup(self._cleanup) + + # run migration scripts + self.db_sync(self.get_engine()) + + with self.get_engine().connect() as conn: + opts = { + 'include_object': self.include_object, + 'compare_type': self.compare_type, + 'compare_server_default': self.compare_server_default, + } + mc = alembic.migration.MigrationContext.configure(conn, opts=opts) + + # compare schemas and fail with diff, if it's not empty + diff1 = alembic.autogenerate.compare_metadata(mc, + self.get_metadata()) + insp = sqlalchemy.engine.reflection.Inspector.from_engine( + self.get_engine()) + dialect = self.get_engine().dialect.name + self.check_mysql_engine(dialect, insp) + diff2 = self.compare_foreign_keys(self.get_metadata(), + self.get_engine()) + + result = filter(self.remove_unrelated_errors, diff1 + diff2) + if result: + msg = pprint.pformat(result, indent=2, width=20) + + self.fail("Models and migration scripts aren't in sync:\n%s" % msg) + + def check_mysql_engine(self, dialect, insp): + if dialect != 'mysql': + return + + # Test that table creation on mysql only builds InnoDB tables + tables = insp.get_table_names() + self.assertTrue(len(tables) > 0, + "No tables found. Wrong schema?") + noninnodb = [table for table in tables if + insp.get_table_options(table)['mysql_engine'] != 'InnoDB' + and table != 'alembic_version'] + self.assertEqual(0, len(noninnodb), "%s non InnoDB tables created" % + noninnodb) + + FKInfo = collections.namedtuple('FKInfo', ['constrained_columns', + 'referred_table', + 'referred_columns']) + + def compare_foreign_keys(self, metadata, bind): + """Compare foreign keys between model and db table. + + Returns a list that contains information about: + * should be a new key added or removed existing, + * name of that key, + * source table, + * referred table, + * constrained columns, + * referred columns + + Output:: + + [('drop_key', + 'testtbl_fk_check_fkey', + 'testtbl', + fk_info(constrained_columns=(u'fk_check',), + referred_table=u'table', + referred_columns=(u'fk_check',)))] + + """ + + diff = [] + insp = sqlalchemy.engine.reflection.Inspector.from_engine(bind) + # Get all tables from db + db_tables = insp.get_table_names() + # Get all tables from models + model_tables = metadata.tables + for table in db_tables: + if table not in model_tables: + continue + # Get all necessary information about key of current table from db + fk_db = dict((self._get_fk_info_from_db(i), i['name']) + for i in insp.get_foreign_keys(table)) + fk_db_set = set(fk_db.keys()) + # Get all necessary information about key of current table from + # models + fk_models = dict((self._get_fk_info_from_model(fk), fk) + for fk in model_tables[table].foreign_keys) + fk_models_set = set(fk_models.keys()) + for key in (fk_db_set - fk_models_set): + diff.append(('drop_key', fk_db[key], table, key)) + LOG.info(("Detected removed foreign key %(fk)r on " + "table %(table)r"), {'fk': fk_db[key], + 'table': table}) + for key in (fk_models_set - fk_db_set): + diff.append(('add_key', fk_models[key], key)) + LOG.info(( + "Detected added foreign key for column %(fk)r on table " + "%(table)r"), {'fk': fk_models[key].column.name, + 'table': table}) + return diff + + def _get_fk_info_from_db(self, fk): + return self.FKInfo(tuple(fk['constrained_columns']), + fk['referred_table'], + tuple(fk['referred_columns'])) + + def _get_fk_info_from_model(self, fk): + return self.FKInfo((fk.parent.name,), fk.column.table.name, + (fk.column.name,)) + + # Remove some difference that are not mistakes just specific of + # dialects, etc + def remove_unrelated_errors(self, element): + insp = sqlalchemy.engine.reflection.Inspector.from_engine( + self.get_engine()) + dialect = self.get_engine().dialect.name + if isinstance(element, tuple): + if dialect == 'mysql' and element[0] == 'remove_index': + table_name = element[1].table.name + for fk in insp.get_foreign_keys(table_name): + if fk['name'] == element[1].name: + return False + cols = [c.name for c in element[1].expressions] + for col in cols: + if col in insp.get_pk_constraint( + table_name)['constrained_columns']: + return False + else: + for modified, _, table, column, _, _, new in element: + if modified == 'modify_default' and dialect == 'mysql': + constrained = insp.get_pk_constraint(table) + if column in constrained['constrained_columns']: + return False + return True + +load_tests = testscenarios.load_tests_apply_scenarios + +_scenarios = [] +for plugin in CORE_PLUGINS: + plugin_name = plugin.split('.')[-1] + class_name = plugin_name + _scenarios.append((class_name, {'core_plugin': plugin})) + + +class TestModelsMigrationsMysql(_TestModelsMigrations, + test_base.MySQLOpportunisticTestCase): + scenarios = _scenarios + + +class TestModelsMigrationsPsql(_TestModelsMigrations, + test_base.PostgreSQLOpportunisticTestCase): + scenarios = _scenarios diff --git a/neutron/tests/unit/db/vpn/__init__.py b/neutron/tests/unit/db/vpn/__init__.py index f560154933f..e69de29bb2d 100644 --- a/neutron/tests/unit/db/vpn/__init__.py +++ b/neutron/tests/unit/db/vpn/__init__.py @@ -1,14 +0,0 @@ -# (c) Copyright 2013 Hewlett-Packard Development Company, L.P. -# 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. diff --git a/neutron/tests/unit/db/vpn/test_db_vpnaas.py b/neutron/tests/unit/db/vpn/test_db_vpnaas.py index 979240ed157..6f641df6d17 100644 --- a/neutron/tests/unit/db/vpn/test_db_vpnaas.py +++ b/neutron/tests/unit/db/vpn/test_db_vpnaas.py @@ -434,7 +434,7 @@ class VPNPluginDbTestCase(VPNTestMixin, service_plugins=service_plugins ) self._subnet_id = uuidutils.generate_uuid() - self.core_plugin = TestVpnCorePlugin + self.core_plugin = TestVpnCorePlugin() self.plugin = vpn_plugin.VPNPlugin() ext_mgr = api_extensions.PluginAwareExtensionManager( extensions_path, @@ -867,6 +867,55 @@ class TestVpnaas(VPNPluginDbTestCase): if k in expected), expected) + def test_delete_router_interface_in_use_by_vpnservice(self): + """Test delete router interface in use by vpn service.""" + with self.subnet(cidr='10.2.0.0/24') as subnet: + with self.router() as router: + with self.vpnservice(subnet=subnet, + router=router): + self._router_interface_action('remove', + router['router']['id'], + subnet['subnet']['id'], + None, + expected_code=webob.exc. + HTTPConflict.code) + + def test_delete_external_gateway_interface_in_use_by_vpnservice(self): + """Test delete external gateway interface in use by vpn service.""" + with self.subnet(cidr='10.2.0.0/24') as subnet: + with self.router() as router: + with self.subnet(cidr='11.0.0.0/24') as public_sub: + self._set_net_external( + public_sub['subnet']['network_id']) + self._add_external_gateway_to_router( + router['router']['id'], + public_sub['subnet']['network_id']) + with self.vpnservice(subnet=subnet, + router=router): + self._remove_external_gateway_from_router( + router['router']['id'], + public_sub['subnet']['network_id'], + expected_code=webob.exc.HTTPConflict.code) + + def test_router_update_after_ipsec_site_connection(self): + """Test case to update router after vpn connection.""" + rname1 = "router_one" + rname2 = "router_two" + with self.subnet(cidr='10.2.0.0/24') as subnet: + with self.router(name=rname1) as r: + with self.vpnservice(subnet=subnet, + router=r + ) as vpnservice: + self.ipsec_site_connection( + name='connection1', vpnservice=vpnservice + ) + body = self._show('routers', r['router']['id']) + self.assertEqual(body['router']['name'], rname1) + body = self._update('routers', r['router']['id'], + {'router': {'name': rname2}}) + body = self._show('routers', r['router']['id']) + self.assertEqual(body['router']['name'], rname2) + def test_update_vpnservice(self): """Test case to update a vpnservice.""" name = 'new_vpnservice1' diff --git a/neutron/tests/unit/embrane/__init__.py b/neutron/tests/unit/embrane/__init__.py index 5627edf2c91..e69de29bb2d 100644 --- a/neutron/tests/unit/embrane/__init__.py +++ b/neutron/tests/unit/embrane/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Embrane, 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. diff --git a/neutron/tests/unit/extensions/__init__.py b/neutron/tests/unit/extensions/__init__.py index 153622e504b..e69de29bb2d 100644 --- a/neutron/tests/unit/extensions/__init__.py +++ b/neutron/tests/unit/extensions/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2011 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/hyperv/__init__.py b/neutron/tests/unit/hyperv/__init__.py index 0089853d728..e69de29bb2d 100644 --- a/neutron/tests/unit/hyperv/__init__.py +++ b/neutron/tests/unit/hyperv/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Cloudbase Solutions SRL -# 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. diff --git a/neutron/tests/unit/linuxbridge/__init__.py b/neutron/tests/unit/linuxbridge/__init__.py index b706747cf8c..e69de29bb2d 100644 --- a/neutron/tests/unit/linuxbridge/__init__.py +++ b/neutron/tests/unit/linuxbridge/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/tests/unit/linuxbridge/test_agent_scheduler.py b/neutron/tests/unit/linuxbridge/test_agent_scheduler.py deleted file mode 100644 index 397baaf5c2e..00000000000 --- a/neutron/tests/unit/linuxbridge/test_agent_scheduler.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2013 OpenStack Foundation. -# -# 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 neutron.tests.unit.linuxbridge import test_linuxbridge_plugin -from neutron.tests.unit.openvswitch import test_agent_scheduler - - -class LbAgentSchedulerTestCase( - test_agent_scheduler.OvsAgentSchedulerTestCase): - plugin_str = test_linuxbridge_plugin.PLUGIN_NAME - l3_plugin = None - - -class LbL3AgentNotifierTestCase( - test_agent_scheduler.OvsL3AgentNotifierTestCase): - plugin_str = test_linuxbridge_plugin.PLUGIN_NAME - l3_plugin = None - - -class LbDhcpAgentNotifierTestCase( - test_agent_scheduler.OvsDhcpAgentNotifierTestCase): - plugin_str = test_linuxbridge_plugin.PLUGIN_NAME diff --git a/neutron/tests/unit/linuxbridge/test_lb_db.py b/neutron/tests/unit/linuxbridge/test_lb_db.py deleted file mode 100644 index f432482103f..00000000000 --- a/neutron/tests/unit/linuxbridge/test_lb_db.py +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright (c) 2012 OpenStack Foundation. -# -# 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.config import cfg -from six import moves -import testtools -from testtools import matchers - -from neutron.common import exceptions as n_exc -from neutron.db import api as db -from neutron.plugins.linuxbridge.db import l2network_db_v2 as lb_db -from neutron.tests.unit import test_db_plugin as test_plugin -from neutron.tests.unit import testlib_api - -PHYS_NET = 'physnet1' -PHYS_NET_2 = 'physnet2' -VLAN_MIN = 10 -VLAN_MAX = 19 -VLAN_RANGES = {PHYS_NET: [(VLAN_MIN, VLAN_MAX)]} -UPDATED_VLAN_RANGES = {PHYS_NET: [(VLAN_MIN + 5, VLAN_MAX + 5)], - PHYS_NET_2: [(VLAN_MIN + 20, VLAN_MAX + 20)]} - -PLUGIN_NAME = ('neutron.plugins.linuxbridge.' - 'lb_neutron_plugin.LinuxBridgePluginV2') - - -class NetworkStatesTest(testlib_api.SqlTestCase): - def setUp(self): - super(NetworkStatesTest, self).setUp() - lb_db.sync_network_states(VLAN_RANGES) - self.session = db.get_session() - - def test_sync_network_states(self): - self.assertIsNone(lb_db.get_network_state(PHYS_NET, - VLAN_MIN - 1)) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MIN).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MIN + 1).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MAX - 1).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MAX).allocated) - self.assertIsNone(lb_db.get_network_state(PHYS_NET, - VLAN_MAX + 1)) - - lb_db.sync_network_states(UPDATED_VLAN_RANGES) - - self.assertIsNone(lb_db.get_network_state(PHYS_NET, - VLAN_MIN + 5 - 1)) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MIN + 5).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MIN + 5 + 1).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MAX + 5 - 1).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MAX + 5).allocated) - self.assertIsNone(lb_db.get_network_state(PHYS_NET, - VLAN_MAX + 5 + 1)) - - self.assertIsNone(lb_db.get_network_state(PHYS_NET_2, - VLAN_MIN + 20 - 1)) - self.assertFalse(lb_db.get_network_state(PHYS_NET_2, - VLAN_MIN + 20).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET_2, - VLAN_MIN + 20 + 1).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET_2, - VLAN_MAX + 20 - 1).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET_2, - VLAN_MAX + 20).allocated) - self.assertIsNone(lb_db.get_network_state(PHYS_NET_2, - VLAN_MAX + 20 + 1)) - - lb_db.sync_network_states(VLAN_RANGES) - - self.assertIsNone(lb_db.get_network_state(PHYS_NET, - VLAN_MIN - 1)) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MIN).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MIN + 1).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MAX - 1).allocated) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - VLAN_MAX).allocated) - self.assertIsNone(lb_db.get_network_state(PHYS_NET, - VLAN_MAX + 1)) - - self.assertIsNone(lb_db.get_network_state(PHYS_NET_2, - VLAN_MIN + 20)) - self.assertIsNone(lb_db.get_network_state(PHYS_NET_2, - VLAN_MAX + 20)) - - def test_network_pool(self): - vlan_ids = set() - for x in moves.xrange(VLAN_MIN, VLAN_MAX + 1): - physical_network, vlan_id = lb_db.reserve_network(self.session) - self.assertEqual(physical_network, PHYS_NET) - self.assertThat(vlan_id, matchers.GreaterThan(VLAN_MIN - 1)) - self.assertThat(vlan_id, matchers.LessThan(VLAN_MAX + 1)) - vlan_ids.add(vlan_id) - - with testtools.ExpectedException(n_exc.NoNetworkAvailable): - physical_network, vlan_id = lb_db.reserve_network(self.session) - - for vlan_id in vlan_ids: - lb_db.release_network(self.session, PHYS_NET, vlan_id, VLAN_RANGES) - - def test_specific_network_inside_pool(self): - vlan_id = VLAN_MIN + 5 - self.assertFalse(lb_db.get_network_state(PHYS_NET, - vlan_id).allocated) - lb_db.reserve_specific_network(self.session, PHYS_NET, vlan_id) - self.assertTrue(lb_db.get_network_state(PHYS_NET, - vlan_id).allocated) - - with testtools.ExpectedException(n_exc.VlanIdInUse): - lb_db.reserve_specific_network(self.session, PHYS_NET, vlan_id) - - lb_db.release_network(self.session, PHYS_NET, vlan_id, VLAN_RANGES) - self.assertFalse(lb_db.get_network_state(PHYS_NET, - vlan_id).allocated) - - def test_specific_network_outside_pool(self): - vlan_id = VLAN_MAX + 5 - self.assertIsNone(lb_db.get_network_state(PHYS_NET, vlan_id)) - lb_db.reserve_specific_network(self.session, PHYS_NET, vlan_id) - self.assertTrue(lb_db.get_network_state(PHYS_NET, - vlan_id).allocated) - - with testtools.ExpectedException(n_exc.VlanIdInUse): - lb_db.reserve_specific_network(self.session, PHYS_NET, vlan_id) - - lb_db.release_network(self.session, PHYS_NET, vlan_id, VLAN_RANGES) - self.assertIsNone(lb_db.get_network_state(PHYS_NET, vlan_id)) - - -class NetworkBindingsTest(test_plugin.NeutronDbPluginV2TestCase): - def setUp(self): - cfg.CONF.set_override('network_vlan_ranges', ['physnet1:1000:2999'], - group='VLANS') - super(NetworkBindingsTest, self).setUp(plugin=PLUGIN_NAME) - self.session = db.get_session() - - def test_add_network_binding(self): - params = {'provider:network_type': 'vlan', - 'provider:physical_network': PHYS_NET, - 'provider:segmentation_id': 1234} - params['arg_list'] = tuple(params.keys()) - with self.network(**params) as network: - TEST_NETWORK_ID = network['network']['id'] - binding = lb_db.get_network_binding(self.session, TEST_NETWORK_ID) - self.assertIsNotNone(binding) - self.assertEqual(binding.network_id, TEST_NETWORK_ID) - self.assertEqual(binding.physical_network, PHYS_NET) - self.assertEqual(binding.vlan_id, 1234) diff --git a/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py b/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py index adc3822db39..1a2bbc4d2e4 100644 --- a/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py +++ b/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py @@ -377,10 +377,10 @@ class TestLinuxBridgeManager(base.BaseTestCase): def test_get_tap_device_name(self): if_id = "123456789101112" self.assertEqual(self.lbm.get_tap_device_name(if_id), - "tap" + if_id[0:11]) + constants.TAP_DEVICE_PREFIX + if_id[0:11]) if_id = "" self.assertEqual(self.lbm.get_tap_device_name(if_id), - "tap") + constants.TAP_DEVICE_PREFIX) def test_get_vxlan_device_name(self): vn_id = constants.MAX_VXLAN_VNI diff --git a/neutron/tests/unit/linuxbridge/test_lb_security_group.py b/neutron/tests/unit/linuxbridge/test_lb_security_group.py deleted file mode 100644 index e930092dbc7..00000000000 --- a/neutron/tests/unit/linuxbridge/test_lb_security_group.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2012, Nachi Ueno, NTT MCL, 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.api.v2 import attributes -from neutron.extensions import securitygroup as ext_sg -from neutron.plugins.linuxbridge.db import l2network_db_v2 as lb_db -from neutron.tests.unit import test_extension_security_group as test_sg -from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc - - -PLUGIN_NAME = ('neutron.plugins.linuxbridge.' - 'lb_neutron_plugin.LinuxBridgePluginV2') -NOTIFIER = ('neutron.plugins.linuxbridge.' - 'lb_neutron_plugin.AgentNotifierApi') - - -class LinuxBridgeSecurityGroupsTestCase(test_sg.SecurityGroupDBTestCase): - _plugin_name = PLUGIN_NAME - - def setUp(self, plugin=None): - test_sg_rpc.set_firewall_driver(test_sg_rpc.FIREWALL_IPTABLES_DRIVER) - notifier_p = mock.patch(NOTIFIER) - notifier_cls = notifier_p.start() - self.notifier = mock.Mock() - notifier_cls.return_value = self.notifier - self._attribute_map_bk_ = {} - for item in attributes.RESOURCE_ATTRIBUTE_MAP: - self._attribute_map_bk_[item] = (attributes. - RESOURCE_ATTRIBUTE_MAP[item]. - copy()) - super(LinuxBridgeSecurityGroupsTestCase, self).setUp(PLUGIN_NAME) - - def tearDown(self): - attributes.RESOURCE_ATTRIBUTE_MAP = self._attribute_map_bk_ - super(LinuxBridgeSecurityGroupsTestCase, self).tearDown() - - -class TestLinuxBridgeSecurityGroups(LinuxBridgeSecurityGroupsTestCase, - test_sg.TestSecurityGroups, - test_sg_rpc.SGNotificationTestMixin): - pass - - -class TestLinuxBridgeSecurityGroupsXML(TestLinuxBridgeSecurityGroups): - fmt = 'xml' - - -class TestLinuxBridgeSecurityGroupsDB(LinuxBridgeSecurityGroupsTestCase): - def test_security_group_get_port_from_device(self): - with self.network() as n: - with self.subnet(n): - with self.security_group() as sg: - security_group_id = sg['security_group']['id'] - res = self._create_port(self.fmt, n['network']['id']) - port = self.deserialize(self.fmt, res) - fixed_ips = port['port']['fixed_ips'] - data = {'port': {'fixed_ips': fixed_ips, - 'name': port['port']['name'], - ext_sg.SECURITYGROUPS: - [security_group_id]}} - - req = self.new_update_request('ports', data, - port['port']['id']) - res = self.deserialize(self.fmt, - req.get_response(self.api)) - port_id = res['port']['id'] - device_id = port_id[:8] - port_dict = lb_db.get_port_from_device(device_id) - self.assertEqual(port_id, port_dict['id']) - self.assertEqual([security_group_id], - port_dict[ext_sg.SECURITYGROUPS]) - self.assertEqual([], port_dict['security_group_rules']) - self.assertEqual([fixed_ips[0]['ip_address']], - port_dict['fixed_ips']) - self._delete('ports', port['port']['id']) - - def test_security_group_get_port_from_device_with_no_port(self): - port_dict = lb_db.get_port_from_device('bad_device_id') - self.assertIsNone(port_dict) - - -class TestLinuxBridgeSecurityGroupsDBXML(TestLinuxBridgeSecurityGroupsDB): - fmt = 'xml' diff --git a/neutron/tests/unit/linuxbridge/test_linuxbridge_plugin.py b/neutron/tests/unit/linuxbridge/test_linuxbridge_plugin.py deleted file mode 100644 index 0572336af53..00000000000 --- a/neutron/tests/unit/linuxbridge/test_linuxbridge_plugin.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (c) 2012 OpenStack Foundation. -# -# 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 oslo.config import cfg - -from neutron.common import constants as q_const -from neutron.extensions import portbindings -from neutron import manager -from neutron.plugins.linuxbridge import lb_neutron_plugin -from neutron.tests.unit import _test_extension_portbindings as test_bindings -from neutron.tests.unit import test_db_plugin as test_plugin -from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc - -PLUGIN_NAME = ('neutron.plugins.linuxbridge.' - 'lb_neutron_plugin.LinuxBridgePluginV2') - - -class LinuxBridgePluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase): - _plugin_name = PLUGIN_NAME - - def setUp(self): - super(LinuxBridgePluginV2TestCase, self).setUp(PLUGIN_NAME) - self.port_create_status = 'DOWN' - - -class TestLinuxBridgeBasicGet(test_plugin.TestBasicGet, - LinuxBridgePluginV2TestCase): - pass - - -class TestLinuxBridgeV2HTTPResponse(test_plugin.TestV2HTTPResponse, - LinuxBridgePluginV2TestCase): - pass - - -class TestLinuxBridgeNetworksV2(test_plugin.TestNetworksV2, - LinuxBridgePluginV2TestCase): - pass - - -class TestLinuxBridgePortsV2(test_plugin.TestPortsV2, - LinuxBridgePluginV2TestCase): - - def test_update_port_status_build(self): - with self.port() as port: - self.assertEqual(port['port']['status'], 'DOWN') - self.assertEqual(self.port_create_status, 'DOWN') - - -class TestLinuxBridgePortBinding(LinuxBridgePluginV2TestCase, - test_bindings.PortBindingsTestCase): - VIF_TYPE = portbindings.VIF_TYPE_BRIDGE - HAS_PORT_FILTER = True - ENABLE_SG = True - FIREWALL_DRIVER = test_sg_rpc.FIREWALL_IPTABLES_DRIVER - - def setUp(self): - test_sg_rpc.set_firewall_driver(self.FIREWALL_DRIVER) - cfg.CONF.set_override( - 'enable_security_group', self.ENABLE_SG, - group='SECURITYGROUP') - super(TestLinuxBridgePortBinding, self).setUp() - - -class TestLinuxBridgePortBindingNoSG(TestLinuxBridgePortBinding): - HAS_PORT_FILTER = False - ENABLE_SG = False - FIREWALL_DRIVER = test_sg_rpc.FIREWALL_NOOP_DRIVER - - -class TestLinuxBridgePortBindingHost( - LinuxBridgePluginV2TestCase, - test_bindings.PortBindingsHostTestCaseMixin): - pass - - -class TestLinuxBridgePluginRpcCallbacks(test_plugin.NeutronDbPluginV2TestCase): - def setUp(self): - super(TestLinuxBridgePluginRpcCallbacks, self).setUp(PLUGIN_NAME) - self.callbacks = lb_neutron_plugin.LinuxBridgeRpcCallbacks() - - def test_update_device_down(self): - with mock.patch.object(manager.NeutronManager, "get_plugin") as gp: - plugin = gp.return_value - plugin.get_port_from_device.return_value = None - self.assertEqual( - self.callbacks.update_device_down("fake_context", - agent_id="123", - device="device", - host="host"), - {'device': 'device', 'exists': False} - ) - plugin.get_port_from_device.return_value = { - 'id': 'fakeid', - 'status': q_const.PORT_STATUS_ACTIVE} - self.assertEqual( - self.callbacks.update_device_down("fake_context", - agent_id="123", - device="device", - host="host"), - {'device': 'device', 'exists': True} - ) - - def test_update_device_up(self): - with mock.patch.object(manager.NeutronManager, "get_plugin") as gp: - plugin = gp.return_value - plugin.get_port_from_device.return_value = { - 'id': 'fakeid', - 'status': q_const.PORT_STATUS_ACTIVE} - self.callbacks.update_device_up("fake_context", - agent_id="123", - device="device", - host="host") - plugin.get_port_from_device.assert_called_once_with('device') diff --git a/neutron/tests/unit/linuxbridge/test_rpcapi.py b/neutron/tests/unit/linuxbridge/test_rpcapi.py deleted file mode 100644 index ee2972f67e6..00000000000 --- a/neutron/tests/unit/linuxbridge/test_rpcapi.py +++ /dev/null @@ -1,143 +0,0 @@ -# Copyright 2012, 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. - -""" -Unit Tests for linuxbridge rpc -""" - -import fixtures -from oslo.config import cfg - -from neutron.agent import rpc as agent_rpc -from neutron.common import topics -from neutron.openstack.common import context -from neutron.plugins.linuxbridge import lb_neutron_plugin as plb -from neutron.tests import base - - -class rpcApiTestCase(base.BaseTestCase): - def _test_lb_api(self, rpcapi, topic, method, rpc_method, - expected_msg=None, **kwargs): - ctxt = context.RequestContext('fake_user', 'fake_project') - expected_retval = 'foo' if method == 'call' else None - expected_kwargs = {} - if topic: - expected_kwargs['topic'] = topic - if 'version' in kwargs: - expected_kwargs['version'] = kwargs.pop('version') - if not expected_msg: - expected_msg = rpcapi.make_msg(method, **kwargs) - if rpc_method == 'cast' and method == 'run_instance': - kwargs['call'] = False - - self.fake_args = None - self.fake_kwargs = None - - def _fake_rpc_method(*args, **kwargs): - self.fake_args = args - self.fake_kwargs = kwargs - if expected_retval: - return expected_retval - - self.useFixture(fixtures.MonkeyPatch( - 'neutron.common.rpc.RpcProxy.' + rpc_method, - _fake_rpc_method)) - - retval = getattr(rpcapi, method)(ctxt, **kwargs) - - self.assertEqual(expected_retval, retval) - expected_args = [ctxt, expected_msg] - - # skip the first argument which is 'self' - for arg, expected_arg in zip(self.fake_args[1:], expected_args): - self.assertEqual(expected_arg, arg) - self.assertEqual(expected_kwargs, self.fake_kwargs) - - def test_delete_network(self): - rpcapi = plb.AgentNotifierApi(topics.AGENT) - self._test_lb_api(rpcapi, - topics.get_topic_name(topics.AGENT, - topics.NETWORK, - topics.DELETE), - 'network_delete', rpc_method='fanout_cast', - network_id='fake_request_spec') - - def test_port_update(self): - cfg.CONF.set_override('rpc_support_old_agents', False, 'AGENT') - rpcapi = plb.AgentNotifierApi(topics.AGENT) - expected_msg = rpcapi.make_msg('port_update', - port='fake_port', - network_type='vlan', - physical_network='fake_net', - segmentation_id='fake_vlan_id') - self._test_lb_api(rpcapi, - topics.get_topic_name(topics.AGENT, - topics.PORT, - topics.UPDATE), - 'port_update', rpc_method='fanout_cast', - expected_msg=expected_msg, - port='fake_port', - physical_network='fake_net', - vlan_id='fake_vlan_id') - - def test_port_update_old_agent(self): - cfg.CONF.set_override('rpc_support_old_agents', True, 'AGENT') - rpcapi = plb.AgentNotifierApi(topics.AGENT) - expected_msg = rpcapi.make_msg('port_update', - port='fake_port', - network_type='vlan', - physical_network='fake_net', - segmentation_id='fake_vlan_id', - vlan_id='fake_vlan_id') - self._test_lb_api(rpcapi, - topics.get_topic_name(topics.AGENT, - topics.PORT, - topics.UPDATE), - 'port_update', rpc_method='fanout_cast', - expected_msg=expected_msg, - port='fake_port', - physical_network='fake_net', - vlan_id='fake_vlan_id') - - def test_device_details(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_lb_api(rpcapi, None, - 'get_device_details', rpc_method='call', - device='fake_device', - agent_id='fake_agent_id', - host='fake_host') - - def test_devices_details_list(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_lb_api(rpcapi, None, - 'get_devices_details_list', rpc_method='call', - devices=['fake_device1', 'fake_device2'], - agent_id='fake_agent_id', host='fake_host', - version='1.3') - - def test_update_device_down(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_lb_api(rpcapi, None, - 'update_device_down', rpc_method='call', - device='fake_device', - agent_id='fake_agent_id', - host='fake_host') - - def test_update_device_up(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_lb_api(rpcapi, None, - 'update_device_up', rpc_method='call', - device='fake_device', - agent_id='fake_agent_id', - host='fake_host') diff --git a/neutron/tests/unit/metaplugin/__init__.py b/neutron/tests/unit/metaplugin/__init__.py index 65685178bf2..e69de29bb2d 100644 --- a/neutron/tests/unit/metaplugin/__init__.py +++ b/neutron/tests/unit/metaplugin/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2012, Nachi Ueno, NTT MCL, 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. diff --git a/neutron/tests/unit/midonet/__init__.py b/neutron/tests/unit/midonet/__init__.py index e2cc2a75b7b..e69de29bb2d 100644 --- a/neutron/tests/unit/midonet/__init__.py +++ b/neutron/tests/unit/midonet/__init__.py @@ -1,15 +0,0 @@ -# Copyright (C) 2012 Midokura Japan K.K. -# Copyright (C) 2013 Midokura PTE LTD -# 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. diff --git a/neutron/tests/unit/midonet/test_midonet_lib.py b/neutron/tests/unit/midonet/test_midonet_lib.py index 9f456a87091..b581493ea52 100644 --- a/neutron/tests/unit/midonet/test_midonet_lib.py +++ b/neutron/tests/unit/midonet/test_midonet_lib.py @@ -92,14 +92,18 @@ class MidoClientTestCase(testtools.TestCase): def test_delete_dhcp(self): bridge = mock.Mock() - subnet = mock.Mock() - subnet.get_subnet_prefix.return_value = "10.0.0.0" - subnets = mock.MagicMock(return_value=[subnet]) + subnet1 = mock.Mock() + subnet1.get_subnet_prefix.return_value = "10.0.0.0" + subnet1.get_subnet_length.return_value = "16" + subnet2 = mock.Mock() + subnet2.get_subnet_prefix.return_value = "10.0.0.0" + subnet2.get_subnet_length.return_value = "24" + subnets = mock.MagicMock(return_value=[subnet1, subnet2]) bridge.get_dhcp_subnets.side_effect = subnets self.client.delete_dhcp(bridge, "10.0.0.0/24") bridge.assert_has_calls(mock.call.get_dhcp_subnets) - subnet.assert_has_calls([mock.call.get_subnet_prefix(), - mock.call.delete()]) + self.assertFalse(subnet1.delete.called) + subnet2.delete.assert_called_once_with() def test_add_dhcp_host(self): diff --git a/neutron/tests/unit/ml2/__init__.py b/neutron/tests/unit/ml2/__init__.py index 788cea1f70b..e69de29bb2d 100644 --- a/neutron/tests/unit/ml2/__init__.py +++ b/neutron/tests/unit/ml2/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/tests/unit/ml2/drivers/__init__.py b/neutron/tests/unit/ml2/drivers/__init__.py index 788cea1f70b..e69de29bb2d 100644 --- a/neutron/tests/unit/ml2/drivers/__init__.py +++ b/neutron/tests/unit/ml2/drivers/__init__.py @@ -1,14 +0,0 @@ -# Copyright (c) 2013 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. diff --git a/neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py b/neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py index b2a2989b644..dc3f29a3c9d 100644 --- a/neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py +++ b/neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py @@ -391,3 +391,66 @@ class AristaL3DriverTestCases_MLAG_v6(base.BaseTestCase): 'ip_version': 6} self.assertFalse(self.drv.remove_router_interface(None, router)) + + +class AristaL3DriverTestCasesMlag_one_switch_failed(base.BaseTestCase): + """Test cases to test with non redundant hardare in redundancy mode. + + In the following test cases, the driver is configured in MLAG (redundancy + mode) but, one of the switches is mocked to throw exceptoin to mimic + failure of the switch. Ensure that the the operation does not fail when + one of the switches fails. + """ + + def setUp(self): + super(AristaL3DriverTestCasesMlag_one_switch_failed, self).setUp() + setup_arista_config('value', mlag=True) + self.drv = arista.AristaL3Driver() + self.drv._servers = [] + self.drv._servers.append(mock.MagicMock()) + self.drv._servers.append(mock.MagicMock()) + + def test_create_router_when_one_switch_fails(self): + router = {} + router['name'] = 'test-router-1' + tenant = '123' + + # Make one of the switches throw an exception - i.e. fail + self.drv._servers[0].runCmds = mock.Mock(side_effect=Exception) + self.drv.create_router(None, tenant, router) + + def test_delete_router_when_one_switch_fails(self): + router = {} + router['name'] = 'test-router-1' + tenant = '123' + router_id = '345' + + # Make one of the switches throw an exception - i.e. fail + self.drv._servers[1].runCmds = mock.Mock(side_effect=Exception) + self.drv.delete_router(None, tenant, router_id, router) + + def test_add_router_interface_when_one_switch_fails(self): + router = {} + router['name'] = 'test-router-1' + router['tenant_id'] = 'ten-1' + router['seg_id'] = '100' + router['ip_version'] = 4 + router['cidr'] = '10.10.10.0/24' + router['gip'] = '10.10.10.1' + + # Make one of the switches throw an exception - i.e. fail + self.drv._servers[1].runCmds = mock.Mock(side_effect=Exception) + self.drv.add_router_interface(None, router) + + def test_remove_router_interface_when_one_switch_fails(self): + router = {} + router['name'] = 'test-router-1' + router['tenant_id'] = 'ten-1' + router['seg_id'] = '100' + router['ip_version'] = 4 + router['cidr'] = '10.10.10.0/24' + router['gip'] = '10.10.10.1' + + # Make one of the switches throw an exception - i.e. fail + self.drv._servers[0].runCmds = mock.Mock(side_effect=Exception) + self.drv.remove_router_interface(None, router) diff --git a/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py b/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py index 7c41361bf34..e2f50716ce8 100644 --- a/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py +++ b/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py @@ -68,10 +68,11 @@ class TestCiscoApicMechDriver(base.BaseTestCase, self.driver.apic_manager.apic.transaction = self.fake_transaction def test_initialize(self): - mgr = self.driver.apic_manager self.driver.initialize() - mgr.ensure_infra_created_on_apic.assert_called_once() - mgr.ensure_bgp_pod_policy_created_on_apic.assert_called_once() + mgr = self.driver.apic_manager + self.assertEqual(1, mgr.ensure_infra_created_on_apic.call_count) + self.assertEqual(1, + mgr.ensure_bgp_pod_policy_created_on_apic.call_count) def test_update_port_postcommit(self): net_ctx = self._get_network_context(mocked.APIC_TENANT, @@ -99,7 +100,7 @@ class TestCiscoApicMechDriver(base.BaseTestCase, self.driver.update_port_postcommit(port_ctx) mgr.get_router_contract.assert_called_once_with( port_ctx.current['device_id']) - mgr.ensure_context_enforced.assert_called_once() + self.assertEqual(1, mgr.ensure_context_enforced.call_count) mgr.ensure_external_routed_network_created.assert_called_once_with( mocked.APIC_NETWORK, transaction='transaction') mgr.ensure_logical_node_profile_created.assert_called_once_with( @@ -119,17 +120,6 @@ class TestCiscoApicMechDriver(base.BaseTestCase, mocked.APIC_NETWORK, mgr.get_router_contract.return_value, transaction='transaction') - def test_update_gw_port_postcommit_fail_contract_create(self): - net_ctx = self._get_network_context(mocked.APIC_TENANT, - mocked.APIC_NETWORK, - TEST_SEGMENT1, external=True) - port_ctx = self._get_port_context(mocked.APIC_TENANT, - mocked.APIC_NETWORK, - 'vm1', net_ctx, HOST_ID1, gw=True) - mgr = self.driver.apic_manager - self.driver.update_port_postcommit(port_ctx) - mgr.ensure_external_routed_network_deleted.assert_called_once() - def test_create_network_postcommit(self): ctx = self._get_network_context(mocked.APIC_TENANT, mocked.APIC_NETWORK, diff --git a/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py b/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py index 3780e57de21..b687f478883 100644 --- a/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py +++ b/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py @@ -62,10 +62,10 @@ class TestCiscoApicSync(base.BaseTestCase): sync.core_plugin.get_ports.return_value = [{'id': 'port', 'network_id': 'net'}] sync.sync_base() - self.driver.create_network_postcommit.assert_called_once() - self.driver.create_subnet_postcommit.assert_called_once() - self.get_locked_port_and_binding.assert_called_once() - self.driver.create_port_postcommit.assert_called_once() + self.assertEqual(1, self.driver.create_network_postcommit.call_count) + self.assertEqual(1, self.driver.create_subnet_postcommit.call_count) + self.assertEqual(1, self.get_locked_port_and_binding.call_count) + self.assertEqual(1, self.driver.create_port_postcommit.call_count) def test_sync_router(self): sync = apic_sync.ApicRouterSynchronizer(self.driver) @@ -74,4 +74,5 @@ class TestCiscoApicSync(base.BaseTestCase): 'network_id': 'net', 'device_id': 'dev'}] sync.sync_router() - self.driver.add_router_interface_postcommit.assert_called_once() + self.assertEqual( + 1, self.driver.add_router_interface_postcommit.call_count) diff --git a/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py b/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py index e7d7d45835f..2f355f6a371 100644 --- a/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py +++ b/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py @@ -354,61 +354,45 @@ class TestCiscoPortsV2(CiscoML2MechanismTestCase, def test_nexus_enable_vlan_cmd(self): """Verify the syntax of the command to enable a vlan on an intf. + Test of the following ml2_conf_cisco_ini config: + [ml2_mech_cisco_nexus:1.1.1.1] + hostA=1/1 + hostB=1/2 (second pass only) + where vlan_id = 100 + Confirm that for the first VLAN configured on a Nexus interface, the command string sent to the switch does not contain the keyword 'add'. Confirm that for the second VLAN configured on a Nexus interface, - the command string sent to the switch contains the keyword 'add'. + the command string sent to the switch contains the keyword 'add' + if it is on the same host. Confirm it does not contain the + keyword 'add' when on different hosts. """ - # First vlan should be configured without 'add' keyword - with self._create_resources(): - self.assertTrue(self._is_vlan_configured( - vlan_creation_expected=True, - add_keyword_expected=False)) - self.mock_ncclient.reset_mock() - self.mock_bound_segment.return_value = BOUND_SEGMENT2 - - # Second vlan should be configured with 'add' keyword - with self._create_resources(name=NETWORK_NAME_2, - device_id=DEVICE_ID_2, - cidr=CIDR_2): + hosts = [COMP_HOST_NAME, COMP_HOST_NAME_2] + for host in hosts: + # First vlan should be configured without 'add' keyword + with self._create_resources(): self.assertTrue(self._is_vlan_configured( vlan_creation_expected=True, - add_keyword_expected=True)) + add_keyword_expected=False)) + self.mock_ncclient.reset_mock() + self.mock_bound_segment.return_value = BOUND_SEGMENT2 - # Return to first segment for delete port calls. - self.mock_bound_segment.return_value = BOUND_SEGMENT1 + # Second vlan should be configured with 'add' keyword + # when on a single host. + with self._create_resources(name=NETWORK_NAME_2, + device_id=DEVICE_ID_2, + cidr=CIDR_2, + host_id=host): + self.assertTrue(self._is_vlan_configured( + vlan_creation_expected=True, + add_keyword_expected=(host == COMP_HOST_NAME) + )) - def test_nexus_add_trunk(self): - """Verify syntax to enable a vlan on an interface. - - Test also verifies that the vlan interface is not created. - - Test of the following ml2_conf_cisco_ini config: - [ml2_mech_cisco_nexus:1.1.1.1] - hostA=1/1 - hostB=1/2 - where vlan_id = 100 - - Confirm that for the first host configured on a Nexus interface, - the command string sent to the switch does not contain the - keyword 'add'. - - Confirm that for the second host configured on a Nexus interface, - the command staring sent to the switch contains does not contain - the keyword 'name' [signifies vlan intf creation]. - - """ - with self._create_resources(name='net1', cidr=CIDR_1): - self.assertTrue(self._is_in_last_nexus_cfg(['allowed', 'vlan'])) - self.assertFalse(self._is_in_last_nexus_cfg(['add'])) - with self._create_resources(name='net2', - cidr=CIDR_2, host_id=COMP_HOST_NAME_2): - self.assertTrue( - self._is_in_last_nexus_cfg(['allowed', 'vlan'])) - self.assertFalse(self._is_in_last_nexus_cfg(['name'])) + # Return to first segment for delete port calls. + self.mock_bound_segment.return_value = BOUND_SEGMENT1 def test_ncclient_version_detect(self): """Test ability to handle connection to old and new-style ncclient. diff --git a/neutron/tests/unit/ml2/drivers/test_l2population.py b/neutron/tests/unit/ml2/drivers/test_l2population.py index cfe76d3a576..85d8b37a731 100644 --- a/neutron/tests/unit/ml2/drivers/test_l2population.py +++ b/neutron/tests/unit/ml2/drivers/test_l2population.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +import contextlib import mock from neutron.common import constants @@ -24,6 +25,7 @@ from neutron.extensions import providernet as pnet from neutron import manager from neutron.openstack.common import timeutils from neutron.plugins.ml2 import config as config +from neutron.plugins.ml2.drivers.l2pop import mech_driver as l2pop_mech_driver from neutron.plugins.ml2 import managers from neutron.plugins.ml2 import rpc from neutron.tests.unit import test_db_plugin as test_plugin @@ -794,3 +796,17 @@ class TestL2PopulationRpcTestCase(test_plugin.NeutronDbPluginV2TestCase): self.mock_fanout.assert_called_with( mock.ANY, expected, topic=self.fanout_topic) + + def test_delete_port_invokes_update_device_down(self): + l2pop_mech = l2pop_mech_driver.L2populationMechanismDriver() + l2pop_mech.L2PopulationAgentNotify = mock.Mock() + l2pop_mech.rpc_ctx = mock.Mock() + with contextlib.nested( + mock.patch.object(l2pop_mech, + '_update_port_down', + return_value=None), + mock.patch.object(l2pop_mech.L2PopulationAgentNotify, + 'remove_fdb_entries')) as (upd_port_down, + rem_fdb_entries): + l2pop_mech.delete_port_postcommit(mock.Mock()) + self.assertTrue(upd_port_down.called) \ No newline at end of file diff --git a/neutron/tests/unit/ml2/test_mechanism_odl.py b/neutron/tests/unit/ml2/test_mechanism_odl.py index 3679f9f1fd0..8d87eb5a619 100644 --- a/neutron/tests/unit/ml2/test_mechanism_odl.py +++ b/neutron/tests/unit/ml2/test_mechanism_odl.py @@ -16,6 +16,7 @@ import mock import requests +from neutron.openstack.common import jsonutils from neutron.plugins.common import constants from neutron.plugins.ml2 import config as config from neutron.plugins.ml2 import driver_api as api @@ -121,11 +122,27 @@ class OpenDaylightMechanismTestPortsV2(test_plugin.TestPortsV2, class AuthMatcher(object): + def __eq__(self, obj): return (obj.username == config.cfg.CONF.ml2_odl.username and obj.password == config.cfg.CONF.ml2_odl.password) +class DataMatcher(object): + + def __init__(self, operation, object_type, context): + self._data = context.current.copy() + self._object_type = object_type + filter_map = getattr(mechanism_odl.OpenDaylightMechanismDriver, + '%s_object_map' % operation) + attr_filter = filter_map["%ss" % object_type] + attr_filter(self._data, context) + + def __eq__(self, s): + data = jsonutils.loads(s) + return self._data == data[self._object_type] + + class OpenDaylightMechanismDriverTestCase(base.BaseTestCase): def setUp(self): @@ -139,18 +156,80 @@ class OpenDaylightMechanismDriverTestCase(base.BaseTestCase): self.mech.initialize() @staticmethod - def _get_mock_delete_resource_context(): - current = {'id': '00000000-1111-2222-3333-444444444444'} + def _get_mock_network_operation_context(): + current = {'status': 'ACTIVE', + 'subnets': [], + 'name': 'net1', + 'provider:physical_network': None, + 'admin_state_up': True, + 'tenant_id': 'test-tenant', + 'provider:network_type': 'local', + 'router:external': False, + 'shared': False, + 'id': 'd897e21a-dfd6-4331-a5dd-7524fa421c3e', + 'provider:segmentation_id': None} context = mock.Mock(current=current) return context + @staticmethod + def _get_mock_subnet_operation_context(): + current = {'ipv6_ra_mode': None, + 'allocation_pools': [{'start': '10.0.0.2', + 'end': '10.0.1.254'}], + 'host_routes': [], + 'ipv6_address_mode': None, + 'cidr': '10.0.0.0/23', + 'id': '72c56c48-e9b8-4dcf-b3a7-0813bb3bd839', + 'name': '', + 'enable_dhcp': True, + 'network_id': 'd897e21a-dfd6-4331-a5dd-7524fa421c3e', + 'tenant_id': 'test-tenant', + 'dns_nameservers': [], + 'gateway_ip': '10.0.0.1', + 'ip_version': 4, + 'shared': False} + context = mock.Mock(current=current) + return context + + @staticmethod + def _get_mock_port_operation_context(): + current = {'status': 'DOWN', + 'binding:host_id': '', + 'allowed_address_pairs': [], + 'device_owner': 'fake_owner', + 'binding:profile': {}, + 'fixed_ips': [], + 'id': '72c56c48-e9b8-4dcf-b3a7-0813bb3bd839', + 'security_groups': ['2f9244b4-9bee-4e81-bc4a-3f3c2045b3d7'], + 'device_id': 'fake_device', + 'name': '', + 'admin_state_up': True, + 'network_id': 'c13bba05-eb07-45ba-ace2-765706b2d701', + 'tenant_id': 'bad_tenant_id', + 'binding:vif_details': {}, + 'binding:vnic_type': 'normal', + 'binding:vif_type': 'unbound', + 'mac_address': '12:34:56:78:21:b6'} + context = mock.Mock(current=current) + context._plugin.get_security_group = mock.Mock(return_value={}) + return context + + @classmethod + def _get_mock_operation_context(cls, object_type): + getter = getattr(cls, '_get_mock_%s_operation_context' % object_type) + return getter() + _status_code_msgs = { + 200: '', + 201: '', 204: '', + 400: '400 Client Error: Bad Request', 401: '401 Client Error: Unauthorized', 403: '403 Client Error: Forbidden', 404: '404 Client Error: Not Found', 409: '409 Client Error: Conflict', - 501: '501 Server Error: Not Implemented' + 501: '501 Server Error: Not Implemented', + 503: '503 Server Error: Service Unavailable', } @classmethod @@ -161,11 +240,9 @@ class OpenDaylightMechanismDriverTestCase(base.BaseTestCase): cls._status_code_msgs[status_code]))) return response - def _test_delete_resource_postcommit(self, object_type, status_code, - exc_class=None): + def _test_single_operation(self, method, context, status_code, + exc_class=None, *args, **kwargs): self.mech.out_of_sync = False - method = getattr(self.mech, 'delete_%s_postcommit' % object_type) - context = self._get_mock_delete_resource_context() request_response = self._get_mock_request_response(status_code) with mock.patch('requests.request', return_value=request_response) as mock_method: @@ -173,12 +250,105 @@ class OpenDaylightMechanismDriverTestCase(base.BaseTestCase): self.assertRaises(exc_class, method, context) else: method(context) + mock_method.assert_called_once_with( + headers={'Content-Type': 'application/json'}, auth=AuthMatcher(), + timeout=config.cfg.CONF.ml2_odl.timeout, *args, **kwargs) + + def _test_create_resource_postcommit(self, object_type, status_code, + exc_class=None): + method = getattr(self.mech, 'create_%s_postcommit' % object_type) + context = self._get_mock_operation_context(object_type) + url = '%s/%ss' % (config.cfg.CONF.ml2_odl.url, object_type) + kwargs = {'url': url, + 'data': DataMatcher('create', object_type, context)} + self._test_single_operation(method, context, status_code, exc_class, + 'post', **kwargs) + + def _test_update_resource_postcommit(self, object_type, status_code, + exc_class=None): + method = getattr(self.mech, 'update_%s_postcommit' % object_type) + context = self._get_mock_operation_context(object_type) url = '%s/%ss/%s' % (config.cfg.CONF.ml2_odl.url, object_type, context.current['id']) - mock_method.assert_called_once_with( - 'delete', url=url, headers={'Content-Type': 'application/json'}, - data=None, auth=AuthMatcher(), - timeout=config.cfg.CONF.ml2_odl.timeout) + kwargs = {'url': url, + 'data': DataMatcher('update', object_type, context)} + self._test_single_operation(method, context, status_code, exc_class, + 'put', **kwargs) + + def _test_delete_resource_postcommit(self, object_type, status_code, + exc_class=None): + method = getattr(self.mech, 'delete_%s_postcommit' % object_type) + context = self._get_mock_operation_context(object_type) + url = '%s/%ss/%s' % (config.cfg.CONF.ml2_odl.url, object_type, + context.current['id']) + kwargs = {'url': url, 'data': None} + self._test_single_operation(method, context, status_code, exc_class, + 'delete', **kwargs) + + def test_create_network_postcommit(self): + for status_code in (requests.codes.created, + requests.codes.bad_request): + self._test_create_resource_postcommit('network', status_code) + self._test_create_resource_postcommit( + 'network', requests.codes.unauthorized, + requests.exceptions.HTTPError) + + def test_create_subnet_postcommit(self): + for status_code in (requests.codes.created, + requests.codes.bad_request): + self._test_create_resource_postcommit('subnet', status_code) + for status_code in (requests.codes.unauthorized, + requests.codes.forbidden, + requests.codes.not_found, + requests.codes.conflict, + requests.codes.not_implemented): + self._test_create_resource_postcommit( + 'subnet', status_code, requests.exceptions.HTTPError) + + def test_create_port_postcommit(self): + for status_code in (requests.codes.created, + requests.codes.bad_request): + self._test_create_resource_postcommit('port', status_code) + for status_code in (requests.codes.unauthorized, + requests.codes.forbidden, + requests.codes.not_found, + requests.codes.conflict, + requests.codes.not_implemented, + requests.codes.service_unavailable): + self._test_create_resource_postcommit( + 'port', status_code, requests.exceptions.HTTPError) + + def test_update_network_postcommit(self): + for status_code in (requests.codes.ok, + requests.codes.bad_request): + self._test_update_resource_postcommit('network', status_code) + for status_code in (requests.codes.forbidden, + requests.codes.not_found): + self._test_update_resource_postcommit( + 'network', status_code, requests.exceptions.HTTPError) + + def test_update_subnet_postcommit(self): + for status_code in (requests.codes.ok, + requests.codes.bad_request): + self._test_update_resource_postcommit('subnet', status_code) + for status_code in (requests.codes.unauthorized, + requests.codes.forbidden, + requests.codes.not_found, + requests.codes.not_implemented): + self._test_update_resource_postcommit( + 'subnet', status_code, requests.exceptions.HTTPError) + + def test_update_port_postcommit(self): + for status_code in (requests.codes.ok, + requests.codes.bad_request): + self._test_update_resource_postcommit('port', status_code) + for status_code in (requests.codes.unauthorized, + requests.codes.forbidden, + requests.codes.not_found, + requests.codes.conflict, + requests.codes.not_implemented): + self._test_update_resource_postcommit( + 'port', status_code, requests.exceptions.HTTPError) def test_delete_network_postcommit(self): self._test_delete_resource_postcommit('network', diff --git a/neutron/tests/unit/ml2/test_ml2_plugin.py b/neutron/tests/unit/ml2/test_ml2_plugin.py index e70aa3c4a55..d1729194c73 100644 --- a/neutron/tests/unit/ml2/test_ml2_plugin.py +++ b/neutron/tests/unit/ml2/test_ml2_plugin.py @@ -23,6 +23,9 @@ from neutron.common import constants from neutron.common import exceptions as exc from neutron.common import utils from neutron import context +from neutron.db import db_base_plugin_v2 as base_plugin +from neutron.extensions import external_net as external_net +from neutron.extensions import l3agentscheduler from neutron.extensions import multiprovidernet as mpnet from neutron.extensions import portbindings from neutron.extensions import providernet as pnet @@ -36,6 +39,7 @@ from neutron.plugins.ml2 import driver_context from neutron.plugins.ml2.drivers import type_vlan from neutron.plugins.ml2 import models from neutron.plugins.ml2 import plugin as ml2_plugin +from neutron.tests import base from neutron.tests.unit import _test_extension_portbindings as test_bindings from neutron.tests.unit.ml2.drivers import mechanism_logger as mech_logger from neutron.tests.unit.ml2.drivers import mechanism_test as mech_test @@ -145,6 +149,22 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase): mock.call(_("The port '%s' was deleted"), 'invalid-uuid') ]) + def test_l3_cleanup_on_net_delete(self): + l3plugin = manager.NeutronManager.get_service_plugins().get( + service_constants.L3_ROUTER_NAT) + kwargs = {'arg_list': (external_net.EXTERNAL,), + external_net.EXTERNAL: True} + with self.network(**kwargs) as n: + with self.subnet(network=n, cidr='200.0.0.0/22'): + l3plugin.create_floatingip( + context.get_admin_context(), + {'floatingip': {'floating_network_id': n['network']['id'], + 'tenant_id': n['network']['tenant_id']}} + ) + self._delete('networks', n['network']['id']) + flips = l3plugin.get_floatingips(context.get_admin_context()) + self.assertFalse(flips) + def test_delete_port_no_notify_in_disassociate_floatingips(self): ctx = context.get_admin_context() plugin = manager.NeutronManager.get_plugin() @@ -177,6 +197,9 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase): self.assertTrue(utils.is_dvr_serviced( constants.DEVICE_OWNER_LOADBALANCER)) + def test_check_if_dhcp_port_serviced_by_dvr(self): + self.assertTrue(utils.is_dvr_serviced(constants.DEVICE_OWNER_DHCP)) + def test_check_if_port_not_serviced_by_dvr(self): self.assertFalse(utils.is_dvr_serviced( constants.DEVICE_OWNER_ROUTER_INTF)) @@ -205,61 +228,73 @@ class TestMl2DvrPortsV2(TestMl2PortsV2): mock.PropertyMock(return_value=extensions)) self.service_plugins = {'L3_ROUTER_NAT': self.l3plugin} - def test_delete_last_vm_port(self): - fip_set = set() - ns_to_delete = {'host': 'vmhost', 'agent_id': 'vm_l3_agent', + def _test_delete_dvr_serviced_port(self, device_owner, floating_ip=False): + ns_to_delete = {'host': 'myhost', 'agent_id': 'vm_l3_agent', 'router_id': 'my_router'} + fip_set = set() + if floating_ip: + fip_set.add(ns_to_delete['router_id']) with contextlib.nested( mock.patch.object(manager.NeutronManager, 'get_service_plugins', return_value=self.service_plugins), - self.port(do_delete=False, device_owner='compute:None'), + self.port(do_delete=False, + device_owner=device_owner), mock.patch.object(self.l3plugin, 'notify_routers_updated'), mock.patch.object(self.l3plugin, 'disassociate_floatingips', return_value=fip_set), - mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_vm', + mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_port', return_value=[ns_to_delete]), mock.patch.object(self.l3plugin, 'remove_router_from_l3_agent') ) as (get_service_plugin, port, notify, disassociate_floatingips, - ddinv, remove_router_from_l3_agent): + dvr_delns_ifno_port, remove_router_from_l3_agent): port_id = port['port']['id'] self.plugin.delete_port(self.context, port_id) notify.assert_has_calls([mock.call(self.context, fip_set)]) + dvr_delns_ifno_port.assert_called_once_with(self.context, + port['port']['id']) remove_router_from_l3_agent.assert_has_calls([ mock.call(self.context, ns_to_delete['agent_id'], ns_to_delete['router_id']) ]) + def test_delete_last_vm_port(self): + self._test_delete_dvr_serviced_port(device_owner='compute:None') + def test_delete_last_vm_port_with_floatingip(self): - ns_to_delete = {'host': 'vmhost', 'agent_id': 'vm_l3_agent', + self._test_delete_dvr_serviced_port(device_owner='compute:None', + floating_ip=True) + + def test_delete_vm_port_namespace_already_deleted(self): + ns_to_delete = {'host': 'myhost', + 'agent_id': 'vm_l3_agent', 'router_id': 'my_router'} - fip_set = set([ns_to_delete['router_id']]) with contextlib.nested( mock.patch.object(manager.NeutronManager, 'get_service_plugins', return_value=self.service_plugins), - self.port(do_delete=False, device_owner='compute:None'), - mock.patch.object(self.l3plugin, 'notify_routers_updated'), - mock.patch.object(self.l3plugin, 'disassociate_floatingips', - return_value=fip_set), - mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_vm', + self.port(do_delete=False, + device_owner='compute:None'), + mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_port', return_value=[ns_to_delete]), - mock.patch.object(self.l3plugin, 'remove_router_from_l3_agent') - ) as (get_service_plugins, port, notify, disassociate_floatingips, - ddinv, remove_router_from_l3_agent): + mock.patch.object(self.l3plugin, 'remove_router_from_l3_agent', + side_effect=l3agentscheduler.RouterNotHostedByL3Agent( + router_id=ns_to_delete['router_id'], + agent_id=ns_to_delete['agent_id'])) + ) as (get_service_plugin, port, dvr_delns_ifno_port, + remove_router_from_l3_agent): - port_id = port['port']['id'] - self.plugin.delete_port(self.context, port_id) + self.plugin.delete_port(self.context, port['port']['id']) + remove_router_from_l3_agent.assert_called_once_with(self.context, + ns_to_delete['agent_id'], ns_to_delete['router_id']) - notify.assert_has_calls([mock.call(self.context, fip_set)]) - remove_router_from_l3_agent.assert_has_calls([ - mock.call(self.context, ns_to_delete['agent_id'], - ns_to_delete['router_id']) - ]) + def test_delete_lbaas_vip_port(self): + self._test_delete_dvr_serviced_port( + device_owner=constants.DEVICE_OWNER_LOADBALANCER) class TestMl2PortBinding(Ml2PluginV2TestCase, @@ -548,20 +583,24 @@ class TestMultiSegmentNetworks(Ml2PluginV2TestCase): network_req = self.new_create_request('networks', data) network = self.deserialize(self.fmt, network_req.get_response(self.api)) - tz = network['network'][mpnet.SEGMENTS] - for tz in data['network'][mpnet.SEGMENTS]: + segments = network['network'][mpnet.SEGMENTS] + for segment_index, segment in enumerate(data['network'] + [mpnet.SEGMENTS]): for field in [pnet.NETWORK_TYPE, pnet.PHYSICAL_NETWORK, pnet.SEGMENTATION_ID]: - self.assertEqual(tz.get(field), tz.get(field)) + self.assertEqual(segment.get(field), + segments[segment_index][field]) # Tests get_network() net_req = self.new_show_request('networks', network['network']['id']) network = self.deserialize(self.fmt, net_req.get_response(self.api)) - tz = network['network'][mpnet.SEGMENTS] - for tz in data['network'][mpnet.SEGMENTS]: + segments = network['network'][mpnet.SEGMENTS] + for segment_index, segment in enumerate(data['network'] + [mpnet.SEGMENTS]): for field in [pnet.NETWORK_TYPE, pnet.PHYSICAL_NETWORK, pnet.SEGMENTATION_ID]: - self.assertEqual(tz.get(field), tz.get(field)) + self.assertEqual(segment.get(field), + segments[segment_index][field]) def test_create_network_with_provider_and_multiprovider_fail(self): data = {'network': {'name': 'net1', @@ -951,3 +990,81 @@ class TestFaultyMechansimDriver(Ml2PluginV2FaultyDriverTestCase): self.assertEqual(new_name, port['port']['name']) self._delete('ports', port['port']['id']) + + +class TestMl2PluginCreateUpdateDeletePort(base.BaseTestCase): + def setUp(self): + super(TestMl2PluginCreateUpdateDeletePort, self).setUp() + self.context = mock.MagicMock() + + def _ensure_transaction_is_closed(self): + transaction = self.context.session.begin(subtransactions=True) + enter = transaction.__enter__.call_count + exit = transaction.__exit__.call_count + self.assertEqual(enter, exit) + + def _create_plugin_for_create_update_port(self, new_host_port): + plugin = ml2_plugin.Ml2Plugin() + plugin.extension_manager = mock.Mock() + plugin.type_manager = mock.Mock() + plugin.mechanism_manager = mock.Mock() + plugin.notifier = mock.Mock() + plugin._get_host_port_if_changed = mock.Mock( + return_value=new_host_port) + + plugin._notify_l3_agent_new_port = mock.Mock() + plugin._notify_l3_agent_new_port.side_effect = ( + lambda c, p: self._ensure_transaction_is_closed()) + + return plugin + + def test_create_port_rpc_outside_transaction(self): + with contextlib.nested( + mock.patch.object(ml2_plugin.Ml2Plugin, '__init__'), + mock.patch.object(base_plugin.NeutronDbPluginV2, 'create_port'), + ) as (init, super_create_port): + init.return_value = None + + new_host_port = mock.Mock() + plugin = self._create_plugin_for_create_update_port(new_host_port) + + plugin.create_port(self.context, mock.MagicMock()) + + plugin._notify_l3_agent_new_port.assert_called_once_with( + self.context, new_host_port) + + def test_update_port_rpc_outside_transaction(self): + with contextlib.nested( + mock.patch.object(ml2_plugin.Ml2Plugin, '__init__'), + mock.patch.object(base_plugin.NeutronDbPluginV2, 'update_port'), + ) as (init, super_update_port): + init.return_value = None + + new_host_port = mock.Mock() + plugin = self._create_plugin_for_create_update_port(new_host_port) + + plugin.update_port(self.context, 'fake_id', mock.MagicMock()) + + plugin._notify_l3_agent_new_port.assert_called_once_with( + self.context, new_host_port) + + def test_vmarp_table_update_outside_of_delete_transaction(self): + l3plugin = mock.Mock() + l3plugin.dvr_vmarp_table_update = ( + lambda *args, **kwargs: self._ensure_transaction_is_closed()) + l3plugin.dvr_deletens_if_no_port.return_value = [] + l3plugin.supported_extension_aliases = [ + 'router', constants.L3_AGENT_SCHEDULER_EXT_ALIAS, + constants.L3_DISTRIBUTED_EXT_ALIAS + ] + with contextlib.nested( + mock.patch.object(ml2_plugin.Ml2Plugin, '__init__', + return_value=None), + mock.patch.object(manager.NeutronManager, + 'get_service_plugins', + return_value={'L3_ROUTER_NAT': l3plugin}), + ): + plugin = self._create_plugin_for_create_update_port(mock.Mock()) + # deleting the port will call dvr_vmarp_table_update, which will + # run the transaction balancing function defined in this test + plugin.delete_port(self.context, 'fake_id') diff --git a/neutron/tests/unit/mlnx/__init__.py b/neutron/tests/unit/mlnx/__init__.py index 7182ac41479..e69de29bb2d 100644 --- a/neutron/tests/unit/mlnx/__init__.py +++ b/neutron/tests/unit/mlnx/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 Mellanox Technologies, Ltd -# -# 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. diff --git a/neutron/tests/unit/mlnx/test_mlnx_comm_utils.py b/neutron/tests/unit/mlnx/test_mlnx_comm_utils.py index bb8bdcced71..49f2eaceea7 100644 --- a/neutron/tests/unit/mlnx/test_mlnx_comm_utils.py +++ b/neutron/tests/unit/mlnx/test_mlnx_comm_utils.py @@ -29,8 +29,7 @@ class WrongException(Exception): class TestRetryDecorator(base.BaseTestCase): def setUp(self): super(TestRetryDecorator, self).setUp() - self.sleep_fn_p = mock.patch.object(comm_utils.RetryDecorator, - 'sleep_fn') + self.sleep_fn_p = mock.patch("time.sleep") self.sleep_fn = self.sleep_fn_p.start() def test_no_retry_required(self): diff --git a/neutron/tests/unit/nec/__init__.py b/neutron/tests/unit/nec/__init__.py index cff1fb258c7..e69de29bb2d 100644 --- a/neutron/tests/unit/nec/__init__.py +++ b/neutron/tests/unit/nec/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2012 NEC Corporation. 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. diff --git a/neutron/tests/unit/nec/test_agent_scheduler.py b/neutron/tests/unit/nec/test_agent_scheduler.py index 7e1b24db30f..70f4f1e7ca6 100644 --- a/neutron/tests/unit/nec/test_agent_scheduler.py +++ b/neutron/tests/unit/nec/test_agent_scheduler.py @@ -41,6 +41,7 @@ class NecDhcpAgentNotifierTestCase( test_nec_plugin.NecPluginV2TestCaseBase): plugin_str = test_nec_plugin.PLUGIN_NAME + l3_plugin = None def setUp(self): self.setup_nec_plugin_base() @@ -64,6 +65,7 @@ class NecL3AgentSchedulerWithOpenFlowRouter( test_nec_plugin.NecPluginV2TestCaseBase): plugin_str = test_nec_plugin.PLUGIN_NAME + l3_plugin = None def setUp(self): self.setup_nec_plugin_base() diff --git a/neutron/tests/unit/nuage/test_nuage_plugin.py b/neutron/tests/unit/nuage/test_nuage_plugin.py index e9a6595e726..37c062aff7b 100644 --- a/neutron/tests/unit/nuage/test_nuage_plugin.py +++ b/neutron/tests/unit/nuage/test_nuage_plugin.py @@ -547,24 +547,24 @@ class TestNuageExtrarouteTestCase(NuagePluginV2TestCase, class TestNuageProviderNetTestCase(NuagePluginV2TestCase): def test_create_provider_network(self): - phy_net = uuidutils.generate_uuid() + phys_net = uuidutils.generate_uuid() data = {'network': {'name': 'pnet1', 'tenant_id': 'admin', pnet.NETWORK_TYPE: 'vlan', - pnet.PHYSICAL_NETWORK: phy_net, + pnet.PHYSICAL_NETWORK: phys_net, pnet.SEGMENTATION_ID: 123}} network_req = self.new_create_request('networks', data, self.fmt) net = self.deserialize(self.fmt, network_req.get_response(self.api)) self.assertEqual('vlan', net['network'][pnet.NETWORK_TYPE]) - self.assertEqual(phy_net, net['network'][pnet.PHYSICAL_NETWORK]) + self.assertEqual(phys_net, net['network'][pnet.PHYSICAL_NETWORK]) self.assertEqual(123, net['network'][pnet.SEGMENTATION_ID]) def test_create_provider_network_no_admin(self): - phy_net = uuidutils.generate_uuid() + phys_net = uuidutils.generate_uuid() data = {'network': {'name': 'pnet1', 'tenant_id': 'no_admin', pnet.NETWORK_TYPE: 'vlan', - pnet.PHYSICAL_NETWORK: phy_net, + pnet.PHYSICAL_NETWORK: phys_net, pnet.SEGMENTATION_ID: 123}} network_req = self.new_create_request('networks', data, self.fmt) network_req.environ['neutron.context'] = context.Context( @@ -572,6 +572,49 @@ class TestNuageProviderNetTestCase(NuagePluginV2TestCase): res = network_req.get_response(self.api) self.assertEqual(exc.HTTPForbidden.code, res.status_int) + def test_get_network_for_provider_network(self): + phys_net = uuidutils.generate_uuid() + data = {'network': {'name': 'pnet1', + 'tenant_id': 'admin', + pnet.NETWORK_TYPE: 'vlan', + pnet.PHYSICAL_NETWORK: phys_net, + pnet.SEGMENTATION_ID: 123}} + network_req = self.new_create_request('networks', data, self.fmt) + res = self.deserialize(self.fmt, network_req.get_response(self.api)) + + get_req = self.new_show_request('networks', res['network']['id']) + net = self.deserialize(self.fmt, get_req.get_response(self.api)) + self.assertEqual('vlan', net['network'][pnet.NETWORK_TYPE]) + self.assertEqual(phys_net, net['network'][pnet.PHYSICAL_NETWORK]) + self.assertEqual(123, net['network'][pnet.SEGMENTATION_ID]) + + def test_list_networks_for_provider_network(self): + phys_net = uuidutils.generate_uuid() + data1 = {'network': {'name': 'pnet1', + 'tenant_id': 'admin', + pnet.NETWORK_TYPE: 'vlan', + pnet.PHYSICAL_NETWORK: phys_net, + pnet.SEGMENTATION_ID: 123}} + network_req_1 = self.new_create_request('networks', data1, self.fmt) + network_req_1.get_response(self.api) + data2 = {'network': {'name': 'pnet2', + 'tenant_id': 'admin', + pnet.NETWORK_TYPE: 'vlan', + pnet.PHYSICAL_NETWORK: phys_net, + pnet.SEGMENTATION_ID: 234}} + network_req_2 = self.new_create_request('networks', data2, self.fmt) + network_req_2.get_response(self.api) + + list_req = self.new_list_request('networks') + pnets = self.deserialize(self.fmt, list_req.get_response(self.api)) + self.assertEqual(2, len(pnets['networks'])) + self.assertEqual('vlan', pnets['networks'][0][pnet.NETWORK_TYPE]) + self.assertEqual(phys_net, pnets['networks'][0][pnet.PHYSICAL_NETWORK]) + self.assertEqual(123, pnets['networks'][0][pnet.SEGMENTATION_ID]) + self.assertEqual('vlan', pnets['networks'][1][pnet.NETWORK_TYPE]) + self.assertEqual(phys_net, pnets['networks'][1][pnet.PHYSICAL_NETWORK]) + self.assertEqual(234, pnets['networks'][1][pnet.SEGMENTATION_ID]) + class TestNuageSecurityGroupTestCase(NuagePluginV2TestCase, test_sg.TestSecurityGroups): diff --git a/neutron/tests/unit/ofagent/test_arp_lib.py b/neutron/tests/unit/ofagent/test_arp_lib.py index a0b0dcdafc3..f0c1d69584f 100644 --- a/neutron/tests/unit/ofagent/test_arp_lib.py +++ b/neutron/tests/unit/ofagent/test_arp_lib.py @@ -16,6 +16,7 @@ import collections import contextlib +import copy import mock @@ -203,6 +204,22 @@ class TestArpLib(OFAAgentTestCase): self.arplib.del_arp_table_entry(self.nets[0].net, self.nets[0].ip) self.assertEqual(self.arplib._arp_tbl, {}) + def test_del_arp_table_entry_unknown_network(self): + self.arplib._arp_tbl = { + 100: {"192.0.2.1": "fa:16:3e:e2:37:37"}, + } + orig = copy.deepcopy(self.arplib._arp_tbl) + self.arplib.del_arp_table_entry(200, "192.0.2.1") + self.assertEqual(orig, self.arplib._arp_tbl) + + def test_del_arp_table_entry_unknown_ip(self): + self.arplib._arp_tbl = { + 100: {"192.0.2.1": "fa:16:3e:e2:37:37"}, + } + orig = copy.deepcopy(self.arplib._arp_tbl) + self.arplib.del_arp_table_entry(100, "192.0.2.9") + self.assertEqual(orig, self.arplib._arp_tbl) + def test_del_arp_table_entry_multiple_net(self): self.arplib._arp_tbl = { self.nets[0].net: {self.nets[0].ip: self.nets[0].mac}, @@ -289,6 +306,11 @@ class TestArpLib(OFAAgentTestCase): self._fake_get_protocol_arp = False self._test_packet_in_handler_drop() + def test_packet_in_handler_corrupted(self): + mock.patch('ryu.lib.packet.packet.Packet', + side_effect=ValueError).start() + self._test_packet_in_handler_drop() + def test_packet_in_handler_unknown_network(self): self.arplib._arp_tbl = { self.nets[0].net: {self.nets[0].ip: self.nets[0].mac}} diff --git a/neutron/tests/unit/ofagent/test_ofa_flows.py b/neutron/tests/unit/ofagent/test_ofa_flows.py index 2f07448aac1..a733288039a 100644 --- a/neutron/tests/unit/ofagent/test_ofa_flows.py +++ b/neutron/tests/unit/ofagent/test_ofa_flows.py @@ -84,7 +84,7 @@ class TestOFAgentFlows(ofa_test_base.OFATestBase): priority=0, table_id=12)), call(ofpp.OFPFlowMod(dp, priority=0, table_id=13)), ] - sendmsg.assert_has_calls(expected_calls) + sendmsg.assert_has_calls(expected_calls, any_order=True) def test_install_arp_responder(self): br = self.br @@ -115,15 +115,27 @@ class TestOFAgentFlows(ofa_test_base.OFATestBase): (dp, ofp, ofpp) = br._get_dp() call = mock.call expected_calls = [ - call(ofpp.OFPFlowMod(dp, instructions=[ - ofpp.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS, - [ofpp.OFPActionSetField(tunnel_id=112), - ofpp.OFPActionOutput(port=113), - ofpp.OFPActionOutput(port=114)]), - ofpp.OFPInstructionGotoTable(table_id=111)], - match=ofpp.OFPMatch(metadata= - meta.mk_metadata(111, meta.LOCAL)), - priority=1, table_id=110)) + call( + ofpp.OFPFlowMod( + dp, + instructions=[ + ofpp.OFPInstructionActions( + ofp.OFPIT_APPLY_ACTIONS, + [ + ofpp.OFPActionSetField(tunnel_id=112), + ofpp.OFPActionOutput(port=113), + ofpp.OFPActionOutput(port=114) + ] + ), + ofpp.OFPInstructionGotoTable(table_id=111) + ], + match=ofpp.OFPMatch( + metadata=meta.mk_metadata(111, meta.LOCAL) + ), + priority=1, + table_id=110 + ) + ) ] sendmsg.assert_has_calls(expected_calls) @@ -134,11 +146,17 @@ class TestOFAgentFlows(ofa_test_base.OFATestBase): (dp, ofp, ofpp) = br._get_dp() call = mock.call expected_calls = [ - call(ofpp.OFPFlowMod(dp, command=ofp.OFPFC_DELETE, - match=ofpp.OFPMatch(metadata= - meta.mk_metadata(111, meta.LOCAL)), - out_group=ofp.OFPG_ANY, - out_port=ofp.OFPP_ANY, priority=0, table_id=110)) + call( + ofpp.OFPFlowMod( + dp, + command=ofp.OFPFC_DELETE, + match=ofpp.OFPMatch( + metadata=meta.mk_metadata(111, meta.LOCAL) + ), + out_group=ofp.OFPG_ANY, + out_port=ofp.OFPP_ANY, priority=0, table_id=110 + ) + ) ] sendmsg.assert_has_calls(expected_calls) @@ -189,15 +207,30 @@ class TestOFAgentFlows(ofa_test_base.OFATestBase): match=ofpp.OFPMatch(in_port=99, vlan_vid=151 | ofp.OFPVID_PRESENT), priority=1, table_id=0)), - call(ofpp.OFPFlowMod(dp, instructions=[ - ofpp.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS, [ - ofpp.OFPActionPushVlan(), - ofpp.OFPActionSetField(vlan_vid=151 | ofp.OFPVID_PRESENT), - ofpp.OFPActionOutput(port=99), ofpp.OFPActionPopVlan()]), - ofpp.OFPInstructionGotoTable(table_id=13)], - match=ofpp.OFPMatch(metadata= - meta.mk_metadata(150, meta.LOCAL)), - priority=1, table_id=12)) + call( + ofpp.OFPFlowMod( + dp, + instructions=[ + ofpp.OFPInstructionActions( + ofp.OFPIT_APPLY_ACTIONS, + [ + ofpp.OFPActionPushVlan(), + ofpp.OFPActionSetField( + vlan_vid=151 | ofp.OFPVID_PRESENT + ), + ofpp.OFPActionOutput(port=99), + ofpp.OFPActionPopVlan() + ] + ), + ofpp.OFPInstructionGotoTable(table_id=13) + ], + match=ofpp.OFPMatch( + metadata=meta.mk_metadata(150, meta.LOCAL) + ), + priority=1, + table_id=12 + ) + ) ] sendmsg.assert_has_calls(expected_calls) diff --git a/neutron/tests/unit/ofagent/test_ofa_neutron_agent.py b/neutron/tests/unit/ofagent/test_ofa_neutron_agent.py index 638b40120ed..32d2721e859 100644 --- a/neutron/tests/unit/ofagent/test_ofa_neutron_agent.py +++ b/neutron/tests/unit/ofagent/test_ofa_neutron_agent.py @@ -662,7 +662,8 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase): mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan, 'ip2', 'mac2') ] - self.ryuapp.add_arp_table_entry.assert_has_calls(calls) + self.ryuapp.add_arp_table_entry.assert_has_calls(calls, + any_order=True) setup_tun_fn.assert_called_once_with(self.agent.int_br, '192.0.2.1', 'gre') @@ -685,7 +686,8 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase): mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan, 'ip2', 'mac2') ] - self.ryuapp.add_arp_table_entry.assert_has_calls(calls) + self.ryuapp.add_arp_table_entry.assert_has_calls(calls, + any_order=True) self.assertFalse(setup_tun_fn.called) def test_add_arp_table_entry_vlan(self): @@ -716,7 +718,8 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase): mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan, 'ip2') ] - self.ryuapp.del_arp_table_entry.assert_has_calls(calls) + self.ryuapp.del_arp_table_entry.assert_has_calls(calls, + any_order=True) cleanup_tun_fn.assert_called_once_with(self.agent.int_br, 1, 'gre') def _test_del_arp_table_entry_non_tunnel(self, network_type): @@ -738,7 +741,8 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase): mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan, 'ip2') ] - self.ryuapp.del_arp_table_entry.assert_has_calls(calls) + self.ryuapp.del_arp_table_entry.assert_has_calls(calls, + any_order=True) self.assertFalse(cleanup_tun_fn.called) def test_del_arp_table_entry_vlan(self): diff --git a/neutron/tests/unit/ofagent/test_ofa_ports.py b/neutron/tests/unit/ofagent/test_ofa_ports.py index 3e362639315..8a19d8a70d9 100644 --- a/neutron/tests/unit/ofagent/test_ofa_ports.py +++ b/neutron/tests/unit/ofagent/test_ofa_ports.py @@ -17,6 +17,7 @@ import mock +from neutron.common import constants as n_const from neutron.plugins.ofagent.agent import ports from neutron.tests import base @@ -34,7 +35,7 @@ class TestOFAgentPorts(base.BaseTestCase): self.assertFalse(p2.is_neutron_port()) def test_neutron_port(self): - for pref in ['qvo', 'qr-', 'qg-', 'tap']: + for pref in ['qvo', 'qr-', 'qg-', n_const.TAP_DEVICE_PREFIX]: name = pref + '03b9a237-0b' p1 = ports.Port(port_name=name, ofport=999) ryu_ofp_port = mock.Mock(port_no=999) diff --git a/neutron/tests/unit/opencontrail/test_contrail_plugin.py b/neutron/tests/unit/opencontrail/test_contrail_plugin.py index de280f346f8..a9a37be50e6 100644 --- a/neutron/tests/unit/opencontrail/test_contrail_plugin.py +++ b/neutron/tests/unit/opencontrail/test_contrail_plugin.py @@ -214,7 +214,8 @@ class ContrailPluginTestCase(test_plugin.NeutronDbPluginV2TestCase): _plugin_name = ('%s.NeutronPluginContrailCoreV2' % CONTRAIL_PKG_PATH) def setUp(self, plugin=None, ext_mgr=None): - + if 'v6' in self._testMethodName: + self.skipTest("OpenContrail Plugin does not support IPV6.") cfg.CONF.keystone_authtoken = KeyStoneInfo() mock.patch('requests.post').start().side_effect = FAKE_SERVER.request super(ContrailPluginTestCase, self).setUp(self._plugin_name) @@ -231,19 +232,6 @@ class TestContrailSubnetsV2(test_plugin.TestSubnetsV2, def setUp(self): super(TestContrailSubnetsV2, self).setUp() - # Support ipv6 in contrail is planned in Juno - def test_update_subnet_ipv6_attributes(self): - self.skipTest("Contrail isn't supporting ipv6 yet") - - def test_update_subnet_ipv6_inconsistent_address_attribute(self): - self.skipTest("Contrail isn't supporting ipv6 yet") - - def test_update_subnet_ipv6_inconsistent_enable_dhcp(self): - self.skipTest("Contrail isn't supporting ipv6 yet") - - def test_update_subnet_ipv6_inconsistent_ra_attribute(self): - self.skipTest("Contrail isn't supporting ipv6 yet") - def test_delete_subnet_dhcp_port_associated_with_other_subnets(self): self.skipTest("There is no dhcp port in contrail") diff --git a/neutron/tests/unit/openvswitch/__init__.py b/neutron/tests/unit/openvswitch/__init__.py index b706747cf8c..e69de29bb2d 100644 --- a/neutron/tests/unit/openvswitch/__init__.py +++ b/neutron/tests/unit/openvswitch/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/tests/unit/openvswitch/test_agent_scheduler.py b/neutron/tests/unit/openvswitch/test_agent_scheduler.py index ed4f44023b9..0fdf9fdbe13 100644 --- a/neutron/tests/unit/openvswitch/test_agent_scheduler.py +++ b/neutron/tests/unit/openvswitch/test_agent_scheduler.py @@ -19,6 +19,7 @@ import datetime import mock from oslo.config import cfg +from oslo.db import exception as db_exc from webob import exc from neutron.api import extensions @@ -27,6 +28,7 @@ from neutron.api.rpc.handlers import dhcp_rpc from neutron.api.rpc.handlers import l3_rpc from neutron.api.v2 import attributes from neutron.common import constants +from neutron.common import rpc as n_rpc from neutron import context from neutron.db import agents_db from neutron.db import l3_agentschedulers_db @@ -202,9 +204,9 @@ class OvsAgentSchedulerTestCaseBase(test_l3_plugin.L3NatTestCaseMixin, AgentSchedulerTestMixIn, test_plugin.NeutronDbPluginV2TestCase): fmt = 'json' - plugin_str = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.OVSNeutronPluginV2') - l3_plugin = None + plugin_str = 'neutron.plugins.ml2.plugin.Ml2Plugin' + l3_plugin = ('neutron.tests.unit.test_l3_plugin.' + 'TestL3NatAgentSchedulingServicePlugin') def setUp(self): # Save the global RESOURCE_ATTRIBUTE_MAP before loading plugin @@ -648,6 +650,53 @@ class OvsAgentSchedulerTestCase(OvsAgentSchedulerTestCaseBase): agt_db.admin_state_up = state self.adminContext.session.commit() + def test_router_rescheduler_catches_rpc_db_and_reschedule_exceptions(self): + with self.router(): + l3_rpc_cb = l3_rpc.L3RpcCallback() + self._register_agent_states() + # schedule the router to host A + l3_rpc_cb.sync_routers(self.adminContext, host=L3_HOSTA) + + plugin = manager.NeutronManager.get_service_plugins().get( + service_constants.L3_ROUTER_NAT) + mock.patch.object( + plugin, 'reschedule_router', + side_effect=[ + db_exc.DBError(), n_rpc.RemoteError(), + l3agentscheduler.RouterReschedulingFailed(router_id='f', + agent_id='f'), + ValueError('this raises') + ]).start() + # these first three should not raise any errors + self._take_down_agent_and_run_reschedule(L3_HOSTA) # DBError + self._take_down_agent_and_run_reschedule(L3_HOSTA) # RemoteError + self._take_down_agent_and_run_reschedule(L3_HOSTA) # schedule err + + # ValueError is not caught so it should raise + self.assertRaises(ValueError, + self._take_down_agent_and_run_reschedule, + L3_HOSTA) + + def test_router_rescheduler_iterates_after_reschedule_failure(self): + plugin = manager.NeutronManager.get_service_plugins().get( + service_constants.L3_ROUTER_NAT) + l3_rpc_cb = l3_rpc.L3RpcCallback() + self._register_agent_states() + with contextlib.nested(self.router(), self.router()) as (r1, r2): + # schedule the routers to host A + l3_rpc_cb.sync_routers(self.adminContext, host=L3_HOSTA) + + rs_mock = mock.patch.object( + plugin, 'reschedule_router', + side_effect=l3agentscheduler.RouterReschedulingFailed( + router_id='f', agent_id='f'), + ).start() + self._take_down_agent_and_run_reschedule(L3_HOSTA) + # make sure both had a reschedule attempt even though first failed + rs_mock.assert_has_calls([mock.call(mock.ANY, r1['router']['id']), + mock.call(mock.ANY, r2['router']['id'])], + any_order=True) + def test_router_is_not_rescheduled_from_alive_agent(self): with self.router(): l3_rpc_cb = l3_rpc.L3RpcCallback() @@ -1105,8 +1154,7 @@ class OvsDhcpAgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin, test_agent_ext_plugin.AgentDBTestMixIn, AgentSchedulerTestMixIn, test_plugin.NeutronDbPluginV2TestCase): - plugin_str = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.OVSNeutronPluginV2') + plugin_str = 'neutron.plugins.ml2.plugin.Ml2Plugin' def setUp(self): # Save the global RESOURCE_ATTRIBUTE_MAP before loading plugin @@ -1271,9 +1319,9 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin, test_agent_ext_plugin.AgentDBTestMixIn, AgentSchedulerTestMixIn, test_plugin.NeutronDbPluginV2TestCase): - plugin_str = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.OVSNeutronPluginV2') - l3_plugin = None + plugin_str = 'neutron.plugins.ml2.plugin.Ml2Plugin' + l3_plugin = ('neutron.tests.unit.test_l3_plugin.' + 'TestL3NatAgentSchedulingServicePlugin') def setUp(self): self.dhcp_notifier_cls_p = mock.patch( @@ -1309,8 +1357,9 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin, attributes.RESOURCE_ATTRIBUTE_MAP = self.saved_attr_map def test_router_add_to_l3_agent_notification(self): - plugin = manager.NeutronManager.get_plugin() - l3_notifier = plugin.agent_notifiers[constants.AGENT_TYPE_L3] + l3_plugin = (manager.NeutronManager.get_service_plugins() + [service_constants.L3_ROUTER_NAT]) + l3_notifier = l3_plugin.agent_notifiers[constants.AGENT_TYPE_L3] with mock.patch.object(l3_notifier, 'cast') as mock_l3: with self.router() as router1: self._register_agent_states() @@ -1330,8 +1379,9 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin, self._assert_notify(notifications, expected_event_type) def test_router_remove_from_l3_agent_notification(self): - plugin = manager.NeutronManager.get_plugin() - l3_notifier = plugin.agent_notifiers[constants.AGENT_TYPE_L3] + l3_plugin = (manager.NeutronManager.get_service_plugins() + [service_constants.L3_ROUTER_NAT]) + l3_notifier = l3_plugin.agent_notifiers[constants.AGENT_TYPE_L3] with mock.patch.object(l3_notifier, 'cast') as mock_l3: with self.router() as router1: self._register_agent_states() @@ -1351,8 +1401,9 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin, self._assert_notify(notifications, expected_event_type) def test_agent_updated_l3_agent_notification(self): - plugin = manager.NeutronManager.get_plugin() - l3_notifier = plugin.agent_notifiers[constants.AGENT_TYPE_L3] + l3_plugin = (manager.NeutronManager.get_service_plugins() + [service_constants.L3_ROUTER_NAT]) + l3_notifier = l3_plugin.agent_notifiers[constants.AGENT_TYPE_L3] with mock.patch.object(l3_notifier, 'cast') as mock_l3: self._register_agent_states() hosta_id = self._get_agent_id(constants.AGENT_TYPE_L3, diff --git a/neutron/tests/unit/openvswitch/test_openvswitch_plugin.py b/neutron/tests/unit/openvswitch/test_openvswitch_plugin.py deleted file mode 100644 index af1c1d0425f..00000000000 --- a/neutron/tests/unit/openvswitch/test_openvswitch_plugin.py +++ /dev/null @@ -1,159 +0,0 @@ -# Copyright (c) 2012 OpenStack Foundation. -# -# 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.config import cfg - -from neutron import context -from neutron.extensions import portbindings -from neutron.extensions import securitygroup as ext_sg -from neutron.plugins.openvswitch import ovs_neutron_plugin -from neutron.tests.unit import _test_extension_portbindings as test_bindings -from neutron.tests.unit import test_db_plugin as test_plugin -from neutron.tests.unit import test_extension_allowedaddresspairs as test_pair -from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc - -import mock - - -class OpenvswitchPluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase): - - _plugin_name = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.OVSNeutronPluginV2') - - def setUp(self): - super(OpenvswitchPluginV2TestCase, self).setUp(self._plugin_name) - self.port_create_status = 'DOWN' - - -class TestOpenvswitchBasicGet(test_plugin.TestBasicGet, - OpenvswitchPluginV2TestCase): - pass - - -class TestOpenvswitchV2HTTPResponse(test_plugin.TestV2HTTPResponse, - OpenvswitchPluginV2TestCase): - pass - - -class TestOpenvswitchPortsV2(test_plugin.TestPortsV2, - OpenvswitchPluginV2TestCase): - - def test_update_port_status_build(self): - with self.port() as port: - self.assertEqual(port['port']['status'], 'DOWN') - self.assertEqual(self.port_create_status, 'DOWN') - - -class TestOpenvswitchNetworksV2(test_plugin.TestNetworksV2, - OpenvswitchPluginV2TestCase): - pass - - -class TestOpenvswitchPortBinding(OpenvswitchPluginV2TestCase, - test_bindings.PortBindingsTestCase): - VIF_TYPE = portbindings.VIF_TYPE_OVS - HAS_PORT_FILTER = True - ENABLE_SG = True - FIREWALL_DRIVER = test_sg_rpc.FIREWALL_HYBRID_DRIVER - - def setUp(self, firewall_driver=None): - test_sg_rpc.set_firewall_driver(self.FIREWALL_DRIVER) - cfg.CONF.set_override( - 'enable_security_group', self.ENABLE_SG, - group='SECURITYGROUP') - super(TestOpenvswitchPortBinding, self).setUp() - - -class TestOpenvswitchPortBindingNoSG(TestOpenvswitchPortBinding): - HAS_PORT_FILTER = False - ENABLE_SG = False - FIREWALL_DRIVER = test_sg_rpc.FIREWALL_NOOP_DRIVER - - -class TestOpenvswitchPortBindingHost( - OpenvswitchPluginV2TestCase, - test_bindings.PortBindingsHostTestCaseMixin): - pass - - -class TestOpenvswitchAllowedAddressPairs(OpenvswitchPluginV2TestCase, - test_pair.TestAllowedAddressPairs): - pass - - -class TestOpenvswitchUpdatePort(OpenvswitchPluginV2TestCase, - ovs_neutron_plugin.OVSNeutronPluginV2): - - def test_update_port_add_remove_security_group(self): - get_port_func = ( - 'neutron.db.db_base_plugin_v2.' - 'NeutronDbPluginV2.get_port' - ) - with mock.patch(get_port_func) as mock_get_port: - mock_get_port.return_value = { - ext_sg.SECURITYGROUPS: ["sg1", "sg2"], - "admin_state_up": True, - "fixed_ips": "fake_ip", - "network_id": "fake_id"} - - update_port_func = ( - 'neutron.db.db_base_plugin_v2.' - 'NeutronDbPluginV2.update_port' - ) - with mock.patch(update_port_func) as mock_update_port: - mock_update_port.return_value = { - ext_sg.SECURITYGROUPS: ["sg2", "sg3"], - "admin_state_up": True, - "fixed_ips": "fake_ip", - "network_id": "fake_id"} - - fake_func = ( - 'neutron.plugins.openvswitch.' - 'ovs_db_v2.get_network_binding' - ) - with mock.patch(fake_func) as mock_func: - class MockBinding: - network_type = "fake" - segmentation_id = "fake" - physical_network = "fake" - - mock_func.return_value = MockBinding() - - ctx = context.Context('', 'somebody') - self.update_port(ctx, "id", { - "port": { - ext_sg.SECURITYGROUPS: [ - "sg2", "sg3"]}}) - - sgmu = self.notifier.security_groups_member_updated - sgmu.assert_called_with(ctx, set(['sg1', 'sg3'])) - - def setUp(self): - super(TestOpenvswitchUpdatePort, self).setUp() - self.update_security_group_on_port = mock.MagicMock(return_value=True) - self._process_portbindings_create_and_update = mock.MagicMock( - return_value=True) - self._update_extra_dhcp_opts_on_port = mock.MagicMock( - return_value=True) - self.update_address_pairs_on_port = mock.MagicMock( - return_value=True) - - class MockNotifier: - def __init__(self): - self.port_update = mock.MagicMock(return_value=True) - self.security_groups_member_updated = mock.MagicMock( - return_value=True) - - self.notifier = MockNotifier() diff --git a/neutron/tests/unit/openvswitch/test_ovs_db.py b/neutron/tests/unit/openvswitch/test_ovs_db.py deleted file mode 100644 index a82f546b126..00000000000 --- a/neutron/tests/unit/openvswitch/test_ovs_db.py +++ /dev/null @@ -1,315 +0,0 @@ -# Copyright (c) 2012 OpenStack Foundation. -# -# 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 oslo.config import cfg -from oslo.db import exception as db_exc -from oslo.db.sqlalchemy import session -from six import moves -import testtools -from testtools import matchers - -from neutron.common import exceptions as n_exc -from neutron.db import api as db -from neutron.plugins.openvswitch import ovs_db_v2 -from neutron.plugins.openvswitch import ovs_models_v2 as ovs_models -from neutron.tests.unit import test_db_plugin as test_plugin -from neutron.tests.unit import testlib_api - -PHYS_NET = 'physnet1' -PHYS_NET_2 = 'physnet2' -VLAN_MIN = 10 -VLAN_MAX = 19 -VLAN_RANGES = {PHYS_NET: [(VLAN_MIN, VLAN_MAX)]} -UPDATED_VLAN_RANGES = {PHYS_NET: [(VLAN_MIN + 5, VLAN_MAX + 5)], - PHYS_NET_2: [(VLAN_MIN + 20, VLAN_MAX + 20)]} -TUN_MIN = 100 -TUN_MAX = 109 -TUNNEL_RANGES = [(TUN_MIN, TUN_MAX)] -UPDATED_TUNNEL_RANGES = [(TUN_MIN + 5, TUN_MAX + 5)] - -PLUGIN_NAME = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.OVSNeutronPluginV2') - - -class VlanAllocationsTest(testlib_api.SqlTestCase): - def setUp(self): - super(VlanAllocationsTest, self).setUp() - ovs_db_v2.sync_vlan_allocations(VLAN_RANGES) - self.session = db.get_session() - - def test_sync_vlan_allocations(self): - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN - 1)) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN).allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN + 1).allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX - 1).allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX).allocated) - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX + 1)) - - ovs_db_v2.sync_vlan_allocations(UPDATED_VLAN_RANGES) - - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN + 5 - 1)) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN + 5). - allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN + 5 + 1). - allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX + 5 - 1). - allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX + 5). - allocated) - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX + 5 + 1)) - - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET_2, - VLAN_MIN + 20 - 1)) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET_2, - VLAN_MIN + 20). - allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET_2, - VLAN_MIN + 20 + 1). - allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET_2, - VLAN_MAX + 20 - 1). - allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET_2, - VLAN_MAX + 20). - allocated) - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET_2, - VLAN_MAX + 20 + 1)) - - ovs_db_v2.sync_vlan_allocations(VLAN_RANGES) - - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN - 1)) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN).allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MIN + 1).allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX - 1).allocated) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX).allocated) - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, - VLAN_MAX + 1)) - - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET_2, - VLAN_MIN + 20)) - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET_2, - VLAN_MAX + 20)) - - def test_vlan_pool(self): - vlan_ids = set() - for x in moves.xrange(VLAN_MIN, VLAN_MAX + 1): - physical_network, vlan_id = ovs_db_v2.reserve_vlan(self.session) - self.assertEqual(physical_network, PHYS_NET) - self.assertThat(vlan_id, matchers.GreaterThan(VLAN_MIN - 1)) - self.assertThat(vlan_id, matchers.LessThan(VLAN_MAX + 1)) - vlan_ids.add(vlan_id) - - with testtools.ExpectedException(n_exc.NoNetworkAvailable): - physical_network, vlan_id = ovs_db_v2.reserve_vlan(self.session) - - ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_ids.pop(), - VLAN_RANGES) - physical_network, vlan_id = ovs_db_v2.reserve_vlan(self.session) - self.assertEqual(physical_network, PHYS_NET) - self.assertThat(vlan_id, matchers.GreaterThan(VLAN_MIN - 1)) - self.assertThat(vlan_id, matchers.LessThan(VLAN_MAX + 1)) - vlan_ids.add(vlan_id) - - for vlan_id in vlan_ids: - ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_id, - VLAN_RANGES) - - def test_specific_vlan_inside_pool(self): - vlan_id = VLAN_MIN + 5 - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - vlan_id).allocated) - ovs_db_v2.reserve_specific_vlan(self.session, PHYS_NET, vlan_id) - self.assertTrue(ovs_db_v2.get_vlan_allocation(PHYS_NET, - vlan_id).allocated) - - with testtools.ExpectedException(n_exc.VlanIdInUse): - ovs_db_v2.reserve_specific_vlan(self.session, PHYS_NET, vlan_id) - - ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_id, VLAN_RANGES) - self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET, - vlan_id).allocated) - - def test_specific_vlan_outside_pool(self): - vlan_id = VLAN_MAX + 5 - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, vlan_id)) - ovs_db_v2.reserve_specific_vlan(self.session, PHYS_NET, vlan_id) - self.assertTrue(ovs_db_v2.get_vlan_allocation(PHYS_NET, - vlan_id).allocated) - - with testtools.ExpectedException(n_exc.VlanIdInUse): - ovs_db_v2.reserve_specific_vlan(self.session, PHYS_NET, vlan_id) - - ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_id, VLAN_RANGES) - self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, vlan_id)) - - def test_sync_with_allocated_false(self): - vlan_ids = set() - for x in moves.xrange(VLAN_MIN, VLAN_MAX + 1): - physical_network, vlan_id = ovs_db_v2.reserve_vlan(self.session) - self.assertEqual(physical_network, PHYS_NET) - self.assertThat(vlan_id, matchers.GreaterThan(VLAN_MIN - 1)) - self.assertThat(vlan_id, matchers.LessThan(VLAN_MAX + 1)) - vlan_ids.add(vlan_id) - - ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_ids.pop(), - VLAN_RANGES) - ovs_db_v2.sync_vlan_allocations({}) - - -class TunnelAllocationsTest(testlib_api.SqlTestCase): - def setUp(self): - super(TunnelAllocationsTest, self).setUp() - ovs_db_v2.sync_tunnel_allocations(TUNNEL_RANGES) - self.session = db.get_session() - - def test_sync_tunnel_allocations(self): - self.assertIsNone(ovs_db_v2.get_tunnel_allocation(TUN_MIN - 1)) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MIN).allocated) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MIN + 1). - allocated) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MAX - 1). - allocated) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MAX).allocated) - self.assertIsNone(ovs_db_v2.get_tunnel_allocation(TUN_MAX + 1)) - - ovs_db_v2.sync_tunnel_allocations(UPDATED_TUNNEL_RANGES) - - self.assertIsNone(ovs_db_v2.get_tunnel_allocation(TUN_MIN + 5 - 1)) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MIN + 5). - allocated) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MIN + 5 + 1). - allocated) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MAX + 5 - 1). - allocated) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MAX + 5). - allocated) - self.assertIsNone(ovs_db_v2.get_tunnel_allocation(TUN_MAX + 5 + 1)) - - def test_tunnel_pool(self): - tunnel_ids = set() - for x in moves.xrange(TUN_MIN, TUN_MAX + 1): - tunnel_id = ovs_db_v2.reserve_tunnel(self.session) - self.assertThat(tunnel_id, matchers.GreaterThan(TUN_MIN - 1)) - self.assertThat(tunnel_id, matchers.LessThan(TUN_MAX + 1)) - tunnel_ids.add(tunnel_id) - - with testtools.ExpectedException(n_exc.NoNetworkAvailable): - tunnel_id = ovs_db_v2.reserve_tunnel(self.session) - - ovs_db_v2.release_tunnel(self.session, tunnel_ids.pop(), TUNNEL_RANGES) - tunnel_id = ovs_db_v2.reserve_tunnel(self.session) - self.assertThat(tunnel_id, matchers.GreaterThan(TUN_MIN - 1)) - self.assertThat(tunnel_id, matchers.LessThan(TUN_MAX + 1)) - tunnel_ids.add(tunnel_id) - - for tunnel_id in tunnel_ids: - ovs_db_v2.release_tunnel(self.session, tunnel_id, TUNNEL_RANGES) - - def test_add_tunnel_endpoints(self): - tun_1 = ovs_db_v2.add_tunnel_endpoint('192.168.0.1') - tun_2 = ovs_db_v2.add_tunnel_endpoint('192.168.0.2') - self.assertEqual(1, tun_1.id) - self.assertEqual('192.168.0.1', tun_1.ip_address) - self.assertEqual(2, tun_2.id) - self.assertEqual('192.168.0.2', tun_2.ip_address) - - def test_specific_tunnel_inside_pool(self): - tunnel_id = TUN_MIN + 5 - self.assertFalse(ovs_db_v2.get_tunnel_allocation(tunnel_id).allocated) - ovs_db_v2.reserve_specific_tunnel(self.session, tunnel_id) - self.assertTrue(ovs_db_v2.get_tunnel_allocation(tunnel_id).allocated) - - with testtools.ExpectedException(n_exc.TunnelIdInUse): - ovs_db_v2.reserve_specific_tunnel(self.session, tunnel_id) - - ovs_db_v2.release_tunnel(self.session, tunnel_id, TUNNEL_RANGES) - self.assertFalse(ovs_db_v2.get_tunnel_allocation(tunnel_id).allocated) - - def test_specific_tunnel_outside_pool(self): - tunnel_id = TUN_MAX + 5 - self.assertIsNone(ovs_db_v2.get_tunnel_allocation(tunnel_id)) - ovs_db_v2.reserve_specific_tunnel(self.session, tunnel_id) - self.assertTrue(ovs_db_v2.get_tunnel_allocation(tunnel_id).allocated) - - with testtools.ExpectedException(n_exc.TunnelIdInUse): - ovs_db_v2.reserve_specific_tunnel(self.session, tunnel_id) - - ovs_db_v2.release_tunnel(self.session, tunnel_id, TUNNEL_RANGES) - self.assertIsNone(ovs_db_v2.get_tunnel_allocation(tunnel_id)) - - def test_add_tunnel_endpoint_create_new_endpoint(self): - addr = '10.0.0.1' - ovs_db_v2.add_tunnel_endpoint(addr) - self.assertIsNotNone(self.session.query(ovs_models.TunnelEndpoint). - filter_by(ip_address=addr).first()) - - def test_add_tunnel_endpoint_retrieve_an_existing_endpoint(self): - addr = '10.0.0.1' - self.session.add(ovs_models.TunnelEndpoint(ip_address=addr, id=1)) - self.session.flush() - - tunnel = ovs_db_v2.add_tunnel_endpoint(addr) - self.assertEqual(tunnel.id, 1) - self.assertEqual(tunnel.ip_address, addr) - - def test_add_tunnel_endpoint_handle_duplicate_error(self): - with mock.patch.object(session.Session, 'query') as query_mock: - error = db_exc.DBDuplicateEntry(['id']) - query_mock.side_effect = error - - with testtools.ExpectedException(n_exc.NeutronException): - ovs_db_v2.add_tunnel_endpoint('10.0.0.1', 5) - self.assertEqual(query_mock.call_count, 5) - - -class NetworkBindingsTest(test_plugin.NeutronDbPluginV2TestCase): - def setUp(self): - cfg.CONF.set_override('network_vlan_ranges', ['physnet1:1000:2999'], - group='OVS') - super(NetworkBindingsTest, self).setUp(plugin=PLUGIN_NAME) - self.session = db.get_session() - - def test_add_network_binding(self): - params = {'provider:network_type': 'vlan', - 'provider:physical_network': PHYS_NET, - 'provider:segmentation_id': 1234} - params['arg_list'] = tuple(params.keys()) - with self.network(**params) as network: - TEST_NETWORK_ID = network['network']['id'] - binding = ovs_db_v2.get_network_binding(self.session, - TEST_NETWORK_ID) - self.assertIsNotNone(binding) - self.assertEqual(binding.network_id, TEST_NETWORK_ID) - self.assertEqual(binding.network_type, 'vlan') - self.assertEqual(binding.physical_network, PHYS_NET) - self.assertEqual(binding.segmentation_id, 1234) diff --git a/neutron/tests/unit/openvswitch/test_ovs_defaults.py b/neutron/tests/unit/openvswitch/test_ovs_defaults.py index 0d5c00f730d..e52b4530e93 100644 --- a/neutron/tests/unit/openvswitch/test_ovs_defaults.py +++ b/neutron/tests/unit/openvswitch/test_ovs_defaults.py @@ -27,9 +27,6 @@ class ConfigurationTest(base.BaseTestCase): self.assertEqual('br-tun', cfg.CONF.OVS.tunnel_bridge) self.assertEqual(2, cfg.CONF.AGENT.polling_interval) self.assertEqual('sudo', cfg.CONF.AGENT.root_helper) - self.assertEqual('local', cfg.CONF.OVS.tenant_network_type) self.assertEqual(0, len(cfg.CONF.OVS.bridge_mappings)) - self.assertEqual(0, len(cfg.CONF.OVS.network_vlan_ranges)) - self.assertEqual(0, len(cfg.CONF.OVS.tunnel_id_ranges)) self.assertFalse(cfg.CONF.AGENT.l2_population) self.assertFalse(cfg.CONF.AGENT.arp_responder) diff --git a/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py b/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py index 44376f00523..73d62b3dff2 100644 --- a/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py +++ b/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py @@ -32,8 +32,7 @@ from neutron.plugins.openvswitch.common import constants from neutron.tests import base -NOTIFIER = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.AgentNotifierApi') +NOTIFIER = 'neutron.plugins.ml2.rpc.AgentNotifierApi' OVS_LINUX_KERN_VERS_WITHOUT_VXLAN = "3.12.0" FAKE_MAC = '00:11:22:33:44:55' @@ -136,6 +135,9 @@ class TestOvsNeutronAgent(base.BaseTestCase): 'FixedIntervalLoopingCall', new=MockFixedIntervalLoopingCall)): self.agent = ovs_neutron_agent.OVSNeutronAgent(**kwargs) + # set back to true because initial report state will succeed due + # to mocked out RPC calls + self.agent.use_call = True self.agent.tun_br = mock.Mock() self.agent.sg_agent = mock.Mock() @@ -1047,6 +1049,20 @@ class TestOvsNeutronAgent(base.BaseTestCase): {'2.2.2.2': [[FAKE_MAC, FAKE_IP1], n_const.FLOODING_ENTRY]}}} + + class ActionMatcher(object): + def __init__(self, action_str): + self.ordered = self.order_ports(action_str) + + def order_ports(self, action_str): + halves = action_str.split('output:') + ports = sorted(halves.pop().split(',')) + halves.append(','.join(ports)) + return 'output:'.join(halves) + + def __eq__(self, other): + return self.ordered == self.order_ports(other) + with contextlib.nested( mock.patch.object(self.agent.tun_br, 'deferred'), mock.patch.object(self.agent.tun_br, 'do_action_flows'), @@ -1074,8 +1090,8 @@ class TestOvsNeutronAgent(base.BaseTestCase): 'set_tunnel:seg1,output:2')]), mock.call('mod', [dict(table=constants.FLOOD_TO_TUN, dl_vlan='vlan1', - actions='strip_vlan,' - 'set_tunnel:seg1,output:1,2')]), + actions=ActionMatcher('strip_vlan,' + 'set_tunnel:seg1,output:1,2'))]), ] do_action_flows_fn.assert_has_calls(expected_calls) diff --git a/neutron/tests/unit/openvswitch/test_ovs_rpcapi.py b/neutron/tests/unit/openvswitch/test_ovs_rpcapi.py deleted file mode 100644 index c443d6cd988..00000000000 --- a/neutron/tests/unit/openvswitch/test_ovs_rpcapi.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright 2012, 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. - -""" -Unit Tests for openvswitch rpc -""" - -import fixtures - -from neutron.agent import rpc as agent_rpc -from neutron.common import topics -from neutron.openstack.common import context -from neutron.plugins.openvswitch.common import constants -from neutron.plugins.openvswitch import ovs_neutron_plugin as povs -from neutron.tests import base - - -class rpcApiTestCase(base.BaseTestCase): - - def _test_ovs_api(self, rpcapi, topic, method, rpc_method, **kwargs): - ctxt = context.RequestContext('fake_user', 'fake_project') - expected_retval = 'foo' if method == 'call' else None - expected_kwargs = {} - if topic: - expected_kwargs['topic'] = topic - if 'version' in kwargs: - expected_kwargs['version'] = kwargs.pop('version') - expected_msg = rpcapi.make_msg(method, **kwargs) - if rpc_method == 'cast' and method == 'run_instance': - kwargs['call'] = False - - self.fake_args = None - self.fake_kwargs = None - - def _fake_rpc_method(*args, **kwargs): - self.fake_args = args - self.fake_kwargs = kwargs - if expected_retval: - return expected_retval - - self.useFixture(fixtures.MonkeyPatch( - 'neutron.common.rpc.RpcProxy.' + rpc_method, - _fake_rpc_method)) - - retval = getattr(rpcapi, method)(ctxt, **kwargs) - - self.assertEqual(retval, expected_retval) - expected_args = [ctxt, expected_msg] - - # skip the first argument which is 'self' - for arg, expected_arg in zip(self.fake_args[1:], expected_args): - self.assertEqual(arg, expected_arg) - self.assertEqual(expected_kwargs, self.fake_kwargs) - - def test_delete_network(self): - rpcapi = povs.AgentNotifierApi(topics.AGENT) - self._test_ovs_api(rpcapi, - topics.get_topic_name(topics.AGENT, - topics.NETWORK, - topics.DELETE), - 'network_delete', rpc_method='fanout_cast', - network_id='fake_request_spec') - - def test_port_update(self): - rpcapi = povs.AgentNotifierApi(topics.AGENT) - self._test_ovs_api(rpcapi, - topics.get_topic_name(topics.AGENT, - topics.PORT, - topics.UPDATE), - 'port_update', rpc_method='fanout_cast', - port='fake_port', - network_type='fake_network_type', - segmentation_id='fake_segmentation_id', - physical_network='fake_physical_network') - - def test_tunnel_update(self): - rpcapi = povs.AgentNotifierApi(topics.AGENT) - self._test_ovs_api(rpcapi, - topics.get_topic_name(topics.AGENT, - constants.TUNNEL, - topics.UPDATE), - 'tunnel_update', rpc_method='fanout_cast', - tunnel_ip='fake_ip', tunnel_id='fake_id', - tunnel_type=None) - - def test_device_details(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_ovs_api(rpcapi, None, - 'get_device_details', rpc_method='call', - device='fake_device', - agent_id='fake_agent_id', - host='fake_host') - - def test_devices_details_list(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_ovs_api(rpcapi, None, - 'get_devices_details_list', rpc_method='call', - devices=['fake_device1', 'fake_device2'], - agent_id='fake_agent_id', host='fake_host', - version='1.3') - - def test_update_device_down(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_ovs_api(rpcapi, None, - 'update_device_down', rpc_method='call', - device='fake_device', - agent_id='fake_agent_id', - host='fake_host') - - def test_tunnel_sync(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_ovs_api(rpcapi, None, - 'tunnel_sync', rpc_method='call', - tunnel_ip='fake_tunnel_ip', - tunnel_type=None) - - def test_update_device_up(self): - rpcapi = agent_rpc.PluginApi(topics.PLUGIN) - self._test_ovs_api(rpcapi, None, - 'update_device_up', rpc_method='call', - device='fake_device', - agent_id='fake_agent_id', - host='fake_host') diff --git a/neutron/tests/unit/openvswitch/test_ovs_security_group.py b/neutron/tests/unit/openvswitch/test_ovs_security_group.py deleted file mode 100644 index 83f91cb7b90..00000000000 --- a/neutron/tests/unit/openvswitch/test_ovs_security_group.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright 2013, Nachi Ueno, NTT MCL, 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.api.v2 import attributes -from neutron.extensions import securitygroup as ext_sg -from neutron import manager -from neutron.tests.unit import test_extension_security_group as test_sg -from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc - -PLUGIN_NAME = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.OVSNeutronPluginV2') -NOTIFIER = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.AgentNotifierApi') - - -class OpenvswitchSecurityGroupsTestCase(test_sg.SecurityGroupDBTestCase): - _plugin_name = PLUGIN_NAME - - def setUp(self, plugin=None): - test_sg_rpc.set_firewall_driver(test_sg_rpc.FIREWALL_HYBRID_DRIVER) - notifier_p = mock.patch(NOTIFIER) - notifier_cls = notifier_p.start() - self.notifier = mock.Mock() - notifier_cls.return_value = self.notifier - self._attribute_map_bk_ = {} - for item in attributes.RESOURCE_ATTRIBUTE_MAP: - self._attribute_map_bk_[item] = (attributes. - RESOURCE_ATTRIBUTE_MAP[item]. - copy()) - super(OpenvswitchSecurityGroupsTestCase, self).setUp(PLUGIN_NAME) - - def tearDown(self): - super(OpenvswitchSecurityGroupsTestCase, self).tearDown() - attributes.RESOURCE_ATTRIBUTE_MAP = self._attribute_map_bk_ - - -class TestOpenvswitchSGServerRpcCallBack( - OpenvswitchSecurityGroupsTestCase, - test_sg_rpc.SGServerRpcCallBackTestCase): - pass - - -class TestOpenvswitchSGServerRpcCallBackXML( - OpenvswitchSecurityGroupsTestCase, - test_sg_rpc.SGServerRpcCallBackTestCaseXML): - pass - - -class TestOpenvswitchSecurityGroups(OpenvswitchSecurityGroupsTestCase, - test_sg.TestSecurityGroups, - test_sg_rpc.SGNotificationTestMixin): - def test_security_group_get_port_from_device(self): - with self.network() as n: - with self.subnet(n): - with self.security_group() as sg: - security_group_id = sg['security_group']['id'] - res = self._create_port(self.fmt, n['network']['id']) - port = self.deserialize(self.fmt, res) - fixed_ips = port['port']['fixed_ips'] - data = {'port': {'fixed_ips': fixed_ips, - 'name': port['port']['name'], - ext_sg.SECURITYGROUPS: - [security_group_id]}} - - req = self.new_update_request('ports', data, - port['port']['id']) - res = self.deserialize(self.fmt, - req.get_response(self.api)) - port_id = res['port']['id'] - plugin = manager.NeutronManager.get_plugin() - port_dict = plugin.get_port_from_device(port_id) - self.assertEqual(port_id, port_dict['id']) - self.assertEqual([security_group_id], - port_dict[ext_sg.SECURITYGROUPS]) - self.assertEqual([], port_dict['security_group_rules']) - self.assertEqual([fixed_ips[0]['ip_address']], - port_dict['fixed_ips']) - self._delete('ports', port_id) - - def test_security_group_get_port_from_device_with_no_port(self): - plugin = manager.NeutronManager.get_plugin() - port_dict = plugin.get_port_from_device('bad_device_id') - self.assertIsNone(port_dict) - - -class TestOpenvswitchSecurityGroupsXML(TestOpenvswitchSecurityGroups): - fmt = 'xml' diff --git a/neutron/tests/unit/plumgrid/__init__.py b/neutron/tests/unit/plumgrid/__init__.py index f34feeeec96..e69de29bb2d 100644 --- a/neutron/tests/unit/plumgrid/__init__.py +++ b/neutron/tests/unit/plumgrid/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 PLUMgrid, 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. diff --git a/neutron/tests/unit/ryu/__init__.py b/neutron/tests/unit/ryu/__init__.py index b706747cf8c..e69de29bb2d 100644 --- a/neutron/tests/unit/ryu/__init__.py +++ b/neutron/tests/unit/ryu/__init__.py @@ -1,14 +0,0 @@ -# Copyright 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. diff --git a/neutron/tests/unit/services/__init__.py b/neutron/tests/unit/services/__init__.py index 69bb9f63237..e69de29bb2d 100644 --- a/neutron/tests/unit/services/__init__.py +++ b/neutron/tests/unit/services/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 New Dream Network, LLC (DreamHost) -# -# 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. diff --git a/neutron/tests/unit/services/firewall/__init__.py b/neutron/tests/unit/services/firewall/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/tests/unit/services/firewall/__init__.py +++ b/neutron/tests/unit/services/firewall/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/services/firewall/agents/__init__.py b/neutron/tests/unit/services/firewall/agents/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/tests/unit/services/firewall/agents/__init__.py +++ b/neutron/tests/unit/services/firewall/agents/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/services/firewall/agents/l3reference/__init__.py b/neutron/tests/unit/services/firewall/agents/l3reference/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/tests/unit/services/firewall/agents/l3reference/__init__.py +++ b/neutron/tests/unit/services/firewall/agents/l3reference/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py b/neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py index 57edddcb45f..c5c3afeef42 100644 --- a/neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py +++ b/neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py @@ -335,8 +335,9 @@ class TestFwaasL3AgentRpcCallback(base.BaseTestCase): def _prepare_router_data(self, use_namespaces): router = {'id': str(uuid.uuid4()), 'tenant_id': str(uuid.uuid4())} + ns = "ns-" + router['id'] return l3_agent.RouterInfo(router['id'], self.conf.root_helper, - use_namespaces, router=router) + use_namespaces, router=router, ns_name=ns) def _get_router_info_list_with_namespace_helper(self, router_use_namespaces): diff --git a/neutron/tests/unit/services/firewall/agents/varmour/__init__.py b/neutron/tests/unit/services/firewall/agents/varmour/__init__.py index a6a8955d8b3..e69de29bb2d 100755 --- a/neutron/tests/unit/services/firewall/agents/varmour/__init__.py +++ b/neutron/tests/unit/services/firewall/agents/varmour/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/tests/unit/services/firewall/drivers/__init__.py b/neutron/tests/unit/services/firewall/drivers/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/tests/unit/services/firewall/drivers/__init__.py +++ b/neutron/tests/unit/services/firewall/drivers/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/services/firewall/drivers/linux/__init__.py b/neutron/tests/unit/services/firewall/drivers/linux/__init__.py index fb181bf6220..e69de29bb2d 100644 --- a/neutron/tests/unit/services/firewall/drivers/linux/__init__.py +++ b/neutron/tests/unit/services/firewall/drivers/linux/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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. diff --git a/neutron/tests/unit/services/firewall/drivers/varmour/__init__.py b/neutron/tests/unit/services/firewall/drivers/varmour/__init__.py index a6a8955d8b3..e69de29bb2d 100755 --- a/neutron/tests/unit/services/firewall/drivers/varmour/__init__.py +++ b/neutron/tests/unit/services/firewall/drivers/varmour/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013 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. diff --git a/neutron/tests/unit/services/firewall/test_fwaas_plugin.py b/neutron/tests/unit/services/firewall/test_fwaas_plugin.py index f1278a8924a..a9f8e67298c 100644 --- a/neutron/tests/unit/services/firewall/test_fwaas_plugin.py +++ b/neutron/tests/unit/services/firewall/test_fwaas_plugin.py @@ -43,9 +43,10 @@ class TestFirewallCallbacks(test_db_firewall.FirewallPluginDbTestCase): ctx = context.get_admin_context() with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP) as fw: + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ) as fw: fw_id = fw['firewall']['id'] res = self.callbacks.set_firewall_status(ctx, fw_id, const.ACTIVE, @@ -63,9 +64,10 @@ class TestFirewallCallbacks(test_db_firewall.FirewallPluginDbTestCase): ctx = context.get_admin_context() with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP) as fw: + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ) as fw: fw_id = fw['firewall']['id'] fw_db = self.plugin._get_firewall(ctx, fw_id) fw_db['status'] = const.PENDING_DELETE @@ -131,10 +133,10 @@ class TestFirewallCallbacks(test_db_firewall.FirewallPluginDbTestCase): res = req.get_response(self.ext_api) attrs = self._get_test_firewall_attrs() attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - tenant_id=tenant_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP) as fw: + with self.firewall( + firewall_policy_id=fwp_id, + tenant_id=tenant_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP) as fw: fw_id = fw['firewall']['id'] res = self.callbacks.get_firewalls_for_tenant(ctx, host='dummy') @@ -229,9 +231,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin): with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP) as firewall: + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ) as firewall: fw_id = firewall['firewall']['id'] res = self.callbacks.set_firewall_status(ctx, fw_id, const.ACTIVE) @@ -252,9 +255,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin): with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP) as firewall: + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ) as firewall: fw_id = firewall['firewall']['id'] data = {'firewall': {'name': name}} req = self.new_update_request('firewalls', data, fw_id) @@ -265,10 +269,11 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin): ctx = context.get_admin_context() with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP, - tenant_id='noadmin') as firewall: + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP, + tenant_id='noadmin' + ) as firewall: fw_id = firewall['firewall']['id'] self.callbacks.set_firewall_status(ctx, fw_id, const.ACTIVE) @@ -286,9 +291,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin): with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP): + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ): data = {'firewall_policy': {'name': name}} req = self.new_update_request('firewall_policies', data, fwp_id) @@ -306,9 +312,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin): req = self.new_update_request('firewall_policies', data, fwp_id) req.get_response(self.ext_api) - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP): + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ): data = {'firewall_rule': {'protocol': 'udp'}} req = self.new_update_request('firewall_rules', data, fr_id) @@ -323,9 +330,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin): with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP) as firewall: + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ) as firewall: fw_id = firewall['firewall']['id'] attrs = self._replace_firewall_status(attrs, const.PENDING_CREATE, @@ -367,9 +375,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin): req.get_response(self.ext_api) attrs = self._get_test_firewall_attrs() attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP) as fw: + with self.firewall( + firewall_policy_id=fwp_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ) as fw: fw_id = fw['firewall']['id'] fw_rules = ( self.plugin._make_firewall_dict_with_rules(ctx, diff --git a/neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py b/neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py index 79fb88d4e95..b2ead4e6936 100644 --- a/neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py +++ b/neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py @@ -120,7 +120,8 @@ class TestCiscoApicL3Plugin(testlib_api.SqlTestCase, mgr = self.plugin.manager self.plugin.remove_router_interface(self.context, ROUTER, interface_info) - mgr.delete_contract_for_epg.assert_called_once() + mgr.remove_router_interface.assert_called_once_with( + mocked.APIC_TENANT, mocked.APIC_ROUTER, mocked.APIC_NETWORK) def test_add_router_interface_subnet(self): self._test_add_router_interface(self.interface_info['subnet']) diff --git a/neutron/tests/unit/services/loadbalancer/__init__.py b/neutron/tests/unit/services/loadbalancer/__init__.py index 69bb9f63237..e69de29bb2d 100644 --- a/neutron/tests/unit/services/loadbalancer/__init__.py +++ b/neutron/tests/unit/services/loadbalancer/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 New Dream Network, LLC (DreamHost) -# -# 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. diff --git a/neutron/tests/unit/services/loadbalancer/drivers/__init__.py b/neutron/tests/unit/services/loadbalancer/drivers/__init__.py index 69bb9f63237..e69de29bb2d 100644 --- a/neutron/tests/unit/services/loadbalancer/drivers/__init__.py +++ b/neutron/tests/unit/services/loadbalancer/drivers/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 New Dream Network, LLC (DreamHost) -# -# 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. diff --git a/neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py b/neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py index 69bb9f63237..e69de29bb2d 100644 --- a/neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py +++ b/neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py @@ -1,13 +0,0 @@ -# Copyright 2013 New Dream Network, LLC (DreamHost) -# -# 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. diff --git a/neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py b/neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py index 45acdf5ee67..0f8a2fd51a5 100644 --- a/neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py +++ b/neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py @@ -272,10 +272,11 @@ class TestHaproxyNSDriver(base.BaseTestCase): 'test_interface', 'mac_addr', namespace='test_ns') - self.vif_driver.init_l3.assert_called_once_with('test_interface', - ['10.0.0.2/24'], - namespace= - 'test_ns') + self.vif_driver.init_l3.assert_called_once_with( + 'test_interface', + ['10.0.0.2/24'], + namespace='test_ns' + ) cmd = ['route', 'add', 'default', 'gw', '10.0.0.1'] cmd_arping = ['arping', '-U', '-I', 'test_interface', '-c', @@ -339,10 +340,11 @@ class TestHaproxyNSDriver(base.BaseTestCase): 'test_interface', 'mac_addr', namespace='test_ns') - self.vif_driver.init_l3.assert_called_once_with('test_interface', - ['10.0.0.2/24'], - namespace= - 'test_ns') + self.vif_driver.init_l3.assert_called_once_with( + 'test_interface', + ['10.0.0.2/24'], + namespace='test_ns' + ) self.assertFalse(ip_wrap.called) dev_exists.return_value = True self.assertRaises(exceptions.PreexistingDeviceFailure, @@ -375,10 +377,11 @@ class TestHaproxyNSDriver(base.BaseTestCase): 'test_interface', 'mac_addr', namespace='test_ns') - self.vif_driver.init_l3.assert_called_once_with('test_interface', - ['10.0.0.2/24'], - namespace= - 'test_ns') + self.vif_driver.init_l3.assert_called_once_with( + 'test_interface', + ['10.0.0.2/24'], + namespace='test_ns' + ) cmd = ['route', 'add', 'default', 'gw', '10.0.0.1'] ip_wrap.assert_has_calls([ mock.call('sudo_test', namespace='test_ns'), diff --git a/neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py b/neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py index 817d20e7527..e69de29bb2d 100644 --- a/neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py +++ b/neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py @@ -1,13 +0,0 @@ -# copyright 2013 Radware LTD. -# -# 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. diff --git a/neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py b/neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py index 31f6cb2f183..ba5c968bd89 100644 --- a/neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py +++ b/neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py @@ -19,6 +19,7 @@ import mock from oslo.config import cfg from six.moves import queue as Queue +from neutron.api.v2 import attributes from neutron import context from neutron.extensions import loadbalancer from neutron import manager @@ -155,6 +156,16 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase): """Call _get_pip twice and verify that a Port is created once.""" port_dict = {'fixed_ips': [{'subnet_id': '10.10.10.10', 'ip_address': '11.11.11.11'}]} + port_data = { + 'tenant_id': 'tenant_id', + 'name': 'port_name', + 'network_id': 'network_id', + 'mac_address': attributes.ATTR_NOT_SPECIFIED, + 'admin_state_up': False, + 'device_id': '', + 'device_owner': 'neutron:' + constants.LOADBALANCER, + 'fixed_ips': [{'subnet_id': '10.10.10.10'}] + } self.plugin_instance._core_plugin.get_ports = mock.Mock( return_value=[]) self.plugin_instance._core_plugin.create_port = mock.Mock( @@ -163,15 +174,18 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase): radware_driver._get_pip(context.get_admin_context(), 'tenant_id', 'port_name', 'network_id', '10.10.10.10') - self.plugin_instance._core_plugin.get_ports.assert_called_once() - self.plugin_instance._core_plugin.create_port.assert_called_once() + self.plugin_instance._core_plugin.get_ports.assert_called_once_with( + mock.ANY, filters={'name': ['port_name']}) + self.plugin_instance._core_plugin.create_port.assert_called_once_with( + mock.ANY, {'port': port_data}) self.plugin_instance._core_plugin.create_port.reset_mock() self.plugin_instance._core_plugin.get_ports.reset_mock() self.plugin_instance._core_plugin.get_ports.return_value = [port_dict] radware_driver._get_pip(context.get_admin_context(), 'tenant_id', 'port_name', 'network_id', '10.10.10.10') - self.plugin_instance._core_plugin.get_ports.assert_called_once() + self.plugin_instance._core_plugin.get_ports.assert_called_once_with( + mock.ANY, filters={'name': ['port_name']}) self.assertFalse(self.plugin_instance._core_plugin.create_port.called) def test_rest_client_recover_was_called(self): @@ -181,7 +195,9 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase): radware_driver.rest_client._call = self.orig__call self.assertRaises(r_exc.RESTRequestFailure, radware_driver._verify_workflow_templates) - self.recover_mock.assert_called_once() + self.recover_mock.assert_called_once_with('GET', + '/api/workflowTemplate', + None, None, False) def test_rest_client_flip_servers(self): radware_driver = self.plugin_instance.drivers['radware'] diff --git a/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py b/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py index 1d78c03d2fb..7d083922f65 100644 --- a/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py +++ b/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py @@ -61,8 +61,7 @@ class LBaaSAgentSchedulerTestCase(test_agent_ext_plugin.AgentDBTestMixIn, test_db_loadbalancer.LoadBalancerTestMixin, test_plugin.NeutronDbPluginV2TestCase): fmt = 'json' - plugin_str = ('neutron.plugins.openvswitch.' - 'ovs_neutron_plugin.OVSNeutronPluginV2') + plugin_str = 'neutron.plugins.ml2.plugin.Ml2Plugin' def setUp(self): # Save the global RESOURCE_ATTRIBUTE_MAP diff --git a/neutron/tests/unit/services/metering/__init__.py b/neutron/tests/unit/services/metering/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/tests/unit/services/metering/__init__.py +++ b/neutron/tests/unit/services/metering/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/tests/unit/services/metering/drivers/__init__.py b/neutron/tests/unit/services/metering/drivers/__init__.py index bc20be2a0cb..e69de29bb2d 100644 --- a/neutron/tests/unit/services/metering/drivers/__init__.py +++ b/neutron/tests/unit/services/metering/drivers/__init__.py @@ -1,13 +0,0 @@ -# Copyright (C) 2013 eNovance SAS -# -# 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. diff --git a/neutron/tests/unit/services/vpn/__init__.py b/neutron/tests/unit/services/vpn/__init__.py index f560154933f..e69de29bb2d 100644 --- a/neutron/tests/unit/services/vpn/__init__.py +++ b/neutron/tests/unit/services/vpn/__init__.py @@ -1,14 +0,0 @@ -# (c) Copyright 2013 Hewlett-Packard Development Company, L.P. -# 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. diff --git a/neutron/tests/unit/services/vpn/device_drivers/__init__.py b/neutron/tests/unit/services/vpn/device_drivers/__init__.py index 46d9c1bed8e..e69de29bb2d 100644 --- a/neutron/tests/unit/services/vpn/device_drivers/__init__.py +++ b/neutron/tests/unit/services/vpn/device_drivers/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013, Nachi Ueno, NTT I3, 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. diff --git a/neutron/tests/unit/services/vpn/device_drivers/cisco_csr_mock.py b/neutron/tests/unit/services/vpn/device_drivers/cisco_csr_mock.py deleted file mode 100644 index 93a126bfdac..00000000000 --- a/neutron/tests/unit/services/vpn/device_drivers/cisco_csr_mock.py +++ /dev/null @@ -1,577 +0,0 @@ -# Copyright 2014 Cisco Systems, 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. - -"""Mock REST requests to Cisco Cloud Services Router.""" - -import re - -import functools -# TODO(pcm): Remove when switch to requests-mock package. Comment out, if use -# local copy of httmock.py source. Needed for PEP8. -import httmock -import requests -from requests import exceptions as r_exc - -from neutron.openstack.common import log as logging -# TODO(pcm) Remove once httmock package is added to test-requirements. For -# now, uncomment and include httmock source to unit test. -# from neutron.tests.unit.services.vpn.device_drivers import httmock - -LOG = logging.getLogger(__name__) - - -def repeat(n): - """Decorator to limit the number of times a handler is called. - - Will allow the wrapped function (handler) to be called 'n' times. - After that, this will return None for any additional calls, - allowing other handlers, if any, to be invoked. - """ - - class static: - retries = n - - def decorator(func): - @functools.wraps(func) - def wrapped(*args, **kwargs): - if static.retries == 0: - return None - static.retries -= 1 - return func(*args, **kwargs) - return wrapped - return decorator - - -def filter_request(methods, resource): - """Decorator to invoke handler once for a specific resource. - - This will call the handler only for a specific resource using - a specific method(s). Any other resource request or method will - return None, allowing other handlers, if any, to be invoked. - """ - - class static: - target_methods = [m.upper() for m in methods] - target_resource = resource - - def decorator(func): - @functools.wraps(func) - def wrapped(*args, **kwargs): - if (args[1].method in static.target_methods and - static.target_resource in args[0].path): - return func(*args, **kwargs) - else: - return None # Not for this resource - return wrapped - return decorator - - -@httmock.urlmatch(netloc=r'localhost') -def token(url, request): - if 'auth/token-services' in url.path: - return {'status_code': requests.codes.OK, - 'content': {'token-id': 'dummy-token'}} - - -@httmock.urlmatch(netloc=r'localhost') -def token_unauthorized(url, request): - if 'auth/token-services' in url.path: - return {'status_code': requests.codes.UNAUTHORIZED} - - -@httmock.urlmatch(netloc=r'wrong-host') -def token_wrong_host(url, request): - raise r_exc.ConnectionError() - - -@httmock.all_requests -def token_timeout(url, request): - raise r_exc.Timeout() - - -@filter_request(['get'], 'global/host-name') -@httmock.all_requests -def timeout(url, request): - """Simulated timeout of a normal request.""" - - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - raise r_exc.Timeout() - - -@httmock.urlmatch(netloc=r'localhost') -def no_such_resource(url, request): - """Indicate not found error, when invalid resource requested.""" - return {'status_code': requests.codes.NOT_FOUND} - - -@filter_request(['get'], 'global/host-name') -@repeat(1) -@httmock.urlmatch(netloc=r'localhost') -def expired_request(url, request): - """Simulate access denied failure on first request for this resource. - - Intent here is to simulate that the token has expired, by failing - the first request to the resource. Because of the repeat=1, this - will only be called once, and subsequent calls will not be handled - by this function, but instead will access the normal handler and - will pass. Currently configured for a GET request, but will work - with POST and PUT as well. For DELETE, would need to filter_request on a - different resource (e.g. 'global/local-users') - """ - - return {'status_code': requests.codes.UNAUTHORIZED} - - -@httmock.urlmatch(netloc=r'localhost') -def normal_get(url, request): - if request.method != 'GET': - return - LOG.debug("GET mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - if 'global/host-name' in url.path: - content = {u'kind': u'object#host-name', - u'host-name': u'Router'} - return httmock.response(requests.codes.OK, content=content) - if 'global/local-users' in url.path: - content = {u'kind': u'collection#local-user', - u'users': ['peter', 'paul', 'mary']} - return httmock.response(requests.codes.OK, content=content) - if 'interfaces/GigabitEthernet' in url.path: - actual_interface = url.path.split('/')[-1] - ip = actual_interface[-1] - content = {u'kind': u'object#interface', - u'description': u'Changed description', - u'if-name': actual_interface, - u'proxy-arp': True, - u'subnet-mask': u'255.255.255.0', - u'icmp-unreachable': True, - u'nat-direction': u'', - u'icmp-redirects': True, - u'ip-address': u'192.168.200.%s' % ip, - u'verify-unicast-source': False, - u'type': u'ethernet'} - return httmock.response(requests.codes.OK, content=content) - if 'vpn-svc/ike/policies/2' in url.path: - content = {u'kind': u'object#ike-policy', - u'priority-id': u'2', - u'version': u'v1', - u'local-auth-method': u'pre-share', - u'encryption': u'aes256', - u'hash': u'sha', - u'dhGroup': 5, - u'lifetime': 3600} - return httmock.response(requests.codes.OK, content=content) - if 'vpn-svc/ike/keyrings' in url.path: - content = {u'kind': u'object#ike-keyring', - u'keyring-name': u'5', - u'pre-shared-key-list': [ - {u'key': u'super-secret', - u'encrypted': False, - u'peer-address': u'10.10.10.20 255.255.255.0'} - ]} - return httmock.response(requests.codes.OK, content=content) - if 'vpn-svc/ipsec/policies/' in url.path: - ipsec_policy_id = url.path.split('/')[-1] - content = {u'kind': u'object#ipsec-policy', - u'mode': u'tunnel', - u'policy-id': u'%s' % ipsec_policy_id, - u'protection-suite': { - u'esp-encryption': u'esp-256-aes', - u'esp-authentication': u'esp-sha-hmac', - u'ah': u'ah-sha-hmac', - }, - u'anti-replay-window-size': u'Disable', - u'lifetime-sec': 120, - u'pfs': u'group5', - u'lifetime-kb': 4608000, - u'idle-time': None} - return httmock.response(requests.codes.OK, content=content) - if 'vpn-svc/site-to-site/Tunnel' in url.path: - tunnel = url.path.split('/')[-1] - # Use same number, to allow mock to generate IPSec policy ID - ipsec_policy_id = tunnel[6:] - content = {u'kind': u'object#vpn-site-to-site', - u'vpn-interface-name': u'%s' % tunnel, - u'ip-version': u'ipv4', - u'vpn-type': u'site-to-site', - u'ipsec-policy-id': u'%s' % ipsec_policy_id, - u'ike-profile-id': None, - u'mtu': 1500, - u'local-device': { - u'ip-address': '10.3.0.1/24', - u'tunnel-ip-address': '10.10.10.10' - }, - u'remote-device': { - u'tunnel-ip-address': '10.10.10.20' - }} - return httmock.response(requests.codes.OK, content=content) - if 'vpn-svc/ike/keepalive' in url.path: - content = {u'interval': 60, - u'retry': 4, - u'periodic': True} - return httmock.response(requests.codes.OK, content=content) - if 'routing-svc/static-routes' in url.path: - content = {u'destination-network': u'10.1.0.0/24', - u'kind': u'object#static-route', - u'next-hop-router': None, - u'outgoing-interface': u'GigabitEthernet1', - u'admin-distance': 1} - return httmock.response(requests.codes.OK, content=content) - if 'vpn-svc/site-to-site/active/sessions' in url.path: - # Only including needed fields for mock - content = {u'kind': u'collection#vpn-active-sessions', - u'items': [{u'status': u'DOWN-NEGOTIATING', - u'vpn-interface-name': u'Tunnel123'}, ]} - return httmock.response(requests.codes.OK, content=content) - - -@filter_request(['get'], 'vpn-svc/ike/keyrings') -@httmock.urlmatch(netloc=r'localhost') -def get_fqdn(url, request): - LOG.debug("GET FQDN mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - content = {u'kind': u'object#ike-keyring', - u'keyring-name': u'5', - u'pre-shared-key-list': [ - {u'key': u'super-secret', - u'encrypted': False, - u'peer-address': u'cisco.com'} - ]} - return httmock.response(requests.codes.OK, content=content) - - -@filter_request(['get'], 'vpn-svc/ipsec/policies/') -@httmock.urlmatch(netloc=r'localhost') -def get_no_ah(url, request): - LOG.debug("GET No AH mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - ipsec_policy_id = url.path.split('/')[-1] - content = {u'kind': u'object#ipsec-policy', - u'mode': u'tunnel', - u'anti-replay-window-size': u'128', - u'policy-id': u'%s' % ipsec_policy_id, - u'protection-suite': { - u'esp-encryption': u'esp-aes', - u'esp-authentication': u'esp-sha-hmac', - }, - u'lifetime-sec': 120, - u'pfs': u'group5', - u'lifetime-kb': 4608000, - u'idle-time': None} - return httmock.response(requests.codes.OK, content=content) - - -@httmock.urlmatch(netloc=r'localhost') -def get_defaults(url, request): - if request.method != 'GET': - return - LOG.debug("GET mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - if 'vpn-svc/ike/policies/2' in url.path: - content = {u'kind': u'object#ike-policy', - u'priority-id': u'2', - u'version': u'v1', - u'local-auth-method': u'pre-share', - u'encryption': u'des', - u'hash': u'sha', - u'dhGroup': 1, - u'lifetime': 86400} - return httmock.response(requests.codes.OK, content=content) - if 'vpn-svc/ipsec/policies/' in url.path: - ipsec_policy_id = url.path.split('/')[-1] - content = {u'kind': u'object#ipsec-policy', - u'mode': u'tunnel', - u'policy-id': u'%s' % ipsec_policy_id, - u'protection-suite': {}, - u'lifetime-sec': 3600, - u'pfs': u'Disable', - u'anti-replay-window-size': u'None', - u'lifetime-kb': 4608000, - u'idle-time': None} - return httmock.response(requests.codes.OK, content=content) - - -@filter_request(['get'], 'vpn-svc/site-to-site') -@httmock.urlmatch(netloc=r'localhost') -def get_unnumbered(url, request): - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - tunnel = url.path.split('/')[-1] - ipsec_policy_id = tunnel[6:] - content = {u'kind': u'object#vpn-site-to-site', - u'vpn-interface-name': u'%s' % tunnel, - u'ip-version': u'ipv4', - u'vpn-type': u'site-to-site', - u'ipsec-policy-id': u'%s' % ipsec_policy_id, - u'ike-profile-id': None, - u'mtu': 1500, - u'local-device': { - u'ip-address': u'GigabitEthernet3', - u'tunnel-ip-address': u'10.10.10.10' - }, - u'remote-device': { - u'tunnel-ip-address': u'10.10.10.20' - }} - return httmock.response(requests.codes.OK, content=content) - - -@filter_request(['get'], 'vpn-svc/site-to-site/Tunnel') -@httmock.urlmatch(netloc=r'localhost') -def get_admin_down(url, request): - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - # URI has .../Tunnel#/state, so get number from 2nd to last element - tunnel = url.path.split('/')[-2] - content = {u'kind': u'object#vpn-site-to-site-state', - u'vpn-interface-name': u'%s' % tunnel, - u'line-protocol-state': u'down', - u'enabled': False} - return httmock.response(requests.codes.OK, content=content) - - -@filter_request(['get'], 'vpn-svc/site-to-site/Tunnel') -@httmock.urlmatch(netloc=r'localhost') -def get_admin_up(url, request): - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - # URI has .../Tunnel#/state, so get number from 2nd to last element - tunnel = url.path.split('/')[-2] - content = {u'kind': u'object#vpn-site-to-site-state', - u'vpn-interface-name': u'%s' % tunnel, - u'line-protocol-state': u'down', - u'enabled': True} - return httmock.response(requests.codes.OK, content=content) - - -@filter_request(['get'], 'vpn-svc/site-to-site') -@httmock.urlmatch(netloc=r'localhost') -def get_mtu(url, request): - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - tunnel = url.path.split('/')[-1] - ipsec_policy_id = tunnel[6:] - content = {u'kind': u'object#vpn-site-to-site', - u'vpn-interface-name': u'%s' % tunnel, - u'ip-version': u'ipv4', - u'vpn-type': u'site-to-site', - u'ipsec-policy-id': u'%s' % ipsec_policy_id, - u'ike-profile-id': None, - u'mtu': 9192, - u'local-device': { - u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10' - }, - u'remote-device': { - u'tunnel-ip-address': u'10.10.10.20' - }} - return httmock.response(requests.codes.OK, content=content) - - -@filter_request(['get'], 'vpn-svc/ike/keepalive') -@httmock.urlmatch(netloc=r'localhost') -def get_not_configured(url, request): - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.NOT_FOUND} - - -@filter_request(['get'], 'vpn-svc/site-to-site/active/sessions') -@httmock.urlmatch(netloc=r'localhost') -def get_none(url, request): - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - content = {u'kind': u'collection#vpn-active-sessions', - u'items': []} - return httmock.response(requests.codes.OK, content=content) - - -@filter_request(['get'], 'interfaces/GigabitEthernet3') -@httmock.urlmatch(netloc=r'localhost') -def get_local_ip(url, request): - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - content = {u'kind': u'object#interface', - u'subnet-mask': u'255.255.255.0', - u'ip-address': u'10.5.0.2'} - return httmock.response(requests.codes.OK, content=content) - - -@httmock.urlmatch(netloc=r'localhost') -def post(url, request): - if request.method != 'POST': - return - LOG.debug("POST mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - if 'interfaces/GigabitEthernet' in url.path: - return {'status_code': requests.codes.NO_CONTENT} - if 'global/local-users' in url.path: - if 'username' not in request.body: - return {'status_code': requests.codes.BAD_REQUEST} - if '"privilege": 20' in request.body: - return {'status_code': requests.codes.BAD_REQUEST} - headers = {'location': '%s/test-user' % url.geturl()} - return httmock.response(requests.codes.CREATED, headers=headers) - if 'vpn-svc/ike/policies' in url.path: - headers = {'location': "%s/2" % url.geturl()} - return httmock.response(requests.codes.CREATED, headers=headers) - if 'vpn-svc/ipsec/policies' in url.path: - m = re.search(r'"policy-id": "(\S+)"', request.body) - if m: - headers = {'location': "%s/%s" % (url.geturl(), m.group(1))} - return httmock.response(requests.codes.CREATED, headers=headers) - return {'status_code': requests.codes.BAD_REQUEST} - if 'vpn-svc/ike/keyrings' in url.path: - headers = {'location': "%s/5" % url.geturl()} - return httmock.response(requests.codes.CREATED, headers=headers) - if 'vpn-svc/site-to-site' in url.path: - m = re.search(r'"vpn-interface-name": "(\S+)"', request.body) - if m: - headers = {'location': "%s/%s" % (url.geturl(), m.group(1))} - return httmock.response(requests.codes.CREATED, headers=headers) - return {'status_code': requests.codes.BAD_REQUEST} - if 'routing-svc/static-routes' in url.path: - headers = {'location': - "%s/10.1.0.0_24_GigabitEthernet1" % url.geturl()} - return httmock.response(requests.codes.CREATED, headers=headers) - - -@filter_request(['post'], 'global/local-users') -@httmock.urlmatch(netloc=r'localhost') -def post_change_attempt(url, request): - LOG.debug("POST change value mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.NOT_FOUND, - 'content': { - u'error-code': -1, - u'error-message': u'user test-user already exists'}} - - -@httmock.urlmatch(netloc=r'localhost') -def post_duplicate(url, request): - LOG.debug("POST duplicate mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.BAD_REQUEST, - 'content': { - u'error-code': -1, - u'error-message': u'policy 2 exist, not allow to ' - u'update policy using POST method'}} - - -@filter_request(['post'], 'vpn-svc/site-to-site') -@httmock.urlmatch(netloc=r'localhost') -def post_missing_ipsec_policy(url, request): - LOG.debug("POST missing ipsec policy mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.BAD_REQUEST} - - -@filter_request(['post'], 'vpn-svc/site-to-site') -@httmock.urlmatch(netloc=r'localhost') -def post_missing_ike_policy(url, request): - LOG.debug("POST missing ike policy mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.BAD_REQUEST} - - -@filter_request(['post'], 'vpn-svc/site-to-site') -@httmock.urlmatch(netloc=r'localhost') -def post_bad_ip(url, request): - LOG.debug("POST bad IP mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.BAD_REQUEST} - - -@filter_request(['post'], 'vpn-svc/site-to-site') -@httmock.urlmatch(netloc=r'localhost') -def post_bad_mtu(url, request): - LOG.debug("POST bad mtu mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.BAD_REQUEST} - - -@filter_request(['post'], 'vpn-svc/ipsec/policies') -@httmock.urlmatch(netloc=r'localhost') -def post_bad_lifetime(url, request): - LOG.debug("POST bad lifetime mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.BAD_REQUEST} - - -@filter_request(['post'], 'vpn-svc/ipsec/policies') -@httmock.urlmatch(netloc=r'localhost') -def post_bad_name(url, request): - LOG.debug("POST bad IPSec policy name for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - return {'status_code': requests.codes.BAD_REQUEST} - - -@httmock.urlmatch(netloc=r'localhost') -def put(url, request): - if request.method != 'PUT': - return - LOG.debug("PUT mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - # Any resource - return {'status_code': requests.codes.NO_CONTENT} - - -@httmock.urlmatch(netloc=r'localhost') -def delete(url, request): - if request.method != 'DELETE': - return - LOG.debug("DELETE mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - # Any resource - return {'status_code': requests.codes.NO_CONTENT} - - -@httmock.urlmatch(netloc=r'localhost') -def delete_unknown(url, request): - if request.method != 'DELETE': - return - LOG.debug("DELETE unknown mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - # Any resource - return {'status_code': requests.codes.NOT_FOUND, - 'content': { - u'error-code': -1, - u'error-message': 'user unknown not found'}} - - -@httmock.urlmatch(netloc=r'localhost') -def delete_not_allowed(url, request): - if request.method != 'DELETE': - return - LOG.debug("DELETE not allowed mock for %s", url) - if not request.headers.get('X-auth-token', None): - return {'status_code': requests.codes.UNAUTHORIZED} - # Any resource - return {'status_code': requests.codes.METHOD_NOT_ALLOWED} diff --git a/neutron/tests/unit/services/vpn/device_drivers/notest_cisco_csr_rest.py b/neutron/tests/unit/services/vpn/device_drivers/notest_cisco_csr_rest.py deleted file mode 100644 index a89abe9445c..00000000000 --- a/neutron/tests/unit/services/vpn/device_drivers/notest_cisco_csr_rest.py +++ /dev/null @@ -1,1358 +0,0 @@ -# Copyright 2014 Cisco Systems, 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. - -#TODO(pcm): Rename this file to remove the "no" prefix, once httmock is -# approved and added to requirements.txt - -import random - -# TODO(pcm): Remove when update to requests-mock package. Comment out, if use -# local copy of httmock.py source. Needed for PEP8. -import httmock -import requests - -from neutron.openstack.common import log as logging -from neutron.services.vpn.device_drivers import ( - cisco_csr_rest_client as csr_client) -from neutron.tests import base -from neutron.tests.unit.services.vpn.device_drivers import ( - cisco_csr_mock as csr_request) -# TODO(pcm) Uncomment to run w/local copy of httmock.py source. Remove when -# update to requests-mock package. -# from neutron.tests.unit.services.vpn.device_drivers import httmock - - -LOG = logging.getLogger(__name__) -# Enables debug logging to console -if True: - logging.CONF.set_override('debug', True) - logging.setup('neutron') - -dummy_policy_id = 'dummy-ipsec-policy-id-name' - - -# Note: Helper functions to test reuse of IDs. -def generate_pre_shared_key_id(): - return random.randint(100, 200) - - -def generate_ike_policy_id(): - return random.randint(200, 300) - - -def generate_ipsec_policy_id(): - return random.randint(300, 400) - - -class TestCsrLoginRestApi(base.BaseTestCase): - - """Test logging into CSR to obtain token-id.""" - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrLoginRestApi, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def test_get_token(self): - """Obtain the token and its expiration time.""" - with httmock.HTTMock(csr_request.token): - self.assertTrue(self.csr.authenticate()) - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertIsNotNone(self.csr.token) - - def test_unauthorized_token_request(self): - """Negative test of invalid user/password.""" - self.csr.auth = ('stack', 'bogus') - with httmock.HTTMock(csr_request.token_unauthorized): - self.assertIsNone(self.csr.authenticate()) - self.assertEqual(requests.codes.UNAUTHORIZED, self.csr.status) - - def test_non_existent_host(self): - """Negative test of request to non-existent host.""" - self.csr.host = 'wrong-host' - self.csr.token = 'Set by some previously successful access' - with httmock.HTTMock(csr_request.token_wrong_host): - self.assertIsNone(self.csr.authenticate()) - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - self.assertIsNone(self.csr.token) - - def test_timeout_on_token_access(self): - """Negative test of a timeout on a request.""" - with httmock.HTTMock(csr_request.token_timeout): - self.assertIsNone(self.csr.authenticate()) - self.assertEqual(requests.codes.REQUEST_TIMEOUT, self.csr.status) - self.assertIsNone(self.csr.token) - - -class TestCsrGetRestApi(base.BaseTestCase): - - """Test CSR GET REST API.""" - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrGetRestApi, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def test_valid_rest_gets(self): - """Simple GET requests. - - First request will do a post to get token (login). Assumes - that there are two interfaces on the CSR. - """ - - with httmock.HTTMock(csr_request.token, - csr_request.normal_get): - content = self.csr.get_request('global/host-name') - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertIn('host-name', content) - self.assertNotEqual(None, content['host-name']) - - content = self.csr.get_request('global/local-users') - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertIn('users', content) - - -class TestCsrPostRestApi(base.BaseTestCase): - - """Test CSR POST REST API.""" - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrPostRestApi, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def test_post_requests(self): - """Simple POST requests (repeatable). - - First request will do a post to get token (login). Assumes - that there are two interfaces (Ge1 and Ge2) on the CSR. - """ - - with httmock.HTTMock(csr_request.token, - csr_request.post): - content = self.csr.post_request( - 'interfaces/GigabitEthernet1/statistics', - payload={'action': 'clear'}) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - self.assertIsNone(content) - content = self.csr.post_request( - 'interfaces/GigabitEthernet2/statistics', - payload={'action': 'clear'}) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - self.assertIsNone(content) - - def test_post_with_location(self): - """Create a user and verify that location returned.""" - with httmock.HTTMock(csr_request.token, - csr_request.post): - location = self.csr.post_request( - 'global/local-users', - payload={'username': 'test-user', - 'password': 'pass12345', - 'privilege': 15}) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('global/local-users/test-user', location) - - def test_post_missing_required_attribute(self): - """Negative test of POST with missing mandatory info.""" - with httmock.HTTMock(csr_request.token, - csr_request.post): - self.csr.post_request('global/local-users', - payload={'password': 'pass12345', - 'privilege': 15}) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - - def test_post_invalid_attribute(self): - """Negative test of POST with invalid info.""" - with httmock.HTTMock(csr_request.token, - csr_request.post): - self.csr.post_request('global/local-users', - payload={'username': 'test-user', - 'password': 'pass12345', - 'privilege': 20}) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - - def test_post_already_exists(self): - """Negative test of a duplicate POST. - - Uses the lower level _do_request() API to just perform the POST and - obtain the response, without any error processing. - """ - with httmock.HTTMock(csr_request.token, - csr_request.post): - location = self.csr._do_request( - 'POST', - 'global/local-users', - payload={'username': 'test-user', - 'password': 'pass12345', - 'privilege': 15}, - more_headers=csr_client.HEADER_CONTENT_TYPE_JSON) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('global/local-users/test-user', location) - with httmock.HTTMock(csr_request.token, - csr_request.post_change_attempt): - self.csr._do_request( - 'POST', - 'global/local-users', - payload={'username': 'test-user', - 'password': 'pass12345', - 'privilege': 15}, - more_headers=csr_client.HEADER_CONTENT_TYPE_JSON) - # Note: For local-user, a 404 error is returned. For - # site-to-site connection a 400 is returned. - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - - def test_post_changing_value(self): - """Negative test of a POST trying to change a value.""" - with httmock.HTTMock(csr_request.token, - csr_request.post): - location = self.csr.post_request( - 'global/local-users', - payload={'username': 'test-user', - 'password': 'pass12345', - 'privilege': 15}) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('global/local-users/test-user', location) - with httmock.HTTMock(csr_request.token, - csr_request.post_change_attempt): - content = self.csr.post_request('global/local-users', - payload={'username': 'test-user', - 'password': 'changed', - 'privilege': 15}) - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - expected = {u'error-code': -1, - u'error-message': u'user test-user already exists'} - self.assertDictContainsSubset(expected, content) - - -class TestCsrPutRestApi(base.BaseTestCase): - - """Test CSR PUT REST API.""" - - def _save_resources(self): - with httmock.HTTMock(csr_request.token, - csr_request.normal_get): - details = self.csr.get_request('global/host-name') - if self.csr.status != requests.codes.OK: - self.fail("Unable to save original host name") - self.original_host = details['host-name'] - details = self.csr.get_request('interfaces/GigabitEthernet1') - if self.csr.status != requests.codes.OK: - self.fail("Unable to save interface Ge1 description") - self.original_if = details - if details.get('description', ''): - self.original_if['description'] = '' - self.csr.token = None - - def _restore_resources(self, user, password): - """Restore the host name and itnerface description. - - Must restore the user and password, so that authentication - token can be obtained (as some tests corrupt auth info). - Will also clear token, so that it gets a fresh token. - """ - - self.csr.auth = (user, password) - self.csr.token = None - with httmock.HTTMock(csr_request.token, - csr_request.put): - payload = {'host-name': self.original_host} - self.csr.put_request('global/host-name', payload=payload) - if self.csr.status != requests.codes.NO_CONTENT: - self.fail("Unable to restore host name after test") - payload = {'description': self.original_if['description'], - 'if-name': self.original_if['if-name'], - 'ip-address': self.original_if['ip-address'], - 'subnet-mask': self.original_if['subnet-mask'], - 'type': self.original_if['type']} - self.csr.put_request('interfaces/GigabitEthernet1', - payload=payload) - if self.csr.status != requests.codes.NO_CONTENT: - self.fail("Unable to restore I/F Ge1 description after test") - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - """Prepare for PUT API tests.""" - super(TestCsrPutRestApi, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - self._save_resources() - self.addCleanup(self._restore_resources, 'stack', 'cisco') - - def test_put_requests(self): - """Simple PUT requests (repeatable). - - First request will do a post to get token (login). Assumes - that there are two interfaces on the CSR (Ge1 and Ge2). - """ - - with httmock.HTTMock(csr_request.token, - csr_request.put, - csr_request.normal_get): - payload = {'host-name': 'TestHost'} - content = self.csr.put_request('global/host-name', - payload=payload) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - self.assertIsNone(content) - - payload = {'host-name': 'TestHost2'} - content = self.csr.put_request('global/host-name', - payload=payload) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - self.assertIsNone(content) - - def test_change_interface_description(self): - """Test that interface description can be changed. - - This was a problem with an earlier version of the CSR image and is - here to prevent regression. - """ - with httmock.HTTMock(csr_request.token, - csr_request.put, - csr_request.normal_get): - payload = {'description': u'Changed description', - 'if-name': self.original_if['if-name'], - 'ip-address': self.original_if['ip-address'], - 'subnet-mask': self.original_if['subnet-mask'], - 'type': self.original_if['type']} - content = self.csr.put_request( - 'interfaces/GigabitEthernet1', payload=payload) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - self.assertIsNone(content) - content = self.csr.get_request('interfaces/GigabitEthernet1') - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertIn('description', content) - self.assertEqual(u'Changed description', - content['description']) - - def ignore_test_change_to_empty_interface_description(self): - """Test that interface description can be changed to empty string. - - This is a problem in the current version of the CSR image, which - rejects the change with a 400 error. This test is here to prevent - a regression (once it is fixed) Note that there is code in the - test setup to change the description to a non-empty string to - avoid failures in other tests. - """ - with httmock.HTTMock(csr_request.token, - csr_request.put, - csr_request.normal_get): - payload = {'description': '', - 'if-name': self.original_if['if-name'], - 'ip-address': self.original_if['ip-address'], - 'subnet-mask': self.original_if['subnet-mask'], - 'type': self.original_if['type']} - content = self.csr.put_request( - 'interfaces/GigabitEthernet1', payload=payload) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - self.assertIsNone(content) - content = self.csr.get_request('interfaces/GigabitEthernet1') - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertIn('description', content) - self.assertEqual('', content['description']) - - -class TestCsrDeleteRestApi(base.BaseTestCase): - - """Test CSR DELETE REST API.""" - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrDeleteRestApi, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def _make_dummy_user(self): - """Create a user that will be later deleted.""" - self.csr.post_request('global/local-users', - payload={'username': 'dummy', - 'password': 'dummy', - 'privilege': 15}) - self.assertEqual(requests.codes.CREATED, self.csr.status) - - def test_delete_requests(self): - """Simple DELETE requests (creating entry first).""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.delete): - self._make_dummy_user() - self.csr.token = None # Force login - self.csr.delete_request('global/local-users/dummy') - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - # Delete again, but without logging in this time - self._make_dummy_user() - self.csr.delete_request('global/local-users/dummy') - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - - def test_delete_non_existent_entry(self): - """Negative test of trying to delete a non-existent user.""" - with httmock.HTTMock(csr_request.token, - csr_request.delete_unknown): - content = self.csr.delete_request('global/local-users/unknown') - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - expected = {u'error-code': -1, - u'error-message': u'user unknown not found'} - self.assertDictContainsSubset(expected, content) - - def test_delete_not_allowed(self): - """Negative test of trying to delete the host-name.""" - with httmock.HTTMock(csr_request.token, - csr_request.delete_not_allowed): - self.csr.delete_request('global/host-name') - self.assertEqual(requests.codes.METHOD_NOT_ALLOWED, - self.csr.status) - - -class TestCsrRestApiFailures(base.BaseTestCase): - - """Test failure cases common for all REST APIs. - - Uses the lower level _do_request() to just perform the operation and get - the result, without any error handling. - """ - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=0.1): - super(TestCsrRestApiFailures, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def test_request_for_non_existent_resource(self): - """Negative test of non-existent resource on REST request.""" - with httmock.HTTMock(csr_request.token, - csr_request.no_such_resource): - self.csr.post_request('no/such/request') - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - # The result is HTTP 404 message, so no error content to check - - def test_timeout_during_request(self): - """Negative test of timeout during REST request.""" - with httmock.HTTMock(csr_request.token, - csr_request.timeout): - self.csr._do_request('GET', 'global/host-name') - self.assertEqual(requests.codes.REQUEST_TIMEOUT, self.csr.status) - - def test_token_expired_on_request(self): - """Token expired before trying a REST request. - - The mock is configured to return a 401 error on the first - attempt to reference the host name. Simulate expiration of - token by changing it. - """ - - with httmock.HTTMock(csr_request.token, - csr_request.expired_request, - csr_request.normal_get): - self.csr.token = '123' # These are 44 characters, so won't match - content = self.csr._do_request('GET', 'global/host-name') - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertIn('host-name', content) - self.assertNotEqual(None, content['host-name']) - - def test_failed_to_obtain_token_for_request(self): - """Negative test of unauthorized user for REST request.""" - self.csr.auth = ('stack', 'bogus') - with httmock.HTTMock(csr_request.token_unauthorized): - self.csr._do_request('GET', 'global/host-name') - self.assertEqual(requests.codes.UNAUTHORIZED, self.csr.status) - - -class TestCsrRestIkePolicyCreate(base.BaseTestCase): - - """Test IKE policy create REST requests.""" - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrRestIkePolicyCreate, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def test_create_delete_ike_policy(self): - """Create and then delete IKE policy.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - policy_id = '2' - policy_info = {u'priority-id': u'%s' % policy_id, - u'encryption': u'aes256', - u'hash': u'sha', - u'dhGroup': 5, - u'lifetime': 3600} - location = self.csr.create_ike_policy(policy_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ike/policies/%s' % policy_id, location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_policy = {u'kind': u'object#ike-policy', - u'version': u'v1', - u'local-auth-method': u'pre-share'} - expected_policy.update(policy_info) - self.assertEqual(expected_policy, content) - # Now delete and verify the IKE policy is gone - with httmock.HTTMock(csr_request.token, - csr_request.delete, - csr_request.no_such_resource): - self.csr.delete_ike_policy(policy_id) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - - def test_create_ike_policy_with_defaults(self): - """Create IKE policy using defaults for all optional values.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.get_defaults): - policy_id = '2' - policy_info = {u'priority-id': u'%s' % policy_id} - location = self.csr.create_ike_policy(policy_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ike/policies/%s' % policy_id, location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_policy = {u'kind': u'object#ike-policy', - u'version': u'v1', - u'encryption': u'des', - u'hash': u'sha', - u'dhGroup': 1, - u'lifetime': 86400, - # Lower level sets this, but it is the default - u'local-auth-method': u'pre-share'} - expected_policy.update(policy_info) - self.assertEqual(expected_policy, content) - - def test_create_duplicate_ike_policy(self): - """Negative test of trying to create a duplicate IKE policy.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - policy_id = '2' - policy_info = {u'priority-id': u'%s' % policy_id, - u'encryption': u'aes', - u'hash': u'sha', - u'dhGroup': 5, - u'lifetime': 3600} - location = self.csr.create_ike_policy(policy_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ike/policies/%s' % policy_id, location) - with httmock.HTTMock(csr_request.token, - csr_request.post_duplicate): - location = self.csr.create_ike_policy(policy_info) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - expected = {u'error-code': -1, - u'error-message': u'policy 2 exist, not allow to ' - u'update policy using POST method'} - self.assertDictContainsSubset(expected, location) - - -class TestCsrRestIPSecPolicyCreate(base.BaseTestCase): - - """Test IPSec policy create REST requests.""" - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrRestIPSecPolicyCreate, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def test_create_delete_ipsec_policy(self): - """Create and then delete IPSec policy.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - policy_id = '123' - policy_info = { - u'policy-id': u'%s' % policy_id, - u'protection-suite': { - u'esp-encryption': u'esp-256-aes', - u'esp-authentication': u'esp-sha-hmac', - u'ah': u'ah-sha-hmac', - }, - u'lifetime-sec': 120, - u'pfs': u'group5', - u'anti-replay-window-size': u'disable' - } - location = self.csr.create_ipsec_policy(policy_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ipsec/policies/%s' % policy_id, location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_policy = {u'kind': u'object#ipsec-policy', - u'mode': u'tunnel', - u'lifetime-kb': 4608000, - u'idle-time': None} - expected_policy.update(policy_info) - # CSR will respond with capitalized value - expected_policy[u'anti-replay-window-size'] = u'Disable' - self.assertEqual(expected_policy, content) - # Now delete and verify the IPSec policy is gone - with httmock.HTTMock(csr_request.token, - csr_request.delete, - csr_request.no_such_resource): - self.csr.delete_ipsec_policy(policy_id) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - - def test_create_ipsec_policy_with_defaults(self): - """Create IPSec policy with default for all optional values.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.get_defaults): - policy_id = '123' - policy_info = { - u'policy-id': u'%s' % policy_id, - } - location = self.csr.create_ipsec_policy(policy_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ipsec/policies/%s' % policy_id, location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_policy = {u'kind': u'object#ipsec-policy', - u'mode': u'tunnel', - u'protection-suite': {}, - u'lifetime-sec': 3600, - u'pfs': u'Disable', - u'anti-replay-window-size': u'None', - u'lifetime-kb': 4608000, - u'idle-time': None} - expected_policy.update(policy_info) - self.assertEqual(expected_policy, content) - - def test_create_ipsec_policy_with_uuid(self): - """Create IPSec policy using UUID for id.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - policy_info = { - u'policy-id': u'%s' % dummy_policy_id, - u'protection-suite': { - u'esp-encryption': u'esp-256-aes', - u'esp-authentication': u'esp-sha-hmac', - u'ah': u'ah-sha-hmac', - }, - u'lifetime-sec': 120, - u'pfs': u'group5', - u'anti-replay-window-size': u'disable' - } - location = self.csr.create_ipsec_policy(policy_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ipsec/policies/%s' % dummy_policy_id, - location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_policy = {u'kind': u'object#ipsec-policy', - u'mode': u'tunnel', - u'lifetime-kb': 4608000, - u'idle-time': None} - expected_policy.update(policy_info) - # CSR will respond with capitalized value - expected_policy[u'anti-replay-window-size'] = u'Disable' - self.assertEqual(expected_policy, content) - - def test_create_ipsec_policy_without_ah(self): - """Create IPSec policy.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.get_no_ah): - policy_id = '10' - policy_info = { - u'policy-id': u'%s' % policy_id, - u'protection-suite': { - u'esp-encryption': u'esp-aes', - u'esp-authentication': u'esp-sha-hmac', - }, - u'lifetime-sec': 120, - u'pfs': u'group5', - u'anti-replay-window-size': u'128' - } - location = self.csr.create_ipsec_policy(policy_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ipsec/policies/%s' % policy_id, location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_policy = {u'kind': u'object#ipsec-policy', - u'mode': u'tunnel', - u'lifetime-kb': 4608000, - u'idle-time': None} - expected_policy.update(policy_info) - self.assertEqual(expected_policy, content) - - def test_invalid_ipsec_policy_lifetime(self): - """Failure test of IPSec policy with unsupported lifetime.""" - with httmock.HTTMock(csr_request.token, - csr_request.post_bad_lifetime): - policy_id = '123' - policy_info = { - u'policy-id': u'%s' % policy_id, - u'protection-suite': { - u'esp-encryption': u'esp-aes', - u'esp-authentication': u'esp-sha-hmac', - u'ah': u'ah-sha-hmac', - }, - u'lifetime-sec': 119, - u'pfs': u'group5', - u'anti-replay-window-size': u'128' - } - self.csr.create_ipsec_policy(policy_info) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - - def test_create_ipsec_policy_with_invalid_name(self): - """Failure test of creating IPSec policy with name too long.""" - with httmock.HTTMock(csr_request.token, - csr_request.post_bad_name, - csr_request.get_defaults): - policy_id = 'policy-name-is-too-long-32-chars' - policy_info = { - u'policy-id': u'%s' % policy_id, - } - self.csr.create_ipsec_policy(policy_info) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - - -class TestCsrRestPreSharedKeyCreate(base.BaseTestCase): - - """Test Pre-shared key (PSK) create REST requests.""" - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrRestPreSharedKeyCreate, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def test_create_delete_pre_shared_key(self): - """Create and then delete a keyring entry for pre-shared key.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - psk_id = '5' - psk_info = {u'keyring-name': u'%s' % psk_id, - u'pre-shared-key-list': [ - {u'key': u'super-secret', - u'encrypted': False, - u'peer-address': u'10.10.10.20/24'} - ]} - location = self.csr.create_pre_shared_key(psk_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ike/keyrings/%s' % psk_id, location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_policy = {u'kind': u'object#ike-keyring'} - expected_policy.update(psk_info) - # Note: the peer CIDR is returned as an IP and mask - expected_policy[u'pre-shared-key-list'][0][u'peer-address'] = ( - u'10.10.10.20 255.255.255.0') - self.assertEqual(expected_policy, content) - # Now delete and verify pre-shared key is gone - with httmock.HTTMock(csr_request.token, - csr_request.delete, - csr_request.no_such_resource): - self.csr.delete_pre_shared_key(psk_id) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - - def test_create_pre_shared_key_with_fqdn_peer(self): - """Create pre-shared key using FQDN for peer address.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.get_fqdn): - psk_id = '5' - psk_info = {u'keyring-name': u'%s' % psk_id, - u'pre-shared-key-list': [ - {u'key': u'super-secret', - u'encrypted': False, - u'peer-address': u'cisco.com'} - ]} - location = self.csr.create_pre_shared_key(psk_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ike/keyrings/%s' % psk_id, location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_policy = {u'kind': u'object#ike-keyring'} - expected_policy.update(psk_info) - self.assertEqual(expected_policy, content) - - def test_create_pre_shared_key_with_duplicate_peer_address(self): - """Negative test of creating a second pre-shared key with same peer.""" - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - psk_id = '5' - psk_info = {u'keyring-name': u'%s' % psk_id, - u'pre-shared-key-list': [ - {u'key': u'super-secret', - u'encrypted': False, - u'peer-address': u'10.10.10.20/24'} - ]} - location = self.csr.create_pre_shared_key(psk_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/ike/keyrings/%s' % psk_id, location) - with httmock.HTTMock(csr_request.token, - csr_request.post_duplicate): - psk_id = u'6' - another_psk_info = {u'keyring-name': psk_id, - u'pre-shared-key-list': [ - {u'key': u'abc123def', - u'encrypted': False, - u'peer-address': u'10.10.10.20/24'} - ]} - self.csr.create_ike_policy(another_psk_info) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - - -class TestCsrRestIPSecConnectionCreate(base.BaseTestCase): - - """Test IPSec site-to-site connection REST requests. - - This requires us to have first created an IKE policy, IPSec policy, - and pre-shared key, so it's more of an itegration test, when used - with a real CSR (as we can't mock out these pre-conditions. - """ - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrRestIPSecConnectionCreate, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def _make_psk_for_test(self): - psk_id = generate_pre_shared_key_id() - self._remove_resource_for_test(self.csr.delete_pre_shared_key, - psk_id) - with httmock.HTTMock(csr_request.token, - csr_request.post): - psk_info = {u'keyring-name': u'%d' % psk_id, - u'pre-shared-key-list': [ - {u'key': u'super-secret', - u'encrypted': False, - u'peer-address': u'10.10.10.20/24'} - ]} - self.csr.create_pre_shared_key(psk_info) - if self.csr.status != requests.codes.CREATED: - self.fail("Unable to create PSK for test case") - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_pre_shared_key, psk_id) - return psk_id - - def _make_ike_policy_for_test(self): - policy_id = generate_ike_policy_id() - self._remove_resource_for_test(self.csr.delete_ike_policy, - policy_id) - with httmock.HTTMock(csr_request.token, - csr_request.post): - policy_info = {u'priority-id': u'%d' % policy_id, - u'encryption': u'aes', - u'hash': u'sha', - u'dhGroup': 5, - u'lifetime': 3600} - self.csr.create_ike_policy(policy_info) - if self.csr.status != requests.codes.CREATED: - self.fail("Unable to create IKE policy for test case") - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ike_policy, policy_id) - return policy_id - - def _make_ipsec_policy_for_test(self): - policy_id = generate_ipsec_policy_id() - self._remove_resource_for_test(self.csr.delete_ipsec_policy, - policy_id) - with httmock.HTTMock(csr_request.token, - csr_request.post): - policy_info = { - u'policy-id': u'%d' % policy_id, - u'protection-suite': { - u'esp-encryption': u'esp-aes', - u'esp-authentication': u'esp-sha-hmac', - u'ah': u'ah-sha-hmac', - }, - u'lifetime-sec': 120, - u'pfs': u'group5', - u'anti-replay-window-size': u'disable' - } - self.csr.create_ipsec_policy(policy_info) - if self.csr.status != requests.codes.CREATED: - self.fail("Unable to create IPSec policy for test case") - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_policy, policy_id) - return policy_id - - def _remove_resource_for_test(self, delete_resource, resource_id): - with httmock.HTTMock(csr_request.token, - csr_request.delete): - delete_resource(resource_id) - - def _prepare_for_site_conn_create(self, skip_psk=False, skip_ike=False, - skip_ipsec=False): - """Create the policies and PSK so can then create site conn.""" - if not skip_psk: - self._make_psk_for_test() - if not skip_ike: - self._make_ike_policy_for_test() - if not skip_ipsec: - ipsec_policy_id = self._make_ipsec_policy_for_test() - else: - ipsec_policy_id = generate_ipsec_policy_id() - # Note: Use same ID number for tunnel and IPSec policy, so that when - # GET tunnel info, the mocks can infer the IPSec policy ID from the - # tunnel number. - return (ipsec_policy_id, ipsec_policy_id) - - def test_create_delete_ipsec_connection(self): - """Create and then delete an IPSec connection.""" - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create() - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - connection_info = { - u'vpn-interface-name': u'Tunnel%d' % tunnel_id, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'mtu': 1500, - u'local-device': {u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - location = self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - 'Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id, - location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_connection = {u'kind': u'object#vpn-site-to-site', - u'ike-profile-id': None, - u'mtu': 1500, - u'ip-version': u'ipv4'} - expected_connection.update(connection_info) - self.assertEqual(expected_connection, content) - # Now delete and verify that site-to-site connection is gone - with httmock.HTTMock(csr_request.token, - csr_request.delete, - csr_request.no_such_resource): - # Only delete connection. Cleanup will take care of prerequisites - self.csr.delete_ipsec_connection('Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) - - def test_create_ipsec_connection_with_no_tunnel_subnet(self): - """Create an IPSec connection without an IP address on tunnel.""" - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create() - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.get_unnumbered): - connection_info = { - u'vpn-interface-name': u'Tunnel%d' % tunnel_id, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'local-device': {u'ip-address': u'GigabitEthernet3', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - location = self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - 'Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id, - location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_connection = {u'kind': u'object#vpn-site-to-site', - u'ike-profile-id': None, - u'mtu': 1500, - u'ip-version': u'ipv4'} - expected_connection.update(connection_info) - self.assertEqual(expected_connection, content) - - def test_create_ipsec_connection_no_pre_shared_key(self): - """Test of connection create without associated pre-shared key. - - The CSR will create the connection, but will not be able to pass - traffic without the pre-shared key. - """ - - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create( - skip_psk=True) - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - connection_info = { - u'vpn-interface-name': u'Tunnel%d' % tunnel_id, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'mtu': 1500, - u'local-device': {u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - location = self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - 'Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id, - location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_connection = {u'kind': u'object#vpn-site-to-site', - u'ike-profile-id': None, - u'mtu': 1500, - u'ip-version': u'ipv4'} - expected_connection.update(connection_info) - self.assertEqual(expected_connection, content) - - def test_create_ipsec_connection_with_default_ike_policy(self): - """Test of connection create without IKE policy (uses default). - - Without an IKE policy, the CSR will use a built-in default IKE - policy setting for the connection. - """ - - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create( - skip_ike=True) - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - connection_info = { - u'vpn-interface-name': u'Tunnel%d' % tunnel_id, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'mtu': 1500, - u'local-device': {u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - location = self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - 'Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id, - location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_connection = {u'kind': u'object#vpn-site-to-site', - u'ike-profile-id': None, - u'mtu': 1500, - u'ip-version': u'ipv4'} - expected_connection.update(connection_info) - self.assertEqual(expected_connection, content) - - def test_set_ipsec_connection_admin_state_changes(self): - """Create IPSec connection in admin down state.""" - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create() - tunnel = u'Tunnel%d' % tunnel_id - with httmock.HTTMock(csr_request.token, - csr_request.post): - connection_info = { - u'vpn-interface-name': tunnel, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'mtu': 1500, - u'local-device': {u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - location = self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - tunnel) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/site-to-site/%s' % tunnel, location) - state_uri = location + "/state" - # Note: When created, the tunnel will be in admin 'up' state - # Note: Line protocol state will be down, unless have an active conn. - expected_state = {u'kind': u'object#vpn-site-to-site-state', - u'vpn-interface-name': tunnel, - u'line-protocol-state': u'down', - u'enabled': False} - with httmock.HTTMock(csr_request.put, - csr_request.get_admin_down): - self.csr.set_ipsec_connection_state(tunnel, admin_up=False) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - content = self.csr.get_request(state_uri, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertEqual(expected_state, content) - - with httmock.HTTMock(csr_request.put, - csr_request.get_admin_up): - self.csr.set_ipsec_connection_state(tunnel, admin_up=True) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - content = self.csr.get_request(state_uri, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_state[u'enabled'] = True - self.assertEqual(expected_state, content) - - def test_create_ipsec_connection_missing_ipsec_policy(self): - """Negative test of connection create without IPSec policy.""" - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create( - skip_ipsec=True) - with httmock.HTTMock( - csr_request.token, - csr_request.post_missing_ipsec_policy): - connection_info = { - u'vpn-interface-name': u'Tunnel%d' % tunnel_id, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'local-device': {u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - 'Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - - def _determine_conflicting_ip(self): - with httmock.HTTMock(csr_request.token, - csr_request.get_local_ip): - details = self.csr.get_request('interfaces/GigabitEthernet3') - if self.csr.status != requests.codes.OK: - self.fail("Unable to obtain interface GigabitEthernet3's IP") - if_ip = details.get('ip-address') - if not if_ip: - self.fail("No IP address for GigabitEthernet3 interface") - return '.'.join(if_ip.split('.')[:3]) + '.10' - - def test_create_ipsec_connection_conficting_tunnel_ip(self): - """Negative test of connection create with conflicting tunnel IP. - - Find out the IP of a local interface (GigabitEthernet3) and create an - IP that is on the same subnet. Note: this interface needs to be up. - """ - - conflicting_ip = self._determine_conflicting_ip() - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create() - with httmock.HTTMock(csr_request.token, - csr_request.post_bad_ip): - connection_info = { - u'vpn-interface-name': u'Tunnel%d' % tunnel_id, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'local-device': {u'ip-address': u'%s/24' % conflicting_ip, - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - 'Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - - def test_create_ipsec_connection_with_max_mtu(self): - """Create an IPSec connection with max MTU value.""" - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create() - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.get_mtu): - connection_info = { - u'vpn-interface-name': u'Tunnel%d' % tunnel_id, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'mtu': 9192, - u'local-device': {u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - location = self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - 'Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id, - location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_connection = {u'kind': u'object#vpn-site-to-site', - u'ike-profile-id': None, - u'ip-version': u'ipv4'} - expected_connection.update(connection_info) - self.assertEqual(expected_connection, content) - - def test_create_ipsec_connection_with_bad_mtu(self): - """Negative test of connection create with unsupported MTU value.""" - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create() - with httmock.HTTMock(csr_request.token, - csr_request.post_bad_mtu): - connection_info = { - u'vpn-interface-name': u'Tunnel%d' % tunnel_id, - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'mtu': 9193, - u'local-device': {u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - 'Tunnel%d' % tunnel_id) - self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) - - def test_status_when_no_tunnels_exist(self): - """Get status, when there are no tunnels.""" - with httmock.HTTMock(csr_request.token, - csr_request.get_none): - tunnels = self.csr.read_tunnel_statuses() - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertEqual([], tunnels) - - def test_status_for_one_tunnel(self): - """Get status of one tunnel.""" - # Create the IPsec site-to-site connection first - tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create() - tunnel_id = 123 # Must hard code to work with mock - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - connection_info = { - u'vpn-interface-name': u'Tunnel123', - u'ipsec-policy-id': u'%d' % ipsec_policy_id, - u'local-device': {u'ip-address': u'10.3.0.1/24', - u'tunnel-ip-address': u'10.10.10.10'}, - u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} - } - location = self.csr.create_ipsec_connection(connection_info) - self.addCleanup(self._remove_resource_for_test, - self.csr.delete_ipsec_connection, - u'Tunnel123') - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id, - location) - with httmock.HTTMock(csr_request.token, - csr_request.normal_get): - tunnels = self.csr.read_tunnel_statuses() - self.assertEqual(requests.codes.OK, self.csr.status) - self.assertEqual([(u'Tunnel123', u'DOWN-NEGOTIATING'), ], tunnels) - - -class TestCsrRestIkeKeepaliveCreate(base.BaseTestCase): - - """Test IKE keepalive REST requests. - - Note: On the Cisco CSR, the IKE keepalive for v1 is a global configuration - that applies to all VPN tunnels to specify Dead Peer Detection information. - As a result, this REST API is not used in the OpenStack device driver, and - the keepalive will default to zero (disabled). - """ - - def _save_dpd_info(self): - with httmock.HTTMock(csr_request.token, - csr_request.normal_get): - details = self.csr.get_request('vpn-svc/ike/keepalive') - if self.csr.status == requests.codes.OK: - self.dpd = details - self.addCleanup(self._restore_dpd_info) - elif self.csr.status != requests.codes.NOT_FOUND: - self.fail("Unable to save original DPD info") - - def _restore_dpd_info(self): - with httmock.HTTMock(csr_request.token, - csr_request.put): - payload = {'interval': self.dpd['interval'], - 'retry': self.dpd['retry']} - self.csr.put_request('vpn-svc/ike/keepalive', payload=payload) - if self.csr.status != requests.codes.NO_CONTENT: - self.fail("Unable to restore DPD info after test") - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrRestIkeKeepaliveCreate, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - self._save_dpd_info() - self.csr.token = None - - def test_configure_ike_keepalive(self): - """Set IKE keep-alive (aka Dead Peer Detection) for the CSR.""" - with httmock.HTTMock(csr_request.token, - csr_request.put, - csr_request.normal_get): - keepalive_info = {'interval': 60, 'retry': 4} - self.csr.configure_ike_keepalive(keepalive_info) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - content = self.csr.get_request('vpn-svc/ike/keepalive') - self.assertEqual(requests.codes.OK, self.csr.status) - expected = {'periodic': False} - expected.update(keepalive_info) - self.assertDictContainsSubset(expected, content) - - def test_disable_ike_keepalive(self): - """Disable IKE keep-alive (aka Dead Peer Detection) for the CSR.""" - with httmock.HTTMock(csr_request.token, - csr_request.delete, - csr_request.put, - csr_request.get_not_configured): - keepalive_info = {'interval': 0, 'retry': 4} - self.csr.configure_ike_keepalive(keepalive_info) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - - -class TestCsrRestStaticRoute(base.BaseTestCase): - - """Test static route REST requests. - - A static route is added for the peer's private network. Would create - a route for each of the peer CIDRs specified for the VPN connection. - """ - - def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): - super(TestCsrRestStaticRoute, self).setUp() - info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, - 'username': 'stack', 'password': 'cisco', 'timeout': timeout} - self.csr = csr_client.CsrRestClient(info) - - def test_create_delete_static_route(self): - """Create and then delete a static route for the tunnel.""" - cidr = u'10.1.0.0/24' - interface = u'GigabitEthernet1' - expected_id = '10.1.0.0_24_GigabitEthernet1' - with httmock.HTTMock(csr_request.token, - csr_request.post, - csr_request.normal_get): - route_info = {u'destination-network': cidr, - u'outgoing-interface': interface} - location = self.csr.create_static_route(route_info) - self.assertEqual(requests.codes.CREATED, self.csr.status) - self.assertIn('routing-svc/static-routes/%s' % expected_id, - location) - # Check the hard-coded items that get set as well... - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.OK, self.csr.status) - expected_route = {u'kind': u'object#static-route', - u'next-hop-router': None, - u'admin-distance': 1} - expected_route.update(route_info) - self.assertEqual(expected_route, content) - # Now delete and verify that static route is gone - with httmock.HTTMock(csr_request.token, - csr_request.delete, - csr_request.no_such_resource): - route_id = csr_client.make_route_id(cidr, interface) - self.csr.delete_static_route(route_id) - self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) - content = self.csr.get_request(location, full_url=True) - self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) diff --git a/neutron/tests/unit/services/vpn/device_drivers/test_cisco_csr_rest.py b/neutron/tests/unit/services/vpn/device_drivers/test_cisco_csr_rest.py new file mode 100644 index 00000000000..b7092af4570 --- /dev/null +++ b/neutron/tests/unit/services/vpn/device_drivers/test_cisco_csr_rest.py @@ -0,0 +1,1626 @@ +# Copyright 2014 Cisco Systems, 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 random +import re + +import requests +from requests import exceptions as r_exc +from requests_mock.contrib import fixture as mock_fixture + +from neutron.services.vpn.device_drivers import ( + cisco_csr_rest_client as csr_client) +from neutron.tests import base + + +dummy_policy_id = 'dummy-ipsec-policy-id-name' +BASE_URL = 'https://%s:55443/api/v1/' +LOCAL_URL = 'https://localhost:55443/api/v1/' + +URI_HOSTNAME = 'global/host-name' +URI_USERS = 'global/local-users' +URI_AUTH = 'auth/token-services' +URI_INTERFACE_GE1 = 'interfaces/GigabitEthernet1' +URI_PSK = 'vpn-svc/ike/keyrings' +URI_PSK_ID = URI_PSK + '/%s' +URI_IKE_POLICY = 'vpn-svc/ike/policies' +URI_IKE_POLICY_ID = URI_IKE_POLICY + '/%s' +URI_IPSEC_POLICY = 'vpn-svc/ipsec/policies' +URI_IPSEC_POLICY_ID = URI_IPSEC_POLICY + '/%s' +URI_IPSEC_CONN = 'vpn-svc/site-to-site' +URI_IPSEC_CONN_ID = URI_IPSEC_CONN + '/%s' +URI_KEEPALIVE = 'vpn-svc/ike/keepalive' +URI_ROUTES = 'routing-svc/static-routes' +URI_ROUTES_ID = URI_ROUTES + '/%s' +URI_SESSIONS = 'vpn-svc/site-to-site/active/sessions' + + +# Note: Helper functions to test reuse of IDs. +def generate_pre_shared_key_id(): + return random.randint(100, 200) + + +def generate_ike_policy_id(): + return random.randint(200, 300) + + +def generate_ipsec_policy_id(): + return random.randint(300, 400) + + +class CiscoCsrBaseTestCase(base.BaseTestCase): + + """Helper methods to register mock intercepts - used by child classes.""" + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + super(CiscoCsrBaseTestCase, self).setUp() + self.base_url = BASE_URL % host + self.requests = self.useFixture(mock_fixture.Fixture()) + info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip, + 'username': 'stack', 'password': 'cisco', 'timeout': timeout} + self.csr = csr_client.CsrRestClient(info) + + def _register_local_get(self, uri, json=None, + result_code=requests.codes.OK): + self.requests.register_uri( + 'GET', + LOCAL_URL + uri, + status_code=result_code, + json=json) + + def _register_local_post(self, uri, resource_id, + result_code=requests.codes.CREATED): + self.requests.register_uri( + 'POST', + LOCAL_URL + uri, + status_code=result_code, + headers={'location': LOCAL_URL + uri + '/' + str(resource_id)}) + + def _register_local_delete(self, uri, resource_id, json=None, + result_code=requests.codes.NO_CONTENT): + self.requests.register_uri( + 'DELETE', + LOCAL_URL + uri + '/' + str(resource_id), + status_code=result_code, + json=json) + + def _register_local_delete_by_id(self, resource_id, + result_code=requests.codes.NO_CONTENT): + local_resource_re = re.compile(LOCAL_URL + '.+%s$' % resource_id) + self.requests.register_uri( + 'DELETE', + local_resource_re, + status_code=result_code) + + def _register_local_put(self, uri, resource_id, + result_code=requests.codes.NO_CONTENT): + self.requests.register_uri('PUT', + LOCAL_URL + uri + '/' + resource_id, + status_code=result_code) + + def _register_local_get_not_found(self, uri, resource_id, + result_code=requests.codes.NOT_FOUND): + self.requests.register_uri( + 'GET', + LOCAL_URL + uri + '/' + str(resource_id), + status_code=result_code) + + def _helper_register_auth_request(self): + self.requests.register_uri('POST', + LOCAL_URL + URI_AUTH, + status_code=requests.codes.OK, + json={'token-id': 'dummy-token'}) + + def _helper_register_psk_post(self, psk_id): + self._register_local_post(URI_PSK, psk_id) + + def _helper_register_ike_policy_post(self, policy_id): + self._register_local_post(URI_IKE_POLICY, policy_id) + + def _helper_register_ipsec_policy_post(self, policy_id): + self._register_local_post(URI_IPSEC_POLICY, policy_id) + + def _helper_register_tunnel_post(self, tunnel): + self._register_local_post(URI_IPSEC_CONN, tunnel) + + +class TestCsrLoginRestApi(CiscoCsrBaseTestCase): + + """Test logging into CSR to obtain token-id.""" + + def test_get_token(self): + """Obtain the token and its expiration time.""" + self._helper_register_auth_request() + self.assertTrue(self.csr.authenticate()) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertIsNotNone(self.csr.token) + + def test_unauthorized_token_request(self): + """Negative test of invalid user/password.""" + self.requests.register_uri('POST', + LOCAL_URL + URI_AUTH, + status_code=requests.codes.UNAUTHORIZED) + self.csr.auth = ('stack', 'bogus') + self.assertIsNone(self.csr.authenticate()) + self.assertEqual(requests.codes.UNAUTHORIZED, self.csr.status) + + def _simulate_wrong_host(self, request): + if 'wrong-host' in request.url: + raise r_exc.ConnectionError() + + def test_non_existent_host(self): + """Negative test of request to non-existent host.""" + self.requests.add_matcher(self._simulate_wrong_host) + self.csr.host = 'wrong-host' + self.csr.token = 'Set by some previously successful access' + self.assertIsNone(self.csr.authenticate()) + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + self.assertIsNone(self.csr.token) + + def _simulate_token_timeout(self, request): + raise r_exc.Timeout() + + def test_timeout_on_token_access(self): + """Negative test of a timeout on a request.""" + self.requests.add_matcher(self._simulate_token_timeout) + self.assertIsNone(self.csr.authenticate()) + self.assertEqual(requests.codes.REQUEST_TIMEOUT, self.csr.status) + self.assertIsNone(self.csr.token) + + +class TestCsrGetRestApi(CiscoCsrBaseTestCase): + + """Test CSR GET REST API.""" + + def test_valid_rest_gets(self): + """Simple GET requests. + + First request will do a post to get token (login). Assumes + that there are two interfaces on the CSR. + """ + + self._helper_register_auth_request() + self._register_local_get(URI_HOSTNAME, + json={u'kind': u'object#host-name', + u'host-name': u'Router'}) + self._register_local_get(URI_USERS, + json={u'kind': u'collection#local-user', + u'users': ['peter', 'paul', 'mary']}) + + actual = self.csr.get_request(URI_HOSTNAME) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertIn('host-name', actual) + self.assertIsNotNone(actual['host-name']) + + actual = self.csr.get_request(URI_USERS) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertIn('users', actual) + + +class TestCsrPostRestApi(CiscoCsrBaseTestCase): + + """Test CSR POST REST API.""" + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Setup for each test in this suite. + + Each test case will have a normal authentication mock response + registered here, although they may replace it, as needed. + """ + super(TestCsrPostRestApi, self).setUp(host, tunnel_ip, timeout) + self._helper_register_auth_request() + + def test_post_requests(self): + """Simple POST requests (repeatable). + + First request will do a post to get token (login). Assumes + that there are two interfaces (Ge1 and Ge2) on the CSR. + """ + + interface_re = re.compile('https://localhost:55443/.*/interfaces/' + 'GigabitEthernet\d/statistics') + self.requests.register_uri('POST', + interface_re, + status_code=requests.codes.NO_CONTENT) + + actual = self.csr.post_request( + 'interfaces/GigabitEthernet1/statistics', + payload={'action': 'clear'}) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + self.assertIsNone(actual) + actual = self.csr.post_request( + 'interfaces/GigabitEthernet2/statistics', + payload={'action': 'clear'}) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + self.assertIsNone(actual) + + def test_post_with_location(self): + """Create a user and verify that location returned.""" + self.requests.register_uri( + 'POST', + LOCAL_URL + URI_USERS, + status_code=requests.codes.CREATED, + headers={'location': LOCAL_URL + URI_USERS + '/test-user'}) + location = self.csr.post_request( + URI_USERS, + payload={'username': 'test-user', + 'password': 'pass12345', + 'privilege': 15}) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_USERS + '/test-user', location) + + def test_post_missing_required_attribute(self): + """Negative test of POST with missing mandatory info.""" + self.requests.register_uri('POST', + LOCAL_URL + URI_USERS, + status_code=requests.codes.BAD_REQUEST) + self.csr.post_request(URI_USERS, + payload={'password': 'pass12345', + 'privilege': 15}) + self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) + + def test_post_invalid_attribute(self): + """Negative test of POST with invalid info.""" + self.requests.register_uri('POST', + LOCAL_URL + URI_USERS, + status_code=requests.codes.BAD_REQUEST) + self.csr.post_request(URI_USERS, + payload={'username': 'test-user', + 'password': 'pass12345', + 'privilege': 20}) + self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) + + def test_post_already_exists(self): + """Negative test of a duplicate POST. + + Uses the lower level _do_request() API to just perform the POST and + obtain the response, without any error processing. + """ + + self.requests.register_uri( + 'POST', + LOCAL_URL + URI_USERS, + status_code=requests.codes.CREATED, + headers={'location': LOCAL_URL + URI_USERS + '/test-user'}) + + location = self.csr._do_request( + 'POST', + URI_USERS, + payload={'username': 'test-user', + 'password': 'pass12345', + 'privilege': 15}, + more_headers=csr_client.HEADER_CONTENT_TYPE_JSON) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_USERS + '/test-user', location) + self.csr.post_request(URI_USERS, + payload={'username': 'test-user', + 'password': 'pass12345', + 'privilege': 20}) + + self.requests.register_uri( + 'POST', + LOCAL_URL + URI_USERS, + status_code=requests.codes.NOT_FOUND, + json={u'error-code': -1, + u'error-message': u'user test-user already exists'}) + + self.csr._do_request( + 'POST', + URI_USERS, + payload={'username': 'test-user', + 'password': 'pass12345', + 'privilege': 15}, + more_headers=csr_client.HEADER_CONTENT_TYPE_JSON) + # Note: For local-user, a 404 error is returned. For + # site-to-site connection a 400 is returned. + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + + def test_post_changing_value(self): + """Negative test of a POST trying to change a value.""" + self.requests.register_uri( + 'POST', + LOCAL_URL + URI_USERS, + status_code=requests.codes.CREATED, + headers={'location': LOCAL_URL + URI_USERS + '/test-user'}) + + location = self.csr.post_request( + URI_USERS, + payload={'username': 'test-user', + 'password': 'pass12345', + 'privilege': 15}) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_USERS + '/test-user', location) + + self.requests.register_uri( + 'POST', + LOCAL_URL + URI_USERS, + status_code=requests.codes.NOT_FOUND, + json={u'error-code': -1, + u'error-message': u'user test-user already exists'}) + + actual = self.csr.post_request(URI_USERS, + payload={'username': 'test-user', + 'password': 'changed', + 'privilege': 15}) + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + expected = {u'error-code': -1, + u'error-message': u'user test-user already exists'} + self.assertDictSupersetOf(expected, actual) + + +class TestCsrPutRestApi(CiscoCsrBaseTestCase): + + """Test CSR PUT REST API.""" + + def _save_resources(self): + self._register_local_get(URI_HOSTNAME, + json={u'kind': u'object#host-name', + u'host-name': u'Router'}) + interface_info = {u'kind': u'object#interface', + u'description': u'Changed description', + u'if-name': 'interfaces/GigabitEthernet1', + u'proxy-arp': True, + u'subnet-mask': u'255.255.255.0', + u'icmp-unreachable': True, + u'nat-direction': u'', + u'icmp-redirects': True, + u'ip-address': u'192.168.200.1', + u'verify-unicast-source': False, + u'type': u'ethernet'} + self._register_local_get(URI_INTERFACE_GE1, + json=interface_info) + details = self.csr.get_request(URI_HOSTNAME) + if self.csr.status != requests.codes.OK: + self.fail("Unable to save original host name") + self.original_host = details['host-name'] + details = self.csr.get_request(URI_INTERFACE_GE1) + if self.csr.status != requests.codes.OK: + self.fail("Unable to save interface Ge1 description") + self.original_if = details + self.csr.token = None + + def _restore_resources(self, user, password): + """Restore the host name and interface description. + + Must restore the user and password, so that authentication + token can be obtained (as some tests corrupt auth info). + Will also clear token, so that it gets a fresh token. + """ + + self._register_local_put('global', 'host-name') + self._register_local_put('interfaces', 'GigabitEthernet1') + + self.csr.auth = (user, password) + self.csr.token = None + payload = {'host-name': self.original_host} + self.csr.put_request(URI_HOSTNAME, payload=payload) + if self.csr.status != requests.codes.NO_CONTENT: + self.fail("Unable to restore host name after test") + payload = {'description': self.original_if['description'], + 'if-name': self.original_if['if-name'], + 'ip-address': self.original_if['ip-address'], + 'subnet-mask': self.original_if['subnet-mask'], + 'type': self.original_if['type']} + self.csr.put_request(URI_INTERFACE_GE1, + payload=payload) + if self.csr.status != requests.codes.NO_CONTENT: + self.fail("Unable to restore I/F Ge1 description after test") + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Setup for each test in this suite. + + Each test case will have a normal authentication mock response + registered here, although they may replace it, as needed. In + addition, resources are saved, before each test is run, and + restored, after each test completes. + """ + super(TestCsrPutRestApi, self).setUp(host, tunnel_ip, timeout) + self._helper_register_auth_request() + self._save_resources() + self.addCleanup(self._restore_resources, 'stack', 'cisco') + + def test_put_requests(self): + """Simple PUT requests (repeatable). + + First request will do a post to get token (login). Assumes + that there are two interfaces on the CSR (Ge1 and Ge2). + """ + + self._register_local_put('interfaces', 'GigabitEthernet1') + self._register_local_put('global', 'host-name') + + actual = self.csr.put_request(URI_HOSTNAME, + payload={'host-name': 'TestHost'}) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + self.assertIsNone(actual) + + actual = self.csr.put_request(URI_HOSTNAME, + payload={'host-name': 'TestHost2'}) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + self.assertIsNone(actual) + + def test_change_interface_description(self): + """Test that interface description can be changed. + + This was a problem with an earlier version of the CSR image and is + here to prevent regression. + """ + self._register_local_put('interfaces', 'GigabitEthernet1') + payload = {'description': u'Changed description', + 'if-name': self.original_if['if-name'], + 'ip-address': self.original_if['ip-address'], + 'subnet-mask': self.original_if['subnet-mask'], + 'type': self.original_if['type']} + actual = self.csr.put_request(URI_INTERFACE_GE1, payload=payload) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + self.assertIsNone(actual) + actual = self.csr.get_request(URI_INTERFACE_GE1) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertIn('description', actual) + self.assertEqual(u'Changed description', + actual['description']) + + def ignore_test_change_to_empty_interface_description(self): + """Test that interface description can be changed to empty string. + + This is here to prevent regression, where the CSR was rejecting + an attempt to set the description to an empty string. + """ + self._register_local_put('interfaces', 'GigabitEthernet1') + payload = {'description': '', + 'if-name': self.original_if['if-name'], + 'ip-address': self.original_if['ip-address'], + 'subnet-mask': self.original_if['subnet-mask'], + 'type': self.original_if['type']} + actual = self.csr.put_request(URI_INTERFACE_GE1, payload=payload) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + self.assertIsNone(actual) + actual = self.csr.get_request(URI_INTERFACE_GE1) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertIn('description', actual) + self.assertEqual('', actual['description']) + + +class TestCsrDeleteRestApi(CiscoCsrBaseTestCase): + + """Test CSR DELETE REST API.""" + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Setup for each test in this suite. + + Each test case will have a normal authentication mock response + registered here, although they may replace it, as needed. + """ + super(TestCsrDeleteRestApi, self).setUp(host, tunnel_ip, timeout) + self._helper_register_auth_request() + + def _make_dummy_user(self): + """Create a user that will be later deleted.""" + self.requests.register_uri( + 'POST', + LOCAL_URL + URI_USERS, + status_code=requests.codes.CREATED, + headers={'location': LOCAL_URL + URI_USERS + '/dummy'}) + self.csr.post_request(URI_USERS, + payload={'username': 'dummy', + 'password': 'dummy', + 'privilege': 15}) + self.assertEqual(requests.codes.CREATED, self.csr.status) + + def test_delete_requests(self): + """Simple DELETE requests (creating entry first).""" + self._register_local_delete(URI_USERS, 'dummy') + self._make_dummy_user() + self.csr.token = None # Force login + self.csr.delete_request(URI_USERS + '/dummy') + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + # Delete again, but without logging in this time + self._make_dummy_user() + self.csr.delete_request(URI_USERS + '/dummy') + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + + def test_delete_non_existent_entry(self): + """Negative test of trying to delete a non-existent user.""" + expected = {u'error-code': -1, + u'error-message': u'user unknown not found'} + self._register_local_delete(URI_USERS, 'unknown', + result_code=requests.codes.NOT_FOUND, + json=expected) + actual = self.csr.delete_request(URI_USERS + '/unknown') + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + self.assertDictSupersetOf(expected, actual) + + def test_delete_not_allowed(self): + """Negative test of trying to delete the host-name.""" + self._register_local_delete( + 'global', 'host-name', + result_code=requests.codes.METHOD_NOT_ALLOWED) + self.csr.delete_request(URI_HOSTNAME) + self.assertEqual(requests.codes.METHOD_NOT_ALLOWED, + self.csr.status) + + +class TestCsrRestApiFailures(CiscoCsrBaseTestCase): + + """Test failure cases common for all REST APIs. + + Uses the lower level _do_request() to just perform the operation and get + the result, without any error handling. + """ + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=0.1): + """Setup for each test in this suite. + + Each test case will have a normal authentication mock response + registered here, although they may replace it, as needed. + """ + super(TestCsrRestApiFailures, self).setUp(host, tunnel_ip, timeout) + self._helper_register_auth_request() + + def _simulate_timeout(self, request): + if URI_HOSTNAME in request.path_uri: + raise r_exc.Timeout() + + def test_request_for_non_existent_resource(self): + """Negative test of non-existent resource on REST request.""" + self.requests.register_uri('POST', + LOCAL_URL + 'no/such/request', + status_code=requests.codes.NOT_FOUND) + self.csr.post_request('no/such/request') + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + # The result is HTTP 404 message, so no error content to check + + def _simulate_get_timeout(self, request): + """Will raise exception for any host request to this resource.""" + if URI_HOSTNAME in request.path_url: + raise r_exc.Timeout() + + def test_timeout_during_request(self): + """Negative test of timeout during REST request.""" + self.requests.add_matcher(self._simulate_get_timeout) + self.csr._do_request('GET', URI_HOSTNAME) + self.assertEqual(requests.codes.REQUEST_TIMEOUT, self.csr.status) + + def _simulate_auth_failure(self, request): + """First time auth POST is done, re-report unauthorized.""" + if URI_AUTH in request.path_url and not self.called_once: + self.called_once = True + resp = requests.Response() + resp.status_code = requests.codes.UNAUTHORIZED + return resp + + def test_token_expired_on_request(self): + """Token expired before trying a REST request. + + First, the token is set to a bogus value, to force it to + try to authenticate on the GET request. Second, a mock that + runs once, will simulate an auth failure. Third, the normal + auth mock will simulate success. + """ + + self._register_local_get(URI_HOSTNAME, + json={u'kind': u'object#host-name', + u'host-name': u'Router'}) + self.called_once = False + self.requests.add_matcher(self._simulate_auth_failure) + self.csr.token = '123' # These are 44 characters, so won't match + actual = self.csr._do_request('GET', URI_HOSTNAME) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertIn('host-name', actual) + self.assertIsNotNone(actual['host-name']) + + def test_failed_to_obtain_token_for_request(self): + """Negative test of unauthorized user for REST request.""" + self.csr.auth = ('stack', 'bogus') + self._register_local_get(URI_HOSTNAME, + result_code=requests.codes.UNAUTHORIZED) + self.csr._do_request('GET', URI_HOSTNAME) + self.assertEqual(requests.codes.UNAUTHORIZED, self.csr.status) + + +class TestCsrRestIkePolicyCreate(CiscoCsrBaseTestCase): + + """Test IKE policy create REST requests.""" + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Setup for each test in this suite. + + Each test case will have a normal authentication and post mock + response registered, although the test may replace them, if needed. + """ + super(TestCsrRestIkePolicyCreate, self).setUp(host, tunnel_ip, timeout) + self._helper_register_auth_request() + self._helper_register_ike_policy_post(2) + + def _helper_register_ike_policy_get(self): + content = {u'kind': u'object#ike-policy', + u'priority-id': u'2', + u'version': u'v1', + u'local-auth-method': u'pre-share', + u'encryption': u'aes256', + u'hash': u'sha', + u'dhGroup': 5, + u'lifetime': 3600} + self._register_local_get(URI_IKE_POLICY_ID % '2', json=content) + + def test_create_delete_ike_policy(self): + """Create and then delete IKE policy.""" + self._helper_register_ike_policy_get() + policy_info = {u'priority-id': u'2', + u'encryption': u'aes256', + u'hash': u'sha', + u'dhGroup': 5, + u'lifetime': 3600} + location = self.csr.create_ike_policy(policy_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IKE_POLICY_ID % '2', location) + # Check the hard-coded items that get set as well... + actual = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + expected_policy = {u'kind': u'object#ike-policy', + u'version': u'v1', + u'local-auth-method': u'pre-share'} + expected_policy.update(policy_info) + self.assertEqual(expected_policy, actual) + + # Now delete and verify the IKE policy is gone + self._register_local_delete(URI_IKE_POLICY, 2) + self._register_local_get_not_found(URI_IKE_POLICY, 2) + + self.csr.delete_ike_policy(2) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + actual = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + + def test_create_ike_policy_with_defaults(self): + """Create IKE policy using defaults for all optional values.""" + policy = {u'kind': u'object#ike-policy', + u'priority-id': u'2', + u'version': u'v1', + u'local-auth-method': u'pre-share', + u'encryption': u'des', + u'hash': u'sha', + u'dhGroup': 1, + u'lifetime': 86400} + self._register_local_get(URI_IKE_POLICY_ID % '2', json=policy) + policy_info = {u'priority-id': u'2'} + location = self.csr.create_ike_policy(policy_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IKE_POLICY_ID % '2', location) + + # Check the hard-coded items that get set as well... + actual = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + expected_policy = {u'kind': u'object#ike-policy', + u'version': u'v1', + u'encryption': u'des', + u'hash': u'sha', + u'dhGroup': 1, + u'lifetime': 86400, + # Lower level sets this, but it is the default + u'local-auth-method': u'pre-share'} + expected_policy.update(policy_info) + self.assertEqual(expected_policy, actual) + + def test_create_duplicate_ike_policy(self): + """Negative test of trying to create a duplicate IKE policy.""" + self._helper_register_ike_policy_get() + policy_info = {u'priority-id': u'2', + u'encryption': u'aes', + u'hash': u'sha', + u'dhGroup': 5, + u'lifetime': 3600} + location = self.csr.create_ike_policy(policy_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IKE_POLICY_ID % '2', location) + self.requests.register_uri( + 'POST', + LOCAL_URL + URI_IKE_POLICY, + status_code=requests.codes.BAD_REQUEST, + json={u'error-code': -1, + u'error-message': u'policy 2 exist, not allow to ' + u'update policy using POST method'}) + location = self.csr.create_ike_policy(policy_info) + self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) + expected = {u'error-code': -1, + u'error-message': u'policy 2 exist, not allow to ' + u'update policy using POST method'} + self.assertDictSupersetOf(expected, location) + + +class TestCsrRestIPSecPolicyCreate(CiscoCsrBaseTestCase): + + """Test IPSec policy create REST requests.""" + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Set up for each test in this suite. + + Each test case will have a normal authentication and post mock + response registered, although the test may replace them, if needed. + """ + super(TestCsrRestIPSecPolicyCreate, self).setUp(host, + tunnel_ip, + timeout) + self._helper_register_auth_request() + self._helper_register_ipsec_policy_post(123) + + def _helper_register_ipsec_policy_get(self, override=None): + content = {u'kind': u'object#ipsec-policy', + u'mode': u'tunnel', + u'policy-id': u'123', + u'protection-suite': { + u'esp-encryption': u'esp-256-aes', + u'esp-authentication': u'esp-sha-hmac', + u'ah': u'ah-sha-hmac', + }, + u'anti-replay-window-size': u'Disable', + u'lifetime-sec': 120, + u'pfs': u'group5', + u'lifetime-kb': 4608000, + u'idle-time': None} + if override: + content.update(override) + self._register_local_get(URI_IPSEC_POLICY + '/123', json=content) + + def test_create_delete_ipsec_policy(self): + """Create and then delete IPSec policy.""" + policy_info = { + u'policy-id': u'123', + u'protection-suite': { + u'esp-encryption': u'esp-256-aes', + u'esp-authentication': u'esp-sha-hmac', + u'ah': u'ah-sha-hmac', + }, + u'lifetime-sec': 120, + u'pfs': u'group5', + u'anti-replay-window-size': u'disable' + } + location = self.csr.create_ipsec_policy(policy_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_POLICY + '/123', location) + + # Check the hard-coded items that get set as well... + self._helper_register_ipsec_policy_get() + actual = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + expected_policy = {u'kind': u'object#ipsec-policy', + u'mode': u'tunnel', + u'lifetime-kb': 4608000, + u'idle-time': None} + expected_policy.update(policy_info) + # CSR will respond with capitalized value + expected_policy[u'anti-replay-window-size'] = u'Disable' + self.assertEqual(expected_policy, actual) + + # Now delete and verify the IPSec policy is gone + self._register_local_delete(URI_IPSEC_POLICY, 123) + self._register_local_get_not_found(URI_IPSEC_POLICY, 123) + + self.csr.delete_ipsec_policy('123') + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + actual = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + + def test_create_ipsec_policy_with_defaults(self): + """Create IPSec policy with default for all optional values.""" + policy_info = {u'policy-id': u'123'} + location = self.csr.create_ipsec_policy(policy_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_POLICY + '/123', location) + + # Check the hard-coded items that get set as well... + expected_policy = {u'kind': u'object#ipsec-policy', + u'mode': u'tunnel', + u'policy-id': u'123', + u'protection-suite': {}, + u'lifetime-sec': 3600, + u'pfs': u'Disable', + u'anti-replay-window-size': u'None', + u'lifetime-kb': 4608000, + u'idle-time': None} + self._register_local_get(URI_IPSEC_POLICY + '/123', + json=expected_policy) + + actual = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_policy, actual) + + def test_create_ipsec_policy_with_uuid(self): + """Create IPSec policy using UUID for id.""" + # Override normal POST response w/one that has a different policy ID + self._helper_register_ipsec_policy_post(dummy_policy_id) + policy_info = { + u'policy-id': u'%s' % dummy_policy_id, + u'protection-suite': { + u'esp-encryption': u'esp-256-aes', + u'esp-authentication': u'esp-sha-hmac', + u'ah': u'ah-sha-hmac', + }, + u'lifetime-sec': 120, + u'pfs': u'group5', + u'anti-replay-window-size': u'disable' + } + location = self.csr.create_ipsec_policy(policy_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_POLICY_ID % dummy_policy_id, location) + + # Check the hard-coded items that get set as well... + expected_policy = {u'kind': u'object#ipsec-policy', + u'mode': u'tunnel', + u'lifetime-kb': 4608000, + u'idle-time': None} + expected_policy.update(policy_info) + # CSR will respond with capitalized value + expected_policy[u'anti-replay-window-size'] = u'Disable' + self._register_local_get(URI_IPSEC_POLICY_ID % dummy_policy_id, + json=expected_policy) + actual = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_policy, actual) + + def test_create_ipsec_policy_without_ah(self): + """Create IPSec policy.""" + policy_info = { + u'policy-id': u'123', + u'protection-suite': { + u'esp-encryption': u'esp-aes', + u'esp-authentication': u'esp-sha-hmac', + }, + u'lifetime-sec': 120, + u'pfs': u'group5', + u'anti-replay-window-size': u'128' + } + location = self.csr.create_ipsec_policy(policy_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_POLICY_ID % '123', location) + + # Check the hard-coded items that get set as well... + self._helper_register_ipsec_policy_get( + override={u'anti-replay-window-size': u'128', + u'protection-suite': { + u'esp-encryption': u'esp-aes', + u'esp-authentication': u'esp-sha-hmac'}}) + + actual = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + expected_policy = {u'kind': u'object#ipsec-policy', + u'mode': u'tunnel', + u'lifetime-kb': 4608000, + u'idle-time': None} + expected_policy.update(policy_info) + self.assertEqual(expected_policy, actual) + + def test_invalid_ipsec_policy_lifetime(self): + """Failure test of IPSec policy with unsupported lifetime.""" + # Override normal POST response with one that indicates bad request + self.requests.register_uri('POST', + LOCAL_URL + URI_IPSEC_POLICY, + status_code=requests.codes.BAD_REQUEST) + policy_info = { + u'policy-id': u'123', + u'protection-suite': { + u'esp-encryption': u'esp-aes', + u'esp-authentication': u'esp-sha-hmac', + u'ah': u'ah-sha-hmac', + }, + u'lifetime-sec': 119, + u'pfs': u'group5', + u'anti-replay-window-size': u'128' + } + self.csr.create_ipsec_policy(policy_info) + self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) + + def test_create_ipsec_policy_with_invalid_name(self): + """Failure test of creating IPSec policy with name too long.""" + # Override normal POST response with one that indicates bad request + self.requests.register_uri('POST', + LOCAL_URL + URI_IPSEC_POLICY, + status_code=requests.codes.BAD_REQUEST) + policy_info = {u'policy-id': u'policy-name-is-too-long-32-chars'} + self.csr.create_ipsec_policy(policy_info) + self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) + + +class TestCsrRestPreSharedKeyCreate(CiscoCsrBaseTestCase): + + """Test Pre-shared key (PSK) create REST requests.""" + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Set up for each test in this suite. + + Each test case will have a normal authentication and post mock + response registered, although the test may replace them, if needed. + """ + super(TestCsrRestPreSharedKeyCreate, self).setUp(host, + tunnel_ip, + timeout) + self._helper_register_auth_request() + self._helper_register_psk_post(5) + + def _helper_register_psk_get(self, override=None): + content = {u'kind': u'object#ike-keyring', + u'keyring-name': u'5', + u'pre-shared-key-list': [ + {u'key': u'super-secret', + u'encrypted': False, + u'peer-address': u'10.10.10.20 255.255.255.0'} + ]} + if override: + content.update(override) + self._register_local_get(URI_PSK_ID % '5', json=content) + + def test_create_delete_pre_shared_key(self): + """Create and then delete a keyring entry for pre-shared key.""" + psk_info = {u'keyring-name': u'5', + u'pre-shared-key-list': [ + {u'key': u'super-secret', + u'encrypted': False, + u'peer-address': u'10.10.10.20/24'} + ]} + location = self.csr.create_pre_shared_key(psk_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_PSK_ID % '5', location) + + # Check the hard-coded items that get set as well... + self._helper_register_psk_get() + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + expected_policy = {u'kind': u'object#ike-keyring'} + expected_policy.update(psk_info) + # Note: the peer CIDR is returned as an IP and mask + expected_policy[u'pre-shared-key-list'][0][u'peer-address'] = ( + u'10.10.10.20 255.255.255.0') + self.assertEqual(expected_policy, content) + + # Now delete and verify pre-shared key is gone + self._register_local_delete(URI_PSK, 5) + self._register_local_get_not_found(URI_PSK, 5) + + self.csr.delete_pre_shared_key('5') + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + + def test_create_pre_shared_key_with_fqdn_peer(self): + """Create pre-shared key using FQDN for peer address.""" + psk_info = {u'keyring-name': u'5', + u'pre-shared-key-list': [ + {u'key': u'super-secret', + u'encrypted': False, + u'peer-address': u'cisco.com'} + ]} + location = self.csr.create_pre_shared_key(psk_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_PSK_ID % '5', location) + + # Check the hard-coded items that get set as well... + self._helper_register_psk_get( + override={u'pre-shared-key-list': [ + {u'key': u'super-secret', + u'encrypted': False, + u'peer-address': u'cisco.com'} + ]} + ) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + expected_policy = {u'kind': u'object#ike-keyring'} + expected_policy.update(psk_info) + self.assertEqual(expected_policy, content) + + +class TestCsrRestIPSecConnectionCreate(CiscoCsrBaseTestCase): + + """Test IPSec site-to-site connection REST requests. + + This requires us to have first created an IKE policy, IPSec policy, + and pre-shared key, so it's more of an itegration test, when used + with a real CSR (as we can't mock out these pre-conditions). + """ + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Setup for each test in this suite. + + Each test case will have a normal authentication mock response + registered here, although they may replace it, as needed. + """ + super(TestCsrRestIPSecConnectionCreate, self).setUp(host, + tunnel_ip, + timeout) + self._helper_register_auth_request() + self.route_id = '10.1.0.0_24_GigabitEthernet1' + + def _make_psk_for_test(self): + psk_id = generate_pre_shared_key_id() + self._remove_resource_for_test(self.csr.delete_pre_shared_key, + psk_id) + self._helper_register_psk_post(psk_id) + psk_info = {u'keyring-name': u'%d' % psk_id, + u'pre-shared-key-list': [ + {u'key': u'super-secret', + u'encrypted': False, + u'peer-address': u'10.10.10.20/24'} + ]} + self.csr.create_pre_shared_key(psk_info) + if self.csr.status != requests.codes.CREATED: + self.fail("Unable to create PSK for test case") + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_pre_shared_key, psk_id) + return psk_id + + def _make_ike_policy_for_test(self): + policy_id = generate_ike_policy_id() + self._remove_resource_for_test(self.csr.delete_ike_policy, + policy_id) + self._helper_register_ike_policy_post(policy_id) + policy_info = {u'priority-id': u'%d' % policy_id, + u'encryption': u'aes', + u'hash': u'sha', + u'dhGroup': 5, + u'lifetime': 3600} + self.csr.create_ike_policy(policy_info) + if self.csr.status != requests.codes.CREATED: + self.fail("Unable to create IKE policy for test case") + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ike_policy, policy_id) + return policy_id + + def _make_ipsec_policy_for_test(self): + policy_id = generate_ipsec_policy_id() + self._remove_resource_for_test(self.csr.delete_ipsec_policy, + policy_id) + self._helper_register_ipsec_policy_post(policy_id) + policy_info = { + u'policy-id': u'%d' % policy_id, + u'protection-suite': { + u'esp-encryption': u'esp-aes', + u'esp-authentication': u'esp-sha-hmac', + u'ah': u'ah-sha-hmac', + }, + u'lifetime-sec': 120, + u'pfs': u'group5', + u'anti-replay-window-size': u'disable' + } + self.csr.create_ipsec_policy(policy_info) + if self.csr.status != requests.codes.CREATED: + self.fail("Unable to create IPSec policy for test case") + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_policy, policy_id) + return policy_id + + def _remove_resource_for_test(self, delete_resource, resource_id): + self._register_local_delete_by_id(resource_id) + delete_resource(resource_id) + + def _prepare_for_site_conn_create(self, skip_psk=False, skip_ike=False, + skip_ipsec=False): + """Create the policies and PSK so can then create site conn.""" + if not skip_psk: + ike_policy_id = self._make_psk_for_test() + else: + ike_policy_id = generate_ike_policy_id() + if not skip_ike: + self._make_ike_policy_for_test() + if not skip_ipsec: + ipsec_policy_id = self._make_ipsec_policy_for_test() + else: + ipsec_policy_id = generate_ipsec_policy_id() + # Note: Use same ID number for tunnel and IPSec policy, so that when + # GET tunnel info, the mocks can infer the IPSec policy ID from the + # tunnel number. + return (ike_policy_id, ipsec_policy_id, ipsec_policy_id) + + def _helper_register_ipsec_conn_get(self, tunnel, override=None): + # Use same number, to allow mock to generate IPSec policy ID + ipsec_policy_id = tunnel[6:] + content = {u'kind': u'object#vpn-site-to-site', + u'vpn-interface-name': u'%s' % tunnel, + u'ip-version': u'ipv4', + u'vpn-type': u'site-to-site', + u'ipsec-policy-id': u'%s' % ipsec_policy_id, + u'ike-profile-id': None, + u'mtu': 1500, + u'local-device': { + u'ip-address': '10.3.0.1/24', + u'tunnel-ip-address': '10.10.10.10' + }, + u'remote-device': { + u'tunnel-ip-address': '10.10.10.20' + }} + if override: + content.update(override) + self._register_local_get(URI_IPSEC_CONN_ID % tunnel, json=content) + + def test_create_delete_ipsec_connection(self): + """Create and then delete an IPSec connection.""" + ike_policy_id, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create()) + tunnel_name = u'Tunnel%s' % tunnel_id + self._helper_register_tunnel_post(tunnel_name) + self._register_local_post(URI_ROUTES, self.route_id) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'mtu': 1500, + u'local-device': {u'ip-address': u'10.3.0.1/24', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + expected_connection = {u'kind': u'object#vpn-site-to-site', + u'ike-profile-id': None, + u'vpn-type': u'site-to-site', + u'mtu': 1500, + u'ip-version': u'ipv4'} + expected_connection.update(connection_info) + location = self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location) + + # Check the hard-coded items that get set as well... + self._helper_register_ipsec_conn_get(tunnel_name) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_connection, content) + + # Now delete and verify that site-to-site connection is gone + self._register_local_delete_by_id(tunnel_name) + self._register_local_delete_by_id(ipsec_policy_id) + self._register_local_delete_by_id(ike_policy_id) + self._register_local_get_not_found(URI_IPSEC_CONN, + tunnel_name) + # Only delete connection. Cleanup will take care of prerequisites + self.csr.delete_ipsec_connection(tunnel_name) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) + + def test_create_ipsec_connection_with_no_tunnel_subnet(self): + """Create an IPSec connection without an IP address on tunnel.""" + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create()) + tunnel_name = u'Tunnel%s' % tunnel_id + self._helper_register_tunnel_post(tunnel_name) + self._register_local_post(URI_ROUTES, self.route_id) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'local-device': {u'ip-address': u'GigabitEthernet3', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + expected_connection = {u'kind': u'object#vpn-site-to-site', + u'ike-profile-id': None, + u'vpn-type': u'site-to-site', + u'mtu': 1500, + u'ip-version': u'ipv4'} + expected_connection.update(connection_info) + location = self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn('vpn-svc/site-to-site/' + tunnel_name, location) + + # Check the hard-coded items that get set as well... + self._helper_register_ipsec_conn_get(tunnel_name, override={ + u'local-device': { + u'ip-address': u'GigabitEthernet3', + u'tunnel-ip-address': u'10.10.10.10' + }}) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_connection, content) + + def test_create_ipsec_connection_no_pre_shared_key(self): + """Test of connection create without associated pre-shared key. + + The CSR will create the connection, but will not be able to pass + traffic without the pre-shared key. + """ + + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create(skip_psk=True)) + tunnel_name = u'Tunnel%s' % tunnel_id + self._helper_register_tunnel_post(tunnel_name) + self._register_local_post(URI_ROUTES, self.route_id) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'mtu': 1500, + u'local-device': {u'ip-address': u'10.3.0.1/24', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + expected_connection = {u'kind': u'object#vpn-site-to-site', + u'ike-profile-id': None, + u'vpn-type': u'site-to-site', + u'ip-version': u'ipv4'} + expected_connection.update(connection_info) + location = self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location) + + # Check the hard-coded items that get set as well... + self._helper_register_ipsec_conn_get(tunnel_name) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_connection, content) + + def test_create_ipsec_connection_with_default_ike_policy(self): + """Test of connection create without IKE policy (uses default). + + Without an IKE policy, the CSR will use a built-in default IKE + policy setting for the connection. + """ + + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create(skip_ike=True)) + tunnel_name = u'Tunnel%s' % tunnel_id + self._helper_register_tunnel_post(tunnel_name) + self._register_local_post(URI_ROUTES, self.route_id) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'mtu': 1500, + u'local-device': {u'ip-address': u'10.3.0.1/24', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + expected_connection = {u'kind': u'object#vpn-site-to-site', + u'ike-profile-id': None, + u'vpn-type': u'site-to-site', + u'ip-version': u'ipv4'} + expected_connection.update(connection_info) + location = self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location) + + # Check the hard-coded items that get set as well... + self._helper_register_ipsec_conn_get(tunnel_name) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_connection, content) + + def test_set_ipsec_connection_admin_state_changes(self): + """Create IPSec connection in admin down state.""" + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create()) + tunnel_name = u'Tunnel%s' % tunnel_id + self._helper_register_tunnel_post(tunnel_name) + self._register_local_post(URI_ROUTES, self.route_id) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'mtu': 1500, + u'local-device': {u'ip-address': u'10.3.0.1/24', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + location = self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location) + + state_url = location + "/state" + state_uri = URI_IPSEC_CONN_ID % tunnel_name + '/state' + # Note: When created, the tunnel will be in admin 'up' state + # Note: Line protocol state will be down, unless have an active conn. + expected_state = {u'kind': u'object#vpn-site-to-site-state', + u'vpn-interface-name': tunnel_name, + u'line-protocol-state': u'down', + u'enabled': False} + self._register_local_put(URI_IPSEC_CONN_ID % tunnel_name, 'state') + self.csr.set_ipsec_connection_state(tunnel_name, admin_up=False) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + + self._register_local_get(state_uri, json=expected_state) + content = self.csr.get_request(state_url, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_state, content) + + self.csr.set_ipsec_connection_state(tunnel_name, admin_up=True) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + expected_state = {u'kind': u'object#vpn-site-to-site-state', + u'vpn-interface-name': tunnel_name, + u'line-protocol-state': u'down', + u'enabled': True} + self._register_local_get(state_uri, json=expected_state) + content = self.csr.get_request(state_url, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_state, content) + + def test_create_ipsec_connection_missing_ipsec_policy(self): + """Negative test of connection create without IPSec policy.""" + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create(skip_ipsec=True)) + tunnel_name = u'Tunnel%s' % tunnel_id + self._register_local_post(URI_IPSEC_CONN, tunnel_name, + result_code=requests.codes.BAD_REQUEST) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'local-device': {u'ip-address': u'10.3.0.1/24', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + 'Tunnel%d' % tunnel_id) + self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) + + def _determine_conflicting_ip(self): + content = {u'kind': u'object#interface', + u'subnet-mask': u'255.255.255.0', + u'ip-address': u'10.5.0.2'} + self._register_local_get('interfaces/GigabitEthernet3', json=content) + details = self.csr.get_request('interfaces/GigabitEthernet3') + if self.csr.status != requests.codes.OK: + self.fail("Unable to obtain interface GigabitEthernet3's IP") + if_ip = details.get('ip-address') + if not if_ip: + self.fail("No IP address for GigabitEthernet3 interface") + return '.'.join(if_ip.split('.')[:3]) + '.10' + + def test_create_ipsec_connection_conficting_tunnel_ip(self): + """Negative test of connection create with conflicting tunnel IP. + + Find out the IP of a local interface (GigabitEthernet3) and create an + IP that is on the same subnet. Note: this interface needs to be up. + """ + + conflicting_ip = self._determine_conflicting_ip() + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create()) + tunnel_name = u'Tunnel%s' % tunnel_id + self._register_local_post(URI_IPSEC_CONN, tunnel_name, + result_code=requests.codes.BAD_REQUEST) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'local-device': {u'ip-address': u'%s/24' % conflicting_ip, + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) + + def test_create_ipsec_connection_with_max_mtu(self): + """Create an IPSec connection with max MTU value.""" + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create()) + tunnel_name = u'Tunnel%s' % tunnel_id + self._helper_register_tunnel_post(tunnel_name) + self._register_local_post(URI_ROUTES, self.route_id) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'mtu': 9192, + u'local-device': {u'ip-address': u'10.3.0.1/24', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + expected_connection = {u'kind': u'object#vpn-site-to-site', + u'ike-profile-id': None, + u'vpn-type': u'site-to-site', + u'ip-version': u'ipv4'} + expected_connection.update(connection_info) + location = self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location) + + # Check the hard-coded items that get set as well... + self._helper_register_ipsec_conn_get(tunnel_name, override={ + u'mtu': 9192}) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_connection, content) + + def test_create_ipsec_connection_with_bad_mtu(self): + """Negative test of connection create with unsupported MTU value.""" + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create()) + tunnel_name = u'Tunnel%s' % tunnel_id + self._register_local_post(URI_IPSEC_CONN, tunnel_name, + result_code=requests.codes.BAD_REQUEST) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'mtu': 9193, + u'local-device': {u'ip-address': u'10.3.0.1/24', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status) + + def test_status_when_no_tunnels_exist(self): + """Get status, when there are no tunnels.""" + content = {u'kind': u'collection#vpn-active-sessions', + u'items': []} + self._register_local_get(URI_SESSIONS, json=content) + tunnels = self.csr.read_tunnel_statuses() + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual([], tunnels) + + def test_status_for_one_tunnel(self): + """Get status of one tunnel.""" + # Create the IPsec site-to-site connection first + _, ipsec_policy_id, tunnel_id = ( + self._prepare_for_site_conn_create()) + tunnel_name = u'Tunnel%s' % tunnel_id + self._helper_register_tunnel_post(tunnel_name) + self._register_local_post(URI_ROUTES, self.route_id) + connection_info = { + u'vpn-interface-name': tunnel_name, + u'ipsec-policy-id': u'%d' % ipsec_policy_id, + u'local-device': {u'ip-address': u'10.3.0.1/24', + u'tunnel-ip-address': u'10.10.10.10'}, + u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'} + } + location = self.csr.create_ipsec_connection(connection_info) + self.addCleanup(self._remove_resource_for_test, + self.csr.delete_ipsec_connection, + tunnel_name) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location) + + # Now, check the status + content = {u'kind': u'collection#vpn-active-sessions', + u'items': [{u'status': u'DOWN-NEGOTIATING', + u'vpn-interface-name': tunnel_name}, ]} + self._register_local_get(URI_SESSIONS, json=content) + self._helper_register_ipsec_conn_get(tunnel_name) + tunnels = self.csr.read_tunnel_statuses() + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual([(tunnel_name, u'DOWN-NEGOTIATING'), ], tunnels) + + +class TestCsrRestIkeKeepaliveCreate(CiscoCsrBaseTestCase): + + """Test IKE keepalive REST requests. + + Note: On the Cisco CSR, the IKE keepalive for v1 is a global configuration + that applies to all VPN tunnels to specify Dead Peer Detection information. + As a result, this REST API is not used in the OpenStack device driver, and + the keepalive will default to zero (disabled). + """ + + def _save_dpd_info(self): + details = self.csr.get_request(URI_KEEPALIVE) + if self.csr.status == requests.codes.OK: + self.dpd = details + self.addCleanup(self._restore_dpd_info) + elif self.csr.status != requests.codes.NOT_FOUND: + self.fail("Unable to save original DPD info") + + def _restore_dpd_info(self): + payload = {'interval': self.dpd['interval'], + 'retry': self.dpd['retry']} + self.csr.put_request(URI_KEEPALIVE, payload=payload) + if self.csr.status != requests.codes.NO_CONTENT: + self.fail("Unable to restore DPD info after test") + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Set up for each test in this suite. + + Each test case will have a normal authentication, get, and put mock + responses registered, although the test may replace them, if needed. + Dead Peer Detection settions will be saved for each test, and + restored afterwards. + """ + super(TestCsrRestIkeKeepaliveCreate, self).setUp(host, + tunnel_ip, + timeout) + self._helper_register_auth_request() + self._helper_register_keepalive_get() + self._register_local_put('vpn-svc/ike', 'keepalive') + self._save_dpd_info() + self.csr.token = None + + def _helper_register_keepalive_get(self, override=None): + content = {u'interval': 60, + u'retry': 4, + u'periodic': True} + if override: + content.update(override) + self._register_local_get(URI_KEEPALIVE, json=content) + + def test_configure_ike_keepalive(self): + """Set IKE keep-alive (aka Dead Peer Detection) for the CSR.""" + keepalive_info = {'interval': 60, 'retry': 4} + self.csr.configure_ike_keepalive(keepalive_info) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + content = self.csr.get_request(URI_KEEPALIVE) + self.assertEqual(requests.codes.OK, self.csr.status) + expected = {'periodic': False} + expected.update(keepalive_info) + self.assertDictSupersetOf(expected, content) + + def test_disable_ike_keepalive(self): + """Disable IKE keep-alive (aka Dead Peer Detection) for the CSR.""" + keepalive_info = {'interval': 0, 'retry': 4} + self.csr.configure_ike_keepalive(keepalive_info) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + + +class TestCsrRestStaticRoute(CiscoCsrBaseTestCase): + + """Test static route REST requests. + + A static route is added for the peer's private network. Would create + a route for each of the peer CIDRs specified for the VPN connection. + """ + + def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None): + """Set up for each test in this suite. + + Each test case will have a normal authentication mock response + registered, although the test may replace it, if needed. + """ + super(TestCsrRestStaticRoute, self).setUp(host, tunnel_ip, timeout) + self._helper_register_auth_request() + + def test_create_delete_static_route(self): + """Create and then delete a static route for the tunnel.""" + expected_id = '10.1.0.0_24_GigabitEthernet1' + self._register_local_post(URI_ROUTES, resource_id=expected_id) + cidr = u'10.1.0.0/24' + interface = u'GigabitEthernet1' + route_info = {u'destination-network': cidr, + u'outgoing-interface': interface} + location = self.csr.create_static_route(route_info) + self.assertEqual(requests.codes.CREATED, self.csr.status) + self.assertIn(URI_ROUTES_ID % expected_id, location) + + # Check the hard-coded items that get set as well... + expected_route = {u'destination-network': u'10.1.0.0/24', + u'kind': u'object#static-route', + u'next-hop-router': None, + u'outgoing-interface': u'GigabitEthernet1', + u'admin-distance': 1} + self._register_local_get(URI_ROUTES_ID % expected_id, + json=expected_route) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.OK, self.csr.status) + self.assertEqual(expected_route, content) + + # Now delete and verify that static route is gone + self._register_local_delete(URI_ROUTES, expected_id) + self._register_local_get_not_found(URI_ROUTES, expected_id) + route_id = csr_client.make_route_id(cidr, interface) + self.csr.delete_static_route(route_id) + self.assertEqual(requests.codes.NO_CONTENT, self.csr.status) + content = self.csr.get_request(location, full_url=True) + self.assertEqual(requests.codes.NOT_FOUND, self.csr.status) diff --git a/neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py b/neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py index f08364894ca..c6a6c684637 100644 --- a/neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py +++ b/neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py @@ -14,6 +14,7 @@ import copy import httplib +import operator import mock @@ -124,7 +125,7 @@ class TestCiscoCsrIPSecConnection(base.BaseTestCase): steps are called in reverse order. At the end, there should be no rollback infromation for the connection. """ - def fake_route_check_fails(*args, **kwargs): + def fake_route_check_fails(*args): if args[0] == 'Static Route': # So that subsequent calls to CSR rest client (for rollback) # will fake as passing. @@ -1530,7 +1531,8 @@ class TestCiscoCsrIPsecDeviceDriverSyncStatuses(base.BaseTestCase): u'4': {u'status': constants.ACTIVE, u'updated_pending_status': True}} }] - self.assertEqual(expected_report, report) + self.assertEqual(expected_report, + sorted(report, key=operator.itemgetter('id'))) # Check that service and connection statuses are updated self.assertEqual(constants.ACTIVE, vpn_service1.last_status) self.assertEqual(constants.ACTIVE, diff --git a/neutron/tests/unit/services/vpn/service_drivers/__init__.py b/neutron/tests/unit/services/vpn/service_drivers/__init__.py index 46d9c1bed8e..e69de29bb2d 100644 --- a/neutron/tests/unit/services/vpn/service_drivers/__init__.py +++ b/neutron/tests/unit/services/vpn/service_drivers/__init__.py @@ -1,14 +0,0 @@ -# Copyright 2013, Nachi Ueno, NTT I3, 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. diff --git a/neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py b/neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py index 781344f75f0..10b9d987c80 100644 --- a/neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py +++ b/neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py @@ -29,19 +29,15 @@ from neutron.tests.unit import testlib_api _uuid = uuidutils.generate_uuid FAKE_VPN_CONN_ID = _uuid() +FAKE_SERVICE_ID = _uuid() FAKE_VPN_CONNECTION = { - 'vpnservice_id': _uuid(), + 'vpnservice_id': FAKE_SERVICE_ID, 'id': FAKE_VPN_CONN_ID, 'ikepolicy_id': _uuid(), 'ipsecpolicy_id': _uuid(), 'tenant_id': _uuid() } -FAKE_SERVICE_ID = _uuid() -FAKE_VPN_CONNECTION = { - 'vpnservice_id': FAKE_SERVICE_ID -} - FAKE_ROUTER_ID = _uuid() FAKE_VPN_SERVICE = { 'router_id': FAKE_ROUTER_ID diff --git a/neutron/tests/unit/services/vpn/test_vpn_agent.py b/neutron/tests/unit/services/vpn/test_vpn_agent.py index f360dfaa1fb..d6ab140fc30 100644 --- a/neutron/tests/unit/services/vpn/test_vpn_agent.py +++ b/neutron/tests/unit/services/vpn/test_vpn_agent.py @@ -93,8 +93,9 @@ class TestVPNAgent(base.BaseTestCase): def test_get_namespace(self): router_id = _uuid() + ns = "ns-" + router_id ri = l3_agent.RouterInfo(router_id, self.conf.root_helper, - self.conf.use_namespaces, {}) + self.conf.use_namespaces, {}, ns_name=ns) self.agent.router_info = {router_id: ri} namespace = self.agent.get_namespace(router_id) self.assertTrue(namespace.endswith(router_id)) @@ -170,9 +171,10 @@ class TestVPNAgent(base.BaseTestCase): 'neutron.agent.linux.iptables_manager.IptablesManager').start() router_id = _uuid() ri = l3_agent.RouterInfo(router_id, self.conf.root_helper, - self.conf.use_namespaces, {}) + self.conf.use_namespaces, {}, + ns_name="qrouter-%s" % router_id) ri.router = { - 'id': _uuid(), + 'id': router_id, 'admin_state_up': True, 'routes': [], 'external_gateway_info': {}, @@ -183,15 +185,14 @@ class TestVPNAgent(base.BaseTestCase): self.agent._router_removed(router_id) device.destroy_router.assert_called_once_with(router_id) - def test_process_routers(self): + def test_process_router_if_compatible(self): self.plugin_api.get_external_network_id.return_value = None - routers = [ - {'id': _uuid(), - 'admin_state_up': True, - 'routes': [], - 'external_gateway_info': {}}] + router = {'id': _uuid(), + 'admin_state_up': True, + 'routes': [], + 'external_gateway_info': {}} device = mock.Mock() self.agent.devices = [device] - self.agent._process_routers(routers, False) - device.sync.assert_called_once_with(mock.ANY, routers) + self.agent._process_router_if_compatible(router) + device.sync.assert_called_once_with(mock.ANY, [router]) diff --git a/neutron/tests/unit/test_api_v2.py b/neutron/tests/unit/test_api_v2.py index e2ee2aacb48..c38cbaa42fc 100644 --- a/neutron/tests/unit/test_api_v2.py +++ b/neutron/tests/unit/test_api_v2.py @@ -13,7 +13,6 @@ # License for the specific language governing permissions and limitations # under the License. -import collections import os import mock @@ -145,7 +144,7 @@ class APIv2TestCase(APIv2TestBase): def _get_collection_kwargs(self, skipargs=[], **kwargs): args_list = ['filters', 'fields', 'sorts', 'limit', 'marker', 'page_reverse'] - args_dict = collections.OrderedDict( + args_dict = dict( (arg, mock.ANY) for arg in set(args_list) - set(skipargs)) args_dict.update(kwargs) return args_dict @@ -791,11 +790,7 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase): def test_create_no_keystone_env(self): data = {'name': 'net1'} - res = self.api.post(_get_path('networks', fmt=self.fmt), - self.serialize(data), - content_type='application/' + self.fmt, - expect_errors=True) - self.assertEqual(res.status_int, exc.HTTPBadRequest.code) + self._test_create_failure_bad_request('networks', data) def test_create_with_keystone_env(self): tenant_id = _uuid() @@ -827,45 +822,25 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase): tenant_id = _uuid() data = {'network': {'name': 'net1', 'tenant_id': tenant_id}} env = {'neutron.context': context.Context('', tenant_id + "bad")} - res = self.api.post(_get_path('networks', fmt=self.fmt), - self.serialize(data), - content_type='application/' + self.fmt, - expect_errors=True, - extra_environ=env) - self.assertEqual(res.status_int, exc.HTTPBadRequest.code) + self._test_create_failure_bad_request('networks', data, + extra_environ=env) def test_create_no_body(self): data = {'whoa': None} - res = self.api.post(_get_path('networks', fmt=self.fmt), - self.serialize(data), - content_type='application/' + self.fmt, - expect_errors=True) - self.assertEqual(res.status_int, exc.HTTPBadRequest.code) + self._test_create_failure_bad_request('networks', data) def test_create_no_resource(self): data = {} - res = self.api.post(_get_path('networks', fmt=self.fmt), - self.serialize(data), - content_type='application/' + self.fmt, - expect_errors=True) - self.assertEqual(res.status_int, exc.HTTPBadRequest.code) + self._test_create_failure_bad_request('networks', data) def test_create_missing_attr(self): data = {'port': {'what': 'who', 'tenant_id': _uuid()}} - res = self.api.post(_get_path('ports', fmt=self.fmt), - self.serialize(data), - content_type='application/' + self.fmt, - expect_errors=True) - self.assertEqual(res.status_int, 400) + self._test_create_failure_bad_request('ports', data) def test_create_readonly_attr(self): data = {'network': {'name': 'net1', 'tenant_id': _uuid(), 'status': "ACTIVE"}} - res = self.api.post(_get_path('networks', fmt=self.fmt), - self.serialize(data), - content_type='application/' + self.fmt, - expect_errors=True) - self.assertEqual(res.status_int, 400) + self._test_create_failure_bad_request('networks', data) def test_create_bulk(self): data = {'networks': [{'name': 'net1', @@ -888,38 +863,28 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase): content_type='application/' + self.fmt) self.assertEqual(res.status_int, exc.HTTPCreated.code) - def _test_create_bulk_failure(self, resource, data): - # TODO(kevinbenton): update the rest of the failure cases to use - # this. + def _test_create_failure_bad_request(self, resource, data, **kwargs): res = self.api.post(_get_path(resource, fmt=self.fmt), self.serialize(data), content_type='application/' + self.fmt, - expect_errors=True) + expect_errors=True, **kwargs) self.assertEqual(res.status_int, exc.HTTPBadRequest.code) def test_create_bulk_networks_none(self): - self._test_create_bulk_failure('networks', {'networks': None}) + self._test_create_failure_bad_request('networks', {'networks': None}) def test_create_bulk_networks_empty_list(self): - self._test_create_bulk_failure('networks', {'networks': []}) + self._test_create_failure_bad_request('networks', {'networks': []}) def test_create_bulk_missing_attr(self): data = {'ports': [{'what': 'who', 'tenant_id': _uuid()}]} - res = self.api.post(_get_path('ports', fmt=self.fmt), - self.serialize(data), - content_type='application/' + self.fmt, - expect_errors=True) - self.assertEqual(res.status_int, 400) + self._test_create_failure_bad_request('ports', data) def test_create_bulk_partial_body(self): data = {'ports': [{'device_id': 'device_1', 'tenant_id': _uuid()}, {'tenant_id': _uuid()}]} - res = self.api.post(_get_path('ports', fmt=self.fmt), - self.serialize(data), - content_type='application/' + self.fmt, - expect_errors=True) - self.assertEqual(res.status_int, 400) + self._test_create_failure_bad_request('ports', data) def test_create_attr_not_specified(self): net_id = _uuid() @@ -1207,6 +1172,18 @@ class SubresourceTest(base.BaseTestCase, testlib_plugin.PluginSetupHelper): network_id='id1', dummy=body) + def test_update_subresource_to_none(self): + instance = self.plugin.return_value + + dummy_id = _uuid() + body = {'dummy': {}} + self.api.put_json('/networks/id1' + _get_path('dummies', id=dummy_id), + body) + instance.update_network_dummy.assert_called_once_with(mock.ANY, + dummy_id, + network_id='id1', + dummy=body) + def test_delete_sub_resource(self): instance = self.plugin.return_value diff --git a/neutron/tests/unit/test_db_plugin.py b/neutron/tests/unit/test_db_plugin.py index 7754cc2b12d..74292fac074 100644 --- a/neutron/tests/unit/test_db_plugin.py +++ b/neutron/tests/unit/test_db_plugin.py @@ -15,6 +15,7 @@ import contextlib import copy +import itertools import mock from oslo.config import cfg @@ -368,10 +369,12 @@ class NeutronDbPluginV2TestCase(testlib_api.WebTestCase, def _list_ports(self, fmt, expected_res_status=None, net_id=None, **kwargs): - query_params = None + query_params = [] if net_id: - query_params = "network_id=%s" % net_id - port_req = self.new_list_request('ports', fmt, query_params) + query_params.append("network_id=%s" % net_id) + if kwargs.get('device_owner'): + query_params.append("device_owner=%s" % kwargs.get('device_owner')) + port_req = self.new_list_request('ports', fmt, '&'.join(query_params)) if ('set_context' in kwargs and kwargs['set_context'] is True and 'tenant_id' in kwargs): @@ -1230,6 +1233,34 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s self.assertEqual(ips[1]['ip_address'], '10.0.0.4') self.assertEqual(ips[1]['subnet_id'], subnet['subnet']['id']) + def test_update_port_invalid_fixed_ip_address_v6_slaac(self): + with self.subnet( + cidr='2607:f0d0:1002:51::/64', + ip_version=6, + ipv6_address_mode=constants.IPV6_SLAAC, + gateway_ip=attributes.ATTR_NOT_SPECIFIED) as subnet: + with self.port(subnet=subnet) as port: + ips = port['port']['fixed_ips'] + self.assertEqual(len(ips), 1) + port_mac = port['port']['mac_address'] + subnet_cidr = subnet['subnet']['cidr'] + eui_addr = str(ipv6_utils.get_ipv6_addr_by_EUI64(subnet_cidr, + port_mac)) + self.assertEqual(ips[0]['ip_address'], eui_addr) + self.assertEqual(ips[0]['subnet_id'], subnet['subnet']['id']) + + data = {'port': {'fixed_ips': [{'subnet_id': + subnet['subnet']['id'], + 'ip_address': + '2607:f0d0:1002:51::5'}]}} + req = self.new_update_request('ports', data, + port['port']['id']) + res = req.get_response(self.api) + err = self.deserialize(self.fmt, res) + self.assertEqual(res.status_int, + webob.exc.HTTPClientError.code) + self.assertEqual(err['NeutronError']['type'], 'InvalidInput') + def test_requested_duplicate_mac(self): with self.port() as port: mac = port['port']['mac_address'] @@ -1292,20 +1323,6 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s res = self._create_port(self.fmt, net_id=net_id, **kwargs) self.assertEqual(res.status_int, webob.exc.HTTPConflict.code) - def test_generated_duplicate_ip_ipv6(self): - with self.subnet(ip_version=6, - cidr="2014::/64", - ipv6_address_mode=constants.IPV6_SLAAC) as subnet: - with self.port(subnet=subnet, - fixed_ips=[{'subnet_id': subnet['subnet']['id'], - 'ip_address': - "2014::1322:33ff:fe44:5566"}]) as port: - # Check configuring of duplicate IP - kwargs = {"mac_address": "11:22:33:44:55:66"} - net_id = port['port']['network_id'] - res = self._create_port(self.fmt, net_id=net_id, **kwargs) - self.assertEqual(res.status_int, webob.exc.HTTPConflict.code) - def test_requested_subnet_id(self): with self.subnet() as subnet: with self.port(subnet=subnet) as port: @@ -1390,13 +1407,64 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s self._delete('ports', port3['port']['id']) self._delete('ports', port4['port']['id']) - def test_ip_allocation_for_ipv6_subnet_slaac_adddress_mode(self): + def test_requested_invalid_fixed_ip_address_v6_slaac(self): + with self.subnet(gateway_ip='fe80::1', + cidr='2607:f0d0:1002:51::/64', + ip_version=6, + ipv6_address_mode=constants.IPV6_SLAAC) as subnet: + kwargs = {"fixed_ips": [{'subnet_id': subnet['subnet']['id'], + 'ip_address': '2607:f0d0:1002:51::5'}]} + net_id = subnet['subnet']['network_id'] + res = self._create_port(self.fmt, net_id=net_id, **kwargs) + self.assertEqual(res.status_int, + webob.exc.HTTPClientError.code) + + def test_requested_subnet_id_v6_slaac(self): + with self.subnet(gateway_ip='fe80::1', + cidr='2607:f0d0:1002:51::/64', + ip_version=6, + ipv6_address_mode=constants.IPV6_SLAAC) as subnet: + with self.port(subnet, + fixed_ips=[{'subnet_id': + subnet['subnet']['id']}]) as port: + port_mac = port['port']['mac_address'] + subnet_cidr = subnet['subnet']['cidr'] + eui_addr = str(ipv6_utils.get_ipv6_addr_by_EUI64(subnet_cidr, + port_mac)) + self.assertEqual(port['port']['fixed_ips'][0]['ip_address'], + eui_addr) + + def test_requested_subnet_id_v4_and_v6_slaac(self): + with self.network() as network: + with contextlib.nested( + self.subnet(network), + self.subnet(network, + cidr='2607:f0d0:1002:51::/64', + ip_version=6, + gateway_ip='fe80::1', + ipv6_address_mode=constants.IPV6_SLAAC) + ) as (subnet, subnet2): + with self.port( + subnet, + fixed_ips=[{'subnet_id': subnet['subnet']['id']}, + {'subnet_id': subnet2['subnet']['id']}] + ) as port: + ips = port['port']['fixed_ips'] + self.assertEqual(len(ips), 2) + self.assertEqual(ips[0]['ip_address'], '10.0.0.2') + port_mac = port['port']['mac_address'] + subnet_cidr = subnet2['subnet']['cidr'] + eui_addr = str(ipv6_utils.get_ipv6_addr_by_EUI64( + subnet_cidr, port_mac)) + self.assertEqual(ips[1]['ip_address'], eui_addr) + + def test_ip_allocation_for_ipv6_subnet_slaac_address_mode(self): res = self._create_network(fmt=self.fmt, name='net', admin_state_up=True) network = self.deserialize(self.fmt, res) v6_subnet = self._make_subnet(self.fmt, network, gateway='fe80::1', - cidr='fe80::/80', + cidr='fe80::/64', ip_version=6, ipv6_ra_mode=None, ipv6_address_mode=constants.IPV6_SLAAC) @@ -2359,6 +2427,18 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): res = subnet_req.get_response(self.api) self.assertEqual(res.status_int, webob.exc.HTTPClientError.code) + def test_create_subnet_V6_slaac_big_prefix(self): + with self.network() as network: + data = {'subnet': {'network_id': network['network']['id'], + 'cidr': '2014::/65', + 'ip_version': '6', + 'tenant_id': network['network']['tenant_id'], + 'gateway_ip': 'fe80::1', + 'ipv6_address_mode': 'slaac'}} + subnet_req = self.new_create_request('subnets', data) + res = subnet_req.get_response(self.api) + self.assertEqual(webob.exc.HTTPClientError.code, res.status_int) + def test_create_2_subnets_overlapping_cidr_allowed_returns_200(self): cidr_1 = '10.0.0.0/23' cidr_2 = '10.0.0.0/24' @@ -3024,15 +3104,48 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): res = subnet_req.get_response(self.api) self.assertEqual(res.status_int, webob.exc.HTTPClientError.code) - def test_create_subnet_ipv6_attributes(self): - gateway_ip = 'fe80::1' - cidr = 'fe80::/80' + 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) + new_subnet = {'ip_version': 6, + 'cidr': 'fe80::/64', + 'enable_dhcp': True} + for mode, value in modes.items(): + new_subnet[mode] = value + if expect_success: + plugin._validate_subnet(ctx, new_subnet, cur_subnet) + else: + self.assertRaises(n_exc.InvalidInput, plugin._validate_subnet, + ctx, new_subnet, cur_subnet) - for mode in constants.IPV6_MODES: - self._test_create_subnet(gateway_ip=gateway_ip, - cidr=cidr, ip_version=6, - ipv6_ra_mode=mode, - ipv6_address_mode=mode) + def test_create_subnet_ipv6_ra_modes(self): + # Test all RA modes with no address mode specified + for ra_mode in constants.IPV6_MODES: + self._test_validate_subnet_ipv6_modes( + ipv6_ra_mode=ra_mode) + + def test_create_subnet_ipv6_addr_modes(self): + # Test all address modes with no RA mode specified + for addr_mode in constants.IPV6_MODES: + self._test_validate_subnet_ipv6_modes( + ipv6_address_mode=addr_mode) + + def test_create_subnet_ipv6_same_ra_and_addr_modes(self): + # Test all ipv6 modes with ra_mode==addr_mode + for ipv6_mode in constants.IPV6_MODES: + self._test_validate_subnet_ipv6_modes( + ipv6_ra_mode=ipv6_mode, + ipv6_address_mode=ipv6_mode) + + def test_create_subnet_ipv6_different_ra_and_addr_modes(self): + # Test all ipv6 modes with ra_mode!=addr_mode + for ra_mode, addr_mode in itertools.permutations( + constants.IPV6_MODES, 2): + self._test_validate_subnet_ipv6_modes( + expect_success=not (ra_mode and addr_mode), + ipv6_ra_mode=ra_mode, + ipv6_address_mode=addr_mode) def test_create_subnet_ipv6_out_of_cidr_global(self): gateway_ip = '2000::1' @@ -3058,7 +3171,7 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): def test_create_subnet_ipv6_attributes_no_dhcp_enabled(self): gateway_ip = 'fe80::1' - cidr = 'fe80::/80' + cidr = 'fe80::/64' with testlib_api.ExpectedException( webob.exc.HTTPClientError) as ctx_manager: for mode in constants.IPV6_MODES: @@ -3094,31 +3207,6 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): self.assertEqual(ctx_manager.exception.code, webob.exc.HTTPClientError.code) - def test_create_subnet_invalid_ipv6_combination(self): - gateway_ip = 'fe80::1' - cidr = 'fe80::/80' - with testlib_api.ExpectedException( - webob.exc.HTTPClientError) as ctx_manager: - self._test_create_subnet(gateway_ip=gateway_ip, - cidr=cidr, ip_version=6, - ipv6_ra_mode='stateful', - ipv6_address_mode='stateless') - self.assertEqual(ctx_manager.exception.code, - webob.exc.HTTPClientError.code) - - def test_create_subnet_ipv6_single_attribute_set(self): - gateway_ip = 'fe80::1' - cidr = 'fe80::/80' - for mode in constants.IPV6_MODES: - self._test_create_subnet(gateway_ip=gateway_ip, - cidr=cidr, ip_version=6, - ipv6_ra_mode=None, - ipv6_address_mode=mode) - self._test_create_subnet(gateway_ip=gateway_ip, - cidr=cidr, ip_version=6, - ipv6_ra_mode=mode, - ipv6_address_mode=None) - def test_create_subnet_ipv6_ra_mode_ip_version_4(self): cidr = '10.0.2.0/24' with testlib_api.ExpectedException( @@ -3298,24 +3386,21 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): self.assertEqual(res.status_int, webob.exc.HTTPConflict.code) - def test_update_subnet_ipv6_attributes(self): - with self.subnet(ip_version=6, cidr='fe80::/80', + def test_update_subnet_ipv6_attributes_fails(self): + with self.subnet(ip_version=6, cidr='fe80::/64', ipv6_ra_mode=constants.IPV6_SLAAC, ipv6_address_mode=constants.IPV6_SLAAC) as subnet: data = {'subnet': {'ipv6_ra_mode': constants.DHCPV6_STATEFUL, 'ipv6_address_mode': constants.DHCPV6_STATEFUL}} req = self.new_update_request('subnets', data, subnet['subnet']['id']) - res = self.deserialize(self.fmt, req.get_response(self.api)) - self.assertEqual(res['subnet']['ipv6_ra_mode'], - data['subnet']['ipv6_ra_mode']) - self.assertEqual(res['subnet']['ipv6_address_mode'], - data['subnet']['ipv6_address_mode']) + res = req.get_response(self.api) + self.assertEqual(res.status_int, + webob.exc.HTTPClientError.code) - def test_update_subnet_ipv6_inconsistent_ra_attribute(self): - with self.subnet(ip_version=6, cidr='fe80::/80', - ipv6_ra_mode=constants.IPV6_SLAAC, - ipv6_address_mode=constants.IPV6_SLAAC) as subnet: + def test_update_subnet_ipv6_ra_mode_fails(self): + with self.subnet(ip_version=6, cidr='fe80::/64', + ipv6_ra_mode=constants.IPV6_SLAAC) as subnet: data = {'subnet': {'ipv6_ra_mode': constants.DHCPV6_STATEFUL}} req = self.new_update_request('subnets', data, subnet['subnet']['id']) @@ -3323,9 +3408,8 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): self.assertEqual(res.status_int, webob.exc.HTTPClientError.code) - def test_update_subnet_ipv6_inconsistent_address_attribute(self): - with self.subnet(ip_version=6, cidr='fe80::/80', - ipv6_ra_mode=constants.IPV6_SLAAC, + def test_update_subnet_ipv6_ra_mode_fails(self): + with self.subnet(ip_version=6, cidr='fe80::/64', ipv6_address_mode=constants.IPV6_SLAAC) as subnet: data = {'subnet': {'ipv6_address_mode': constants.DHCPV6_STATEFUL}} req = self.new_update_request('subnets', data, @@ -3334,8 +3418,8 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase): self.assertEqual(res.status_int, webob.exc.HTTPClientError.code) - def test_update_subnet_ipv6_inconsistent_enable_dhcp(self): - with self.subnet(ip_version=6, cidr='fe80::/80', + def test_update_subnet_ipv6_cannot_disable_dhcp(self): + with self.subnet(ip_version=6, cidr='fe80::/64', ipv6_ra_mode=constants.IPV6_SLAAC, ipv6_address_mode=constants.IPV6_SLAAC) as subnet: data = {'subnet': {'enable_dhcp': False}} diff --git a/neutron/tests/unit/test_dhcp_agent.py b/neutron/tests/unit/test_dhcp_agent.py index c6f98643fe8..cae87c692b5 100644 --- a/neutron/tests/unit/test_dhcp_agent.py +++ b/neutron/tests/unit/test_dhcp_agent.py @@ -72,6 +72,8 @@ fake_meta_subnet = dhcp.DictModel(dict(id='bbbbbbbb-1111-2222-bbbbbbbbbbbb', fake_fixed_ip1 = dhcp.DictModel(dict(id='', subnet_id=fake_subnet1.id, ip_address='172.9.9.9')) +fake_fixed_ip2 = dhcp.DictModel(dict(id='', subnet_id=fake_subnet1.id, + ip_address='172.9.9.10')) fake_meta_fixed_ip = dhcp.DictModel(dict(id='', subnet=fake_meta_subnet, ip_address='169.254.169.254')) fake_allocation_pool_subnet1 = dhcp.DictModel(dict(id='', start='172.9.9.2', @@ -89,7 +91,7 @@ fake_port2 = dhcp.DictModel(dict(id='12345678-1234-aaaa-123456789000', device_owner='', mac_address='aa:bb:cc:dd:ee:99', network_id='12345678-1234-5678-1234567890ab', - fixed_ips=[])) + fixed_ips=[fake_fixed_ip2])) fake_meta_port = dhcp.DictModel(dict(id='12345678-1234-aaaa-1234567890ab', mac_address='aa:bb:cc:dd:ee:ff', @@ -98,6 +100,13 @@ fake_meta_port = dhcp.DictModel(dict(id='12345678-1234-aaaa-1234567890ab', device_id='forzanapoli', fixed_ips=[fake_meta_fixed_ip])) +fake_dist_port = dhcp.DictModel(dict(id='12345678-1234-aaaa-1234567890ab', + mac_address='aa:bb:cc:dd:ee:ff', + network_id='12345678-1234-5678-1234567890ab', + device_owner=const.DEVICE_OWNER_DVR_INTERFACE, + device_id='forzanapoli', + fixed_ips=[fake_meta_fixed_ip])) + fake_network = dhcp.NetModel(True, dict(id='12345678-1234-5678-1234567890ab', tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa', admin_state_up=True, @@ -112,6 +121,14 @@ isolated_network = dhcp.NetModel( subnets=[fake_subnet1], ports=[fake_port1])) +nonisolated_dist_network = dhcp.NetModel( + True, dict( + id='12345678-1234-5678-1234567890ab', + tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa', + admin_state_up=True, + subnets=[fake_subnet1], + ports=[fake_port1, fake_port2])) + empty_network = dhcp.NetModel( True, dict( id='12345678-1234-5678-1234567890ab', @@ -127,6 +144,13 @@ fake_meta_network = dhcp.NetModel( subnets=[fake_meta_subnet], ports=[fake_meta_port])) +fake_dist_network = dhcp.NetModel( + True, dict(id='12345678-1234-5678-1234567890ab', + tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa', + admin_state_up=True, + subnets=[fake_meta_subnet], + ports=[fake_meta_port, fake_dist_port])) + fake_down_network = dhcp.NetModel( True, dict(id='12345678-dddd-dddd-1234567890ab', tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa', @@ -540,13 +564,26 @@ class TestDhcpAgentEventHandler(base.BaseTestCase): def test_enable_dhcp_helper_enable_metadata_nonisolated_network(self): nonisolated_network = copy.deepcopy(isolated_network) - nonisolated_network.ports[0].device_owner = "network:router_interface" + nonisolated_network.ports[0].device_owner = ( + const.DEVICE_OWNER_ROUTER_INTF) nonisolated_network.ports[0].fixed_ips[0].ip_address = '172.9.9.1' self._enable_dhcp_helper(nonisolated_network, enable_isolated_metadata=True, is_isolated_network=False) + def test_enable_dhcp_helper_enable_metadata_nonisolated_dist_network(self): + nonisolated_dist_network.ports[0].device_owner = ( + const.DEVICE_OWNER_ROUTER_INTF) + nonisolated_dist_network.ports[0].fixed_ips[0].ip_address = '172.9.9.1' + nonisolated_dist_network.ports[1].device_owner = ( + const.DEVICE_OWNER_DVR_INTERFACE) + nonisolated_dist_network.ports[1].fixed_ips[0].ip_address = '172.9.9.1' + + self._enable_dhcp_helper(nonisolated_dist_network, + enable_isolated_metadata=True, + is_isolated_network=False) + def test_enable_dhcp_helper_enable_metadata_empty_network(self): self._enable_dhcp_helper(empty_network, enable_isolated_metadata=True, @@ -685,7 +722,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase): mock.call().disable() ]) - def test_enable_isolated_metadata_proxy_with_metadata_network(self): + def _test_metadata_network(self, network): cfg.CONF.set_override('enable_metadata_network', True) cfg.CONF.set_override('debug', True) cfg.CONF.set_override('verbose', False) @@ -695,7 +732,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase): # Ensure the mock is restored if this test fail try: with mock.patch(class_path) as ip_wrapper: - self.dhcp.enable_isolated_metadata_proxy(fake_meta_network) + self.dhcp.enable_isolated_metadata_proxy(network) ip_wrapper.assert_has_calls([mock.call( 'sudo', 'qdhcp-12345678-1234-5678-1234567890ab'), @@ -708,11 +745,17 @@ class TestDhcpAgentEventHandler(base.BaseTestCase): mock.ANY, '--debug', ('--log-file=neutron-ns-metadata-proxy-%s.log' % - fake_meta_network.id)], addl_env=None) + network.id)], addl_env=None) ]) finally: self.external_process_p.start() + def test_enable_isolated_metadata_proxy_with_metadata_network(self): + self._test_metadata_network(fake_meta_network) + + def test_enable_isolated_metadata_proxy_with_dist_network(self): + self._test_metadata_network(fake_dist_network) + def test_network_create_end(self): payload = dict(network=dict(id=fake_network.id)) diff --git a/neutron/tests/unit/test_dhcp_rpc.py b/neutron/tests/unit/test_dhcp_rpc.py index 6a2ed16d7e0..2c4c5c9e6e7 100644 --- a/neutron/tests/unit/test_dhcp_rpc.py +++ b/neutron/tests/unit/test_dhcp_rpc.py @@ -161,13 +161,44 @@ class TestDhcpRpcCallback(base.BaseTestCase): self.plugin.assert_has_calls(expected) return retval - def test_update_dhcp_port(self): + def test_update_dhcp_port_verify_port_action_port_dict(self): + port = {'port': {'network_id': 'foo_network_id', + 'device_owner': constants.DEVICE_OWNER_DHCP, + 'fixed_ips': [{'subnet_id': 'foo_subnet_id'}]} + } + expected_port = {'port': {'network_id': 'foo_network_id', + 'device_owner': constants.DEVICE_OWNER_DHCP, + 'fixed_ips': [{'subnet_id': 'foo_subnet_id'}] + }, + 'id': 'foo_port_id' + } + + def _fake_port_action(plugin, context, port, action): + self.assertEqual(expected_port, port) + + self.callbacks._port_action = _fake_port_action self.callbacks.update_dhcp_port(mock.Mock(), host='foo_host', port_id='foo_port_id', - port=mock.Mock()) + port=port) + + def test_update_dhcp_port(self): + port = {'port': {'network_id': 'foo_network_id', + 'device_owner': constants.DEVICE_OWNER_DHCP, + 'fixed_ips': [{'subnet_id': 'foo_subnet_id'}]} + } + expected_port = {'port': {'network_id': 'foo_network_id', + 'device_owner': constants.DEVICE_OWNER_DHCP, + 'fixed_ips': [{'subnet_id': 'foo_subnet_id'}] + }, + 'id': 'foo_port_id' + } + self.callbacks.update_dhcp_port(mock.Mock(), + host='foo_host', + port_id='foo_port_id', + port=port) self.plugin.assert_has_calls( - mock.call.update_port(mock.ANY, 'foo_port_id', mock.ANY)) + mock.call.update_port(mock.ANY, 'foo_port_id', expected_port)) def test_get_dhcp_port_existing(self): port_retval = dict(id='port_id', fixed_ips=[dict(subnet_id='a')]) diff --git a/neutron/tests/unit/test_extension_ext_gw_mode.py b/neutron/tests/unit/test_extension_ext_gw_mode.py index c119470d390..502fd1c0f9f 100644 --- a/neutron/tests/unit/test_extension_ext_gw_mode.py +++ b/neutron/tests/unit/test_extension_ext_gw_mode.py @@ -245,14 +245,16 @@ class TestL3GwModeMixin(testlib_api.SqlTestCase, def test_make_router_dict_with_ext_gw(self): router_dict = self.target_object._make_router_dict(self.router) self.assertEqual({'network_id': self.ext_net_id, - 'enable_snat': True}, + 'enable_snat': True, + 'external_fixed_ips': []}, router_dict[l3.EXTERNAL_GW_INFO]) def test_make_router_dict_with_ext_gw_snat_disabled(self): self.router.enable_snat = False router_dict = self.target_object._make_router_dict(self.router) self.assertEqual({'network_id': self.ext_net_id, - 'enable_snat': False}, + 'enable_snat': False, + 'external_fixed_ips': []}, router_dict[l3.EXTERNAL_GW_INFO]) def test_build_routers_list_no_ext_gw(self): @@ -364,7 +366,10 @@ class ExtGwModeIntTestCase(test_db_plugin.NeutronDbPluginV2TestCase, ('admin_state_up', True), ('status', 'ACTIVE'), ('external_gateway_info', {'network_id': ext_net_id, - 'enable_snat': snat_expected_value})] + 'enable_snat': snat_expected_value, + 'external_fixed_ips': [{ + 'ip_address': mock.ANY, + 'subnet_id': s['subnet']['id']}]})] with self.router( name=name, admin_state_up=True, tenant_id=tenant_id, external_gateway_info=input_value) as router: diff --git a/neutron/tests/unit/test_extension_extended_attribute.py b/neutron/tests/unit/test_extension_extended_attribute.py index 49f7dc32de4..5b008c346c8 100644 --- a/neutron/tests/unit/test_extension_extended_attribute.py +++ b/neutron/tests/unit/test_extension_extended_attribute.py @@ -26,7 +26,7 @@ from neutron.api.v2 import attributes from neutron.common import config from neutron import manager from neutron.plugins.common import constants -from neutron.plugins.openvswitch import ovs_neutron_plugin +from neutron.plugins.ml2 import plugin as ml2_plugin from neutron import quota from neutron.tests import base from neutron.tests.unit.extensions import extendedattribute as extattr @@ -41,7 +41,7 @@ extensions_path = ':'.join(neutron.tests.unit.extensions.__path__) class ExtensionExtendedAttributeTestPlugin( - ovs_neutron_plugin.OVSNeutronPluginV2): + ml2_plugin.Ml2Plugin): supported_extension_aliases = [ 'ext-obj-test', "extended-ext-attr" diff --git a/neutron/tests/unit/test_extension_extraroute.py b/neutron/tests/unit/test_extension_extraroute.py index f2fa6e33944..dad220370f8 100644 --- a/neutron/tests/unit/test_extension_extraroute.py +++ b/neutron/tests/unit/test_extension_extraroute.py @@ -403,7 +403,7 @@ class ExtraRouteDBTestCaseBase(object): 200, s['subnet']['network_id'], tenant_id=r['router']['tenant_id'], - device_own=constants.DEVICE_OWNER_ROUTER_GW) + device_owner=constants.DEVICE_OWNER_ROUTER_GW) port_list = self.deserialize('json', port_res) self.assertEqual(len(port_list['ports']), 1) diff --git a/neutron/tests/unit/test_extension_firewall.py b/neutron/tests/unit/test_extension_firewall.py index 27abc0cc6b5..a986b029f0b 100644 --- a/neutron/tests/unit/test_extension_firewall.py +++ b/neutron/tests/unit/test_extension_firewall.py @@ -148,10 +148,9 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase): res = self.api.post(_get_path('fw/firewall_rules', fmt=self.fmt), self.serialize(data), content_type='application/%s' % self.fmt) - instance.create_firewall_rule.assert_called_with(mock.ANY, - firewall_rule= - {'firewall_rule': - expected_call_args}) + instance.create_firewall_rule.assert_called_with( + mock.ANY, + firewall_rule={'firewall_rule': expected_call_args}) self.assertEqual(res.status_int, exc.HTTPCreated.code) res = self.deserialize(res) self.assertIn('firewall_rule', res) @@ -213,10 +212,10 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase): fmt=self.fmt), self.serialize(update_data)) - instance.update_firewall_rule.assert_called_with(mock.ANY, - rule_id, - firewall_rule= - update_data) + instance.update_firewall_rule.assert_called_with( + mock.ANY, + rule_id, + firewall_rule=update_data) self.assertEqual(res.status_int, exc.HTTPOk.code) res = self.deserialize(res) self.assertIn('firewall_rule', res) @@ -242,9 +241,9 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase): fmt=self.fmt), self.serialize(data), content_type='application/%s' % self.fmt) - instance.create_firewall_policy.assert_called_with(mock.ANY, - firewall_policy= - data) + instance.create_firewall_policy.assert_called_with( + mock.ANY, + firewall_policy=data) self.assertEqual(res.status_int, exc.HTTPCreated.code) res = self.deserialize(res) self.assertIn('firewall_policy', res) @@ -299,10 +298,10 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase): fmt=self.fmt), self.serialize(update_data)) - instance.update_firewall_policy.assert_called_with(mock.ANY, - policy_id, - firewall_policy= - update_data) + instance.update_firewall_policy.assert_called_with( + mock.ANY, + policy_id, + firewall_policy=update_data) self.assertEqual(res.status_int, exc.HTTPOk.code) res = self.deserialize(res) self.assertIn('firewall_policy', res) diff --git a/neutron/tests/unit/test_extension_security_group.py b/neutron/tests/unit/test_extension_security_group.py index 478d4a31ddd..4f52ba08077 100644 --- a/neutron/tests/unit/test_extension_security_group.py +++ b/neutron/tests/unit/test_extension_security_group.py @@ -573,6 +573,16 @@ class TestSecurityGroups(SecurityGroupDBTestCase): neutron_context=neutron_context).get('security_groups') self.assertEqual(len(sg), 1) + def test_security_group_port_create_creates_default_security_group(self): + res = self._create_network(self.fmt, 'net1', True, + tenant_id='not_admin', + set_context=True) + net1 = self.deserialize(self.fmt, res) + res = self._create_port(self.fmt, net1['network']['id'], + tenant_id='not_admin', set_context=True) + sg = self._list('security-groups').get('security_groups') + self.assertEqual(len(sg), 1) + def test_default_security_group_rules(self): with self.network(): res = self.new_list_request('security-groups') diff --git a/neutron/tests/unit/test_hacking.py b/neutron/tests/unit/test_hacking.py index 895dbe91019..00ffd7de708 100644 --- a/neutron/tests/unit/test_hacking.py +++ b/neutron/tests/unit/test_hacking.py @@ -79,3 +79,21 @@ class HackingTestCase(base.BaseTestCase): self.assertEqual(2, checks.no_author_tags("# author: pele")[0]) self.assertEqual(2, checks.no_author_tags("# Author: pele")[0]) self.assertEqual(3, checks.no_author_tags(".. moduleauthor:: pele")[0]) + + def test_assert_called_once(self): + fail_code = """ + mock = Mock() + mock.method(1, 2, 3, test='wow') + mock.method.assert_called_once() + """ + pass_code = """ + mock = Mock() + mock.method(1, 2, 3, test='wow') + mock.method.assert_called_once_with() + """ + self.assertEqual( + 1, len(list(checks.check_assert_called_once(fail_code, + "neutron/tests/test_assert.py")))) + self.assertEqual( + 0, len(list(checks.check_assert_called_once(pass_code, + "neutron/tests/test_assert.py")))) diff --git a/neutron/tests/unit/test_iptables_firewall.py b/neutron/tests/unit/test_iptables_firewall.py index d94da9aac83..c4c0cafb250 100644 --- a/neutron/tests/unit/test_iptables_firewall.py +++ b/neutron/tests/unit/test_iptables_firewall.py @@ -19,6 +19,7 @@ import mock from oslo.config import cfg from neutron.agent.common import config as a_cfg +from neutron.agent.linux import iptables_comments as ic from neutron.agent.linux import iptables_firewall from neutron.agent import securitygroups_rpc as sg_cfg from neutron.common import constants @@ -42,6 +43,8 @@ class BaseIptablesFirewallTestCase(base.BaseTestCase): super(BaseIptablesFirewallTestCase, self).setUp() cfg.CONF.register_opts(a_cfg.ROOT_HELPER_OPTS, 'AGENT') cfg.CONF.register_opts(sg_cfg.security_group_opts, 'SECURITYGROUP') + cfg.CONF.register_opts(a_cfg.IPTABLES_OPTS, 'AGENT') + cfg.CONF.set_override('comment_iptables_rules', False, 'AGENT') self.utils_exec_p = mock.patch( 'neutron.agent.linux.utils.execute') self.utils_exec = self.utils_exec_p.start() @@ -71,55 +74,74 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): port = self._fake_port() self.firewall.prepare_port_filter(port) calls = [mock.call.add_chain('sg-fallback'), - mock.call.add_rule('sg-fallback', '-j DROP'), + mock.call.add_rule( + 'sg-fallback', '-j DROP', + comment=ic.UNMATCH_DROP), mock.call.ensure_remove_chain('sg-chain'), mock.call.add_chain('sg-chain'), mock.call.add_chain('ifake_dev'), mock.call.add_rule('FORWARD', '-m physdev --physdev-out tapfake_dev ' '--physdev-is-bridged ' - '-j $sg-chain'), + '-j $sg-chain', comment=ic.VM_INT_SG), mock.call.add_rule('sg-chain', '-m physdev --physdev-out tapfake_dev ' '--physdev-is-bridged ' - '-j $ifake_dev'), - mock.call.add_rule( - 'ifake_dev', '-m state --state INVALID -j DROP'), + '-j $ifake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule( 'ifake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ifake_dev', '-j $sg-fallback'), + '-m state --state INVALID -j DROP', + comment=None), + mock.call.add_rule( + 'ifake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule( + 'ifake_dev', + '-j $sg-fallback', comment=None), mock.call.add_chain('ofake_dev'), mock.call.add_rule('FORWARD', '-m physdev --physdev-in tapfake_dev ' '--physdev-is-bridged ' - '-j $sg-chain'), + '-j $sg-chain', comment=ic.VM_INT_SG), mock.call.add_rule('sg-chain', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged ' - '-j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule('INPUT', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged ' - '-j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.INPUT_TO_SG), mock.call.add_chain('sfake_dev'), mock.call.add_rule( 'sfake_dev', '-m mac --mac-source ff:ff:ff:ff:ff:ff ' - '-s 10.0.0.1 -j RETURN'), - mock.call.add_rule('sfake_dev', '-j DROP'), + '-s 10.0.0.1 -j RETURN', + comment=ic.PAIR_ALLOW), + mock.call.add_rule( + 'sfake_dev', '-j DROP', + comment=ic.PAIR_DROP), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 68 --dport 67 -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sfake_dev'), + '-p udp -m udp --sport 68 --dport 67 -j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', '-j $sfake_dev', + comment=None), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 67 --dport 68 -j DROP'), - mock.call.add_rule( - 'ofake_dev', '-m state --state INVALID -j DROP'), + '-p udp -m udp --sport 67 --dport 68 -j DROP', + comment=None), mock.call.add_rule( 'ofake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sg-fallback'), + '-m state --state INVALID -j DROP', comment=None), + mock.call.add_rule( + 'ofake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule( + 'ofake_dev', + '-j $sg-fallback', + comment=None), mock.call.add_rule('sg-chain', '-j ACCEPT')] self.v4filter_inst.assert_has_calls(calls) @@ -127,7 +149,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): def test_filter_ipv4_ingress(self): rule = {'ethertype': 'IPv4', 'direction': 'ingress'} - ingress = mock.call.add_rule('ifake_dev', '-j RETURN') + ingress = mock.call.add_rule('ifake_dev', '-j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -136,7 +159,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv4', 'direction': 'ingress', 'source_ip_prefix': prefix} - ingress = mock.call.add_rule('ifake_dev', '-s %s -j RETURN' % prefix) + ingress = mock.call.add_rule( + 'ifake_dev', '-s %s -j RETURN' % prefix, comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -144,7 +168,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv4', 'direction': 'ingress', 'protocol': 'tcp'} - ingress = mock.call.add_rule('ifake_dev', '-p tcp -m tcp -j RETURN') + ingress = mock.call.add_rule( + 'ifake_dev', '-p tcp -m tcp -j RETURN', comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -155,7 +180,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'tcp', 'source_ip_prefix': prefix} ingress = mock.call.add_rule('ifake_dev', - '-s %s -p tcp -m tcp -j RETURN' % prefix) + '-s %s -p tcp -m tcp -j RETURN' % prefix, + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -163,7 +189,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv4', 'direction': 'ingress', 'protocol': 'icmp'} - ingress = mock.call.add_rule('ifake_dev', '-p icmp -j RETURN') + ingress = mock.call.add_rule('ifake_dev', '-p icmp -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -174,7 +201,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'icmp', 'source_ip_prefix': prefix} ingress = mock.call.add_rule( - 'ifake_dev', '-s %s -p icmp -j RETURN' % prefix) + 'ifake_dev', '-s %s -p icmp -j RETURN' % prefix, + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -185,7 +213,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_min': 10, 'port_range_max': 10} ingress = mock.call.add_rule('ifake_dev', - '-p tcp -m tcp --dport 10 -j RETURN') + '-p tcp -m tcp --dport 10 -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -197,7 +226,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_max': 100} ingress = mock.call.add_rule( 'ifake_dev', - '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN') + '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -212,7 +242,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): ingress = mock.call.add_rule( 'ifake_dev', '-s %s -p tcp -m tcp -m multiport --dports 10:100 ' - '-j RETURN' % prefix) + '-j RETURN' % prefix, comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -220,7 +250,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv4', 'direction': 'ingress', 'protocol': 'udp'} - ingress = mock.call.add_rule('ifake_dev', '-p udp -m udp -j RETURN') + ingress = mock.call.add_rule( + 'ifake_dev', '-p udp -m udp -j RETURN', comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -231,7 +262,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'udp', 'source_ip_prefix': prefix} ingress = mock.call.add_rule('ifake_dev', - '-s %s -p udp -m udp -j RETURN' % prefix) + '-s %s -p udp -m udp -j RETURN' % prefix, + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -242,7 +274,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_min': 10, 'port_range_max': 10} ingress = mock.call.add_rule('ifake_dev', - '-p udp -m udp --dport 10 -j RETURN') + '-p udp -m udp --dport 10 -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -254,7 +287,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_max': 100} ingress = mock.call.add_rule( 'ifake_dev', - '-p udp -m udp -m multiport --dports 10:100 -j RETURN') + '-p udp -m udp -m multiport --dports 10:100 -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -269,14 +303,14 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): ingress = mock.call.add_rule( 'ifake_dev', '-s %s -p udp -m udp -m multiport --dports 10:100 ' - '-j RETURN' % prefix) + '-j RETURN' % prefix, comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) def test_filter_ipv4_egress(self): rule = {'ethertype': 'IPv4', 'direction': 'egress'} - egress = mock.call.add_rule('ofake_dev', '-j RETURN') + egress = mock.call.add_rule('ofake_dev', '-j RETURN', comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -285,7 +319,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv4', 'direction': 'egress', 'source_ip_prefix': prefix} - egress = mock.call.add_rule('ofake_dev', '-s %s -j RETURN' % prefix) + egress = mock.call.add_rule( + 'ofake_dev', '-s %s -j RETURN' % prefix, comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -293,7 +328,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv4', 'direction': 'egress', 'protocol': 'tcp'} - egress = mock.call.add_rule('ofake_dev', '-p tcp -m tcp -j RETURN') + egress = mock.call.add_rule( + 'ofake_dev', '-p tcp -m tcp -j RETURN', comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -304,7 +340,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'tcp', 'source_ip_prefix': prefix} egress = mock.call.add_rule('ofake_dev', - '-s %s -p tcp -m tcp -j RETURN' % prefix) + '-s %s -p tcp -m tcp -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -312,7 +349,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv4', 'direction': 'egress', 'protocol': 'icmp'} - egress = mock.call.add_rule('ofake_dev', '-p icmp -j RETURN') + egress = mock.call.add_rule('ofake_dev', '-p icmp -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -323,7 +361,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'icmp', 'source_ip_prefix': prefix} egress = mock.call.add_rule( - 'ofake_dev', '-s %s -p icmp -j RETURN' % prefix) + 'ofake_dev', '-s %s -p icmp -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -336,7 +375,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'source_ip_prefix': prefix} egress = mock.call.add_rule( 'ofake_dev', - '-s %s -p icmp --icmp-type 8 -j RETURN' % prefix) + '-s %s -p icmp --icmp-type 8 -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -349,7 +389,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'source_ip_prefix': prefix} egress = mock.call.add_rule( 'ofake_dev', - '-s %s -p icmp --icmp-type echo-request -j RETURN' % prefix) + '-s %s -p icmp --icmp-type echo-request -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -363,7 +404,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'source_ip_prefix': prefix} egress = mock.call.add_rule( 'ofake_dev', - '-s %s -p icmp --icmp-type 8/0 -j RETURN' % prefix) + '-s %s -p icmp --icmp-type 8/0 -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -374,7 +416,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_min': 10, 'port_range_max': 10} egress = mock.call.add_rule('ofake_dev', - '-p tcp -m tcp --dport 10 -j RETURN') + '-p tcp -m tcp --dport 10 -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -386,7 +429,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_max': 100} egress = mock.call.add_rule( 'ofake_dev', - '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN') + '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -401,7 +445,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): egress = mock.call.add_rule( 'ofake_dev', '-s %s -p tcp -m tcp -m multiport --dports 10:100 ' - '-j RETURN' % prefix) + '-j RETURN' % prefix, comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -409,7 +453,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv4', 'direction': 'egress', 'protocol': 'udp'} - egress = mock.call.add_rule('ofake_dev', '-p udp -m udp -j RETURN') + egress = mock.call.add_rule( + 'ofake_dev', '-p udp -m udp -j RETURN', comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -420,7 +465,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'udp', 'source_ip_prefix': prefix} egress = mock.call.add_rule('ofake_dev', - '-s %s -p udp -m udp -j RETURN' % prefix) + '-s %s -p udp -m udp -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -431,7 +477,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_min': 10, 'port_range_max': 10} egress = mock.call.add_rule('ofake_dev', - '-p udp -m udp --dport 10 -j RETURN') + '-p udp -m udp --dport 10 -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -443,7 +490,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_max': 100} egress = mock.call.add_rule( 'ofake_dev', - '-p udp -m udp -m multiport --dports 10:100 -j RETURN') + '-p udp -m udp -m multiport --dports 10:100 -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -458,14 +506,15 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): egress = mock.call.add_rule( 'ofake_dev', '-s %s -p udp -m udp -m multiport --dports 10:100 ' - '-j RETURN' % prefix) + '-j RETURN' % prefix, comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) def test_filter_ipv6_ingress(self): rule = {'ethertype': 'IPv6', 'direction': 'ingress'} - ingress = mock.call.add_rule('ifake_dev', '-j RETURN') + ingress = mock.call.add_rule('ifake_dev', '-j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -474,7 +523,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv6', 'direction': 'ingress', 'source_ip_prefix': prefix} - ingress = mock.call.add_rule('ifake_dev', '-s %s -j RETURN' % prefix) + ingress = mock.call.add_rule( + 'ifake_dev', '-s %s -j RETURN' % prefix, comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -482,7 +532,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv6', 'direction': 'ingress', 'protocol': 'tcp'} - ingress = mock.call.add_rule('ifake_dev', '-p tcp -m tcp -j RETURN') + ingress = mock.call.add_rule( + 'ifake_dev', '-p tcp -m tcp -j RETURN', comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -493,7 +544,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'tcp', 'source_ip_prefix': prefix} ingress = mock.call.add_rule('ifake_dev', - '-s %s -p tcp -m tcp -j RETURN' % prefix) + '-s %s -p tcp -m tcp -j RETURN' % prefix, + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -504,7 +556,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_min': 10, 'port_range_max': 10} ingress = mock.call.add_rule('ifake_dev', - '-p tcp -m tcp --dport 10 -j RETURN') + '-p tcp -m tcp --dport 10 -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -512,7 +565,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv6', 'direction': 'ingress', 'protocol': 'icmp'} - ingress = mock.call.add_rule('ifake_dev', '-p icmpv6 -j RETURN') + ingress = mock.call.add_rule( + 'ifake_dev', '-p icmpv6 -j RETURN', comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -523,7 +577,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'icmp', 'source_ip_prefix': prefix} ingress = mock.call.add_rule( - 'ifake_dev', '-s %s -p icmpv6 -j RETURN' % prefix) + 'ifake_dev', '-s %s -p icmpv6 -j RETURN' % prefix, + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -535,7 +590,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_max': 100} ingress = mock.call.add_rule( 'ifake_dev', - '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN') + '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -550,7 +606,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): ingress = mock.call.add_rule( 'ifake_dev', '-s %s -p tcp -m tcp -m multiport --dports 10:100 ' - '-j RETURN' % prefix) + '-j RETURN' % prefix, comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -558,7 +614,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv6', 'direction': 'ingress', 'protocol': 'udp'} - ingress = mock.call.add_rule('ifake_dev', '-p udp -m udp -j RETURN') + ingress = mock.call.add_rule( + 'ifake_dev', '-p udp -m udp -j RETURN', comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -569,7 +626,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'udp', 'source_ip_prefix': prefix} ingress = mock.call.add_rule('ifake_dev', - '-s %s -p udp -m udp -j RETURN' % prefix) + '-s %s -p udp -m udp -j RETURN' % prefix, + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -580,7 +638,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_min': 10, 'port_range_max': 10} ingress = mock.call.add_rule('ifake_dev', - '-p udp -m udp --dport 10 -j RETURN') + '-p udp -m udp --dport 10 -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -592,7 +651,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_max': 100} ingress = mock.call.add_rule( 'ifake_dev', - '-p udp -m udp -m multiport --dports 10:100 -j RETURN') + '-p udp -m udp -m multiport --dports 10:100 -j RETURN', + comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -607,14 +667,14 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): ingress = mock.call.add_rule( 'ifake_dev', '-s %s -p udp -m udp -m multiport --dports 10:100 ' - '-j RETURN' % prefix) + '-j RETURN' % prefix, comment=None) egress = None self._test_prepare_port_filter(rule, ingress, egress) def test_filter_ipv6_egress(self): rule = {'ethertype': 'IPv6', 'direction': 'egress'} - egress = mock.call.add_rule('ofake_dev', '-j RETURN') + egress = mock.call.add_rule('ofake_dev', '-j RETURN', comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -623,7 +683,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv6', 'direction': 'egress', 'source_ip_prefix': prefix} - egress = mock.call.add_rule('ofake_dev', '-s %s -j RETURN' % prefix) + egress = mock.call.add_rule( + 'ofake_dev', '-s %s -j RETURN' % prefix, comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -631,7 +692,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv6', 'direction': 'egress', 'protocol': 'tcp'} - egress = mock.call.add_rule('ofake_dev', '-p tcp -m tcp -j RETURN') + egress = mock.call.add_rule( + 'ofake_dev', '-p tcp -m tcp -j RETURN', comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -642,7 +704,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'tcp', 'source_ip_prefix': prefix} egress = mock.call.add_rule('ofake_dev', - '-s %s -p tcp -m tcp -j RETURN' % prefix) + '-s %s -p tcp -m tcp -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -650,7 +713,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv6', 'direction': 'egress', 'protocol': 'icmp'} - egress = mock.call.add_rule('ofake_dev', '-p icmpv6 -j RETURN') + egress = mock.call.add_rule( + 'ofake_dev', '-p icmpv6 -j RETURN', comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -661,7 +725,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'icmp', 'source_ip_prefix': prefix} egress = mock.call.add_rule( - 'ofake_dev', '-s %s -p icmpv6 -j RETURN' % prefix) + 'ofake_dev', '-s %s -p icmpv6 -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -674,7 +739,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'source_ip_prefix': prefix} egress = mock.call.add_rule( 'ofake_dev', - '-s %s -p icmpv6 --icmpv6-type 8 -j RETURN' % prefix) + '-s %s -p icmpv6 --icmpv6-type 8 -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -687,7 +753,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'source_ip_prefix': prefix} egress = mock.call.add_rule( 'ofake_dev', - '-s %s -p icmpv6 --icmpv6-type echo-request -j RETURN' % prefix) + '-s %s -p icmpv6 --icmpv6-type echo-request -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -701,7 +768,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'source_ip_prefix': prefix} egress = mock.call.add_rule( 'ofake_dev', - '-s %s -p icmpv6 --icmpv6-type 8/0 -j RETURN' % prefix) + '-s %s -p icmpv6 --icmpv6-type 8/0 -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -712,7 +780,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_min': 10, 'port_range_max': 10} egress = mock.call.add_rule('ofake_dev', - '-p tcp -m tcp --dport 10 -j RETURN') + '-p tcp -m tcp --dport 10 -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -724,7 +793,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_max': 100} egress = mock.call.add_rule( 'ofake_dev', - '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN') + '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -739,7 +809,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): egress = mock.call.add_rule( 'ofake_dev', '-s %s -p tcp -m tcp -m multiport --dports 10:100 ' - '-j RETURN' % prefix) + '-j RETURN' % prefix, comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -747,7 +817,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): rule = {'ethertype': 'IPv6', 'direction': 'egress', 'protocol': 'udp'} - egress = mock.call.add_rule('ofake_dev', '-p udp -m udp -j RETURN') + egress = mock.call.add_rule( + 'ofake_dev', '-p udp -m udp -j RETURN', comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -758,7 +829,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'protocol': 'udp', 'source_ip_prefix': prefix} egress = mock.call.add_rule('ofake_dev', - '-s %s -p udp -m udp -j RETURN' % prefix) + '-s %s -p udp -m udp -j RETURN' % prefix, + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -769,7 +841,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_min': 10, 'port_range_max': 10} egress = mock.call.add_rule('ofake_dev', - '-p udp -m udp --dport 10 -j RETURN') + '-p udp -m udp --dport 10 -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -781,7 +854,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'port_range_max': 100} egress = mock.call.add_rule( 'ofake_dev', - '-p udp -m udp -m multiport --dports 10:100 -j RETURN') + '-p udp -m udp -m multiport --dports 10:100 -j RETURN', + comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -796,7 +870,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): egress = mock.call.add_rule( 'ofake_dev', '-s %s -p udp -m udp -m multiport --dports 10:100 ' - '-j RETURN' % prefix) + '-j RETURN' % prefix, comment=None) ingress = None self._test_prepare_port_filter(rule, ingress, egress) @@ -810,89 +884,113 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): filter_inst = self.v4filter_inst dhcp_rule = [mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 68 --dport 67 -j RETURN')] + '-p udp -m udp --sport 68 --dport 67 -j RETURN', + comment=None)] if ethertype == 'IPv6': filter_inst = self.v6filter_inst dhcp_rule = [mock.call.add_rule('ofake_dev', - '-p icmpv6 -j RETURN'), + '-p icmpv6 -j RETURN', + comment=None), mock.call.add_rule('ofake_dev', '-p udp -m udp ' '--sport 546 --dport 547 ' - '-j RETURN')] + '-j RETURN', comment=None)] sg = [rule] port['security_group_rules'] = sg self.firewall.prepare_port_filter(port) calls = [mock.call.add_chain('sg-fallback'), - mock.call.add_rule('sg-fallback', '-j DROP'), + mock.call.add_rule( + 'sg-fallback', + '-j DROP', + comment=ic.UNMATCH_DROP), mock.call.ensure_remove_chain('sg-chain'), mock.call.add_chain('sg-chain'), mock.call.add_chain('ifake_dev'), mock.call.add_rule('FORWARD', '-m physdev --physdev-out tapfake_dev ' '--physdev-is-bridged ' - '-j $sg-chain'), + '-j $sg-chain', comment=ic.VM_INT_SG), mock.call.add_rule('sg-chain', '-m physdev --physdev-out tapfake_dev ' '--physdev-is-bridged ' - '-j $ifake_dev'), + '-j $ifake_dev', + comment=ic.SG_TO_VM_SG), ] if ethertype == 'IPv6': for icmp6_type in constants.ICMPV6_ALLOWED_TYPES: calls.append( mock.call.add_rule('ifake_dev', '-p icmpv6 --icmpv6-type %s -j RETURN' % - icmp6_type)) - calls += [mock.call.add_rule('ifake_dev', - '-m state --state INVALID -j DROP'), - mock.call.add_rule( - 'ifake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN')] + icmp6_type, comment=None)) + calls += [ + mock.call.add_rule( + 'ifake_dev', + '-m state --state INVALID -j DROP', comment=None + ), + mock.call.add_rule( + 'ifake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None + ) + ] if ingress_expected_call: calls.append(ingress_expected_call) - calls += [mock.call.add_rule('ifake_dev', '-j $sg-fallback'), + calls += [mock.call.add_rule('ifake_dev', + '-j $sg-fallback', comment=None), mock.call.add_chain('ofake_dev'), mock.call.add_rule('FORWARD', '-m physdev --physdev-in tapfake_dev ' '--physdev-is-bridged ' - '-j $sg-chain'), + '-j $sg-chain', comment=ic.VM_INT_SG), mock.call.add_rule('sg-chain', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged ' - '-j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule('INPUT', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged ' - '-j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.INPUT_TO_SG), mock.call.add_chain('sfake_dev'), mock.call.add_rule( 'sfake_dev', '-m mac --mac-source ff:ff:ff:ff:ff:ff -s %s -j RETURN' - % prefix), - mock.call.add_rule('sfake_dev', '-j DROP')] + % prefix, + comment=ic.PAIR_ALLOW), + mock.call.add_rule( + 'sfake_dev', '-j DROP', + comment=ic.PAIR_DROP)] calls += dhcp_rule - calls.append(mock.call.add_rule('ofake_dev', '-j $sfake_dev')) + calls.append(mock.call.add_rule('ofake_dev', '-j $sfake_dev', + comment=None)) if ethertype == 'IPv4': calls.append(mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 67 --dport 68 -j DROP')) + '-p udp -m udp --sport 67 --dport 68 -j DROP', + comment=None)) if ethertype == 'IPv6': calls.append(mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 547 --dport 546 -j DROP')) + '-p udp -m udp --sport 547 --dport 546 -j DROP', + comment=None)) - calls += [mock.call.add_rule( - 'ofake_dev', '-m state --state INVALID -j DROP'), - mock.call.add_rule( - 'ofake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN')] + calls += [ + mock.call.add_rule( + 'ofake_dev', + '-m state --state INVALID -j DROP', comment=None), + mock.call.add_rule( + 'ofake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + ] if egress_expected_call: calls.append(egress_expected_call) - calls += [mock.call.add_rule('ofake_dev', '-j $sg-fallback'), + calls += [mock.call.add_rule('ofake_dev', + '-j $sg-fallback', comment=None), mock.call.add_rule('sg-chain', '-j ACCEPT')] filter_inst.assert_has_calls(calls) @@ -909,57 +1007,80 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): self.firewall.remove_port_filter(port) self.firewall.remove_port_filter({'device': 'no-exist-device'}) calls = [mock.call.add_chain('sg-fallback'), - mock.call.add_rule('sg-fallback', '-j DROP'), + mock.call.add_rule( + 'sg-fallback', + '-j DROP', + comment=ic.UNMATCH_DROP), mock.call.ensure_remove_chain('sg-chain'), mock.call.add_chain('sg-chain'), mock.call.add_chain('ifake_dev'), mock.call.add_rule( 'FORWARD', '-m physdev --physdev-out tapfake_dev ' - '--physdev-is-bridged -j $sg-chain'), + '--physdev-is-bridged -j $sg-chain', + comment=ic.VM_INT_SG), mock.call.add_rule( 'sg-chain', '-m physdev --physdev-out tapfake_dev ' - '--physdev-is-bridged -j $ifake_dev'), - mock.call.add_rule( - 'ifake_dev', '-m state --state INVALID -j DROP'), + '--physdev-is-bridged -j $ifake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule( 'ifake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ifake_dev', '-j RETURN'), - mock.call.add_rule('ifake_dev', '-j $sg-fallback'), + '-m state --state INVALID -j DROP', comment=None), + mock.call.add_rule( + 'ifake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule('ifake_dev', '-j RETURN', + comment=None), + mock.call.add_rule( + 'ifake_dev', + '-j $sg-fallback', comment=None), mock.call.add_chain('ofake_dev'), mock.call.add_rule( 'FORWARD', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged -j $sg-chain'), + '--physdev-is-bridged -j $sg-chain', + comment=ic.VM_INT_SG), mock.call.add_rule( 'sg-chain', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged -j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule( 'INPUT', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged -j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.INPUT_TO_SG), mock.call.add_chain('sfake_dev'), mock.call.add_rule( 'sfake_dev', '-m mac --mac-source ff:ff:ff:ff:ff:ff -s 10.0.0.1 ' - '-j RETURN'), - mock.call.add_rule('sfake_dev', '-j DROP'), + '-j RETURN', + comment=ic.PAIR_ALLOW), + mock.call.add_rule( + 'sfake_dev', '-j DROP', + comment=ic.PAIR_DROP), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 68 --dport 67 -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sfake_dev'), + '-p udp -m udp --sport 68 --dport 67 -j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', '-j $sfake_dev', + comment=None), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 67 --dport 68 -j DROP'), + '-p udp -m udp --sport 67 --dport 68 -j DROP', + comment=None), mock.call.add_rule( - 'ofake_dev', '-m state --state INVALID -j DROP'), + 'ofake_dev', '-m state --state INVALID -j DROP', + comment=None), mock.call.add_rule( 'ofake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sg-fallback'), + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule( + 'ofake_dev', + '-j $sg-fallback', comment=None), mock.call.add_rule('sg-chain', '-j ACCEPT'), mock.call.ensure_remove_chain('ifake_dev'), mock.call.ensure_remove_chain('ofake_dev'), @@ -970,51 +1091,70 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): mock.call.add_rule( 'FORWARD', '-m physdev --physdev-out tapfake_dev ' - '--physdev-is-bridged -j $sg-chain'), + '--physdev-is-bridged -j $sg-chain', + comment=ic.VM_INT_SG), mock.call.add_rule( 'sg-chain', '-m physdev --physdev-out tapfake_dev ' - '--physdev-is-bridged -j $ifake_dev'), + '--physdev-is-bridged -j $ifake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule( 'ifake_dev', - '-m state --state INVALID -j DROP'), + '-m state --state INVALID -j DROP', comment=None), mock.call.add_rule( 'ifake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ifake_dev', '-j $sg-fallback'), + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule( + 'ifake_dev', + '-j $sg-fallback', comment=None), mock.call.add_chain('ofake_dev'), mock.call.add_rule( 'FORWARD', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged -j $sg-chain'), + '--physdev-is-bridged -j $sg-chain', + comment=ic.VM_INT_SG), mock.call.add_rule( 'sg-chain', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged -j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule( 'INPUT', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged -j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.INPUT_TO_SG), mock.call.add_chain('sfake_dev'), mock.call.add_rule( 'sfake_dev', '-m mac --mac-source ff:ff:ff:ff:ff:ff -s 10.0.0.1 ' - '-j RETURN'), - mock.call.add_rule('sfake_dev', '-j DROP'), + '-j RETURN', + comment=ic.PAIR_ALLOW), + mock.call.add_rule( + 'sfake_dev', '-j DROP', + comment=ic.PAIR_DROP), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 68 --dport 67 -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sfake_dev'), + '-p udp -m udp --sport 68 --dport 67 -j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', '-j $sfake_dev', + comment=None), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 67 --dport 68 -j DROP'), - mock.call.add_rule( - 'ofake_dev', '-m state --state INVALID -j DROP'), + '-p udp -m udp --sport 67 --dport 68 -j DROP', + comment=None), mock.call.add_rule( 'ofake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ofake_dev', '-j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sg-fallback'), + '-m state --state INVALID -j DROP', comment=None), + mock.call.add_rule( + 'ofake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', '-j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', + '-j $sg-fallback', + comment=None), mock.call.add_rule('sg-chain', '-j ACCEPT'), mock.call.ensure_remove_chain('ifake_dev'), mock.call.ensure_remove_chain('ofake_dev'), @@ -1116,60 +1256,76 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'fixed_ips': ['10.0.0.1', 'fe80::1', '10.0.0.2']} self.firewall.prepare_port_filter(port) calls = [mock.call.add_chain('sg-fallback'), - mock.call.add_rule('sg-fallback', '-j DROP'), + mock.call.add_rule( + 'sg-fallback', '-j DROP', + comment=ic.UNMATCH_DROP), mock.call.ensure_remove_chain('sg-chain'), mock.call.add_chain('sg-chain'), mock.call.add_chain('ifake_dev'), mock.call.add_rule('FORWARD', '-m physdev --physdev-out tapfake_dev ' '--physdev-is-bridged ' - '-j $sg-chain'), + '-j $sg-chain', comment=ic.VM_INT_SG), mock.call.add_rule('sg-chain', '-m physdev --physdev-out tapfake_dev ' '--physdev-is-bridged ' - '-j $ifake_dev'), - mock.call.add_rule( - 'ifake_dev', '-m state --state INVALID -j DROP'), + '-j $ifake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule( 'ifake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ifake_dev', '-j $sg-fallback'), + '-m state --state INVALID -j DROP', comment=None), + mock.call.add_rule( + 'ifake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule('ifake_dev', + '-j $sg-fallback', comment=None), mock.call.add_chain('ofake_dev'), mock.call.add_rule('FORWARD', '-m physdev --physdev-in tapfake_dev ' '--physdev-is-bridged ' - '-j $sg-chain'), + '-j $sg-chain', comment=ic.VM_INT_SG), mock.call.add_rule('sg-chain', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged ' - '-j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule('INPUT', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged ' - '-j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.INPUT_TO_SG), mock.call.add_chain('sfake_dev'), mock.call.add_rule( 'sfake_dev', '-m mac --mac-source ff:ff:ff:ff:ff:ff -s 10.0.0.1 ' - '-j RETURN'), + '-j RETURN', + comment=ic.PAIR_ALLOW), mock.call.add_rule( 'sfake_dev', '-m mac --mac-source ff:ff:ff:ff:ff:ff -s 10.0.0.2 ' - '-j RETURN'), - mock.call.add_rule('sfake_dev', '-j DROP'), + '-j RETURN', + comment=ic.PAIR_ALLOW), + mock.call.add_rule( + 'sfake_dev', '-j DROP', + comment=ic.PAIR_DROP), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 68 --dport 67 -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sfake_dev'), + '-p udp -m udp --sport 68 --dport 67 -j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', '-j $sfake_dev', + comment=None), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 67 --dport 68 -j DROP'), - mock.call.add_rule( - 'ofake_dev', '-m state --state INVALID -j DROP'), + '-p udp -m udp --sport 67 --dport 68 -j DROP', + comment=None), mock.call.add_rule( 'ofake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sg-fallback'), + '-m state --state INVALID -j DROP', comment=None), + mock.call.add_rule( + 'ofake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', + '-j $sg-fallback', comment=None), mock.call.add_rule('sg-chain', '-j ACCEPT')] self.v4filter_inst.assert_has_calls(calls) @@ -1179,55 +1335,71 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase): 'fixed_ips': []} self.firewall.prepare_port_filter(port) calls = [mock.call.add_chain('sg-fallback'), - mock.call.add_rule('sg-fallback', '-j DROP'), + mock.call.add_rule( + 'sg-fallback', '-j DROP', + comment=ic.UNMATCH_DROP), mock.call.ensure_remove_chain('sg-chain'), mock.call.add_chain('sg-chain'), mock.call.add_chain('ifake_dev'), mock.call.add_rule('FORWARD', '-m physdev --physdev-out tapfake_dev ' '--physdev-is-bridged ' - '-j $sg-chain'), + '-j $sg-chain', comment=ic.VM_INT_SG), mock.call.add_rule('sg-chain', '-m physdev --physdev-out tapfake_dev ' '--physdev-is-bridged ' - '-j $ifake_dev'), - mock.call.add_rule( - 'ifake_dev', '-m state --state INVALID -j DROP'), + '-j $ifake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule( 'ifake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ifake_dev', '-j $sg-fallback'), + '-m state --state INVALID -j DROP', comment=None), + mock.call.add_rule( + 'ifake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule('ifake_dev', '-j $sg-fallback', + comment=None), mock.call.add_chain('ofake_dev'), mock.call.add_rule('FORWARD', '-m physdev --physdev-in tapfake_dev ' '--physdev-is-bridged ' - '-j $sg-chain'), + '-j $sg-chain', comment=ic.VM_INT_SG), mock.call.add_rule('sg-chain', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged ' - '-j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.SG_TO_VM_SG), mock.call.add_rule('INPUT', '-m physdev --physdev-in tapfake_dev ' - '--physdev-is-bridged ' - '-j $ofake_dev'), + '--physdev-is-bridged -j $ofake_dev', + comment=ic.INPUT_TO_SG), mock.call.add_chain('sfake_dev'), mock.call.add_rule( 'sfake_dev', - '-m mac --mac-source ff:ff:ff:ff:ff:ff -j RETURN'), - mock.call.add_rule('sfake_dev', '-j DROP'), + '-m mac --mac-source ff:ff:ff:ff:ff:ff -j RETURN', + comment=ic.PAIR_ALLOW), + mock.call.add_rule( + 'sfake_dev', '-j DROP', + comment=ic.PAIR_DROP), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 68 --dport 67 -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sfake_dev'), + '-p udp -m udp --sport 68 --dport 67 -j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', '-j $sfake_dev', + comment=None), mock.call.add_rule( 'ofake_dev', - '-p udp -m udp --sport 67 --dport 68 -j DROP'), - mock.call.add_rule( - 'ofake_dev', '-m state --state INVALID -j DROP'), + '-p udp -m udp --sport 67 --dport 68 -j DROP', + comment=None), mock.call.add_rule( 'ofake_dev', - '-m state --state RELATED,ESTABLISHED -j RETURN'), - mock.call.add_rule('ofake_dev', '-j $sg-fallback'), + '-m state --state INVALID -j DROP', + comment=None), + mock.call.add_rule( + 'ofake_dev', + '-m state --state RELATED,ESTABLISHED -j RETURN', + comment=None), + mock.call.add_rule('ofake_dev', '-j $sg-fallback', + comment=None), mock.call.add_rule('sg-chain', '-j ACCEPT')] self.v4filter_inst.assert_has_calls(calls) diff --git a/neutron/tests/unit/test_iptables_manager.py b/neutron/tests/unit/test_iptables_manager.py index ac0f9ad8c0f..54380401d74 100644 --- a/neutron/tests/unit/test_iptables_manager.py +++ b/neutron/tests/unit/test_iptables_manager.py @@ -17,13 +17,17 @@ import inspect import os import mock +from oslo.config import cfg +from neutron.agent.common import config as a_cfg +from neutron.agent.linux import iptables_comments as ic from neutron.agent.linux import iptables_manager from neutron.tests import base from neutron.tests import tools -IPTABLES_ARG = {'bn': iptables_manager.binary_name} +IPTABLES_ARG = {'bn': iptables_manager.binary_name, + 'snat_out_comment': ic.SNAT_OUT} NAT_DUMP = ('# Generated by iptables_manager\n' '*nat\n' @@ -59,6 +63,107 @@ FILTER_DUMP = ('# Generated by iptables_manager\n' 'COMMIT\n' '# Completed by iptables_manager\n' % IPTABLES_ARG) +COMMENTED_NAT_DUMP = ( + '# Generated by iptables_manager\n' + '*nat\n' + ':neutron-postrouting-bottom - [0:0]\n' + ':%(bn)s-OUTPUT - [0:0]\n' + ':%(bn)s-POSTROUTING - [0:0]\n' + ':%(bn)s-PREROUTING - [0:0]\n' + ':%(bn)s-float-snat - [0:0]\n' + ':%(bn)s-snat - [0:0]\n' + '[0:0] -A PREROUTING -j %(bn)s-PREROUTING\n' + '[0:0] -A OUTPUT -j %(bn)s-OUTPUT\n' + '[0:0] -A POSTROUTING -j %(bn)s-POSTROUTING\n' + '[0:0] -A POSTROUTING -j neutron-postrouting-bottom\n' + '[0:0] -A neutron-postrouting-bottom -j %(bn)s-snat ' + '-m comment --comment "%(snat_out_comment)s"\n' + '[0:0] -A %(bn)s-snat -j ' + '%(bn)s-float-snat\n' + 'COMMIT\n' + '# Completed by iptables_manager\n' % IPTABLES_ARG) + + +class IptablesCommentsTestCase(base.BaseTestCase): + + def setUp(self): + super(IptablesCommentsTestCase, self).setUp() + cfg.CONF.register_opts(a_cfg.IPTABLES_OPTS, 'AGENT') + cfg.CONF.set_override('comment_iptables_rules', True, 'AGENT') + self.root_helper = 'sudo' + self.iptables = (iptables_manager. + IptablesManager(root_helper=self.root_helper)) + self.execute = mock.patch.object(self.iptables, "execute").start() + + def test_comments_short_enough(self): + for attr in dir(ic): + if not attr.startswith('__') and len(getattr(ic, attr)) > 255: + self.fail("Iptables comment %s is longer than 255 characters." + % attr) + + def test_add_filter_rule(self): + filter_dump_mod = ('# Generated by iptables_manager\n' + '*filter\n' + ':neutron-filter-top - [0:0]\n' + ':%(bn)s-FORWARD - [0:0]\n' + ':%(bn)s-INPUT - [0:0]\n' + ':%(bn)s-OUTPUT - [0:0]\n' + ':%(bn)s-filter - [0:0]\n' + ':%(bn)s-local - [0:0]\n' + '[0:0] -A FORWARD -j neutron-filter-top\n' + '[0:0] -A OUTPUT -j neutron-filter-top\n' + '[0:0] -A neutron-filter-top -j %(bn)s-local\n' + '[0:0] -A INPUT -j %(bn)s-INPUT\n' + '[0:0] -A OUTPUT -j %(bn)s-OUTPUT\n' + '[0:0] -A FORWARD -j %(bn)s-FORWARD\n' + '[0:0] -A %(bn)s-filter -j DROP\n' + '[0:0] -A %(bn)s-INPUT -s 0/0 -d 192.168.0.2 -j ' + '%(bn)s-filter\n' + 'COMMIT\n' + '# Completed by iptables_manager\n' + % IPTABLES_ARG) + + raw_dump = _generate_raw_dump(IPTABLES_ARG) + + expected_calls_and_values = [ + (mock.call(['iptables-save', '-c'], + root_helper=self.root_helper), + ''), + (mock.call(['iptables-restore', '-c'], + process_input=( + raw_dump + COMMENTED_NAT_DUMP + filter_dump_mod), + root_helper=self.root_helper), + None), + (mock.call(['iptables-save', '-c'], + root_helper=self.root_helper), + ''), + (mock.call(['iptables-restore', '-c'], + process_input=( + raw_dump + COMMENTED_NAT_DUMP + FILTER_DUMP), + root_helper=self.root_helper + ), + None), + ] + tools.setup_mock_calls(self.execute, expected_calls_and_values) + + self.iptables.ipv4['filter'].add_chain('filter') + self.iptables.ipv4['filter'].add_rule('filter', '-j DROP') + self.iptables.ipv4['filter'].add_rule('INPUT', + '-s 0/0 -d 192.168.0.2 -j' + ' %(bn)s-filter' % IPTABLES_ARG) + self.iptables.apply() + + self.iptables.ipv4['filter'].remove_rule('filter', '-j DROP') + self.iptables.ipv4['filter'].remove_rule('INPUT', + '-s 0/0 -d 192.168.0.2 -j' + ' %(bn)s-filter' + % IPTABLES_ARG) + self.iptables.ipv4['filter'].remove_chain('filter') + + self.iptables.apply() + + tools.verify_mock_calls(self.execute, expected_calls_and_values) + def _generate_raw_dump(iptables_args): return ('# Generated by iptables_manager\n' @@ -77,6 +182,8 @@ class IptablesManagerStateFulTestCase(base.BaseTestCase): def setUp(self): super(IptablesManagerStateFulTestCase, self).setUp() + cfg.CONF.register_opts(a_cfg.IPTABLES_OPTS, 'AGENT') + cfg.CONF.set_override('comment_iptables_rules', False, 'AGENT') self.root_helper = 'sudo' self.iptables = iptables_manager.IptablesManager( root_helper=self.root_helper) @@ -936,6 +1043,8 @@ class IptablesManagerStateLessTestCase(base.BaseTestCase): def setUp(self): super(IptablesManagerStateLessTestCase, self).setUp() + cfg.CONF.register_opts(a_cfg.IPTABLES_OPTS, 'AGENT') + cfg.CONF.set_override('comment_iptables_rules', False, 'AGENT') self.iptables = (iptables_manager.IptablesManager(state_less=True)) def test_nat_not_found(self): diff --git a/neutron/tests/unit/test_l3_agent.py b/neutron/tests/unit/test_l3_agent.py index 0be506e7ce6..df362342d7f 100644 --- a/neutron/tests/unit/test_l3_agent.py +++ b/neutron/tests/unit/test_l3_agent.py @@ -20,6 +20,7 @@ import datetime import mock import netaddr from oslo.config import cfg +from oslo import messaging from testtools import matchers from neutron.agent.common import config as agent_config @@ -376,6 +377,27 @@ class TestBasicRouterOperations(base.BaseTestCase): 'neutron.openstack.common.loopingcall.FixedIntervalLoopingCall') self.looping_call_p.start() + self.snat_ports = [{'subnet': {'cidr': '152.2.0.0/16', + 'gateway_ip': '152.2.0.1', + 'id': _uuid()}, + 'network_id': _uuid(), + 'device_owner': 'network:router_centralized_snat', + 'ip_cidr': '152.2.0.13/16', + 'mac_address': 'fa:16:3e:80:8d:80', + 'fixed_ips': [{'subnet_id': _uuid(), + 'ip_address': '152.2.0.13'}], + 'id': _uuid(), 'device_id': _uuid()}, + {'subnet': {'cidr': '152.10.0.0/16', + 'gateway_ip': '152.10.0.1', + 'id': _uuid()}, + 'network_id': _uuid(), + 'device_owner': 'network:router_centralized_snat', + 'ip_cidr': '152.10.0.13/16', + 'mac_address': 'fa:16:3e:80:8d:80', + 'fixed_ips': [{'subnet_id': _uuid(), + 'ip_address': '152.10.0.13'}], + 'id': _uuid(), 'device_id': _uuid()}] + def _prepare_internal_network_data(self): port_id = _uuid() router_id = _uuid() @@ -409,8 +431,9 @@ class TestBasicRouterOperations(base.BaseTestCase): def test_router_info_create(self): id = _uuid() + ns = "ns-" + id ri = l3_agent.RouterInfo(id, self.conf.root_helper, - self.conf.use_namespaces, {}) + self.conf.use_namespaces, {}, ns_name=ns) self.assertTrue(ri.ns_name.endswith(id)) @@ -427,8 +450,9 @@ class TestBasicRouterOperations(base.BaseTestCase): 'enable_snat': True, 'routes': [], 'gw_port': ex_gw_port} + ns = "ns-" + id ri = l3_agent.RouterInfo(id, self.conf.root_helper, - self.conf.use_namespaces, router) + self.conf.use_namespaces, router, ns_name=ns) self.assertTrue(ri.ns_name.endswith(id)) self.assertEqual(ri.router, router) @@ -497,11 +521,18 @@ class TestBasicRouterOperations(base.BaseTestCase): def test_agent_remove_internal_network(self): self._test_internal_network_action('remove') - def _test_external_gateway_action(self, action): - router = prepare_router_data(num_internal_ports=2) - ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper, - self.conf.use_namespaces, router=router) + def _test_external_gateway_action(self, action, router): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper, + self.conf.use_namespaces, router=router, + ns_name=agent.get_ns_name(router['id'])) + # Special setup for dvr routers + if router.get('distributed'): + agent.conf.agent_mode = 'dvr_snat' + agent.host = HOSTNAME + agent._create_dvr_gateway = mock.Mock() + agent.get_snat_interfaces = mock.Mock(return_value=self.snat_ports) + ex_gw_port = {'fixed_ips': [{'ip_address': '20.0.0.30', 'subnet_id': _uuid()}], 'subnet': {'gateway_ip': '20.0.0.1'}, @@ -520,17 +551,23 @@ class TestBasicRouterOperations(base.BaseTestCase): 'port_id': _uuid()}]} router[l3_constants.FLOATINGIP_KEY] = fake_fip['floatingips'] agent.external_gateway_added(ri, ex_gw_port, interface_name) - 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, - '20.0.0.30') - kwargs = {'preserve_ips': ['192.168.1.34/32'], - 'namespace': 'qrouter-' + router['id'], - 'gateway': '20.0.0.1', - 'extra_subnets': [{'cidr': '172.16.0.0/24'}]} - self.mock_driver.init_l3.assert_called_with(interface_name, - ['20.0.0.30/24'], - **kwargs) + if not router.get('distributed'): + 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, + '20.0.0.30') + kwargs = {'preserve_ips': ['192.168.1.34/32'], + 'namespace': 'qrouter-' + router['id'], + 'gateway': '20.0.0.1', + 'extra_subnets': [{'cidr': '172.16.0.0/24'}]} + self.mock_driver.init_l3.assert_called_with(interface_name, + ['20.0.0.30/24'], + **kwargs) + else: + agent._create_dvr_gateway.assert_called_once_with( + ri, ex_gw_port, interface_name, + self.snat_ports) elif action == 'remove': self.device_exists.return_value = True @@ -556,9 +593,10 @@ class TestBasicRouterOperations(base.BaseTestCase): def test_external_gateway_updated(self): router = prepare_router_data(num_internal_ports=2) - ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper, - self.conf.use_namespaces, router=router) agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper, + self.conf.use_namespaces, router=router, + ns_name=agent.get_ns_name(router['id'])) interface_name, ex_gw_port = self._prepare_ext_gw_test(agent) fake_fip = {'floatingips': [{'id': _uuid(), @@ -614,7 +652,14 @@ class TestBasicRouterOperations(base.BaseTestCase): 'dvr_snat', 1) def test_agent_add_external_gateway(self): - self._test_external_gateway_action('add') + router = prepare_router_data(num_internal_ports=2) + self._test_external_gateway_action('add', router) + + def test_agent_add_external_gateway_dist(self): + router = prepare_router_data(num_internal_ports=2) + router['distributed'] = True + router['gw_port_host'] = HOSTNAME + self._test_external_gateway_action('add', router) def _test_arping(self, namespace): if not namespace: @@ -642,7 +687,14 @@ class TestBasicRouterOperations(base.BaseTestCase): self._test_arping(namespace=False) def test_agent_remove_external_gateway(self): - self._test_external_gateway_action('remove') + router = prepare_router_data(num_internal_ports=2) + self._test_external_gateway_action('remove', router) + + def test_agent_remove_external_gateway_dist(self): + router = prepare_router_data(num_internal_ports=2) + router['distributed'] = True + router['gw_port_host'] = HOSTNAME + self._test_external_gateway_action('remove', router) def _check_agent_method_called(self, agent, calls, namespace): self.mock_ip.netns.execute.assert_has_calls( @@ -988,17 +1040,7 @@ class TestBasicRouterOperations(base.BaseTestCase): del router[l3_constants.INTERFACE_KEY] del router['gw_port'] agent.process_router(ri) - ex_gw_port = agent._get_ex_gw_port(ri) self.assertEqual(self.send_arp.call_count, 1) - agent.process_router_floating_ip_addresses.assert_called_with( - ri, ex_gw_port) - agent.process_router_floating_ip_addresses.reset_mock() - agent.process_router_floating_ip_nat_rules.assert_called_with(ri) - agent.process_router_floating_ip_nat_rules.reset_mock() - - # now no ports no gateway, test state tear down - ri.ex_gw_port = None - agent.process_router(ri) self.assertFalse(agent.process_router_floating_ip_addresses.called) self.assertFalse(agent.process_router_floating_ip_nat_rules.called) @@ -1153,6 +1195,10 @@ vrrp_instance VR_1 { ri, {'id': _uuid()}) self.assertEqual({}, fip_statuses) device.addr.delete.assert_called_once_with(4, '15.1.2.3/32') + self.mock_driver.delete_conntrack_state.assert_called_once_with( + root_helper=self.conf.root_helper, + namespace=ri.ns_name, + ip='15.1.2.3/32') def test_process_router_floating_ip_nat_rules_remove(self): ri = mock.MagicMock() @@ -1703,44 +1749,25 @@ vrrp_instance VR_1 { agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) agent._queue = mock.Mock() agent.router_deleted(None, FAKE_ID) - agent._queue.add.assert_called_once() + self.assertEqual(1, agent._queue.add.call_count) def test_routers_updated(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) agent._queue = mock.Mock() agent.routers_updated(None, [FAKE_ID]) - agent._queue.add.assert_called_once() + self.assertEqual(1, agent._queue.add.call_count) def test_removed_from_agent(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) agent._queue = mock.Mock() agent.router_removed_from_agent(None, {'router_id': FAKE_ID}) - agent._queue.add.assert_called_once() + self.assertEqual(1, agent._queue.add.call_count) def test_added_to_agent(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) agent._queue = mock.Mock() agent.router_added_to_agent(None, [FAKE_ID]) - agent._queue.add.assert_called_once() - - def test_process_router_delete(self): - agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) - ex_gw_port = {'id': _uuid(), - 'network_id': _uuid(), - 'fixed_ips': [{'ip_address': '19.4.4.4', - 'subnet_id': _uuid()}], - 'subnet': {'cidr': '19.4.4.0/24', - 'gateway_ip': '19.4.4.1'}} - router = { - 'id': _uuid(), - 'enable_snat': True, - 'routes': [], - 'gw_port': ex_gw_port} - router['distributed'] = False - agent._router_added(router['id'], router) - agent.router_deleted(None, router['id']) - agent._process_router_delete() - self.assertFalse(list(agent.removed_routers)) + self.assertEqual(1, agent._queue.add.call_count) def test_destroy_fip_namespace(self): class FakeDev(object): @@ -1847,108 +1874,94 @@ vrrp_instance VR_1 { self.assertEqual(['1234'], agent._router_ids()) self.assertFalse(agent._clean_stale_namespaces) - def test_process_routers_with_no_ext_net_in_conf(self): + def test_process_router_if_compatible_with_no_ext_net_in_conf(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) self.plugin_api.get_external_network_id.return_value = 'aaa' - routers = [ - {'id': _uuid(), - 'routes': [], - 'admin_state_up': True, - 'external_gateway_info': {'network_id': 'aaa'}}] + router = {'id': _uuid(), + 'routes': [], + 'admin_state_up': True, + 'external_gateway_info': {'network_id': 'aaa'}} - agent._process_routers(routers) - self.assertIn(routers[0]['id'], agent.router_info) + agent._process_router_if_compatible(router) + self.assertIn(router['id'], agent.router_info) self.plugin_api.get_external_network_id.assert_called_with( agent.context) - def test_process_routers_with_cached_ext_net(self): + def test_process_router_if_compatible_with_cached_ext_net(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) self.plugin_api.get_external_network_id.return_value = 'aaa' agent.target_ex_net_id = 'aaa' - routers = [ - {'id': _uuid(), - 'routes': [], - 'admin_state_up': True, - 'external_gateway_info': {'network_id': 'aaa'}}] + router = {'id': _uuid(), + 'routes': [], + 'admin_state_up': True, + 'external_gateway_info': {'network_id': 'aaa'}} - agent._process_routers(routers) - self.assertIn(routers[0]['id'], agent.router_info) + agent._process_router_if_compatible(router) + self.assertIn(router['id'], agent.router_info) self.assertFalse(self.plugin_api.get_external_network_id.called) - def test_process_routers_with_stale_cached_ext_net(self): + def test_process_router_if_compatible_with_stale_cached_ext_net(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) self.plugin_api.get_external_network_id.return_value = 'aaa' agent.target_ex_net_id = 'bbb' - routers = [ - {'id': _uuid(), - 'routes': [], - 'admin_state_up': True, - 'external_gateway_info': {'network_id': 'aaa'}}] + router = {'id': _uuid(), + 'routes': [], + 'admin_state_up': True, + 'external_gateway_info': {'network_id': 'aaa'}} - agent._process_routers(routers) - self.assertIn(routers[0]['id'], agent.router_info) + agent._process_router_if_compatible(router) + self.assertIn(router['id'], agent.router_info) self.plugin_api.get_external_network_id.assert_called_with( agent.context) - def test_process_routers_with_no_ext_net_in_conf_and_two_net_plugin(self): + def test_process_router_if_compatible_w_no_ext_net_and_2_net_plugin(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) - routers = [ - {'id': _uuid(), - 'routes': [], - 'admin_state_up': True, - 'external_gateway_info': {'network_id': 'aaa'}}] + router = {'id': _uuid(), + 'routes': [], + 'admin_state_up': True, + 'external_gateway_info': {'network_id': 'aaa'}} agent.router_info = {} self.plugin_api.get_external_network_id.side_effect = ( n_exc.TooManyExternalNetworks()) self.assertRaises(n_exc.TooManyExternalNetworks, - agent._process_routers, - routers) - self.assertNotIn(routers[0]['id'], agent.router_info) + agent._process_router_if_compatible, + router) + self.assertNotIn(router['id'], agent.router_info) - def test_process_routers_with_ext_net_in_conf(self): + def test_process_router_if_compatible_with_ext_net_in_conf(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) self.plugin_api.get_external_network_id.return_value = 'aaa' - routers = [ - {'id': _uuid(), - 'routes': [], - 'admin_state_up': True, - 'external_gateway_info': {'network_id': 'aaa'}}, - {'id': _uuid(), - 'routes': [], - 'admin_state_up': True, - 'external_gateway_info': {'network_id': 'bbb'}}] + router = {'id': _uuid(), + 'routes': [], + 'admin_state_up': True, + 'external_gateway_info': {'network_id': 'bbb'}} agent.router_info = {} self.conf.set_override('gateway_external_network_id', 'aaa') - agent._process_routers(routers) - self.assertIn(routers[0]['id'], agent.router_info) - self.assertNotIn(routers[1]['id'], agent.router_info) + self.assertRaises(n_exc.RouterNotCompatibleWithAgent, + agent._process_router_if_compatible, + router) + self.assertNotIn(router['id'], agent.router_info) - def test_process_routers_with_no_bridge_no_ext_net_in_conf(self): + def test_process_router_if_compatible_with_no_bridge_no_ext_net(self): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) self.plugin_api.get_external_network_id.return_value = 'aaa' - routers = [ - {'id': _uuid(), - 'routes': [], - 'admin_state_up': True, - 'external_gateway_info': {'network_id': 'aaa'}}, - {'id': _uuid(), - 'routes': [], - 'admin_state_up': True, - 'external_gateway_info': {'network_id': 'bbb'}}] + router = {'id': _uuid(), + 'routes': [], + 'admin_state_up': True, + 'external_gateway_info': {'network_id': 'aaa'}} agent.router_info = {} self.conf.set_override('external_network_bridge', '') - agent._process_routers(routers) - self.assertIn(routers[0]['id'], agent.router_info) - self.assertIn(routers[1]['id'], agent.router_info) + agent._process_router_if_compatible(router) + self.assertIn(router['id'], agent.router_info) def test_nonexistent_interface_driver(self): self.conf.set_override('interface_driver', None) @@ -2003,15 +2016,10 @@ vrrp_instance VR_1 { ns_list = agent._list_namespaces() agent._cleanup_namespaces(ns_list, [r['id'] for r in router_list]) - # Expect process manager to disable one radvd per stale namespace - expected_pm_disables = len(stale_namespace_list) - # Expect process manager to disable metadata proxy per qrouter ns qrouters = [n for n in stale_namespace_list if n.startswith(l3_agent.NS_PREFIX)] - expected_pm_disables += len(qrouters) - self.assertEqual(expected_pm_disables, pm.disable.call_count) self.assertEqual(agent._destroy_router_namespace.call_count, len(qrouters)) self.assertEqual(agent._destroy_snat_namespace.call_count, @@ -2073,31 +2081,11 @@ vrrp_instance VR_1 { 'mac_address': 'ca:fe:de:ad:be:ef', 'ip_cidr': '20.0.0.30/24'} - snat_ports = [{'subnet': {'cidr': '152.2.0.0/16', - 'gateway_ip': '152.2.0.1', - 'id': _uuid()}, - 'network_id': _uuid(), - 'device_owner': 'network:router_centralized_snat', - 'ip_cidr': '152.2.0.13/16', - 'mac_address': 'fa:16:3e:80:8d:80', - 'fixed_ips': [{'subnet_id': _uuid(), - 'ip_address': '152.2.0.13'}], - 'id': _uuid(), 'device_id': _uuid()}, - {'subnet': {'cidr': '152.10.0.0/16', - 'gateway_ip': '152.10.0.1', - 'id': _uuid()}, - 'network_id': _uuid(), - 'device_owner': 'network:router_centralized_snat', - 'ip_cidr': '152.10.0.13/16', - 'mac_address': 'fa:16:3e:80:8d:80', - 'fixed_ips': [{'subnet_id': _uuid(), - 'ip_address': '152.10.0.13'}], - 'id': _uuid(), 'device_id': _uuid()}] - interface_name = agent.get_snat_int_device_name(port_id) self.device_exists.return_value = False - agent._create_dvr_gateway(ri, dvr_gw_port, interface_name, snat_ports) + agent._create_dvr_gateway(ri, dvr_gw_port, interface_name, + self.snat_ports) # check 2 internal ports are plugged # check 1 ext-gw-port is plugged @@ -2185,8 +2173,9 @@ vrrp_instance VR_1 { 16, FIP_PRI) # TODO(mrsmith): add more asserts + @mock.patch.object(l3_agent.L3NATAgent, '_fip_ns_unsubscribe') @mock.patch.object(l3_agent.LinkLocalAllocator, '_write') - def test_floating_ip_removed_dist(self, write): + def test_floating_ip_removed_dist(self, write, unsubscribe): agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) router = prepare_router_data() agent_gw_port = {'fixed_ips': [{'ip_address': '20.0.0.30', @@ -2201,6 +2190,7 @@ vrrp_instance VR_1 { ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper, self.conf.use_namespaces, router=router) ri.dist_fip_count = 2 + agent.fip_ns_subscribers.add(ri.router_id) ri.floating_ips_dict['11.22.33.44'] = FIP_PRI ri.fip_2_rtr = '11.22.33.42' ri.rtr_2_fip = '11.22.33.40' @@ -2211,9 +2201,10 @@ vrrp_instance VR_1 { self.mock_rule.delete_rule_priority.assert_called_with(FIP_PRI) self.mock_ip_dev.route.delete_route.assert_called_with(fip_cidr, str(s.ip)) + self.assertFalse(unsubscribe.called, '_fip_ns_unsubscribe called!') + with mock.patch.object(agent, '_destroy_fip_namespace') as f: ri.dist_fip_count = 1 - agent.agent_fip_count = 1 fip_ns_name = agent.get_fip_ns_name( str(agent._fetch_external_net_id())) ri.rtr_fip_subnet = agent.local_subnets.allocate(ri.router_id) @@ -2224,6 +2215,7 @@ vrrp_instance VR_1 { self.mock_ip_dev.route.delete_gateway.assert_called_once_with( str(fip_to_rtr.ip), table=16) f.assert_called_once_with(fip_ns_name) + unsubscribe.assert_called_once_with(ri.router_id) def test_get_service_plugin_list(self): service_plugins = [p_const.L3_ROUTER_NAT] @@ -2239,6 +2231,60 @@ vrrp_instance VR_1 { self.assertIsNone(agent.neutron_service_plugins) self.assertTrue(self.plugin_api.get_service_plugin_list.called) + def test_get_service_plugin_list_retried(self): + raise_timeout = messaging.MessagingTimeout() + # Raise a timeout the first 2 times it calls + # get_service_plugin_list then return a empty tuple + self.plugin_api.get_service_plugin_list.side_effect = ( + raise_timeout, raise_timeout, tuple() + ) + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + + self.assertEqual(agent.neutron_service_plugins, tuple()) + + def test_get_service_plugin_list_retried_max(self): + raise_timeout = messaging.MessagingTimeout() + # Raise a timeout 5 times + self.plugin_api.get_service_plugin_list.side_effect = ( + (raise_timeout, ) * 5 + ) + self.assertRaises(messaging.MessagingTimeout, l3_agent.L3NATAgent, + HOSTNAME, self.conf) + + def test__fip_ns_subscribe_is_first_true(self): + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + router_id = _uuid() + is_first = agent._fip_ns_subscribe(router_id) + self.assertTrue(is_first) + self.assertEqual(len(agent.fip_ns_subscribers), 1) + + def test__fip_ns_subscribe_is_first_false(self): + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + router_id = _uuid() + router2_id = _uuid() + agent._fip_ns_subscribe(router_id) + is_first = agent._fip_ns_subscribe(router2_id) + self.assertFalse(is_first) + self.assertEqual(len(agent.fip_ns_subscribers), 2) + + def test__fip_ns_unsubscribe_is_last_true(self): + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + router_id = _uuid() + agent.fip_ns_subscribers.add(router_id) + is_last = agent._fip_ns_unsubscribe(router_id) + self.assertTrue(is_last) + self.assertEqual(len(agent.fip_ns_subscribers), 0) + + def test__fip_ns_unsubscribe_is_last_false(self): + agent = l3_agent.L3NATAgent(HOSTNAME, self.conf) + router_id = _uuid() + router2_id = _uuid() + agent.fip_ns_subscribers.add(router_id) + agent.fip_ns_subscribers.add(router2_id) + is_last = agent._fip_ns_unsubscribe(router_id) + self.assertFalse(is_last) + self.assertEqual(len(agent.fip_ns_subscribers), 1) + class TestL3AgentEventHandler(base.BaseTestCase): diff --git a/neutron/tests/unit/test_l3_plugin.py b/neutron/tests/unit/test_l3_plugin.py index 19838c3ec6f..e81a32028c8 100644 --- a/neutron/tests/unit/test_l3_plugin.py +++ b/neutron/tests/unit/test_l3_plugin.py @@ -22,6 +22,7 @@ import netaddr from oslo.config import cfg from webob import exc +from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api from neutron.api.rpc.handlers import l3_rpc from neutron.api.v2 import attributes from neutron.common import constants as l3_constants @@ -307,6 +308,13 @@ class TestL3NatAgentSchedulingServicePlugin(TestL3NatServicePlugin, supported_extension_aliases = ["router", "l3_agent_scheduler"] + def __init__(self): + super(TestL3NatAgentSchedulingServicePlugin, self).__init__() + self.router_scheduler = importutils.import_object( + cfg.CONF.router_scheduler_driver) + self.agent_notifiers.update( + {l3_constants.AGENT_TYPE_L3: l3_rpc_agent_api.L3AgentNotifyAPI()}) + class L3NATdbonlyMixinTestCase(base.BaseTestCase): @@ -469,7 +477,7 @@ class L3NatTestCaseMixin(object): public_sub['subnet']['network_id'], port_id=private_port['port']['id'], fixed_ip=fixed_ip, - set_context=False) + set_context=set_context) yield floatingip if floatingip: @@ -1094,11 +1102,17 @@ class L3NatTestCaseBase(L3NatTestCaseMixin): 'remove', tenant_router['router']['id'], s['subnet']['id'], None, tenant_id='tenant_a') - def test_router_add_gateway_invalid_network_returns_404(self): + def test_router_add_gateway_invalid_network_returns_400(self): with self.router() as r: self._add_external_gateway_to_router( r['router']['id'], - "foobar", expected_code=exc.HTTPNotFound.code) + "foobar", expected_code=exc.HTTPBadRequest.code) + + def test_router_add_gateway_non_existent_network_returns_404(self): + with self.router() as r: + self._add_external_gateway_to_router( + r['router']['id'], + _uuid(), expected_code=exc.HTTPNotFound.code) def test_router_add_gateway_net_not_external_returns_400(self): with self.router() as r: diff --git a/neutron/tests/unit/test_l3_schedulers.py b/neutron/tests/unit/test_l3_schedulers.py index fdf823213b3..09346758e05 100644 --- a/neutron/tests/unit/test_l3_schedulers.py +++ b/neutron/tests/unit/test_l3_schedulers.py @@ -822,7 +822,7 @@ class L3DvrSchedulerTestCase(testlib_api.SqlTestCase, '.L3AgentNotifyAPI')): self.dut.dvr_update_router_addvm(self.adminContext, port) - def test_get_dvr_routers_by_vmportid(self): + def test_get_dvr_routers_by_portid(self): dvr_port = { 'id': 'dvr_port1', 'device_id': 'r1', @@ -844,8 +844,8 @@ class L3DvrSchedulerTestCase(testlib_api.SqlTestCase, '.get_port', return_value=dvr_port), mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2' '.get_ports', return_value=[dvr_port])): - router_id = self.dut.get_dvr_routers_by_vmportid(self.adminContext, - dvr_port['id']) + router_id = self.dut.get_dvr_routers_by_portid(self.adminContext, + dvr_port['id']) self.assertEqual(router_id.pop(), r1['id']) def test_get_subnet_ids_on_router(self): @@ -1056,11 +1056,12 @@ class L3HATestCaseMixin(testlib_api.SqlTestCase, self._register_l3_agents() def _create_ha_router(self, ha=True, tenant_id='tenant1'): + self.adminContext.tenant_id = tenant_id router = {'name': 'router1', 'admin_state_up': True} if ha is not None: router['ha'] = ha - return self.plugin._create_router_db(self.adminContext, - router, tenant_id) + return self.plugin.create_router(self.adminContext, + {'router': router}) class L3_HA_scheduler_db_mixinTestCase(L3HATestCaseMixin): diff --git a/neutron/tests/unit/test_linux_dhcp.py b/neutron/tests/unit/test_linux_dhcp.py index f6f5fc6a23a..a0187369b82 100644 --- a/neutron/tests/unit/test_linux_dhcp.py +++ b/neutron/tests/unit/test_linux_dhcp.py @@ -130,8 +130,9 @@ class FakeRouterPort: 'dddddddd-dddd-dddd-dddd-dddddddddddd')] mac_address = '00:00:0f:rr:rr:rr' - def __init__(self): + def __init__(self, dev_owner=constants.DEVICE_OWNER_ROUTER_INTF): self.extra_dhcp_opts = [] + self.device_owner = dev_owner class FakePortMultipleAgents1: @@ -341,6 +342,13 @@ class FakeV4NetworkNoRouter: ports = [FakePort1()] +class FakeV4NetworkDistRouter: + id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' + subnets = [FakeV4Subnet()] + ports = [FakePort1(), + FakeRouterPort(dev_owner=constants.DEVICE_OWNER_DVR_INTERFACE)] + + class FakeDualV4Pxe3Ports: id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' subnets = [FakeV4Subnet(), FakeV4SubnetNoDHCP()] @@ -798,7 +806,8 @@ class TestDnsmasq(TestBase): self.assertTrue(mocks['_output_opts_file'].called) self.execute.assert_called_once_with(expected, root_helper='sudo', - check_exit_code=True) + check_exit_code=True, + extra_ok_codes=None) def test_spawn(self): self._test_spawn(['--conf-file=', '--domain=openstacklocal']) @@ -961,6 +970,26 @@ tag:tag0,option:router""".lstrip() self.safe.assert_called_once_with('/foo/opts', expected) + def test_output_opts_file_dist_neutron_router_on_subnet(self): + expected = ( + 'tag:tag0,option:dns-server,8.8.8.8\n' + 'tag:tag0,option:classless-static-route,20.0.0.1/24,20.0.0.1,' + '0.0.0.0/0,192.168.0.1\n' + 'tag:tag0,249,20.0.0.1/24,20.0.0.1,0.0.0.0/0,192.168.0.1\n' + 'tag:tag0,option:router,192.168.0.1').lstrip() + + with mock.patch.object(dhcp.Dnsmasq, 'get_conf_file_name') as conf_fn: + conf_fn.return_value = '/foo/opts' + dm = dhcp.Dnsmasq(self.conf, FakeV4NetworkDistRouter(), + version=dhcp.Dnsmasq.MINIMUM_VERSION) + with mock.patch.object(dm, '_make_subnet_interface_ip_map') as ipm: + ipm.return_value = {FakeV4Subnet.id: '192.168.0.1'} + + dm._output_opts_file() + self.assertTrue(ipm.called) + + self.safe.assert_called_once_with('/foo/opts', expected) + def test_output_opts_file_pxe_2port_1net(self): expected = ( 'tag:tag0,option:dns-server,8.8.8.8\n' diff --git a/neutron/tests/unit/test_linux_external_process.py b/neutron/tests/unit/test_linux_external_process.py index 85c24544a24..b16b681e930 100644 --- a/neutron/tests/unit/test_linux_external_process.py +++ b/neutron/tests/unit/test_linux_external_process.py @@ -41,7 +41,8 @@ class TestProcessManager(base.BaseTestCase): name.assert_called_once_with(ensure_pids_dir=True) self.execute.assert_called_once_with(['the', 'cmd'], root_helper='sudo', - check_exit_code=True) + check_exit_code=True, + extra_ok_codes=None) def test_enable_with_namespace(self): callback = mock.Mock() @@ -122,7 +123,7 @@ class TestProcessManager(base.BaseTestCase): isdir.return_value = True manager = ep.ProcessManager(self.conf, 'uuid') retval = manager.get_pid_file_name(ensure_pids_dir=True) - self.assertEqual(retval, '/var/path/uuid/pid') + self.assertEqual(retval, '/var/path/uuid.pid') def test_get_pid_file_name_not_existing(self): with mock.patch.object(ep.utils.os.path, 'isdir') as isdir: @@ -130,15 +131,15 @@ class TestProcessManager(base.BaseTestCase): isdir.return_value = False manager = ep.ProcessManager(self.conf, 'uuid') retval = manager.get_pid_file_name(ensure_pids_dir=True) - self.assertEqual(retval, '/var/path/uuid/pid') - makedirs.assert_called_once_with('/var/path/uuid', 0o755) + self.assertEqual(retval, '/var/path/uuid.pid') + makedirs.assert_called_once_with('/var/path', 0o755) def test_get_pid_file_name_default(self): with mock.patch.object(ep.utils.os.path, 'isdir') as isdir: isdir.return_value = True manager = ep.ProcessManager(self.conf, 'uuid') retval = manager.get_pid_file_name(ensure_pids_dir=False) - self.assertEqual(retval, '/var/path/uuid/pid') + self.assertEqual(retval, '/var/path/uuid.pid') self.assertFalse(isdir.called) def test_pid(self): diff --git a/neutron/tests/unit/test_linux_ip_lib.py b/neutron/tests/unit/test_linux_ip_lib.py index 6c20aa6d743..2b9486d3e75 100644 --- a/neutron/tests/unit/test_linux_ip_lib.py +++ b/neutron/tests/unit/test_linux_ip_lib.py @@ -792,7 +792,7 @@ class TestIpNetnsCommand(TestIPCmdBase): execute.assert_called_once_with( ['ip', 'netns', 'exec', 'ns', 'sysctl', '-w', 'net.ipv4.conf.all.promote_secondaries=1'], - root_helper='sudo', check_exit_code=True) + root_helper='sudo', check_exit_code=True, extra_ok_codes=None) def test_delete_namespace(self): with mock.patch('neutron.agent.linux.utils.execute'): @@ -830,7 +830,8 @@ class TestIpNetnsCommand(TestIPCmdBase): execute.assert_called_once_with(['ip', 'netns', 'exec', 'ns', 'ip', 'link', 'list'], root_helper='sudo', - check_exit_code=True) + check_exit_code=True, + extra_ok_codes=None) def test_execute_env_var_prepend(self): self.parent.namespace = 'ns' @@ -841,7 +842,7 @@ class TestIpNetnsCommand(TestIPCmdBase): ['ip', 'netns', 'exec', 'ns', 'env'] + ['%s=%s' % (k, v) for k, v in env.items()] + ['ip', 'link', 'list'], - root_helper='sudo', check_exit_code=True) + root_helper='sudo', check_exit_code=True, extra_ok_codes=None) def test_execute_nosudo_with_no_namespace(self): with mock.patch('neutron.agent.linux.utils.execute') as execute: @@ -850,7 +851,8 @@ class TestIpNetnsCommand(TestIPCmdBase): self.netns_cmd.execute(['test']) execute.assert_called_once_with(['test'], root_helper=None, - check_exit_code=True) + check_exit_code=True, + extra_ok_codes=None) class TestDeviceExists(base.BaseTestCase): diff --git a/neutron/tests/unit/test_metadata_agent.py b/neutron/tests/unit/test_metadata_agent.py index f5446e933ca..7af182a5cfd 100644 --- a/neutron/tests/unit/test_metadata_agent.py +++ b/neutron/tests/unit/test_metadata_agent.py @@ -433,6 +433,10 @@ class TestMetadataProxyHandlerCache(base.BaseTestCase): self.assertEqual(response.content_type, "text/plain") self.assertEqual(response.body, 'content') + def test_proxy_request_400(self): + self.assertIsInstance(self._proxy_request_test_helper(400), + webob.exc.HTTPBadRequest) + def test_proxy_request_403(self): self.assertIsInstance(self._proxy_request_test_helper(403), webob.exc.HTTPForbidden) @@ -493,8 +497,8 @@ class TestUnixDomainWSGIServer(base.BaseTestCase): def test_start(self): mock_app = mock.Mock() - with mock.patch.object(self.server, 'pool') as pool: - self.server.start(mock_app, '/the/path', workers=0, backlog=128) + with mock.patch.object(self.server, '_launch') as launcher: + self.server.start(mock_app, '/the/path', workers=5, backlog=128) self.eventlet.assert_has_calls([ mock.call.listen( '/the/path', @@ -502,27 +506,7 @@ class TestUnixDomainWSGIServer(base.BaseTestCase): backlog=128 )] ) - pool.spawn_n.assert_called_once_with( - self.server._run, - mock_app, - self.eventlet.listen.return_value - ) - - @mock.patch('neutron.openstack.common.service.ProcessLauncher') - def test_start_multiple_workers(self, process_launcher): - launcher = process_launcher.return_value - - mock_app = mock.Mock() - self.server.start(mock_app, '/the/path', workers=2, backlog=128) - launcher.running = True - launcher.launch_service.assert_called_once_with(self.server._server, - workers=2) - - self.server.stop() - self.assertFalse(launcher.running) - - self.server.wait() - launcher.wait.assert_called_once_with() + launcher.assert_called_once_with(mock_app, workers=5) def test_run(self): with mock.patch.object(agent, 'logging') as logging: diff --git a/neutron/tests/unit/test_metadata_namespace_proxy.py b/neutron/tests/unit/test_metadata_namespace_proxy.py index 6f90d335f22..3ffbd9921fa 100644 --- a/neutron/tests/unit/test_metadata_namespace_proxy.py +++ b/neutron/tests/unit/test_metadata_namespace_proxy.py @@ -148,15 +148,15 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): 'application/json') self.assertEqual(retval.body, '{}') - def test_proxy_request_network_404(self): + def _test_proxy_request_network_4xx(self, status, method, expected): self.handler.network_id = 'network_id' - resp = mock.Mock(status=404) + resp = mock.Mock(status=status) with mock.patch('httplib2.Http') as mock_http: mock_http.return_value.request.return_value = (resp, '') retval = self.handler._proxy_request('192.168.1.1', - 'GET', + method, '/latest/meta-data', '', '') @@ -164,7 +164,7 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): mock_http.assert_has_calls([ mock.call().request( 'http://169.254.169.254/latest/meta-data', - method='GET', + method=method, headers={ 'X-Forwarded-For': '192.168.1.1', 'X-Neutron-Network-ID': 'network_id' @@ -174,35 +174,19 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): )] ) - self.assertIsInstance(retval, webob.exc.HTTPNotFound) + self.assertIsInstance(retval, expected) + + def test_proxy_request_network_400(self): + self._test_proxy_request_network_4xx( + 400, 'GET', webob.exc.HTTPBadRequest) + + def test_proxy_request_network_404(self): + self._test_proxy_request_network_4xx( + 404, 'GET', webob.exc.HTTPNotFound) def test_proxy_request_network_409(self): - self.handler.network_id = 'network_id' - - resp = mock.Mock(status=409) - with mock.patch('httplib2.Http') as mock_http: - mock_http.return_value.request.return_value = (resp, '') - - retval = self.handler._proxy_request('192.168.1.1', - 'POST', - '/latest/meta-data', - '', - '') - - mock_http.assert_has_calls([ - mock.call().request( - 'http://169.254.169.254/latest/meta-data', - method='POST', - headers={ - 'X-Forwarded-For': '192.168.1.1', - 'X-Neutron-Network-ID': 'network_id' - }, - connection_type=ns_proxy.UnixDomainHTTPConnection, - body='' - )] - ) - - self.assertIsInstance(retval, webob.exc.HTTPConflict) + self._test_proxy_request_network_4xx( + 409, 'POST', webob.exc.HTTPConflict) def test_proxy_request_network_500(self): self.handler.network_id = 'network_id' diff --git a/neutron/tests/unit/test_policy.py b/neutron/tests/unit/test_policy.py index bc0074c909c..af5d64c8080 100644 --- a/neutron/tests/unit/test_policy.py +++ b/neutron/tests/unit/test_policy.py @@ -23,6 +23,7 @@ import six import neutron from neutron.api.v2 import attributes +from neutron.common import constants as const from neutron.common import exceptions from neutron import context from neutron import manager @@ -282,9 +283,11 @@ class NeutronPolicyTestCase(base.BaseTestCase): fake_manager_instance.plugin = plugin_klass() def _test_action_on_attr(self, context, action, attr, value, - exception=None): + exception=None, **kwargs): action = "%s_network" % action target = {'tenant_id': 'the_owner', attr: value} + if kwargs: + target.update(kwargs) if exception: self.assertRaises(exception, policy.enforce, context, action, target) @@ -293,10 +296,10 @@ class NeutronPolicyTestCase(base.BaseTestCase): self.assertEqual(result, True) def _test_nonadmin_action_on_attr(self, action, attr, value, - exception=None): + exception=None, **kwargs): user_context = context.Context('', "user", roles=['user']) self._test_action_on_attr(user_context, action, attr, - value, exception) + value, exception, **kwargs) def test_nonadmin_write_on_private_fails(self): self._test_nonadmin_action_on_attr('create', 'shared', False, @@ -313,9 +316,11 @@ class NeutronPolicyTestCase(base.BaseTestCase): def test_nonadmin_read_on_shared_succeeds(self): self._test_nonadmin_action_on_attr('get', 'shared', True) - def _test_enforce_adminonly_attribute(self, action): + def _test_enforce_adminonly_attribute(self, action, **kwargs): admin_context = context.get_admin_context() target = {'shared': True} + if kwargs: + target.update(kwargs) result = policy.enforce(admin_context, action, target) self.assertEqual(result, True) @@ -323,7 +328,14 @@ class NeutronPolicyTestCase(base.BaseTestCase): self._test_enforce_adminonly_attribute('create_network') def test_enforce_adminonly_attribute_update(self): - self._test_enforce_adminonly_attribute('update_network') + kwargs = {const.ATTRIBUTES_TO_UPDATE: ['shared']} + self._test_enforce_adminonly_attribute('update_network', **kwargs) + + def test_reset_adminonly_attr_to_default_fails(self): + kwargs = {const.ATTRIBUTES_TO_UPDATE: ['shared']} + self._test_nonadmin_action_on_attr('update', 'shared', False, + exceptions.PolicyNotAuthorized, + **kwargs) def test_enforce_adminonly_attribute_no_context_is_admin_policy(self): del self.rules[policy.ADMIN_CTX_POLICY] @@ -551,3 +563,24 @@ class NeutronPolicyTestCase(base.BaseTestCase): {'extension:provider_network:set': 'rule:admin_only'}, dict((policy, 'rule:admin_only') for policy in expected_policies)) + + def test_process_rules(self): + action = "create_something" + # Construct RuleChecks for an action, attribute and subattribute + match_rule = common_policy.RuleCheck('rule', action) + attr_rule = common_policy.RuleCheck('rule', '%s:%s' % + (action, 'somethings')) + sub_attr_rules = [common_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( + [attr_rule, sub_attr_rules]) + + match_rule = common_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_something', 'create_something:somethings', + 'create_something:attr:sub_attr_1'], rules) diff --git a/neutron/tests/unit/test_quota_ext.py b/neutron/tests/unit/test_quota_ext.py index 262fb044115..55096f7d27a 100644 --- a/neutron/tests/unit/test_quota_ext.py +++ b/neutron/tests/unit/test_quota_ext.py @@ -18,11 +18,13 @@ import sys import mock from oslo.config import cfg import testtools +from webob import exc import webtest from neutron.api import extensions from neutron.api.v2 import attributes from neutron.common import config +from neutron.common import constants from neutron.common import exceptions from neutron import context from neutron.db import quota_db @@ -32,8 +34,7 @@ from neutron.tests.unit import test_api_v2 from neutron.tests.unit import testlib_api from neutron.tests.unit import testlib_plugin -TARGET_PLUGIN = ('neutron.plugins.linuxbridge.lb_neutron_plugin' - '.LinuxBridgePluginV2') +TARGET_PLUGIN = 'neutron.plugins.ml2.plugin.Ml2Plugin' _get_path = test_api_v2._get_path @@ -188,6 +189,16 @@ class QuotaExtensionDbTestCase(QuotaExtensionTestCase): expect_errors=True) self.assertEqual(400, res.status_int) + def test_update_quotas_with_out_of_range_integer_returns_400(self): + tenant_id = 'tenant_id1' + env = {'neutron.context': context.Context('', tenant_id, + is_admin=True)} + quotas = {'quota': {'network': constants.DB_INTEGER_MAX_VALUE + 1}} + res = self.api.put(_get_path('quotas', id=tenant_id, fmt=self.fmt), + self.serialize(quotas), extra_environ=env, + expect_errors=True) + self.assertEqual(exc.HTTPBadRequest.code, res.status_int) + def test_update_quotas_to_unlimited(self): tenant_id = 'tenant_id1' env = {'neutron.context': context.Context('', tenant_id, diff --git a/neutron/tests/unit/test_security_groups_rpc.py b/neutron/tests/unit/test_security_groups_rpc.py index 5a1d5dc97ed..58a68bfe60d 100644 --- a/neutron/tests/unit/test_security_groups_rpc.py +++ b/neutron/tests/unit/test_security_groups_rpc.py @@ -544,6 +544,52 @@ class SGServerRpcCallBackTestCase(test_sg.SecurityGroupDBTestCase): expected) self._delete('ports', port_id1) + def test_security_group_info_for_devices_only_ipv6_rule(self): + with self.network() as n: + with contextlib.nested(self.subnet(n), + self.security_group()) as (subnet_v4, + sg1): + sg1_id = sg1['security_group']['id'] + rule1 = self._build_security_group_rule( + sg1_id, + 'ingress', const.PROTO_NAME_TCP, '22', + '22', remote_group_id=sg1_id, + ethertype=const.IPv6) + rules = { + 'security_group_rules': [rule1['security_group_rule']]} + self._make_security_group_rule(self.fmt, rules) + + res1 = self._create_port( + self.fmt, n['network']['id'], + security_groups=[sg1_id]) + ports_rest1 = self.deserialize(self.fmt, res1) + port_id1 = ports_rest1['port']['id'] + self.rpc.devices = {port_id1: ports_rest1['port']} + devices = [port_id1, 'no_exist_device'] + + ctx = context.get_admin_context() + ports_rpc = self.rpc.security_group_info_for_devices( + ctx, devices=devices) + expected = { + 'security_groups': {sg1_id: [ + {'direction': 'egress', 'ethertype': const.IPv4}, + {'direction': 'egress', 'ethertype': const.IPv6}, + {'direction': u'ingress', + 'protocol': const.PROTO_NAME_TCP, + 'ethertype': const.IPv6, + 'port_range_max': 22, 'port_range_min': 22, + 'remote_group_id': sg1_id} + ]}, + 'sg_member_ips': {sg1_id: { + 'IPv6': [], + }} + } + self.assertEqual(expected['security_groups'], + ports_rpc['security_groups']) + self.assertEqual(expected['sg_member_ips'][sg1_id]['IPv6'], + ports_rpc['sg_member_ips'][sg1_id]['IPv6']) + self._delete('ports', port_id1) + def test_security_group_ra_rules_for_devices_ipv6_gateway_global(self): fake_prefix = FAKE_PREFIX[const.IPv6] fake_gateway = FAKE_IP['IPv6_GLOBAL'] @@ -975,6 +1021,7 @@ class BaseSecurityGroupAgentRpcTestCase(base.BaseTestCase): self.agent.root_helper = 'sudo' self.agent.plugin_rpc = mock.Mock() self.agent.init_firewall(defer_refresh_firewall=defer_refresh_firewall) + self.default_firewall = self.agent.firewall self.firewall = mock.Mock() firewall_object = firewall_base.FirewallDriver() self.firewall.defer_apply.side_effect = firewall_object.defer_apply @@ -1011,6 +1058,26 @@ class SecurityGroupAgentRpcTestCase(BaseSecurityGroupAgentRpcTestCase): self.fake_device), ]) + def test_prepare_devices_filter_with_noopfirewall(self): + self.agent.firewall = self.default_firewall + self.agent.plugin_rpc.security_group_info_for_devices = mock.Mock() + self.agent.plugin_rpc.security_group_rules_for_devices = mock.Mock() + self.agent.prepare_devices_filter(['fake_device']) + self.assertFalse(self.agent.plugin_rpc. + security_group_info_for_devices.called) + self.assertFalse(self.agent.plugin_rpc. + security_group_rules_for_devices.called) + + def test_prepare_devices_filter_with_firewall_disabled(self): + cfg.CONF.set_override('enable_security_group', False, 'SECURITYGROUP') + self.agent.plugin_rpc.security_group_info_for_devices = mock.Mock() + self.agent.plugin_rpc.security_group_rules_for_devices = mock.Mock() + self.agent.prepare_devices_filter(['fake_device']) + self.assertFalse(self.agent.plugin_rpc. + security_group_info_for_devices.called) + self.assertFalse(self.agent.plugin_rpc. + security_group_rules_for_devices.called) + def test_security_groups_rule_updated(self): self.agent.refresh_firewall = mock.Mock() self.agent.prepare_devices_filter(['fake_port_id']) @@ -1065,6 +1132,30 @@ class SecurityGroupAgentRpcTestCase(BaseSecurityGroupAgentRpcTestCase): self.agent.refresh_firewall([]) self.assertFalse(self.firewall.called) + def test_refresh_firewall_with_firewall_disabled(self): + cfg.CONF.set_override('enable_security_group', False, 'SECURITYGROUP') + self.agent.plugin_rpc.security_group_info_for_devices = mock.Mock() + self.agent.plugin_rpc.security_group_rules_for_devices = mock.Mock() + self.agent.firewall.defer_apply = mock.Mock() + self.agent.refresh_firewall([self.fake_device]) + self.assertFalse(self.agent.plugin_rpc. + security_group_info_for_devices.called) + self.assertFalse(self.agent.plugin_rpc. + security_group_rules_for_devices.called) + self.assertFalse(self.agent.firewall.defer_apply.called) + + def test_refresh_firewall_with_noopfirewall(self): + self.agent.firewall = self.default_firewall + self.agent.plugin_rpc.security_group_info_for_devices = mock.Mock() + self.agent.plugin_rpc.security_group_rules_for_devices = mock.Mock() + self.agent.firewall.defer_apply = mock.Mock() + self.agent.refresh_firewall([self.fake_device]) + self.assertFalse(self.agent.plugin_rpc. + security_group_info_for_devices.called) + self.assertFalse(self.agent.plugin_rpc. + security_group_rules_for_devices.called) + self.assertFalse(self.agent.firewall.defer_apply.called) + class SecurityGroupAgentEnhancedRpcTestCase( BaseSecurityGroupAgentRpcTestCase): @@ -2254,11 +2345,13 @@ class TestSecurityGroupAgentWithIptables(base.BaseTestCase): def setUp(self, defer_refresh_firewall=False, test_rpc_v1_1=True): super(TestSecurityGroupAgentWithIptables, self).setUp() config.register_root_helper(cfg.CONF) + config.register_iptables_opts(cfg.CONF) cfg.CONF.set_override( 'lock_path', '$state_path/lock') set_firewall_driver(self.FIREWALL_DRIVER) cfg.CONF.set_override('enable_ipset', False, group='SECURITYGROUP') + cfg.CONF.set_override('comment_iptables_rules', False, group='AGENT') self.agent = sg_rpc.SecurityGroupAgentRpcMixin() self.agent.context = None diff --git a/neutron/tests/unit/test_wsgi.py b/neutron/tests/unit/test_wsgi.py index d1229139886..789b27ce62a 100644 --- a/neutron/tests/unit/test_wsgi.py +++ b/neutron/tests/unit/test_wsgi.py @@ -56,12 +56,10 @@ class TestWSGIServer(base.BaseTestCase): server = wsgi.Server("test_multiple_processes") server.start(None, 0, host="127.0.0.1", workers=2) - launcher.running = True - launcher.launch_service.assert_called_once_with(server._server, - workers=2) + launcher.launch_service.assert_called_once_with(mock.ANY, workers=2) server.stop() - self.assertFalse(launcher.running) + launcher.stop.assert_called_once_with() server.wait() launcher.wait.assert_called_once_with() diff --git a/neutron/tests/unit/testlib_api.py b/neutron/tests/unit/testlib_api.py index a8c7a7e6edb..564e0b501f3 100644 --- a/neutron/tests/unit/testlib_api.py +++ b/neutron/tests/unit/testlib_api.py @@ -55,17 +55,24 @@ def create_request(path, body, content_type, method='GET', class SqlTestCase(base.BaseTestCase): + # flag to indicate that the models have been loaded + _TABLES_ESTABLISHED = False + def setUp(self): super(SqlTestCase, self).setUp() # Register all data models engine = db_api.get_engine() - model_base.BASEV2.metadata.create_all(engine) + if not SqlTestCase._TABLES_ESTABLISHED: + model_base.BASEV2.metadata.create_all(engine) + SqlTestCase._TABLES_ESTABLISHED = True - def unregister_models(): - """Unregister all data models.""" - model_base.BASEV2.metadata.drop_all(engine) + def clear_tables(): + with engine.begin() as conn: + for table in reversed( + model_base.BASEV2.metadata.sorted_tables): + conn.execute(table.delete()) - self.addCleanup(unregister_models) + self.addCleanup(clear_tables) class WebTestCase(SqlTestCase): diff --git a/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py b/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py index e3b92f25f81..006ad38648d 100644 --- a/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py +++ b/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py @@ -165,6 +165,7 @@ class L2GatewayTestCase(base.NsxlibTestCase): "type": '%sConnector' % connector_type}], "admin_status_enabled": True } + body.get("tags").sort() if client_certificate: body["credential"] = { "client_certificate": { @@ -191,7 +192,7 @@ class L2GatewayTestCase(base.NsxlibTestCase): request_mock.assert_called_once_with( "POST", "/ws.v1/transport-node", - jsonutils.dumps(expected_req_body), + jsonutils.dumps(expected_req_body, sort_keys=True), cluster=self.fake_cluster) def test_update_gw_device(self): @@ -215,7 +216,7 @@ class L2GatewayTestCase(base.NsxlibTestCase): request_mock.assert_called_once_with( "PUT", "/ws.v1/transport-node/whatever", - jsonutils.dumps(expected_req_body), + jsonutils.dumps(expected_req_body, sort_keys=True), cluster=self.fake_cluster) def test_update_gw_device_without_certificate(self): @@ -238,7 +239,7 @@ class L2GatewayTestCase(base.NsxlibTestCase): request_mock.assert_called_once_with( "PUT", "/ws.v1/transport-node/whatever", - jsonutils.dumps(expected_req_body), + jsonutils.dumps(expected_req_body, sort_keys=True), cluster=self.fake_cluster) def test_get_gw_device_status(self): diff --git a/neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py b/neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py index 04c24172e2f..a954a32b7de 100644 --- a/neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py +++ b/neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py @@ -130,12 +130,13 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase, fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id attrs['router_id'] = self._create_and_get_router() - with self.firewall(name=name, - firewall_policy_id=fwp_id, - router_id=attrs['router_id'], - admin_state_up= - test_db_firewall.ADMIN_STATE_UP, - expected_res_status=201) as fw: + with self.firewall( + name=name, + firewall_policy_id=fwp_id, + router_id=attrs['router_id'], + admin_state_up=test_db_firewall.ADMIN_STATE_UP, + expected_res_status=201 + ) as fw: attrs = self._replace_firewall_status( attrs, const.PENDING_CREATE, const.ACTIVE) for k, v in attrs.iteritems(): @@ -146,11 +147,12 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase, attrs = self._get_test_firewall_attrs(name) attrs['router_id'] = self._create_and_get_router() - with self.firewall(name=name, - router_id=attrs['router_id'], - admin_state_up= - test_db_firewall.ADMIN_STATE_UP, - expected_res_status=201) as fw: + with self.firewall( + name=name, + router_id=attrs['router_id'], + admin_state_up=test_db_firewall.ADMIN_STATE_UP, + expected_res_status=201 + ) as fw: attrs = self._replace_firewall_status( attrs, const.PENDING_CREATE, const.ACTIVE) for k, v in attrs.iteritems(): @@ -201,12 +203,13 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase, router_id = self._create_and_get_router() with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] - with self.firewall(name='fw', - firewall_policy_id=fwp_id, - router_id=router_id, - admin_state_up= - test_db_firewall.ADMIN_STATE_UP, - expected_res_status=201): + with self.firewall( + name='fw', + firewall_policy_id=fwp_id, + router_id=router_id, + admin_state_up=test_db_firewall.ADMIN_STATE_UP, + expected_res_status=201 + ): self._delete('routers', router_id, expected_code=webob.exc.HTTPConflict.code) @@ -311,10 +314,11 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase, firewall_rules=None, audited=test_db_firewall.AUDITED) as fwp: fwp_id = fwp['firewall_policy']['id'] - with self.firewall(firewall_policy_id=fwp_id, - router_id=self._create_and_get_router(), - admin_state_up= - test_db_firewall.ADMIN_STATE_UP): + with self.firewall( + firewall_policy_id=fwp_id, + router_id=self._create_and_get_router(), + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ): data = {'firewall_policy': {'name': name}} req = self.new_update_request( 'firewall_policies', data, fwp['firewall_policy']['id']) @@ -372,10 +376,11 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase, with self.firewall_policy() as fwp: fwp_id = fwp['firewall_policy']['id'] attrs['firewall_policy_id'] = fwp_id - with self.firewall(firewall_policy_id=fwp_id, - router_id=self._create_and_get_router(), - admin_state_up= - test_db_firewall.ADMIN_STATE_UP): + with self.firewall( + firewall_policy_id=fwp_id, + router_id=self._create_and_get_router(), + admin_state_up=test_db_firewall.ADMIN_STATE_UP + ): fwr_id = fwr['firewall_rule']['id'] data = {'firewall_policy': {'firewall_rules': [fwr_id]}} req = self.new_update_request( diff --git a/neutron/wsgi.py b/neutron/wsgi.py index a98e2226375..137dcb96e5e 100644 --- a/neutron/wsgi.py +++ b/neutron/wsgi.py @@ -97,7 +97,8 @@ class WorkerService(object): self._service._socket) def wait(self): - self._service.pool.waitall() + if isinstance(self._server, eventlet.greenthread.GreenThread): + self._server.wait() def stop(self): if isinstance(self._server, eventlet.greenthread.GreenThread): @@ -113,7 +114,6 @@ class Server(object): eventlet.wsgi.MAX_HEADER_LINE = CONF.max_header_line self.pool = eventlet.GreenPool(threads) self.name = name - self._launcher = None self._server = None def _get_socket(self, host, port, backlog): @@ -205,17 +205,22 @@ class Server(object): self._socket = self._get_socket(self._host, self._port, backlog=backlog) + + self._launch(application, workers) + + def _launch(self, application, workers=0): + service = WorkerService(self, application) if workers < 1: - # For the case where only one process is required. - self._server = self.pool.spawn(self._run, application, - self._socket) + # The API service should run in the current process. + self._server = service + service.start() systemd.notify_once() else: + # The API service runs in a number of child processes. # Minimize the cost of checking for child exit by extending the # wait interval past the default of 0.01s. - self._launcher = common_service.ProcessLauncher(wait_interval=1.0) - self._server = WorkerService(self, application) - self._launcher.launch_service(self._server, workers=workers) + self._server = common_service.ProcessLauncher(wait_interval=1.0) + self._server.launch_service(service, workers=workers) @property def host(self): @@ -226,19 +231,12 @@ class Server(object): return self._socket.getsockname()[1] if self._socket else self._port def stop(self): - if self._launcher: - # The process launcher does not support stop or kill. - self._launcher.running = False - else: - self._server.kill() + self._server.stop() def wait(self): """Wait until all servers have completed running.""" try: - if self._launcher: - self._launcher.wait() - else: - self.pool.waitall() + self._server.wait() except KeyboardInterrupt: pass diff --git a/openstack-common.conf b/openstack-common.conf index 6e6c64e9e6c..a3bebcc38b6 100644 --- a/openstack-common.conf +++ b/openstack-common.conf @@ -25,13 +25,11 @@ module=periodic_task module=policy module=processutils module=service -module=sslutils module=strutils module=systemd module=threadgroup module=timeutils module=uuidutils -module=versionutils # The base module to hold the copy of openstack.common base=neutron diff --git a/requirements.txt b/requirements.txt index cb31cee1dd9..a8b4883e842 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,26 +9,28 @@ Routes>=1.12.3,!=2.0 anyjson>=0.3.3 argparse Babel>=1.3 -eventlet>=0.15.1 +eventlet>=0.15.2 greenlet>=0.3.2 httplib2>=0.7.5 -requests>=1.2.1,!=2.4.0 +requests>=2.2.0,!=2.4.0 iso8601>=0.1.9 jsonrpclib Jinja2 keystonemiddleware>=1.0.0 -kombu>=2.4.8 netaddr>=0.7.12 python-neutronclient>=2.3.6,<3 SQLAlchemy>=0.8.4,<=0.8.99,>=0.9.7,<=0.9.99 WebOb>=1.2.3 -python-keystoneclient>=0.10.0 +python-keystoneclient>=0.11.1 alembic>=0.6.4 six>=1.7.0 -stevedore>=0.14 -oslo.config>=1.4.0.0a3 -oslo.db>=0.4.0 # Apache-2.0 -oslo.messaging>=1.4.0.0a3 -oslo.rootwrap>=1.3.0.0a1 +stevedore>=1.0.0 # Apache-2.0 +oslo.config>=1.4.0 # Apache-2.0 +oslo.db>=1.0.0 # Apache-2.0 +oslo.i18n>=1.0.0 # Apache-2.0 +oslo.messaging>=1.4.0 +oslo.rootwrap>=1.3.0 +oslo.serialization>=1.0.0 # Apache-2.0 +oslo.utils>=1.0.0 # Apache-2.0 python-novaclient>=2.18.0 diff --git a/setup.cfg b/setup.cfg index 4f0697c80e7..a021a4ee030 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = neutron -version = 2014.2 +version = 2015.1 summary = OpenStack Networking description-file = README.rst @@ -55,6 +55,7 @@ data_files = etc/neutron/plugins/bigswitch/ssl/host_certs/README etc/neutron/plugins/brocade = etc/neutron/plugins/brocade/brocade.ini etc/neutron/plugins/cisco = + etc/neutron/plugins/cisco/cisco_cfg_agent.ini etc/neutron/plugins/cisco/cisco_plugins.ini etc/neutron/plugins/cisco/cisco_router_plugin.ini etc/neutron/plugins/cisco/cisco_vpn_agent.ini @@ -133,14 +134,13 @@ neutron.core_plugins = embrane = neutron.plugins.embrane.plugins.embrane_ml2_plugin:EmbraneMl2Plugin hyperv = neutron.plugins.hyperv.hyperv_neutron_plugin:HyperVNeutronPlugin ibm = neutron.plugins.ibm.sdnve_neutron_plugin:SdnvePluginV2 - linuxbridge = neutron.plugins.linuxbridge.lb_neutron_plugin:LinuxBridgePluginV2 midonet = neutron.plugins.midonet.plugin:MidonetPluginV2 ml2 = neutron.plugins.ml2.plugin:Ml2Plugin mlnx = neutron.plugins.mlnx.mlnx_plugin:MellanoxEswitchPlugin nec = neutron.plugins.nec.nec_plugin:NECPluginV2 nuage = neutron.plugins.nuage.plugin:NuagePlugin metaplugin = neutron.plugins.metaplugin.meta_neutron_plugin:MetaPluginV2 - oneconvergence = neutron.plugins.oneconvergence.plugin.OneConvergencePluginV2 + oneconvergence = neutron.plugins.oneconvergence.plugin:OneConvergencePluginV2 openvswitch = neutron.plugins.openvswitch.ovs_neutron_plugin:OVSNeutronPluginV2 plumgrid = neutron.plugins.plumgrid.plumgrid_plugin.plumgrid_plugin:NeutronPluginPLUMgridV2 ryu = neutron.plugins.ryu.ryu_neutron_plugin:RyuNeutronPluginV2 diff --git a/test-requirements.txt b/test-requirements.txt index aa8596daf4e..1ff984a4ad0 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -3,7 +3,7 @@ # process, which may cause wedges in the gate later. hacking>=0.9.2,<0.10 -cliff>=1.6.0 +cliff>=1.7.0 # Apache-2.0 coverage>=3.6 discover fixtures>=0.3.14 @@ -11,8 +11,12 @@ mock>=1.0 python-subunit>=0.0.18 ordereddict requests-mock>=0.4.0 # Apache-2.0 -sphinx>=1.1.2,!=1.2.0,<1.3 -oslosphinx>=2.2.0.0a2 +sphinx>=1.1.2,!=1.2.0,!=1.3b1,<1.3 +oslosphinx>=2.2.0 # Apache-2.0 testrepository>=0.0.18 testtools>=0.9.34 +testscenarios>=0.4 WebTest>=2.0 +oslotest>=1.1.0 # Apache-2.0 +psycopg2 +MySQL-python diff --git a/tox.ini b/tox.ini index 90cc8d766cf..d5a1d1386c5 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py26,py27,py33,pep8 +envlist = py26,py27,py33,py34,pep8 minversion = 1.6 skipsdist = True @@ -64,13 +64,11 @@ commands = python setup.py build_sphinx # E126 continuation line over-indented for hanging indent # E128 continuation line under-indented for visual indent # E129 visually indented line with same indent as next logical line -# E251 unexpected spaces around keyword / parameter equals # E265 block comment should start with ‘# ‘ # E713 test for membership should be ‘not in’ # F402 import module shadowed by loop variable # F811 redefinition of unused variable # F812 list comprehension redefines name from line -# H104 file contains nothing but comments # H237 module is removed in Python 3 # H305 imports not grouped correctly # H307 like imports should be grouped together @@ -79,11 +77,18 @@ commands = python setup.py build_sphinx # H405 multi line docstring summary not separated with an empty line # H904 Wrap long lines in parentheses instead of a backslash # TODO(marun) H404 multi line docstring should start with a summary -ignore = E125,E126,E128,E129,E251,E265,E713,F402,F811,F812,H104,H237,H305,H307,H401,H402,H404,H405,H904 +ignore = E125,E126,E128,E129,E265,E713,F402,F811,F812,H237,H305,H307,H401,H402,H404,H405,H904 show-source = true builtins = _ exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,tools,.ropeproject,rally-scenarios +[testenv:pylint] +deps = + {[testenv]deps} + pylint +commands = + pylint --rcfile=.pylintrc --output-format=colorized {posargs:neutron} + [hacking] import_exceptions = neutron.openstack.common.gettextutils local-check-factory = neutron.hacking.checks.factory