Merge remote-tracking branch 'origin' into merge-branch

This commit merges the master neutron branch into the feature/lbaasv2
branch. This is needed to get the feature/lbaasv2 branch building again.

Change-Id: Iba59aa20adc6b369b4b9d250afee406159287ba1
This commit is contained in:
Kyle Mestery 2014-10-24 10:53:51 +00:00
commit c089154a94
398 changed files with 11085 additions and 35020 deletions

124
.pylintrc
View File

@ -2,17 +2,97 @@
[MASTER] [MASTER]
# Add <file or directory> to the black list. It should be a base name, not a # Add <file or directory> to the black list. It should be a base name, not a
# path. You may set this option multiple times. # 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] [MESSAGES CONTROL]
# NOTE(justinsb): We might want to have a 2nd strict pylintrc in future # NOTE(gus): This is a long list. A number of these are important and
# C0111: Don't require docstrings on every method # should be re-enabled once the offending code is fixed (or marked
# W0511: TODOs in code comments are fine. # with a local disable)
# W0142: *args and **kwargs are fine. disable=
# W0622: Redefining id is fine. # "F" Fatal errors that prevent further processing
disable=C0111,W0511,W0142,W0622 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 names can be 1 to 31 characters long, with lowercase and underscores
variable-rgx=[a-z_][a-z0-9_]{0,30}$ 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 # Method names should be at least 3 characters long
# and be lowecased with underscores # 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 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_-]+))$ 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. # Don't require docstrings on tests.
no-docstring-rgx=((__.*__)|([tT]est.*)|setUp|tearDown)$ no-docstring-rgx=((__.*__)|([tT]est.*)|setUp|tearDown)$
[Design] [FORMAT]
max-public-methods=100 # Maximum number of characters on a single line.
min-public-methods=0 max-line-length=79
max-args=6
[Variables]
[VARIABLES]
# List of additional names supposed to be defined in builtins. Remember that # List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible. # you should avoid to define new builtins when possible.
# _ is used by our localization # _ is used by our localization
additional-builtins=_ 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

View File

@ -12,6 +12,7 @@ Neutron Specific Commandments
- [N321] Validate that jsonutils module is used instead of json - [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 - [N322] We do not use @authors tags in source files. We have git to track
authorship. authorship.
- [N323] assert_called_once() is not a valid method
Creating Unit Tests Creating Unit Tests
------------------- -------------------

View File

@ -1,2 +1,11 @@
Neutron Database Layer Neutron Database Layer
====================== ======================
Testing database and models sync
--------------------------------
.. automodule:: neutron.tests.unit.db.test_migration
.. autoclass:: _TestModelsMigrations
:members:

View File

@ -251,6 +251,11 @@ lock_path = $state_path/lock
# The uuid of the admin nova tenant # The uuid of the admin nova tenant
# nova_admin_tenant_id = # 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. # Password for connection to nova in admin context.
# nova_admin_password = # 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 # Change to "sudo" to skip the filtering and just run the comand directly
# root_helper = sudo # 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 ============= # =========== items for agent management extension =============
# seconds between nodes reporting state to server; should be less than # 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 # agent_down_time, best if it is half or less than agent_down_time

View File

@ -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

View File

@ -1,52 +1,13 @@
[ovs] [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
# <physical_network>[:<vlan_min>:<vlan_max>] 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 # (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 # for GRE or VXLAN networks. Requires kernel support for OVS patch ports and
# GRE or VXLAN tunneling. # GRE or VXLAN tunneling.
# #
# WARNING: This option will be deprecated in the Icehouse release, at which # WARNING: This option will be deprecated in the Icehouse release, at which
# point setting tunnel_type below will be required to enable # point setting tunnel_types will be required to enable tunneling.
# tunneling.
# #
# enable_tunneling = False # 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 <tun_min>:<tun_max> 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. # 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. # 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 # The integration bridge acts as a virtual "patch bay". All VM VIFs are
@ -55,7 +16,7 @@
# #
# integration_bridge = br-int # 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. # the server. In most cases, the default value should be fine.
# #
# tunnel_bridge = br-tun # tunnel_bridge = br-tun
@ -66,7 +27,7 @@
# Peer patch port in tunnel bridge for integration bridge # Peer patch port in tunnel bridge for integration bridge
# tun_peer_patch_port = patch-int # 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 # empty for the server. Set local-ip to be the local IP address of
# this hypervisor. # this hypervisor.
# #
@ -77,8 +38,8 @@
# bridge names to be used for flat and VLAN networks. The length of # bridge names to be used for flat and VLAN networks. The length of
# bridge names should be no more than 11. Each bridge must # bridge names should be no more than 11. Each bridge must
# exist, and should have a physical network interface configured as a # exist, and should have a physical network interface configured as a
# port. All physical networks listed in network_vlan_ranges on the # port. All physical networks configured on the server should have
# server should have mappings to appropriate bridges on each agent. # mappings to appropriate bridges on each agent.
# #
# bridge_mappings = # bridge_mappings =
# Example: bridge_mappings = physnet1:br-eth1 # Example: bridge_mappings = physnet1:br-eth1
@ -102,10 +63,8 @@
# (ListOpt) The types of tenant network tunnels supported by the agent. # (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 # 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 # 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 # disable tunneling support in the agent.
# plugin, this value must be the same as "tunnel_type" in the "[ovs]" section. # You can specify as many values here as your compute hosts supports.
# When running the agent with ML2, you can specify as many values here as
# your compute hosts supports.
# #
# tunnel_types = # tunnel_types =
# Example: tunnel_types = gre # Example: tunnel_types = gre
@ -164,25 +123,17 @@
# #
# 1. With VLANs on eth1. # 1. With VLANs on eth1.
# [ovs] # [ovs]
# network_vlan_ranges = default:2000:3999
# tunnel_id_ranges =
# integration_bridge = br-int # integration_bridge = br-int
# bridge_mappings = default:br-eth1 # bridge_mappings = default:br-eth1
# #
# 2. With GRE tunneling. # 2. With GRE tunneling.
# [ovs] # [ovs]
# network_vlan_ranges =
# tunnel_id_ranges = 1:1000
# integration_bridge = br-int # integration_bridge = br-int
# tunnel_bridge = br-tun # tunnel_bridge = br-tun
# local_ip = 10.0.0.3 # local_ip = 10.0.0.3
# #
# 3. With VXLAN tunneling. # 3. With VXLAN tunneling.
# [ovs] # [ovs]
# network_vlan_ranges =
# tenant_network_type = vxlan
# tunnel_type = vxlan
# tunnel_id_ranges = 1:1000
# integration_bridge = br-int # integration_bridge = br-int
# tunnel_bridge = br-tun # tunnel_bridge = br-tun
# local_ip = 10.0.0.3 # local_ip = 10.0.0.3

View File

@ -46,3 +46,6 @@ ip6tables-restore: CommandFilter, ip6tables-restore, root
# Keepalived # Keepalived
keepalived: CommandFilter, keepalived, root keepalived: CommandFilter, keepalived, root
kill_keepalived: KillFilter, root, /usr/sbin/keepalived, -HUP, -15, -9 kill_keepalived: KillFilter, root, /usr/sbin/keepalived, -HUP, -15, -9
# l3 agent to delete floatingip's conntrack state
conntrack: CommandFilter, conntrack, root

View File

@ -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.

View File

@ -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.

View File

@ -46,6 +46,11 @@ USE_NAMESPACES_OPTS = [
help=_("Allow overlapping IP.")), 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): def get_log_args(conf, log_file_name):
cmd_args = [] cmd_args = []
@ -92,6 +97,10 @@ def register_use_namespaces_opts_helper(conf):
conf.register_opts(USE_NAMESPACES_OPTS) conf.register_opts(USE_NAMESPACES_OPTS)
def register_iptables_opts(conf):
conf.register_opts(IPTABLES_OPTS, 'AGENT')
def get_root_helper(conf): def get_root_helper(conf):
root_helper = conf.AGENT.root_helper root_helper = conf.AGENT.root_helper
if root_helper != 'sudo': if root_helper != 'sudo':

View File

@ -105,6 +105,14 @@ class FirewallDriver(object):
finally: finally:
self.filter_defer_apply_off() 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): class NoopFirewallDriver(FirewallDriver):
"""Noop Firewall Driver. """Noop Firewall Driver.
@ -134,3 +142,9 @@ class NoopFirewallDriver(FirewallDriver):
@property @property
def ports(self): def ports(self):
return {} return {}
def update_security_group_members(self, sg_id, ips):
pass
def update_security_group_rules(self, sg_id, rules):
pass

View File

@ -242,12 +242,12 @@ class L2populationRpcCallBackTunnelMixin(L2populationRpcCallBackMixin):
if agent_ip == local_ip: if agent_ip == local_ip:
continue continue
after = state.get('after') after = state.get('after', [])
for mac, ip in after: for mac, ip in after:
self.setup_entry_for_arp_reply(br, 'add', lvm.vlan, mac, self.setup_entry_for_arp_reply(br, 'add', lvm.vlan, mac,
ip) ip)
before = state.get('before') before = state.get('before', [])
for mac, ip in before: for mac, ip in before:
self.setup_entry_for_arp_reply(br, 'remove', lvm.vlan, mac, self.setup_entry_for_arp_reply(br, 'remove', lvm.vlan, mac,
ip) ip)

View File

@ -22,6 +22,7 @@ eventlet.monkey_patch()
import netaddr import netaddr
import os import os
from oslo.config import cfg from oslo.config import cfg
from oslo import messaging
import Queue import Queue
from neutron.agent.common import config 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.agent import rpc as agent_rpc
from neutron.common import config as common_config from neutron.common import config as common_config
from neutron.common import constants as l3_constants 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 ipv6_utils
from neutron.common import rpc as n_rpc from neutron.common import rpc as n_rpc
from neutron.common import topics from neutron.common import topics
from neutron.common import utils as common_utils 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 import manager
from neutron.openstack.common import excutils 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 importutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall from neutron.openstack.common import loopingcall
@ -241,7 +244,7 @@ class LinkLocalAllocator(object):
class RouterInfo(l3_ha_agent.RouterMixin): class RouterInfo(l3_ha_agent.RouterMixin):
def __init__(self, router_id, root_helper, use_namespaces, router, 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.router_id = router_id
self.ex_gw_port = None self.ex_gw_port = None
self._snat_enabled = None self._snat_enabled = None
@ -254,7 +257,7 @@ class RouterInfo(l3_ha_agent.RouterMixin):
self.use_namespaces = use_namespaces self.use_namespaces = use_namespaces
# Invoke the setter for establishing initial SNAT action # Invoke the setter for establishing initial SNAT action
self.router = router 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( self.iptables_manager = iptables_manager.IptablesManager(
root_helper=root_helper, root_helper=root_helper,
use_ipv6=use_ipv6, use_ipv6=use_ipv6,
@ -518,31 +521,47 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
LOG.error(msg) LOG.error(msg)
raise SystemExit(1) 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.plugin_rpc = L3PluginApi(topics.L3PLUGIN, host)
self.fullsync = True self.fullsync = True
self.updated_routers = set()
self.removed_routers = set()
self.sync_progress = False self.sync_progress = False
# Get the list of service plugins from Neutron Server # Get the list of service plugins from Neutron Server
try: # This is the first place where we contact neutron-server on startup
self.neutron_service_plugins = ( # so retry in case its not ready to respond.
self.plugin_rpc.get_service_plugin_list(self.context)) retry_count = 5
except n_rpc.RemoteError as e: while True:
LOG.warning(_('l3-agent cannot check service plugins ' retry_count = retry_count - 1
'enabled at the neutron server when startup ' try:
'due to RPC error. It happens when the server ' self.neutron_service_plugins = (
'does not support this RPC API. If the error ' self.plugin_rpc.get_service_plugin_list(self.context))
'is UnsupportedVersion you can ignore ' except n_rpc.RemoteError as e:
'this warning. Detail message: %s'), e) with excutils.save_and_reraise_exception() as ctx:
self.neutron_service_plugins = None 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 self._clean_stale_namespaces = self.conf.use_namespaces
# dvr data # dvr data
self.agent_gateway_port = None self.agent_gateway_port = None
self.agent_fip_count = 0 self.fip_ns_subscribers = set()
self.local_subnets = LinkLocalAllocator( self.local_subnets = LinkLocalAllocator(
os.path.join(self.conf.state_path, 'fip-linklocal-networks'), os.path.join(self.conf.state_path, 'fip-linklocal-networks'),
FIP_LL_SUBNET) FIP_LL_SUBNET)
@ -554,6 +573,15 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
self.target_ex_net_id = None self.target_ex_net_id = None
self.use_ipv6 = ipv6_utils.is_enabled() 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): def _check_config_params(self):
"""Check items in configuration files. """Check items in configuration files.
@ -588,16 +616,22 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
'for namespace cleanup.')) 'for namespace cleanup.'))
return set() 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): def _cleanup_namespaces(self, router_namespaces, router_ids):
"""Destroy stale router namespaces on host when L3 agent restarts """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_namespaces is the list of all routers namespaces
The argument router_ids is the list of ids for known routers. The argument router_ids is the list of ids for known routers.
""" """
ns_to_ignore = set(NS_PREFIX + id for id in router_ids) # Don't destroy namespaces of routers this agent handles.
ns_to_ignore.update(SNAT_NS_PREFIX + id for id in router_ids) ns_to_ignore = self._get_routers_namespaces(router_ids)
ns_to_destroy = router_namespaces - ns_to_ignore ns_to_destroy = router_namespaces - ns_to_ignore
self._destroy_stale_router_namespaces(ns_to_destroy) 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. one attempt will be made to delete them.
""" """
for ns in router_namespaces: for ns in router_namespaces:
ra.disable_ipv6_ra(ns[len(NS_PREFIX):], ns, self.root_helper)
try: try:
self._destroy_namespace(ns) self._destroy_namespace(ns)
except RuntimeError: except RuntimeError:
@ -620,8 +653,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
def _destroy_namespace(self, ns): def _destroy_namespace(self, ns):
if ns.startswith(NS_PREFIX): 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) self._destroy_router_namespace(ns)
elif ns.startswith(FIP_NS_PREFIX): elif ns.startswith(FIP_NS_PREFIX):
self._destroy_fip_namespace(ns) self._destroy_fip_namespace(ns)
@ -670,6 +701,10 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
self.agent_gateway_port = None self.agent_gateway_port = None
def _destroy_router_namespace(self, ns): 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) ns_ip = ip_lib.IPWrapper(self.root_helper, namespace=ns)
for d in ns_ip.get_devices(exclude_loopback=True): for d in ns_ip.get_devices(exclude_loopback=True):
if d.name.startswith(INTERNAL_DEV_PREFIX): if d.name.startswith(INTERNAL_DEV_PREFIX):
@ -727,9 +762,14 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
raise Exception(msg) raise Exception(msg)
def _router_added(self, router_id, router): def _router_added(self, router_id, router):
ri = RouterInfo(router_id, self.root_helper, ns_name = (self.get_ns_name(router_id)
self.conf.use_namespaces, router, if self.conf.use_namespaces else None)
use_ipv6=self.use_ipv6) 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 self.router_info[router_id] = ri
if self.conf.use_namespaces: if self.conf.use_namespaces:
self._create_router_namespace(ri) self._create_router_namespace(ri)
@ -768,15 +808,13 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
for c, r in self.metadata_nat_rules(): for c, r in self.metadata_nat_rules():
ri.iptables_manager.ipv4['nat'].remove_rule(c, r) ri.iptables_manager.ipv4['nat'].remove_rule(c, r)
ri.iptables_manager.apply() 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] del self.router_info[router_id]
self._destroy_router_namespace(ri.ns_name) self._destroy_router_namespace(ri.ns_name)
def _get_metadata_proxy_callback(self, router_id): def _get_metadata_proxy_callback(self, router_id):
def callback(pid_file): 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', proxy_cmd = ['neutron-ns-metadata-proxy',
'--pid_file=%s' % pid_file, '--pid_file=%s' % pid_file,
'--metadata_proxy_socket=%s' % metadata_proxy_socket, '--metadata_proxy_socket=%s' % metadata_proxy_socket,
@ -784,7 +822,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
'--state_path=%s' % self.conf.state_path, '--state_path=%s' % self.conf.state_path,
'--metadata_port=%s' % self.conf.metadata_port] '--metadata_port=%s' % self.conf.metadata_port]
proxy_cmd.extend(config.get_log_args( 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)) router_id))
return proxy_cmd return proxy_cmd
@ -948,7 +986,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
# Process SNAT/DNAT rules for floating IPs # Process SNAT/DNAT rules for floating IPs
fip_statuses = {} fip_statuses = {}
try: try:
if ex_gw_port or ri.ex_gw_port: if ex_gw_port:
existing_floating_ips = ri.floating_ips existing_floating_ips = ri.floating_ips
self.process_router_floating_ip_nat_rules(ri) self.process_router_floating_ip_nat_rules(ri)
ri.iptables_manager.defer_apply_off() 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, []): for fip in ri.router.get(l3_constants.FLOATINGIP_KEY, []):
fip_statuses[fip['id']] = l3_constants.FLOATINGIP_STATUS_ERROR 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 # Identify floating IPs which were disabled
ri.floating_ips = set(fip_statuses.keys()) ri.floating_ips = set(fip_statuses.keys())
for fip_id in existing_floating_ips - ri.floating_ips: for fip_id in existing_floating_ips - ri.floating_ips:
@ -1066,9 +1104,11 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
if ri.router['distributed']: if ri.router['distributed']:
# filter out only FIPs for this host/agent # filter out only FIPs for this host/agent
floating_ips = [i for i in floating_ips if i['host'] == self.host] floating_ips = [i for i in floating_ips if i['host'] == self.host]
if floating_ips and self.agent_gateway_port is None: if floating_ips:
self._create_agent_gateway_port(ri, floating_ips[0] is_first = self._fip_ns_subscribe(ri.router_id)
['floating_network_id']) if is_first:
self._create_agent_gateway_port(ri, floating_ips[0]
['floating_network_id'])
if self.agent_gateway_port: if self.agent_gateway_port:
if floating_ips and ri.dist_fip_count == 0: if floating_ips and ri.dist_fip_count == 0:
@ -1115,6 +1155,9 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
else: else:
net = netaddr.IPNetwork(ip_cidr) net = netaddr.IPNetwork(ip_cidr)
device.addr.delete(net.version, 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']: if ri.router['distributed']:
self.floating_ip_removed_dist(ri, ip_cidr) 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): def get_fip_ns_name(self, ext_net_id):
return (FIP_NS_PREFIX + 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): def get_snat_ns_name(self, router_id):
return (SNAT_NS_PREFIX + 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) self._snat_redirect_remove(ri, p, internal_interface)
if self.conf.agent_mode == 'dvr_snat' and ( 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']) ns_name = self.get_snat_ns_name(ri.router['id'])
else: else:
# not hosting agent - no work to do # not hosting agent - no work to do
@ -1626,7 +1672,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
interface_name, floating_ip, interface_name, floating_ip,
distributed=True) distributed=True)
# update internal structures # update internal structures
self.agent_fip_count = self.agent_fip_count + 1
ri.dist_fip_count = ri.dist_fip_count + 1 ri.dist_fip_count = ri.dist_fip_count + 1
def floating_ip_removed_dist(self, ri, fip_cidr): 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) self.local_subnets.release(ri.router_id)
ri.rtr_fip_subnet = None ri.rtr_fip_subnet = None
ns_ip.del_veth(fip_2_rtr_name) ns_ip.del_veth(fip_2_rtr_name)
# clean up fip-namespace if this is the last FIP is_last = self._fip_ns_unsubscribe(ri.router_id)
self.agent_fip_count = self.agent_fip_count - 1 # clean up fip-namespace if this is the last FIP
if self.agent_fip_count == 0: if is_last:
self._destroy_fip_namespace(fip_ns_name) self._destroy_fip_namespace(fip_ns_name)
def floating_forward_rules(self, floating_ip, fixed_ip): def floating_forward_rules(self, floating_ip, fixed_ip):
return [('PREROUTING', '-d %s -j DNAT --to %s' % 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) LOG.debug(_('Got router added to agent :%r'), payload)
self.routers_updated(context, payload) self.routers_updated(context, payload)
def _process_routers(self, routers, all_routers=False): def _process_router_if_compatible(self, router):
pool = eventlet.GreenPool()
if (self.conf.external_network_bridge and if (self.conf.external_network_bridge and
not ip_lib.device_exists(self.conf.external_network_bridge)): not ip_lib.device_exists(self.conf.external_network_bridge)):
LOG.error(_("The external network bridge '%s' does not exist"), LOG.error(_("The external network bridge '%s' does not exist"),
self.conf.external_network_bridge) self.conf.external_network_bridge)
return 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() target_ex_net_id = self._fetch_external_net_id()
# if routers are all the routers we have (They are from router sync on if (target_ex_net_id and ex_net_id and ex_net_id != target_ex_net_id):
# starting or when error occurs during running), we seek the # Double check that our single external_net_id has not changed
# routers which should be removed. # by forcing a check by RPC.
# If routers are from server side notification, we seek them if ex_net_id != self._fetch_external_net_id(force=True):
# from subset of incoming routers and ones we have now. raise n_exc.RouterNotCompatibleWithAgent(
if all_routers: router_id=router['id'])
prev_router_ids = set(self.router_info)
else: if router['id'] not in self.router_info:
prev_router_ids = set(self.router_info) & set( self._router_added(router['id'], router)
[router['id'] for router in routers]) ri = self.router_info[router['id']]
cur_router_ids = set() ri.router = router
for r in routers: self.process_router(ri)
# 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()
def _process_router_update(self): def _process_router_update(self):
for rp, update in self._queue.each_update_to_next_router(): 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) self._router_removed(update.id)
continue 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) LOG.debug("Finished a router update for %s", update.id)
rp.fetched_and_processed(update.timestamp) rp.fetched_and_processed(update.timestamp)
@ -1820,12 +1860,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
while True: while True:
pool.spawn_n(self._process_router_update) 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): def _router_ids(self):
if not self.conf.use_namespaces: if not self.conf.use_namespaces:
return [self.conf.router_id] return [self.conf.router_id]
@ -1851,8 +1885,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
try: try:
router_ids = self._router_ids() router_ids = self._router_ids()
self.updated_routers.clear()
self.removed_routers.clear()
timestamp = timeutils.utcnow() timestamp = timeutils.utcnow()
routers = self.plugin_rpc.get_routers( routers = self.plugin_rpc.get_routers(
context, router_ids) context, router_ids)
@ -1946,7 +1978,7 @@ class L3NATAgentWithStateReport(L3NATAgent):
'interface_driver': self.conf.interface_driver}, 'interface_driver': self.conf.interface_driver},
'start_flag': True, 'start_flag': True,
'agent_type': l3_constants.AGENT_TYPE_L3} '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 self.use_call = True
if report_interval: if report_interval:
self.heartbeat = loopingcall.FixedIntervalLoopingCall( self.heartbeat = loopingcall.FixedIntervalLoopingCall(

View File

@ -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.

View File

@ -730,7 +730,8 @@ class Dnsmasq(DhcpLocalProcess):
subnets = dict((subnet.id, subnet) for subnet in network.subnets) subnets = dict((subnet.id, subnet) for subnet in network.subnets)
for port in network.ports: 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 continue
for alloc in port.fixed_ips: for alloc in port.fixed_ips:
if subnets[alloc.subnet_id].gateway_ip == alloc.ip_address: if subnets[alloc.subnet_id].gateway_ip == alloc.ip_address:

View File

@ -30,14 +30,12 @@ OPTS = [
cfg.StrOpt('external_pids', cfg.StrOpt('external_pids',
default='$state_path/external/pids', default='$state_path/external/pids',
help=_('Location to store child pid files')), 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', cfg.StrOpt('check_child_processes_action', default='respawn',
choices=['respawn', 'exit'], choices=['respawn', 'exit'],
help=_('Action to be executed when a child process dies')), 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 ' help=_('Interval between checks of child process liveness '
'(seconds)')), '(seconds), use 0 to disable')),
] ]
@ -156,7 +154,7 @@ class ProcessMonitor(object):
self._process_managers = {} self._process_managers = {}
if self._config.check_child_processes: if self._config.check_child_processes_interval:
self._spawn_checking_thread() self._spawn_checking_thread()
def enable(self, uuid, cmd_callback, namespace=None, service=None, def enable(self, uuid, cmd_callback, namespace=None, service=None,

View File

@ -23,8 +23,10 @@ from neutron.agent.common import config
from neutron.agent.linux import ip_lib from neutron.agent.linux import ip_lib
from neutron.agent.linux import ovs_lib from neutron.agent.linux import ovs_lib
from neutron.agent.linux import utils from neutron.agent.linux import utils
from neutron.common import constants as n_const
from neutron.common import exceptions from neutron.common import exceptions
from neutron.extensions import flavor from neutron.extensions import flavor
from neutron.openstack.common.gettextutils import _LE
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
@ -71,7 +73,7 @@ class LinuxInterfaceDriver(object):
# from linux IF_NAMESIZE # from linux IF_NAMESIZE
DEV_NAME_LEN = 14 DEV_NAME_LEN = 14
DEV_NAME_PREFIX = 'tap' DEV_NAME_PREFIX = n_const.TAP_DEVICE_PREFIX
def __init__(self, conf): def __init__(self, conf):
self.conf = conf self.conf = conf
@ -110,6 +112,9 @@ class LinuxInterfaceDriver(object):
for ip_cidr, ip_version in previous.items(): for ip_cidr, ip_version in previous.items():
if ip_cidr not in preserve_ips: if ip_cidr not in preserve_ips:
device.addr.delete(ip_version, ip_cidr) device.addr.delete(ip_version, ip_cidr)
self.delete_conntrack_state(root_helper=self.root_helper,
namespace=namespace,
ip=ip_cidr)
if gateway: if gateway:
device.route.add_gateway(gateway) device.route.add_gateway(gateway)
@ -121,6 +126,43 @@ class LinuxInterfaceDriver(object):
for route in existing_onlink_routes - new_onlink_routes: for route in existing_onlink_routes - new_onlink_routes:
device.route.delete_onlink_route(route) 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): def check_bridge_exists(self, bridge):
if not ip_lib.device_exists(bridge): if not ip_lib.device_exists(bridge):
raise exceptions.BridgeDoesNotExist(bridge=bridge) raise exceptions.BridgeDoesNotExist(bridge=bridge)
@ -150,7 +192,7 @@ class NullDriver(LinuxInterfaceDriver):
class OVSInterfaceDriver(LinuxInterfaceDriver): class OVSInterfaceDriver(LinuxInterfaceDriver):
"""Driver for creating an internal interface on an OVS bridge.""" """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): def __init__(self, conf):
super(OVSInterfaceDriver, self).__init__(conf) super(OVSInterfaceDriver, self).__init__(conf)
@ -159,7 +201,8 @@ class OVSInterfaceDriver(LinuxInterfaceDriver):
def _get_tap_name(self, dev_name, prefix=None): def _get_tap_name(self, dev_name, prefix=None):
if self.conf.ovs_use_veth: 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 return dev_name
def _ovs_add_port(self, bridge, device_name, port_id, mac_address, def _ovs_add_port(self, bridge, device_name, port_id, mac_address,
@ -254,7 +297,8 @@ class MidonetInterfaceDriver(LinuxInterfaceDriver):
self.root_helper, self.root_helper,
namespace=namespace): namespace=namespace):
ip = ip_lib.IPWrapper(self.root_helper) 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. # Create ns_dev in a namespace if one is configured.
root_dev, ns_dev = ip.add_veth(tap_name, device_name, root_dev, ns_dev = ip.add_veth(tap_name, device_name,
@ -293,14 +337,15 @@ class MidonetInterfaceDriver(LinuxInterfaceDriver):
class IVSInterfaceDriver(LinuxInterfaceDriver): class IVSInterfaceDriver(LinuxInterfaceDriver):
"""Driver for creating an internal interface on an IVS bridge.""" """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): def __init__(self, conf):
super(IVSInterfaceDriver, self).__init__(conf) super(IVSInterfaceDriver, self).__init__(conf)
self.DEV_NAME_PREFIX = 'ns-' self.DEV_NAME_PREFIX = 'ns-'
def _get_tap_name(self, dev_name, prefix=None): 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 return dev_name
def _ivs_add_port(self, device_name, port_id, mac_address): 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) ip = ip_lib.IPWrapper(self.root_helper)
# Enable agent to define the prefix # Enable agent to define the prefix
if prefix: tap_name = device_name.replace(prefix or self.DEV_NAME_PREFIX,
tap_name = device_name.replace(prefix, 'tap') n_const.TAP_DEVICE_PREFIX)
else:
tap_name = device_name.replace(self.DEV_NAME_PREFIX, 'tap')
# Create ns_veth in a namespace if one is configured. # Create ns_veth in a namespace if one is configured.
root_veth, ns_veth = ip.add_veth(tap_name, device_name, root_veth, ns_veth = ip.add_veth(tap_name, device_name,
namespace2=namespace) namespace2=namespace)

View File

@ -532,7 +532,8 @@ class IpNetnsCommand(IpCommandBase):
def delete(self, name): def delete(self, name):
self._as_root('delete', name, use_root_namespace=True) 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 = [] ns_params = []
if self._parent.namespace: if self._parent.namespace:
if not self._parent.root_helper: if not self._parent.root_helper:
@ -546,7 +547,7 @@ class IpNetnsCommand(IpCommandBase):
return utils.execute( return utils.execute(
ns_params + env_params + list(cmds), ns_params + env_params + list(cmds),
root_helper=self._parent.root_helper, 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): def exists(self, name):
output = self._parent._execute('o', 'netns', ['list']) output = self._parent._execute('o', 'netns', ['list'])

View File

@ -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.'

View File

@ -18,6 +18,7 @@ from oslo.config import cfg
from neutron.agent import firewall from neutron.agent import firewall
from neutron.agent.linux import ipset_manager from neutron.agent.linux import ipset_manager
from neutron.agent.linux import iptables_comments as ic
from neutron.agent.linux import iptables_manager from neutron.agent.linux import iptables_manager
from neutron.common import constants from neutron.common import constants
from neutron.common import ipv6_utils from neutron.common import ipv6_utils
@ -40,6 +41,7 @@ LINUX_DEV_LEN = 14
IPSET_CHAIN_LEN = 20 IPSET_CHAIN_LEN = 20
IPSET_CHANGE_BULK_THRESHOLD = 10 IPSET_CHANGE_BULK_THRESHOLD = 10
IPSET_ADD_BULK_THRESHOLD = 5 IPSET_ADD_BULK_THRESHOLD = 5
comment_rule = iptables_manager.comment_rule
class IptablesFirewallDriver(firewall.FirewallDriver): class IptablesFirewallDriver(firewall.FirewallDriver):
@ -146,9 +148,11 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
def _add_fallback_chain_v4v6(self): def _add_fallback_chain_v4v6(self):
self.iptables.ipv4['filter'].add_chain('sg-fallback') 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_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): def _add_chain_by_name_v4v6(self, chain_name):
self.iptables.ipv6['filter'].add_chain(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.ipv4['filter'].ensure_remove_chain(chain_name)
self.iptables.ipv6['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: 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: 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): def _get_device_name(self, port):
return port['device'] return port['device']
@ -183,17 +190,20 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
'-j $%s' % (self.IPTABLES_DIRECTION[direction], '-j $%s' % (self.IPTABLES_DIRECTION[direction],
device, device,
SG_CHAIN)] 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 to the chain based on the device
jump_rule = ['-m physdev --%s %s --physdev-is-bridged ' jump_rule = ['-m physdev --%s %s --physdev-is-bridged '
'-j $%s' % (self.IPTABLES_DIRECTION[direction], '-j $%s' % (self.IPTABLES_DIRECTION[direction],
device, device,
chain_name)] 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: 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): def _split_sgr_by_ethertype(self, security_group_rules):
ipv4_sg_rules = [] ipv4_sg_rules = []
@ -222,12 +232,12 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
# of the list after the allowed_address_pair rules. # of the list after the allowed_address_pair rules.
table.add_rule(chain_name, table.add_rule(chain_name,
'-m mac --mac-source %s -j RETURN' '-m mac --mac-source %s -j RETURN'
% mac) % mac, comment=ic.PAIR_ALLOW)
else: else:
table.add_rule(chain_name, table.add_rule(chain_name,
'-m mac --mac-source %s -s %s -j RETURN' '-m mac --mac-source %s -s %s -j RETURN'
% (mac, ip)) % (mac, ip), comment=ic.PAIR_ALLOW)
table.add_rule(chain_name, '-j DROP') table.add_rule(chain_name, '-j DROP', comment=ic.PAIR_DROP)
rules.append('-j $%s' % chain_name) rules.append('-j $%s' % chain_name)
def _build_ipv4v6_mac_ip_list(self, mac, ip_address, mac_ipv4_pairs, 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): def _spoofing_rule(self, port, ipv4_rules, ipv6_rules):
#Note(nati) allow dhcp or RA packet #Note(nati) allow dhcp or RA packet
ipv4_rules += ['-p udp -m udp --sport 68 --dport 67 -j RETURN'] ipv4_rules += [comment_rule('-p udp -m udp --sport 68 --dport 67 '
ipv6_rules += ['-p icmpv6 -j RETURN'] '-j RETURN', comment=ic.DHCP_CLIENT)]
ipv6_rules += ['-p udp -m udp --sport 546 --dport 547 -j RETURN'] 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_ipv4_pairs = []
mac_ipv6_pairs = [] mac_ipv6_pairs = []
@ -266,8 +279,10 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
def _drop_dhcp_rule(self, ipv4_rules, ipv6_rules): def _drop_dhcp_rule(self, ipv4_rules, ipv6_rules):
#Note(nati) Drop dhcp packet from VM #Note(nati) Drop dhcp packet from VM
ipv4_rules += ['-p udp -m udp --sport 67 --dport 68 -j DROP'] ipv4_rules += [comment_rule('-p udp -m udp --sport 67 --dport 68 '
ipv6_rules += ['-p udp -m udp --sport 547 --dport 546 -j DROP'] '-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): def _accept_inbound_icmpv6(self):
# Allow multicast listener, neighbor solicitation and # Allow multicast listener, neighbor solicitation and
@ -454,18 +469,22 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
args += ['-j RETURN'] args += ['-j RETURN']
iptables_rules += [' '.join(args)] iptables_rules += [' '.join(args)]
iptables_rules += ['-j $sg-fallback'] iptables_rules += [comment_rule('-j $sg-fallback',
comment=ic.UNMATCHED)]
return iptables_rules return iptables_rules
def _drop_invalid_packets(self, iptables_rules): def _drop_invalid_packets(self, iptables_rules):
# Always drop invalid packets # 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 return iptables_rules
def _allow_established(self, iptables_rules): def _allow_established(self, iptables_rules):
# Allow established connections # 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 return iptables_rules
def _protocol_arg(self, protocol): def _protocol_arg(self, protocol):
@ -560,7 +579,7 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
class OVSHybridIptablesFirewallDriver(IptablesFirewallDriver): class OVSHybridIptablesFirewallDriver(IptablesFirewallDriver):
OVS_HYBRID_TAP_PREFIX = 'tap' OVS_HYBRID_TAP_PREFIX = constants.TAP_DEVICE_PREFIX
def _port_chain_name(self, port, direction): def _port_chain_name(self, port, direction):
return iptables_manager.get_chain_name( return iptables_manager.get_chain_name(

View File

@ -22,6 +22,10 @@ import inspect
import os import os
import re 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.agent.linux import utils as linux_utils
from neutron.common import utils from neutron.common import utils
from neutron.openstack.common import excutils from neutron.openstack.common import excutils
@ -51,6 +55,12 @@ MAX_CHAIN_LEN_NOWRAP = 28
IPTABLES_ERROR_LINES_OF_CONTEXT = 5 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): def get_chain_name(chain_name, wrap=True):
if wrap: if wrap:
return chain_name[:MAX_CHAIN_LEN_WRAP] return chain_name[:MAX_CHAIN_LEN_WRAP]
@ -67,13 +77,14 @@ class IptablesRule(object):
""" """
def __init__(self, chain, rule, wrap=True, top=False, 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.chain = get_chain_name(chain, wrap)
self.rule = rule self.rule = rule
self.wrap = wrap self.wrap = wrap
self.top = top self.top = top
self.wrap_name = binary_name[:16] self.wrap_name = binary_name[:16]
self.tag = tag self.tag = tag
self.comment = comment
def __eq__(self, other): def __eq__(self, other):
return ((self.chain == other.chain) and return ((self.chain == other.chain) and
@ -89,7 +100,7 @@ class IptablesRule(object):
chain = '%s-%s' % (self.wrap_name, self.chain) chain = '%s-%s' % (self.wrap_name, self.chain)
else: else:
chain = self.chain chain = self.chain
return '-A %s %s' % (chain, self.rule) return comment_rule('-A %s %s' % (chain, self.rule), self.comment)
class IptablesTable(object): class IptablesTable(object):
@ -182,7 +193,8 @@ class IptablesTable(object):
self.rules = [r for r in self.rules self.rules = [r for r in self.rules
if jump_snippet not in r.rule] 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. """Add a rule to the table.
This is just like what you'd feed to iptables, just without 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._wrap_target_chain(e, wrap) for e in rule.split(' '))
self.rules.append(IptablesRule(chain, rule, wrap, top, self.wrap_name, self.rules.append(IptablesRule(chain, rule, wrap, top, self.wrap_name,
tag)) tag, comment))
def _wrap_target_chain(self, s, wrap): def _wrap_target_chain(self, s, wrap):
if s.startswith('$'): if s.startswith('$'):
@ -210,7 +222,7 @@ class IptablesTable(object):
return s 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. """Remove a rule from a chain.
Note: The rule must be exactly identical to the one that was added. 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._wrap_target_chain(e, wrap) for e in rule.split(' '))
self.rules.remove(IptablesRule(chain, rule, wrap, top, self.rules.remove(IptablesRule(chain, rule, wrap, top,
self.wrap_name)) self.wrap_name,
comment=comment))
if not wrap: if not wrap:
self.remove_rules.append(IptablesRule(chain, rule, wrap, top, self.remove_rules.append(IptablesRule(chain, rule, wrap, top,
self.wrap_name)) self.wrap_name,
comment=comment))
except ValueError: except ValueError:
LOG.warn(_('Tried to remove rule that was not there:' LOG.warn(_('Tried to remove rule that was not there:'
' %(chain)r %(rule)r %(wrap)r %(top)r'), ' %(chain)r %(rule)r %(wrap)r %(top)r'),
@ -288,6 +302,7 @@ class IptablesManager(object):
else: else:
self.execute = linux_utils.execute self.execute = linux_utils.execute
config.register_iptables_opts(cfg.CONF)
self.use_ipv6 = use_ipv6 self.use_ipv6 = use_ipv6
self.root_helper = root_helper self.root_helper = root_helper
self.namespace = namespace self.namespace = namespace
@ -351,7 +366,8 @@ class IptablesManager(object):
# chain so that it's applied last. # chain so that it's applied last.
self.ipv4['nat'].add_chain('snat') self.ipv4['nat'].add_chain('snat')
self.ipv4['nat'].add_rule('neutron-postrouting-bottom', 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 # And then we add a float-snat chain and jump to first thing in
# the snat chain. # the snat chain.

View File

@ -22,6 +22,7 @@ from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils from neutron.agent.linux import utils
from neutron.common import exceptions from neutron.common import exceptions
from neutron.openstack.common import excutils 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 jsonutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.plugins.common import constants from neutron.plugins.common import constants
@ -401,29 +402,28 @@ class OVSBridge(BaseOVS):
# an exeception which will be captured in this block. # an exeception which will be captured in this block.
# We won't deal with the possibility of ovs-vsctl return multiple # We won't deal with the possibility of ovs-vsctl return multiple
# rows since the interface identifier is unique # rows since the interface identifier is unique
data = json_result['data'][0] for data in json_result['data']:
port_name = data[name_idx] port_name = data[name_idx]
switch = get_bridge_for_iface(self.root_helper, port_name) switch = get_bridge_for_iface(self.root_helper, port_name)
if switch != self.br_name: if switch != self.br_name:
LOG.info(_("Port: %(port_name)s is on %(switch)s," continue
" not on %(br_name)s"), {'port_name': port_name, ofport = data[ofport_idx]
'switch': switch, # ofport must be integer otherwise return None
'br_name': self.br_name}) if not isinstance(ofport, int) or ofport == -1:
return LOG.warn(_LW("ofport: %(ofport)s for VIF: %(vif)s is not a"
ofport = data[ofport_idx] " positive integer"), {'ofport': ofport,
# ofport must be integer otherwise return None 'vif': port_id})
if not isinstance(ofport, int) or ofport == -1: return
LOG.warn(_("ofport: %(ofport)s for VIF: %(vif)s is not a " # Find VIF's mac address in external ids
"positive integer"), {'ofport': ofport, ext_id_dict = dict((item[0], item[1]) for item in
'vif': port_id}) data[ext_ids_idx][1])
return vif_mac = ext_id_dict['attached-mac']
# Find VIF's mac address in external ids return VifPort(port_name, ofport, port_id, vif_mac, self)
ext_id_dict = dict((item[0], item[1]) for item in LOG.info(_LI("Port %(port_id)s not present in bridge %(br_name)s"),
data[ext_ids_idx][1]) {'port_id': port_id, 'br_name': self.br_name})
vif_mac = ext_id_dict['attached-mac'] except Exception as error:
return VifPort(port_name, ofport, port_id, vif_mac, self) LOG.warn(_LW("Unable to parse interface details. Exception: %s"),
except Exception as e: error)
LOG.warn(_("Unable to parse interface details. Exception: %s"), e)
return return
def delete_ports(self, all_ports=False): def delete_ports(self, all_ports=False):

View File

@ -14,9 +14,9 @@
# under the License. # under the License.
import fcntl import fcntl
import glob
import os import os
import shlex import shlex
import shutil
import socket import socket
import struct import struct
import tempfile 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, 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: try:
obj, cmd = create_process(cmd, root_helper=root_helper, obj, cmd = create_process(cmd, root_helper=root_helper,
addl_env=addl_env) 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, "Stderr: %(stderr)r") % {'cmd': cmd, 'code': obj.returncode,
'stdout': _stdout, 'stderr': _stderr} '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: if obj.returncode and log_fail_as_error:
LOG.error(m) LOG.error(m)
else: else:
@ -129,19 +134,19 @@ def find_child_pids(pid):
return [x.strip() for x in raw_pids.split('\n') if x.strip()] return [x.strip() for x in raw_pids.split('\n') if x.strip()]
def _get_conf_dir(cfg_root, uuid, ensure_conf_dir): def _get_conf_base(cfg_root, uuid, ensure_conf_dir):
confs_dir = os.path.abspath(os.path.normpath(cfg_root)) conf_dir = os.path.abspath(os.path.normpath(cfg_root))
conf_dir = os.path.join(confs_dir, uuid) conf_base = os.path.join(conf_dir, uuid)
if ensure_conf_dir: if ensure_conf_dir:
if not os.path.isdir(conf_dir): if not os.path.isdir(conf_dir):
os.makedirs(conf_dir, 0o755) 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): 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.""" """Returns the file name for a given kind of config file."""
conf_dir = _get_conf_dir(cfg_root, uuid, ensure_conf_dir) conf_base = _get_conf_base(cfg_root, uuid, ensure_conf_dir)
return os.path.join(conf_dir, cfg_file) return "%s.%s" % (conf_base, cfg_file)
def get_value_from_conf_file(cfg_root, uuid, cfg_file, converter=None): 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): def remove_conf_files(cfg_root, uuid):
conf_dir = _get_conf_dir(cfg_root, uuid, False) conf_base = _get_conf_base(cfg_root, uuid, False)
shutil.rmtree(conf_dir, ignore_errors=True) for file_path in glob.iglob("%s.*" % conf_base):
os.unlink(file_path)
def remove_conf_file(cfg_root, uuid, cfg_file): 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) conf_file = get_conf_file_name(cfg_root, uuid, cfg_file)
if os.path.exists(conf_file): if os.path.exists(conf_file):
os.unlink(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)

View File

@ -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.

View File

@ -38,7 +38,6 @@ from neutron.openstack.common.cache import cache
from neutron.openstack.common import excutils from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall from neutron.openstack.common import loopingcall
from neutron.openstack.common import service
from neutron import wsgi from neutron import wsgi
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -210,9 +209,10 @@ class MetadataProxyHandler(object):
req.query_string, req.query_string,
'')) ''))
h = httplib2.Http(ca_certs=self.conf.auth_ca_cert, h = httplib2.Http(
disable_ssl_certificate_validation= ca_certs=self.conf.auth_ca_cert,
self.conf.nova_metadata_insecure) disable_ssl_certificate_validation=self.conf.nova_metadata_insecure
)
if self.conf.nova_client_cert and self.conf.nova_client_priv_key: if self.conf.nova_client_cert and self.conf.nova_client_priv_key:
h.add_certificate(self.conf.nova_client_priv_key, h.add_certificate(self.conf.nova_client_priv_key,
self.conf.nova_client_cert, self.conf.nova_client_cert,
@ -232,6 +232,8 @@ class MetadataProxyHandler(object):
) )
LOG.warn(msg) LOG.warn(msg)
return webob.exc.HTTPForbidden() return webob.exc.HTTPForbidden()
elif resp.status == 400:
return webob.exc.HTTPBadRequest()
elif resp.status == 404: elif resp.status == 404:
return webob.exc.HTTPNotFound() return webob.exc.HTTPNotFound()
elif resp.status == 409: elif resp.status == 409:
@ -278,16 +280,8 @@ class UnixDomainWSGIServer(wsgi.Server):
self._socket = eventlet.listen(file_socket, self._socket = eventlet.listen(file_socket,
family=socket.AF_UNIX, family=socket.AF_UNIX,
backlog=backlog) backlog=backlog)
if workers < 1:
# For the case where only one process is required. self._launch(application, workers=workers)
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)
def _run(self, application, socket): def _run(self, application, socket):
"""Start a WSGI service in a new green thread.""" """Start a WSGI service in a new green thread."""

View File

@ -110,6 +110,8 @@ class NetworkMetadataProxyHandler(object):
response.headers['Content-Type'] = resp['content-type'] response.headers['Content-Type'] = resp['content-type']
response.body = content response.body = content
return response return response
elif resp.status == 400:
return webob.exc.HTTPBadRequest()
elif resp.status == 404: elif resp.status == 404:
return webob.exc.HTTPNotFound() return webob.exc.HTTPNotFound()
elif resp.status == 409: elif resp.status == 409:

View File

@ -14,11 +14,14 @@
# under the License. # under the License.
# #
import functools
from oslo.config import cfg from oslo.config import cfg
from oslo import messaging from oslo import messaging
from neutron.agent import firewall
from neutron.common import topics 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 importutils
from neutron.openstack.common import log as logging 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): def disable_security_group_extension_by_config(aliases):
if not is_firewall_enabled(): if not is_firewall_enabled():
LOG.info(_('Disabled security-group extension.')) LOG.info(_LI('Disabled security-group extension.'))
_disable_extension('security-group', aliases) _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) _disable_extension('allowed-address-pairs', aliases)
@ -187,10 +190,23 @@ class SecurityGroupAgentRpcMixin(object):
return False return False
return True 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): def prepare_devices_filter(self, device_ids):
if not device_ids: if not device_ids:
return 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: if self.use_enhanced_rpc:
devices_info = self.plugin_rpc.security_group_info_for_devices( devices_info = self.plugin_rpc.security_group_info_for_devices(
self.context, list(device_ids)) self.context, list(device_ids))
@ -220,15 +236,15 @@ class SecurityGroupAgentRpcMixin(object):
remote_sg_id, member_ips) remote_sg_id, member_ips)
def security_groups_rule_updated(self, security_groups): def security_groups_rule_updated(self, security_groups):
LOG.info(_("Security group " LOG.info(_LI("Security group "
"rule updated %r"), security_groups) "rule updated %r"), security_groups)
self._security_group_updated( self._security_group_updated(
security_groups, security_groups,
'security_groups') 'security_groups')
def security_groups_member_updated(self, security_groups): def security_groups_member_updated(self, security_groups):
LOG.info(_("Security group " LOG.info(_LI("Security group "
"member updated %r"), security_groups) "member updated %r"), security_groups)
self._security_group_updated( self._security_group_updated(
security_groups, security_groups,
'security_group_source_groups') 'security_group_source_groups')
@ -249,7 +265,7 @@ class SecurityGroupAgentRpcMixin(object):
self.refresh_firewall(devices) self.refresh_firewall(devices)
def security_groups_provider_updated(self): def security_groups_provider_updated(self):
LOG.info(_("Provider rule updated")) LOG.info(_LI("Provider rule updated"))
if self.defer_refresh_firewall: if self.defer_refresh_firewall:
# NOTE(salv-orlando): A 'global refresh' might not be # NOTE(salv-orlando): A 'global refresh' might not be
# necessary if the subnet for which the provider rules # necessary if the subnet for which the provider rules
@ -261,7 +277,7 @@ class SecurityGroupAgentRpcMixin(object):
def remove_devices_filter(self, device_ids): def remove_devices_filter(self, device_ids):
if not device_ids: if not device_ids:
return 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(): with self.firewall.defer_apply():
for device_id in device_ids: for device_id in device_ids:
device = self.firewall.ports.get(device_id) device = self.firewall.ports.get(device_id)
@ -269,12 +285,13 @@ class SecurityGroupAgentRpcMixin(object):
continue continue
self.firewall.remove_port_filter(device) self.firewall.remove_port_filter(device)
@skip_if_noopfirewall_or_firewall_disabled
def refresh_firewall(self, device_ids=None): def refresh_firewall(self, device_ids=None):
LOG.info(_("Refresh firewall rules")) LOG.info(_LI("Refresh firewall rules"))
if not device_ids: if not device_ids:
device_ids = self.firewall.ports.keys() device_ids = self.firewall.ports.keys()
if not device_ids: if not device_ids:
LOG.info(_("No ports here to refresh firewall")) LOG.info(_LI("No ports here to refresh firewall"))
return return
if self.use_enhanced_rpc: if self.use_enhanced_rpc:
devices_info = self.plugin_rpc.security_group_info_for_devices( devices_info = self.plugin_rpc.security_group_info_for_devices(

View File

@ -60,7 +60,7 @@ class DhcpRpcCallback(n_rpc.RpcCallback):
if action == 'create_port': if action == 'create_port':
return plugin.create_port(context, port) return plugin.create_port(context, port)
elif action == 'update_port': elif action == 'update_port':
return plugin.update_port(context, port['id'], port['port']) return plugin.update_port(context, port['id'], port)
else: else:
msg = _('Unrecognized action') msg = _('Unrecognized action')
raise n_exc.Invalid(message=msg) raise n_exc.Invalid(message=msg)
@ -282,13 +282,11 @@ class DhcpRpcCallback(n_rpc.RpcCallback):
def update_dhcp_port(self, context, **kwargs): def update_dhcp_port(self, context, **kwargs):
"""Update the dhcp port.""" """Update the dhcp port."""
host = kwargs.get('host') host = kwargs.get('host')
port_id = kwargs.get('port_id')
port = kwargs.get('port') port = kwargs.get('port')
port['id'] = kwargs.get('port_id')
LOG.debug(_('Update dhcp port %(port)s ' LOG.debug(_('Update dhcp port %(port)s '
'from %(host)s.'), 'from %(host)s.'),
{'port': port, {'port': port,
'host': host}) 'host': host})
plugin = manager.NeutronManager.get_plugin() plugin = manager.NeutronManager.get_plugin()
return self._port_action(plugin, context, return self._port_action(plugin, context, port, 'update_port')
{'id': port_id, 'port': port},
'update_port')

View File

@ -115,8 +115,6 @@ class DVRAgentRpcApiMixin(object):
class DVRAgentRpcCallbackMixin(object): class DVRAgentRpcCallbackMixin(object):
"""Agent-side RPC (implementation) for plugin-to-agent interaction.""" """Agent-side RPC (implementation) for plugin-to-agent interaction."""
dvr_agent = None
def dvr_mac_address_update(self, context, **kwargs): def dvr_mac_address_update(self, context, **kwargs):
"""Callback for dvr_mac_addresses update. """Callback for dvr_mac_addresses update.
@ -124,7 +122,4 @@ class DVRAgentRpcCallbackMixin(object):
""" """
dvr_macs = kwargs.get('dvr_macs', []) dvr_macs = kwargs.get('dvr_macs', [])
LOG.debug("dvr_macs updated on remote: %s", 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) self.dvr_agent.dvr_mac_address_update(dvr_macs)

View File

@ -729,11 +729,11 @@ RESOURCE_ATTRIBUTE_MAP = {
'default': True, 'default': True,
'convert_to': convert_to_boolean, 'convert_to': convert_to_boolean,
'is_visible': True}, '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, 'default': ATTR_NOT_SPECIFIED,
'validate': {'type:values': constants.IPV6_MODES}, 'validate': {'type:values': constants.IPV6_MODES},
'is_visible': True}, '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, 'default': ATTR_NOT_SPECIFIED,
'validate': {'type:values': 'validate': {'type:values':
constants.IPV6_MODES}, constants.IPV6_MODES},

View File

@ -513,6 +513,10 @@ class Controller(object):
parent_id=parent_id) parent_id=parent_id)
orig_object_copy = copy.copy(orig_obj) orig_object_copy = copy.copy(orig_obj)
orig_obj.update(body[self._resource]) 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: try:
policy.enforce(request.context, policy.enforce(request.context,
action, action,

View File

@ -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.

View File

@ -104,11 +104,7 @@ def enable_tests_from_config():
def all_tests_passed(): def all_tests_passed():
res = True return all(opt.callback() for opt in OPTS if cfg.CONF.get(opt.name))
for opt in OPTS:
if cfg.CONF.get(opt.name):
res &= opt.callback()
return res
def main(): def main():

View File

@ -101,6 +101,8 @@ core_opts = [
secret=True), secret=True),
cfg.StrOpt('nova_admin_tenant_id', cfg.StrOpt('nova_admin_tenant_id',
help=_('The uuid of the admin nova tenant')), 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', cfg.StrOpt('nova_admin_auth_url',
default='http://localhost:5000/v2.0', default='http://localhost:5000/v2.0',
help=_('Authorization URL for connecting to nova in admin ' help=_('Authorization URL for connecting to nova in admin '

View File

@ -147,3 +147,13 @@ IPV6_LLA_PREFIX = 'fe80::/64'
# Linux interface max length # Linux interface max length
DEVICE_NAME_MAX_LEN = 15 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

View File

@ -335,3 +335,7 @@ class DeviceIDNotOwnedByTenant(Conflict):
class InvalidCIDR(BadRequest): class InvalidCIDR(BadRequest):
message = _("Invalid CIDR %(input)s given as IP prefix") message = _("Invalid CIDR %(input)s given as IP prefix")
class RouterNotCompatibleWithAgent(NeutronException):
message = _("Router '%(router_id)s' is not compatible with this agent")

View File

@ -449,7 +449,14 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
msg = _('IP address %s is not a valid IP for the defined ' msg = _('IP address %s is not a valid IP for the defined '
'subnet') % fixed['ip_address'] 'subnet') % fixed['ip_address']
raise n_exc.InvalidInput(error_message=msg) 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, fixed_ip_set.append({'subnet_id': subnet_id,
'ip_address': fixed['ip_address']}) 'ip_address': fixed['ip_address']})
else: else:
@ -459,7 +466,7 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
raise n_exc.InvalidInput(error_message=msg) raise n_exc.InvalidInput(error_message=msg)
return fixed_ip_set 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.""" """Allocate IP addresses according to the configured fixed_ips."""
ips = [] ips = []
for fixed in fixed_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 # Only subnet ID is specified => need to generate IP
# from subnet # from subnet
else: else:
subnets = [self._get_subnet(context, fixed['subnet_id'])] subnet = self._get_subnet(context, fixed['subnet_id'])
# IP address allocation if (subnet['ip_version'] == 6 and
result = self._generate_ip(context, subnets) self._check_if_subnet_uses_eui64(subnet)):
ips.append({'ip_address': result['ip_address'], prefix = subnet['cidr']
'subnet_id': result['subnet_id']}) 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 return ips
def _update_ips_for_port(self, context, network_id, port_id, original_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.""" """Add or remove IPs from the port."""
ips = [] ips = []
# These ips are still on the port and haven't been removed # 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: if to_add:
LOG.debug(_("Port update. Adding %s"), 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 return ips, prev_ips
def _allocate_ips_for_port(self, context, port): 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, configured_ips = self._test_fixed_ips_for_port(context,
p["network_id"], p["network_id"],
p['fixed_ips']) p['fixed_ips'])
ips = self._allocate_fixed_ips(context, configured_ips) ips = self._allocate_fixed_ips(context,
configured_ips,
p['mac_address'])
else: else:
filter = {'network_id': [p['network_id']]} filter = {'network_id': [p['network_id']]}
subnets = self.get_subnets(context, filters=filter) 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 # subnet from the array of subnets that will be passed
# to the _generate_ip() function call, since we just # to the _generate_ip() function call, since we just
# generated an IP. # generated an IP.
mac = p['mac_address']
prefix = subnet['cidr'] prefix = subnet['cidr']
ip_address = ipv6_utils.get_ipv6_addr_by_EUI64( ip_address = ipv6_utils.get_ipv6_addr_by_EUI64(
prefix, mac) prefix, p['mac_address'])
if not self._check_unique_ip( if not self._check_unique_ip(
context, p['network_id'], context, p['network_id'],
subnet['id'], ip_address.format()): subnet['id'], ip_address.format()):
@ -740,24 +757,32 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
raise n_exc.InvalidSharedSetting(network=original.name) raise n_exc.InvalidSharedSetting(network=original.name)
def _validate_ipv6_attributes(self, subnet, cur_subnet): 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')) ra_mode_set = attributes.is_attr_set(subnet.get('ipv6_ra_mode'))
address_mode_set = attributes.is_attr_set( address_mode_set = attributes.is_attr_set(
subnet.get('ipv6_address_mode')) subnet.get('ipv6_address_mode'))
if cur_subnet: self._validate_ipv6_dhcp(ra_mode_set, address_mode_set,
ra_mode = (subnet['ipv6_ra_mode'] if ra_mode_set subnet['enable_dhcp'])
else cur_subnet['ipv6_ra_mode']) if ra_mode_set and address_mode_set:
addr_mode = (subnet['ipv6_address_mode'] if address_mode_set self._validate_ipv6_combination(subnet['ipv6_ra_mode'],
else cur_subnet['ipv6_address_mode']) subnet['ipv6_address_mode'])
if ra_mode_set or address_mode_set: if address_mode_set:
# Check that updated subnet ipv6 attributes do not conflict self._validate_eui64_applicable(subnet)
self._validate_ipv6_combination(ra_mode, addr_mode)
self._validate_ipv6_update_dhcp(subnet, cur_subnet) def _validate_eui64_applicable(self, subnet):
else: # Per RFC 4862, section 5.5.3, prefix length and interface
self._validate_ipv6_dhcp(ra_mode_set, address_mode_set, # id together should be equal to 128. Currently neutron supports
subnet['enable_dhcp']) # EUI64 interface id only, thus limiting the prefix
if ra_mode_set and address_mode_set: # length to be 64 only.
self._validate_ipv6_combination(subnet['ipv6_ra_mode'], if self._check_if_subnet_uses_eui64(subnet):
subnet['ipv6_address_mode']) 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): def _validate_ipv6_combination(self, ra_mode, address_mode):
if ra_mode != address_mode: if ra_mode != address_mode:
@ -1369,8 +1394,9 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
changed_ips = True changed_ips = True
original = self._make_port_dict(port, process_extensions=False) original = self._make_port_dict(port, process_extensions=False)
added_ips, prev_ips = self._update_ips_for_port( added_ips, prev_ips = self._update_ips_for_port(
context, port["network_id"], id, original["fixed_ips"], context, port["network_id"], id,
p['fixed_ips']) original["fixed_ips"], p['fixed_ips'],
original['mac_address'])
# Update ips if necessary # Update ips if necessary
for ip in added_ips: for ip in added_ips:

View File

@ -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.

View File

@ -162,6 +162,13 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
'enabled': firewall_rule['enabled']} 'enabled': firewall_rule['enabled']}
return self._fields(res, fields) 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): def _set_rules_for_policy(self, context, firewall_policy_db, fwp):
rule_id_list = fwp['firewall_rules'] rule_id_list = fwp['firewall_rules']
fwp_db = firewall_policy_db 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 # If we find an invalid rule in the list we
# do not perform the update since this breaks # do not perform the update since this breaks
# the integrity of this list. # the integrity of this list.
raise firewall.FirewallRuleNotFound(firewall_rule_id= raise firewall.FirewallRuleNotFound(
fwrule_id) firewall_rule_id=fwrule_id)
elif rules_dict[fwrule_id]['firewall_policy_id']: elif rules_dict[fwrule_id]['firewall_policy_id']:
if (rules_dict[fwrule_id]['firewall_policy_id'] != if (rules_dict[fwrule_id]['firewall_policy_id'] !=
fwp_db['id']): fwp_db['id']):
@ -196,6 +203,8 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
raise firewall.FirewallRuleSharingConflict( raise firewall.FirewallRuleSharingConflict(
firewall_rule_id=fwrule_id, firewall_rule_id=fwrule_id,
firewall_policy_id=fwp_db['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 # New list of rules is valid so we will first reset the existing
# list and then add each rule in order. # list and then add each rule in order.
# Note that the list could be empty in which case we interpret # 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 status = (const.CREATED
if cfg.CONF.router_distributed else const.PENDING_CREATE) if cfg.CONF.router_distributed else const.PENDING_CREATE)
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
firewall_db = Firewall(id=uuidutils.generate_uuid(), firewall_db = Firewall(
tenant_id=tenant_id, id=uuidutils.generate_uuid(),
name=fw['name'], tenant_id=tenant_id,
description=fw['description'], name=fw['name'],
firewall_policy_id= description=fw['description'],
fw['firewall_policy_id'], firewall_policy_id=fw['firewall_policy_id'],
admin_state_up=fw['admin_state_up'], admin_state_up=fw['admin_state_up'],
status=status) status=status)
context.session.add(firewall_db) context.session.add(firewall_db)
return self._make_firewall_dict(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'] fwp = firewall_policy['firewall_policy']
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
fwp_db = self._get_firewall_policy(context, id) 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 # check any existing rules are not shared
if 'shared' in fwp and 'firewall_rules' not in fwp: if 'shared' in fwp and 'firewall_rules' not in fwp:
self._check_unshared_rules_for_policy(fwp_db, 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( dst_port_min, dst_port_max = self._get_min_max_ports_from_range(
fwr['destination_port']) fwr['destination_port'])
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
fwr_db = FirewallRule(id=uuidutils.generate_uuid(), fwr_db = FirewallRule(
tenant_id=tenant_id, id=uuidutils.generate_uuid(),
name=fwr['name'], tenant_id=tenant_id,
description=fwr['description'], name=fwr['name'],
shared=fwr['shared'], description=fwr['description'],
protocol=fwr['protocol'], shared=fwr['shared'],
ip_version=fwr['ip_version'], protocol=fwr['protocol'],
source_ip_address=fwr['source_ip_address'], ip_version=fwr['ip_version'],
destination_ip_address= source_ip_address=fwr['source_ip_address'],
fwr['destination_ip_address'], destination_ip_address=fwr['destination_ip_address'],
source_port_range_min=src_port_min, source_port_range_min=src_port_min,
source_port_range_max=src_port_max, source_port_range_max=src_port_max,
destination_port_range_min=dst_port_min, destination_port_range_min=dst_port_min,
destination_port_range_max=dst_port_max, destination_port_range_max=dst_port_max,
action=fwr['action'], action=fwr['action'],
enabled=fwr['enabled']) enabled=fwr['enabled'])
context.session.add(fwr_db) context.session.add(fwr_db)
return self._make_firewall_rule_dict(fwr_db) return self._make_firewall_rule_dict(fwr_db)
def update_firewall_rule(self, context, id, firewall_rule): def update_firewall_rule(self, context, id, firewall_rule):
LOG.debug(_("update_firewall_rule() called")) LOG.debug(_("update_firewall_rule() called"))
fwr = firewall_rule['firewall_rule'] 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: if 'source_port' in fwr:
src_port_min, src_port_max = self._get_min_max_ports_from_range( src_port_min, src_port_max = self._get_min_max_ports_from_range(
fwr['source_port']) fwr['source_port'])
@ -416,7 +438,6 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
fwr['destination_port_range_max'] = dst_port_max fwr['destination_port_range_max'] = dst_port_max
del fwr['destination_port'] del fwr['destination_port']
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
fwr_db = self._get_firewall_rule(context, id)
protocol = fwr.get('protocol', fwr_db['protocol']) protocol = fwr.get('protocol', fwr_db['protocol'])
if not protocol: if not protocol:
sport = fwr.get('source_port_range_min', sport = fwr.get('source_port_range_min',
@ -427,8 +448,6 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
raise firewall.FirewallRuleWithPortWithoutProtocolInvalid() raise firewall.FirewallRuleWithPortWithoutProtocolInvalid()
fwr_db.update(fwr) fwr_db.update(fwr)
if fwr_db.firewall_policy_id: if fwr_db.firewall_policy_id:
fwp_db = self._get_firewall_policy(context,
fwr_db.firewall_policy_id)
fwp_db.audited = False fwp_db.audited = False
return self._make_firewall_rule_dict(fwr_db) return self._make_firewall_rule_dict(fwr_db)
@ -476,8 +495,10 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
insert_before = False insert_before = False
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
fwr_db = self._get_firewall_rule(context, firewall_rule_id) fwr_db = self._get_firewall_rule(context, firewall_rule_id)
fwp_db = self._get_firewall_policy(context, id)
if fwr_db.firewall_policy_id: if fwr_db.firewall_policy_id:
raise firewall.FirewallRuleInUse(firewall_rule_id=fwr_db['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 ref_firewall_rule_id:
# If reference_firewall_rule_id is set, the new rule # If reference_firewall_rule_id is set, the new rule
# is inserted depending on the value of insert_before. # is inserted depending on the value of insert_before.

View File

@ -26,6 +26,7 @@ from sqlalchemy.orm import joinedload
from sqlalchemy import sql from sqlalchemy import sql
from neutron.common import constants from neutron.common import constants
from neutron.common import rpc as n_rpc
from neutron.common import utils as n_utils from neutron.common import utils as n_utils
from neutron import context as n_ctx from neutron import context as n_ctx
from neutron.db import agents_db 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.db import model_base
from neutron.extensions import l3agentscheduler from neutron.extensions import l3agentscheduler
from neutron import manager 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 log as logging
from neutron.openstack.common import loopingcall from neutron.openstack.common import loopingcall
from neutron.openstack.common import timeutils from neutron.openstack.common import timeutils
@ -122,15 +123,28 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase,
RouterL3AgentBinding.router_id). RouterL3AgentBinding.router_id).
filter(sa.or_(l3_attrs_db.RouterExtraAttributes.ha == sql.false(), filter(sa.or_(l3_attrs_db.RouterExtraAttributes.ha == sql.false(),
l3_attrs_db.RouterExtraAttributes.ha == sql.null()))) l3_attrs_db.RouterExtraAttributes.ha == sql.null())))
try:
for binding in down_bindings: for binding in down_bindings:
LOG.warn(_LW("Rescheduling router %(router)s from agent %(agent)s " LOG.warn(_LW(
"because the agent did not report to the server in " "Rescheduling router %(router)s from agent %(agent)s "
"the last %(dead_time)s seconds."), "because the agent did not report to the server in "
{'router': binding.router_id, "the last %(dead_time)s seconds."),
'agent': binding.l3_agent_id, {'router': binding.router_id,
'dead_time': agent_dead_limit}) 'agent': binding.l3_agent_id,
self.reschedule_router(context, binding.router_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): def validate_agent_router_combination(self, context, agent, router):
"""Validate if the router can be correctly assigned to the agent. """Validate if the router can be correctly assigned to the agent.

View File

@ -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') 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): class Router(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
"""Represents a v2 neutron router.""" """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) admin_state_up = sa.Column(sa.Boolean)
gw_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id')) gw_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id'))
gw_port = orm.relationship(models_v2.Port, lazy='joined') 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): 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 # aysnchronous backend is unavailable when the floating IP is disassociated
last_known_router_id = sa.Column(sa.String(36)) last_known_router_id = sa.Column(sa.String(36))
status = sa.Column(sa.String(16)) status = sa.Column(sa.String(16))
router = orm.relationship(Router, backref='floating_ips')
class L3_NAT_dbonly_mixin(l3.RouterPluginBase): 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): def _make_router_dict(self, router, fields=None, process_extensions=True):
res = dict((key, router[key]) for key in CORE_ROUTER_ATTRS) res = dict((key, router[key]) for key in CORE_ROUTER_ATTRS)
if router['gw_port_id']: 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: else:
ext_gw_info = None ext_gw_info = None
res.update({ res.update({
@ -255,7 +284,13 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
router.gw_port = self._core_plugin._get_port(context.elevated(), router.gw_port = self._core_plugin._get_port(context.elevated(),
gw_port['id']) 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)
context.session.add(router_port)
def _validate_gw_info(self, context, gw_port, info): def _validate_gw_info(self, context, gw_port, info):
network_id = info['network_id'] if info else None network_id = info['network_id'] if info else None
@ -277,11 +312,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
raise l3.RouterExternalGatewayInUseByFloatingIp( raise l3.RouterExternalGatewayInUseByFloatingIp(
router_id=router_id, net_id=router.gw_port['network_id']) router_id=router_id, net_id=router.gw_port['network_id'])
with context.session.begin(subtransactions=True): with context.session.begin(subtransactions=True):
gw_port_id = router.gw_port['id'] gw_port = router.gw_port
router.gw_port = None router.gw_port = None
context.session.add(router) 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( 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): def _create_gw_port(self, context, router_id, router, new_network):
new_valid_gw_port_attachment = ( 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, subnets = self._core_plugin._get_subnets_by_network(context,
new_network) new_network)
for subnet in subnets: 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'], new_network, subnet['id'],
subnet['cidr']) subnet['cidr'])
self._create_router_gw_port(context, router, new_network) 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]}): admin_ctx, filters={'router_id': [router_id]}):
raise l3.RouterInUse(router_id=router_id) raise l3.RouterInUse(router_id=router_id)
device_owner = self._get_device_owner(context, router) device_owner = self._get_device_owner(context, router)
device_filter = {'device_id': [router_id], if any(rp.port_type == device_owner
'device_owner': [device_owner]} for rp in router.attached_ports.all()):
port_count = self._core_plugin.get_ports_count(
admin_ctx, filters=device_filter)
if port_count:
raise l3.RouterInUse(router_id=router_id) raise l3.RouterInUse(router_id=router_id)
return router return router
@ -331,18 +368,13 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
if vpnservice: if vpnservice:
vpnservice.check_router_in_use(context, id) 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) 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): def get_router(self, context, id, fields=None):
router = self._get_router(context, id) router = self._get_router(context, id)
return self._make_router_dict(router, fields) 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, return self._get_collection_count(context, Router,
filters=filters) 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): network_id, subnet_id, subnet_cidr):
try: 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 # It's possible these ports are on the same network, but
# different subnets. # different subnets.
new_ipnet = netaddr.IPNetwork(subnet_cidr) 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']: for ip in p['fixed_ips']:
if ip['subnet_id'] == subnet_id: if ip['subnet_id'] == subnet_id:
msg = (_("Router already has a port on subnet %s") 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) raise n_exc.BadRequest(resource='router', msg=msg)
return port_id_specified, subnet_id_specified 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): with context.session.begin(subtransactions=True):
port = self._core_plugin._get_port(context, port_id) port = self._core_plugin._get_port(context, port_id)
if port['device_id']: if port['device_id']:
@ -424,19 +454,19 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
raise n_exc.BadRequest(resource='router', msg=msg) raise n_exc.BadRequest(resource='router', msg=msg)
subnet_id = fixed_ips[0]['subnet_id'] subnet_id = fixed_ips[0]['subnet_id']
subnet = self._core_plugin._get_subnet(context, 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'], port['network_id'],
subnet['id'], subnet['id'],
subnet['cidr']) subnet['cidr'])
port.update({'device_id': router_id, 'device_owner': owner}) port.update({'device_id': router.id, 'device_owner': owner})
return port 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) subnet = self._core_plugin._get_subnet(context, subnet_id)
if not subnet['gateway_ip']: if not subnet['gateway_ip']:
msg = _('Subnet for router interface must have a gateway IP') msg = _('Subnet for router interface must have a gateway IP')
raise n_exc.BadRequest(resource='router', msg=msg) 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['network_id'],
subnet_id, subnet_id,
subnet['cidr']) subnet['cidr'])
@ -449,7 +479,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
'fixed_ips': [fixed_ip], 'fixed_ips': [fixed_ip],
'mac_address': attributes.ATTR_NOT_SPECIFIED, 'mac_address': attributes.ATTR_NOT_SPECIFIED,
'admin_state_up': True, 'admin_state_up': True,
'device_id': router_id, 'device_id': router.id,
'device_owner': owner, 'device_owner': owner,
'name': ''}}) 'name': ''}})
@ -464,18 +494,27 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
} }
def add_router_interface(self, context, router_id, interface_info): 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) add_by_port, add_by_sub = self._validate_interface_info(interface_info)
device_owner = self._get_device_owner(context, router_id) device_owner = self._get_device_owner(context, router_id)
if add_by_port: if add_by_port:
port = self._add_interface_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: elif add_by_sub:
port = self._add_interface_by_subnet( 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( 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']) port['fixed_ips'][0]['subnet_id'])
def _confirm_router_interface_not_in_use(self, context, router_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_db = self._core_plugin._get_subnet(context, subnet_id)
subnet_cidr = netaddr.IPNetwork(subnet_db['cidr']) subnet_cidr = netaddr.IPNetwork(subnet_db['cidr'])
fip_qry = context.session.query(FloatingIP) 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): for fip_db in fip_qry.filter_by(router_id=router_id):
if netaddr.IPAddress(fip_db['fixed_ip_address']) in subnet_cidr: if netaddr.IPAddress(fip_db['fixed_ip_address']) in subnet_cidr:
raise l3.RouterInterfaceInUseByFloatingIP( raise l3.RouterInterfaceInUseByFloatingIP(
@ -490,9 +533,15 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
def _remove_interface_by_port(self, context, router_id, def _remove_interface_by_port(self, context, router_id,
port_id, subnet_id, owner): port_id, subnet_id, owner):
port_db = self._core_plugin._get_port(context, port_id) qry = context.session.query(RouterPort)
if not (port_db['device_owner'] == owner and qry = qry.filter_by(
port_db['device_id'] == router_id): 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, raise l3.RouterInterfaceNotFound(router_id=router_id,
port_id=port_id) port_id=port_id)
port_subnet_id = port_db['fixed_ips'][0]['subnet_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) subnet = self._core_plugin._get_subnet(context, subnet_id)
try: try:
rport_qry = context.session.query(models_v2.Port) rport_qry = context.session.query(models_v2.Port).join(RouterPort)
ports = rport_qry.filter_by( ports = rport_qry.filter(
device_id=router_id, RouterPort.router_id == router_id,
device_owner=owner, RouterPort.port_type == owner,
network_id=subnet['network_id']) models_v2.Port.network_id == subnet['network_id']
)
for p in ports: for p in ports:
if p['fixed_ips'][0]['subnet_id'] == subnet_id: 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) return self._fields(res, fields)
def _get_interface_ports_for_network(self, context, network_id): def _get_interface_ports_for_network(self, context, network_id):
router_intf_qry = context.session.query(models_v2.Port) router_intf_qry = context.session.query(RouterPort)
return router_intf_qry.filter_by( router_intf_qry = router_intf_qry.join(models_v2.Port)
network_id=network_id, return router_intf_qry.filter(
device_owner=DEVICE_OWNER_ROUTER_INTF) models_v2.Port.network_id == network_id,
RouterPort.port_type == DEVICE_OWNER_ROUTER_INTF
)
def _get_router_for_floatingip(self, context, internal_port, def _get_router_for_floatingip(self, context, internal_port,
internal_subnet_id, internal_subnet_id,
@ -584,16 +636,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
router_intf_ports = self._get_interface_ports_for_network( router_intf_ports = self._get_interface_ports_for_network(
context, internal_port['network_id']) context, internal_port['network_id'])
for intf_p in router_intf_ports: # This joins on port_id so is not a cross-join
if intf_p['fixed_ips'][0]['subnet_id'] == internal_subnet_id: routerport_qry = router_intf_ports.join(models_v2.IPAllocation)
router_id = intf_p['device_id'] routerport_qry = routerport_qry.filter(
router_gw_qry = context.session.query(models_v2.Port) models_v2.IPAllocation.subnet_id == internal_subnet_id
has_gw_port = router_gw_qry.filter_by( )
network_id=external_network_id,
device_id=router_id, router_port = routerport_qry.first()
device_owner=DEVICE_OWNER_ROUTER_GW).count()
if has_gw_port: if router_port and router_port.router.gw_port:
return router_id return router_port.router.id
raise l3.ExternalGatewayForFloatingIPNotFound( raise l3.ExternalGatewayForFloatingIPNotFound(
subnet_id=internal_subnet_id, 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] device_owners = device_owners or [DEVICE_OWNER_ROUTER_INTF]
if not router_ids: if not router_ids:
return [] return []
filters = {'device_id': router_ids, qry = context.session.query(RouterPort)
'device_owner': device_owners} qry = qry.filter(
interfaces = self._core_plugin.get_ports(context, filters) 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: if interfaces:
self._populate_subnet_for_ports(context, interfaces) self._populate_subnet_for_ports(context, interfaces)
return interfaces return interfaces
@ -1037,10 +1096,10 @@ class L3RpcNotifierMixin(object):
self._l3_rpc_notifier = value self._l3_rpc_notifier = value
def notify_router_updated(self, context, router_id, def notify_router_updated(self, context, router_id,
operation=None, data=None): operation=None):
if router_id: if router_id:
self.l3_rpc_notifier.routers_updated( self.l3_rpc_notifier.routers_updated(
context, [router_id], operation, data) context, [router_id], operation)
def notify_routers_updated(self, context, router_ids, def notify_routers_updated(self, context, router_ids,
operation=None, data=None): 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.""" """Mixin class to add rpc notifier methods to db_base_plugin_v2."""
def update_router(self, context, id, router): 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, router_dict = super(L3_NAT_db_mixin, self).update_router(context,
id, router) id, router)
self.notify_router_updated(context, router_dict['id'], None, payload) self.notify_router_updated(context, router_dict['id'], None)
return router_dict return router_dict
def delete_router(self, context, id): 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( floatingip_dict = super(L3_NAT_db_mixin, self).create_floatingip(
context, floatingip, initial_status) context, floatingip, initial_status)
router_id = floatingip_dict['router_id'] 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 return floatingip_dict
def update_floatingip(self, context, id, floatingip): 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): def delete_floatingip(self, context, id):
router_id = self._delete_floatingip(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): def disassociate_floatingips(self, context, port_id, do_notify=True):
"""Disassociate all floating IPs linked to specific port. """Disassociate all floating IPs linked to specific port.

View File

@ -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): self, context, router_id, router_db, data, gw_info):
"""Update the model to support the dvr case of a router.""" """Update the model to support the dvr case of a router."""
if not attributes.is_attr_set(gw_info) and data.get('distributed'): if not attributes.is_attr_set(gw_info) and data.get('distributed'):
admin_ctx = context.elevated() old_owner = l3_const.DEVICE_OWNER_ROUTER_INTF
filters = {'device_id': [router_id], new_owner = DEVICE_OWNER_DVR_INTERFACE
'device_owner': [l3_const.DEVICE_OWNER_ROUTER_INTF]} for rp in router_db.attached_ports.filter_by(port_type=old_owner):
ports = self._core_plugin.get_ports(admin_ctx, filters=filters) rp.port_type = new_owner
for p in ports: rp.port.device_owner = new_owner
port_db = self._core_plugin._get_port(admin_ctx, p['id'])
port_db.update({'device_owner': DEVICE_OWNER_DVR_INTERFACE})
def _update_router_db(self, context, router_id, data, gw_info): def _update_router_db(self, context, router_id, data, gw_info):
with context.session.begin(subtransactions=True): 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) router, new_network)
if router.extra_attributes.distributed and router.gw_port: if router.extra_attributes.distributed and router.gw_port:
snat_p_list = self.create_snat_intf_ports_if_not_exists( snat_p_list = self.create_snat_intf_ports_if_not_exists(
context.elevated(), router['id']) context.elevated(), router)
if not snat_p_list: if not snat_p_list:
LOG.debug("SNAT interface ports not created: %s", 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) self)._get_device_owner(context, router)
def _get_interface_ports_for_network(self, context, network_id): def _get_interface_ports_for_network(self, context, network_id):
router_intf_qry = (context.session.query(models_v2.Port). router_intf_qry = context.session.query(l3_db.RouterPort)
filter_by(network_id=network_id)) router_intf_qry = router_intf_qry.join(models_v2.Port)
return (router_intf_qry.
filter(models_v2.Port.device_owner.in_( return router_intf_qry.filter(
[l3_const.DEVICE_OWNER_ROUTER_INTF, models_v2.Port.network_id == network_id,
DEVICE_OWNER_DVR_INTERFACE]))) 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): def _update_fip_assoc(self, context, fip, floatingip_db, external_port):
previous_router_id = floatingip_db.router_id 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: if add_by_port:
port = self._add_interface_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: elif add_by_sub:
port = self._add_interface_by_subnet( 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: if router.extra_attributes.distributed and router.gw_port:
self.add_csnat_router_interface_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']) port['fixed_ips'][0]['subnet_id'])
router_interface_info = self._make_router_interface_info( 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.""" """Query router interfaces that relate to list of router_ids."""
if not router_ids: if not router_ids:
return [] return []
filters = {'device_id': router_ids, qry = context.session.query(l3_db.RouterPort)
'device_owner': [DEVICE_OWNER_DVR_SNAT]} qry = qry.filter(
interfaces = self._core_plugin.get_ports(context, filters) 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) LOG.debug("Return the SNAT ports: %s", interfaces)
if interfaces: if interfaces:
self._populate_subnet_for_ports(context, 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( floating_ip['host'] = self.get_vm_port_hostid(
context, floating_ip['port_id']) context, floating_ip['port_id'])
LOG.debug("Floating IP host: %s", floating_ip['host']) 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( fip_agent = self._get_agent_by_type_and_host(
context, l3_const.AGENT_TYPE_L3, context, l3_const.AGENT_TYPE_L3,
floating_ip['host']) 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): def get_snat_interface_ports_for_router(self, context, router_id):
"""Return all existing snat_router_interface ports.""" """Return all existing snat_router_interface ports."""
filters = {'device_id': [router_id], # TODO(markmcclain): This is suboptimal but was left to reduce
'device_owner': [DEVICE_OWNER_DVR_SNAT]} # changeset size since it is late in cycle
return self._core_plugin.get_ports(context, filters) 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( 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.""" """Add SNAT interface to the specified router and subnet."""
snat_port = self._core_plugin.create_port( snat_port = self._core_plugin.create_port(
context, context,
@ -457,19 +483,27 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
'network_id': network_id, 'network_id': network_id,
'mac_address': attributes.ATTR_NOT_SPECIFIED, 'mac_address': attributes.ATTR_NOT_SPECIFIED,
'fixed_ips': [{'subnet_id': subnet_id}], 'fixed_ips': [{'subnet_id': subnet_id}],
'device_id': router_id, 'device_id': router.id,
'device_owner': DEVICE_OWNER_DVR_SNAT, 'device_owner': DEVICE_OWNER_DVR_SNAT,
'admin_state_up': True, 'admin_state_up': True,
'name': ''}}) 'name': ''}})
if not snat_port: if not snat_port:
msg = _("Unable to create the SNAT Interface Port") msg = _("Unable to create the SNAT Interface Port")
raise n_exc.BadRequest(resource='router', msg=msg) 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 self._populate_subnet_for_ports(context, [snat_port])
return snat_port return snat_port
def create_snat_intf_ports_if_not_exists( def create_snat_intf_ports_if_not_exists(self, context, router):
self, context, router_id):
"""Function to return the snat interface port list. """Function to return the snat interface port list.
This function will 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. new ports and then return the list.
""" """
port_list = self.get_snat_interface_ports_for_router( port_list = self.get_snat_interface_ports_for_router(
context, router_id) context, router.id)
if port_list: if port_list:
self._populate_subnet_for_ports(context, port_list) self._populate_subnet_for_ports(context, port_list)
return port_list return port_list
port_list = [] port_list = []
filters = {
'device_id': [router_id], int_ports = (
'device_owner': [DEVICE_OWNER_DVR_INTERFACE]} rp.port for rp in
int_ports = self._core_plugin.get_ports(context, filters) router.attached_ports.filter_by(
port_type=DEVICE_OWNER_DVR_INTERFACE
)
)
LOG.info(_('SNAT interface port list does not exist,' LOG.info(_('SNAT interface port list does not exist,'
' so create one: %s'), port_list) ' so create one: %s'), port_list)
for intf in int_ports: 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 # Passing the subnet for the port to make sure the IP's
# are assigned on the right subnet if multiple subnet # are assigned on the right subnet if multiple subnet
# exists # exists
snat_port = self.add_csnat_router_interface_port( 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) intf['fixed_ips'][0]['subnet_id'], do_pop=False)
port_list.append(snat_port) port_list.append(snat_port)
if port_list: if port_list:
self._populate_subnet_for_ports(context, port_list) self._populate_subnet_for_ports(context, port_list)
return 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. """Notify the L3 agent of VM ARP table changes.
Provide the details of the VM ARP to the L3 agent when Provide the details of the VM ARP to the L3 agent when
a Nova instance gets created or deleted. a Nova instance gets created or deleted.
""" """
port_dict = self._core_plugin._get_port(context, port_id)
# Check this is a valid VM port # Check this is a valid VM port
if ("compute:" not in port_dict['device_owner'] or if ("compute:" not in port_dict['device_owner'] or
not port_dict['fixed_ips']): 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 # Each csnat router interface port is associated
# with a subnet, so we need to pass the subnet id to # with a subnet, so we need to pass the subnet id to
# delete the right ports. # delete the right ports.
device_filter = {
'device_id': [router['id']], # TODO(markmcclain): This is suboptimal but was left to reduce
'device_owner': [DEVICE_OWNER_DVR_SNAT]} # 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( c_snat_ports = self._core_plugin.get_ports(
context, filters=device_filter) context,
filters={'id': ports}
)
for p in c_snat_ports: for p in c_snat_ports:
if subnet_id is None: if subnet_id is None:
self._core_plugin.delete_port(context, self._core_plugin.delete_port(context,

View File

@ -110,7 +110,7 @@ class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin):
break break
LOG.debug('DVR: dvr_update_router_addvm %s ', router_id) 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.""" """Gets the dvr routers on vmport subnets."""
router_ids = set() router_ids = set()
port_dict = self._core_plugin.get_port(context, port_id) 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 True
return False return False
def dvr_deletens_if_no_vm(self, context, port_id): def dvr_deletens_if_no_port(self, context, port_id):
"""Delete the DVR namespace if no VM exists.""" """Delete the DVR namespace if no dvr serviced port exists."""
router_ids = self.get_dvr_routers_by_vmportid(context, port_id) router_ids = self.get_dvr_routers_by_portid(context, port_id)
port_host = ml2_db.get_port_binding_host(port_id) port_host = ml2_db.get_port_binding_host(port_id)
if not router_ids: if not router_ids:
LOG.debug('No namespaces available for this DVR port %(port)s ' 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 = [] removed_router_info = []
for router_id in router_ids: for router_id in router_ids:
subnet_ids = self.get_subnet_ids_on_router(context, router_id) 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: for subnet in subnet_ids:
if self.check_ports_active_on_host_and_subnet(context, if self.check_ports_active_on_host_and_subnet(context,
port_host, port_host,
port_id, port_id,
subnet): subnet):
vm_exists_on_subnet = True port_exists_on_subnet = True
break break
if vm_exists_on_subnet: if port_exists_on_subnet:
continue continue
filter_rtr = {'device_id': [router_id], filter_rtr = {'device_id': [router_id],
'device_owner': 'device_owner':

View File

@ -43,7 +43,13 @@ class L3_NAT_dbonly_mixin(l3_db.L3_NAT_dbonly_mixin):
nw_id = router_db.gw_port['network_id'] nw_id = router_db.gw_port['network_id']
router_res[EXTERNAL_GW_INFO] = { router_res[EXTERNAL_GW_INFO] = {
'network_id': nw_id, '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): def _update_router_gw_info(self, context, router_id, info, router=None):
# Load the router only if necessary # Load the router only if necessary

View File

@ -333,18 +333,19 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin):
ha = cfg.CONF.l3_ha ha = cfg.CONF.l3_ha
return ha return ha
def _create_router_db(self, context, router, tenant_id): def create_router(self, context, router):
router['ha'] = self._is_ha(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() raise l3_ha.DistributedHARouterNotSupported()
with context.session.begin(subtransactions=True): router['router']['ha'] = is_ha
router_db = super(L3_HA_NAT_db_mixin, self)._create_router_db( router_dict = super(L3_HA_NAT_db_mixin,
context, router, tenant_id) self).create_router(context, router)
if router['ha']: if is_ha:
try: try:
router_db = self._get_router(context, router_dict['id'])
ha_network = self.get_ha_network(context, ha_network = self.get_ha_network(context,
router_db.tenant_id) router_db.tenant_id)
if not ha_network: 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) self._notify_ha_interfaces_updated(context, router_db.id)
except Exception: except Exception:
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
self.delete_router(context, router_db.id) self.delete_router(context, router_dict['id'])
router_dict['ha_vr_id'] = router_db.extra_attributes.ha_vr_id
return router_db return router_dict
def _update_router_db(self, context, router_id, data, gw_info): def _update_router_db(self, context, router_id, data, gw_info):
ha = data.pop('ha', None) ha = data.pop('ha', None)

View File

@ -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.

View File

@ -1,13 +0,0 @@
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
#
# 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.

View File

@ -158,8 +158,8 @@ class MeteringDbMixin(metering.MeteringPluginBase,
cidrs = [r['remote_ip_prefix'] for r in r_ips] cidrs = [r['remote_ip_prefix'] for r in r_ips]
new_cidr_ipset = netaddr.IPSet([remote_ip_prefix]) new_cidr_ipset = netaddr.IPSet([remote_ip_prefix])
if (netaddr.IPSet(cidrs) & new_cidr_ipset): if (netaddr.IPSet(cidrs) & new_cidr_ipset):
raise metering.MeteringLabelRuleOverlaps(remote_ip_prefix= raise metering.MeteringLabelRuleOverlaps(
remote_ip_prefix) remote_ip_prefix=remote_ip_prefix)
def create_metering_label_rule(self, context, metering_label_rule): def create_metering_label_rule(self, context, metering_label_rule):
m = metering_label_rule['metering_label_rule'] m = metering_label_rule['metering_label_rule']

View File

@ -100,6 +100,7 @@ def run_migrations_online():
context.run_migrations() context.run_migrations()
finally: finally:
connection.close() connection.close()
engine.dispose()
if context.is_offline_mode(): if context.is_offline_mode():

View File

@ -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')

View File

@ -27,6 +27,7 @@ down_revision = '37f322991f59'
from alembic import op from alembic import op
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy.engine import reflection
TABLE_NAME = 'routerl3agentbindings' TABLE_NAME = 'routerl3agentbindings'
PK_NAME = 'pk_routerl3agentbindings' PK_NAME = 'pk_routerl3agentbindings'
@ -49,7 +50,7 @@ def upgrade():
# and all the duplicate records which violate the PK # and all the duplicate records which violate the PK
# constraint need to be removed. # constraint need to be removed.
context = op.get_context() 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 (' op.execute('DELETE FROM %(table)s WHERE id in ('
'SELECT %(table)s.id FROM %(table)s LEFT OUTER JOIN ' 'SELECT %(table)s.id FROM %(table)s LEFT OUTER JOIN '
'(SELECT MIN(id) as id, router_id, l3_agent_id ' '(SELECT MIN(id) as id, router_id, l3_agent_id '
@ -65,6 +66,19 @@ def upgrade():
op.drop_column(TABLE_NAME, 'id') 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( op.create_primary_key(
name=PK_NAME, name=PK_NAME,
table_name=TABLE_NAME, table_name=TABLE_NAME,
@ -79,16 +93,32 @@ def downgrade():
# Drop the existed foreign key constraints # Drop the existed foreign key constraints
# In order to perform primary key changes # In order to perform primary key changes
op.drop_constraint( db2fks = {}
name=fk_names[dialect]['l3_agent_id'], if dialect == 'ibm_db_sa':
table_name=TABLE_NAME, # NOTE(mriedem): In DB2 the foreign key names are randomly generated
type_='foreignkey' # if you didn't originally explicitly name them, so the name is like
) # SQLxxxxx where the suffix is a random integer. Therefore we go
op.drop_constraint( # through and just drop all of the foreign keys and save them so we
name=fk_names[dialect]['router_id'], # can re-create them later after the primary key is dropped.
table_name=TABLE_NAME, inspector = reflection.Inspector.from_engine(op.get_bind().engine)
type_='foreignkey' 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( op.drop_constraint(
name=PK_NAME, name=PK_NAME,
@ -101,27 +131,46 @@ def downgrade():
sa.Column('id', sa.String(32)) sa.Column('id', sa.String(32))
) )
# Restore the foreign key constraints if dialect == 'ibm_db_sa':
op.create_foreign_key( # DB2 doesn't support nullable column in primary key
name=fk_names[dialect]['router_id'], op.alter_column(
source=TABLE_NAME, table_name=TABLE_NAME,
referent='routers', column_name='id',
local_cols=['router_id'], nullable=False
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'
)
op.create_primary_key( op.create_primary_key(
name=PK_NAME, name=PK_NAME,
table_name=TABLE_NAME, table_name=TABLE_NAME,
cols=['id'] 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'
)

View File

@ -29,6 +29,7 @@ import sqlalchemy as sa
def upgrade(): def upgrade():
context = op.get_context()
op.create_table( op.create_table(
'router_extra_attributes', 'router_extra_attributes',
sa.Column('router_id', sa.String(length=36), nullable=False), sa.Column('router_id', sa.String(length=36), nullable=False),
@ -38,8 +39,15 @@ def upgrade():
['router_id'], ['routers.id'], ondelete='CASCADE'), ['router_id'], ['routers.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('router_id') sa.PrimaryKeyConstraint('router_id')
) )
op.execute("INSERT INTO router_extra_attributes SELECT id as router_id, " if context.bind.dialect.name == 'ibm_db_sa':
"False as distributed from routers") # 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(): def downgrade():

View File

@ -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'
)

View File

@ -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')

View File

@ -38,6 +38,13 @@ def _migrate_data(old_table, new_table):
"FROM %(old_table)s old_t " "FROM %(old_table)s old_t "
"WHERE new_t.router_id = old_t.router_id") % "WHERE new_t.router_id = old_t.router_id") %
{'new_table': new_table, 'old_table': old_table}) {'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: else:
op.execute(("UPDATE %(new_table)s new_t " op.execute(("UPDATE %(new_table)s new_t "
"INNER JOIN %(old_table)s as old_t " "INNER JOIN %(old_table)s as old_t "

View File

@ -1 +1 @@
1680e1f0c4dc 1f71e54a85e7

View File

@ -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

View File

@ -159,12 +159,16 @@ command_opt = cfg.SubCommandOpt('command',
CONF.register_cli_opt(command_opt) CONF.register_cli_opt(command_opt)
def main(): def get_alembic_config():
config = alembic_config.Config( config = alembic_config.Config(os.path.join(os.path.dirname(__file__),
os.path.join(os.path.dirname(__file__), 'alembic.ini') 'alembic.ini'))
)
config.set_main_option('script_location', config.set_main_option('script_location',
'neutron.db.migration:alembic_migrations') 'neutron.db.migration:alembic_migrations')
return config
def main():
config = get_alembic_config()
# attach the Neutron conf to the Alembic conf # attach the Neutron conf to the Alembic conf
config.neutron_config = CONF config.neutron_config = CONF

View File

@ -75,9 +75,10 @@ OPENVSWITCH = 'openvswitch'
# Releases # Releases
ICEHOUSE = 'icehouse' ICEHOUSE = 'icehouse'
JUNO = 'juno'
SUPPORTED_SCHEMA_VERSIONS = [ICEHOUSE] SUPPORTED_SCHEMA_VERSIONS = [ICEHOUSE, JUNO]
def check_db_schema_version(engine, metadata): def check_db_schema_version(engine, metadata):
@ -115,7 +116,7 @@ def interpret_vlan_id(vlan_id):
return (p_const.TYPE_VLAN, 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, def __init__(self, vif_type, driver_type, segment_table_name,
vlan_allocation_table_name, old_tables): vlan_allocation_table_name, old_tables):
@ -131,7 +132,8 @@ class BaseMigrateToMl2_Icehouse(object):
metadata = sa.MetaData() metadata = sa.MetaData()
check_db_schema_version(engine, 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 # Autoload the ports table to ensure that foreign keys to it and
# the network table can be created for the new tables. # 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_vlan_allocations(engine)
self.migrate_port_bindings(engine, metadata) 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): def migrate_segment_dict(self, binding):
binding['id'] = uuidutils.generate_uuid() binding['id'] = uuidutils.generate_uuid()
@ -210,6 +213,13 @@ class BaseMigrateToMl2_Icehouse(object):
ml2_port_bindings = metadata.tables['ml2_port_bindings'] ml2_port_bindings = metadata.tables['ml2_port_bindings']
engine.execute(ml2_port_bindings.insert(), ml2_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): def drop_old_tables(self, engine, save_tables=False):
if save_tables: if save_tables:
return return
@ -351,10 +361,10 @@ class BaseMigrateToMl2_Icehouse(object):
) )
class MigrateLinuxBridgeToMl2_Icehouse(BaseMigrateToMl2_Icehouse): class MigrateLinuxBridgeToMl2_Juno(BaseMigrateToMl2):
def __init__(self): def __init__(self):
super(MigrateLinuxBridgeToMl2_Icehouse, self).__init__( super(MigrateLinuxBridgeToMl2_Juno, self).__init__(
vif_type=portbindings.VIF_TYPE_BRIDGE, vif_type=portbindings.VIF_TYPE_BRIDGE,
driver_type=LINUXBRIDGE, driver_type=LINUXBRIDGE,
segment_table_name='network_bindings', segment_table_name='network_bindings',
@ -362,7 +372,7 @@ class MigrateLinuxBridgeToMl2_Icehouse(BaseMigrateToMl2_Icehouse):
old_tables=['portbindingports']) old_tables=['portbindingports'])
def migrate_segment_dict(self, binding): def migrate_segment_dict(self, binding):
super(MigrateLinuxBridgeToMl2_Icehouse, self).migrate_segment_dict( super(MigrateLinuxBridgeToMl2_Juno, self).migrate_segment_dict(
binding) binding)
vlan_id = binding.pop('vlan_id') vlan_id = binding.pop('vlan_id')
network_type, segmentation_id = interpret_vlan_id(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 binding['segmentation_id'] = segmentation_id
class MigrateOpenvswitchToMl2_Icehouse(BaseMigrateToMl2_Icehouse): class MigrateOpenvswitchToMl2_Juno(BaseMigrateToMl2):
def __init__(self): def __init__(self):
super(MigrateOpenvswitchToMl2_Icehouse, self).__init__( super(MigrateOpenvswitchToMl2_Juno, self).__init__(
vif_type=portbindings.VIF_TYPE_OVS, vif_type=portbindings.VIF_TYPE_OVS,
driver_type=OPENVSWITCH, driver_type=OPENVSWITCH,
segment_table_name='ovs_network_bindings', segment_table_name='ovs_network_bindings',
@ -415,11 +425,25 @@ class MigrateOpenvswitchToMl2_Icehouse(BaseMigrateToMl2_Icehouse):
raise ValueError(_('Unknown tunnel type: %s') % tunnel_type) 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 = { migrate_map = {
ICEHOUSE: { ICEHOUSE: {
OPENVSWITCH: MigrateOpenvswitchToMl2_Icehouse, OPENVSWITCH: MigrateOpenvswitchToMl2_Icehouse,
LINUXBRIDGE: MigrateLinuxBridgeToMl2_Icehouse, LINUXBRIDGE: MigrateLinuxBridgeToMl2_Icehouse,
}, },
JUNO: {
OPENVSWITCH: MigrateOpenvswitchToMl2_Juno,
LINUXBRIDGE: MigrateLinuxBridgeToMl2_Juno,
},
} }
@ -436,7 +460,7 @@ def main():
OPENVSWITCH) OPENVSWITCH)
parser.add_argument('--vxlan-udp-port', default=None, type=int, parser.add_argument('--vxlan-udp-port', default=None, type=int,
help=_('The UDP port to use for VXLAN tunnels.')) 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', parser.add_argument('--save-tables', default=False, action='store_true',
help=_("Retain the old plugin's tables")) help=_("Retain the old plugin's tables"))
#TODO(marun) Provide a verbose option #TODO(marun) Provide a verbose option

View File

@ -63,6 +63,13 @@ class IPAvailabilityRange(model_base.BASEV2):
primary_key=True) primary_key=True)
first_ip = sa.Column(sa.String(64), nullable=False, 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) 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): def __repr__(self):
return "%s - %s" % (self.first_ip, self.last_ip) 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()) enable_dhcp = sa.Column(sa.Boolean())
dns_nameservers = orm.relationship(DNSNameServer, dns_nameservers = orm.relationship(DNSNameServer,
backref='subnet', backref='subnet',
cascade='all, delete, delete-orphan') cascade='all, delete, delete-orphan',
lazy='joined')
routes = orm.relationship(SubnetRoute, routes = orm.relationship(SubnetRoute,
backref='subnet', backref='subnet',
cascade='all, delete, delete-orphan') cascade='all, delete, delete-orphan',
lazy='joined')
shared = sa.Column(sa.Boolean) shared = sa.Column(sa.Boolean)
ipv6_ra_mode = sa.Column(sa.Enum(constants.IPV6_SLAAC, ipv6_ra_mode = sa.Column(sa.Enum(constants.IPV6_SLAAC,
constants.DHCPV6_STATEFUL, constants.DHCPV6_STATEFUL,

View File

@ -147,7 +147,12 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
# because all the unit tests do not explicitly set the context on # because all the unit tests do not explicitly set the context on
# GETS. TODO(arosen) context handling can probably be improved here. # GETS. TODO(arosen) context handling can probably be improved here.
if not default_sg and context.tenant_id: 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_obj = self._get_marker_obj(context, 'security_group', limit,
marker) marker)
return self._get_collection(context, return self._get_collection(context,
@ -518,9 +523,13 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
return return
port_sg = p.get(ext_sg.SECURITYGROUPS, []) 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 valid_groups = set(g['id'] for g in
self.get_security_groups(context, fields=['id'], self.get_security_groups(context, fields=['id'],
filters={'id': port_sg})) filters=filters))
requested_groups = set(port_sg) requested_groups = set(port_sg)
port_sg_missing = requested_groups - valid_groups port_sg_missing = requested_groups - valid_groups

View File

@ -19,6 +19,7 @@ from sqlalchemy.orm import exc
from neutron.common import constants as q_const from neutron.common import constants as q_const
from neutron.common import ipv6_utils as ipv6 from neutron.common import ipv6_utils as ipv6
from neutron.common import utils from neutron.common import utils
from neutron.db import allowedaddresspairs_db as addr_pair
from neutron.db import models_v2 from neutron.db import models_v2
from neutron.db import securitygroups_db as sg_db from neutron.db import securitygroups_db as sg_db
from neutron.extensions import securitygroup as ext_sg from neutron.extensions import securitygroup as ext_sg
@ -153,8 +154,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
'sg_member_ips': {}} 'sg_member_ips': {}}
rules_in_db = self._select_rules_for_ports(context, ports) rules_in_db = self._select_rules_for_ports(context, ports)
remote_security_group_info = {} remote_security_group_info = {}
for (binding, rule_in_db) in rules_in_db: for (port_id, rule_in_db) in rules_in_db:
port_id = binding['port_id']
remote_gid = rule_in_db.get('remote_group_id') remote_gid = rule_in_db.get('remote_group_id')
security_group_id = rule_in_db.get('security_group_id') security_group_id = rule_in_db.get('security_group_id')
ethertype = rule_in_db['ethertype'] ethertype = rule_in_db['ethertype']
@ -206,7 +206,8 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
for sg_id, member_ips in ips.items(): for sg_id, member_ips in ips.items():
for ip in member_ips: for ip in member_ips:
ethertype = 'IPv%d' % netaddr.IPAddress(ip).version 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) sg_info['sg_member_ips'][sg_id][ethertype].append(ip)
return sg_info return sg_info
@ -218,7 +219,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
sgr_sgid = sg_db.SecurityGroupRule.security_group_id 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) sg_db.SecurityGroupRule)
query = query.join(sg_db.SecurityGroupRule, query = query.join(sg_db.SecurityGroupRule,
sgr_sgid == sg_binding_sgid) sgr_sgid == sg_binding_sgid)
@ -230,27 +231,32 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
if not remote_group_ids: if not remote_group_ids:
return ips_by_group return ips_by_group
for remote_group_id in remote_group_ids: 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 ip_port = models_v2.IPAllocation.port_id
sg_binding_port = sg_db.SecurityGroupPortBinding.port_id sg_binding_port = sg_db.SecurityGroupPortBinding.port_id
sg_binding_sgid = sg_db.SecurityGroupPortBinding.security_group_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, 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, query = query.join(models_v2.IPAllocation,
ip_port == sg_binding_port) ip_port == sg_binding_port)
query = query.join(models_v2.Port, # Outerjoin because address pairs may be null and we still want the
ip_port == models_v2.Port.id) # 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)) query = query.filter(sg_binding_sgid.in_(remote_group_ids))
for security_group_id, port, ip_address in query: # Each allowed address pair IP record for a port beyond the 1st
ips_by_group[security_group_id].append(ip_address) # will have a duplicate regular IP in the query response since
# if there are allowed_address_pairs add them # the relationship is 1-to-many. Dedup with a set
if getattr(port, 'allowed_address_pairs', None): for security_group_id, ip_address, allowed_addr_ip in query:
for address_pair in port.allowed_address_pairs: ips_by_group[security_group_id].add(ip_address)
ips_by_group[security_group_id].append( if allowed_addr_ip:
address_pair['ip_address']) ips_by_group[security_group_id].add(allowed_addr_ip)
return ips_by_group return ips_by_group
def _select_remote_group_ids(self, ports): 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): def _select_dhcp_ips_for_network_ids(self, context, network_ids):
if not network_ids: if not network_ids:
return {} 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) models_v2.IPAllocation.ip_address)
query = query.join(models_v2.IPAllocation) query = query.join(models_v2.IPAllocation)
query = query.filter(models_v2.Port.network_id.in_(network_ids)) 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: for network_id in network_ids:
ips[network_id] = [] ips[network_id] = []
for port, ip in query: for mac_address, network_id, ip in query:
if (netaddr.IPAddress(ip).version == 6 if (netaddr.IPAddress(ip).version == 6
and not netaddr.IPAddress(ip).is_link_local()): 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, ip = str(ipv6.get_ipv6_addr_by_EUI64(q_const.IPV6_LLA_PREFIX,
mac_address)) mac_address))
if ip not in ips[port['network_id']]: if ip not in ips[network_id]:
ips[port['network_id']].append(ip) ips[network_id].append(ip)
return ips return ips
@ -329,7 +335,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
return ips return ips
def _get_lla_gateway_ip_for_subnet(self, context, subnet): 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.join(models_v2.IPAllocation)
query = query.filter( query = query.filter(
models_v2.IPAllocation.subnet_id == subnet['id']) models_v2.IPAllocation.subnet_id == subnet['id'])
@ -338,12 +344,11 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
query = query.filter(models_v2.Port.device_owner == query = query.filter(models_v2.Port.device_owner ==
q_const.DEVICE_OWNER_ROUTER_INTF) q_const.DEVICE_OWNER_ROUTER_INTF)
try: try:
gateway_port = query.one() mac_address = query.one()[0]
except (exc.NoResultFound, exc.MultipleResultsFound): except (exc.NoResultFound, exc.MultipleResultsFound):
LOG.warn(_('No valid gateway port on subnet %s is ' LOG.warn(_('No valid gateway port on subnet %s is '
'found for IPv6 RA'), subnet['id']) 'found for IPv6 RA'), subnet['id'])
return return
mac_address = gateway_port['mac_address']
lla_ip = str(ipv6.get_ipv6_addr_by_EUI64( lla_ip = str(ipv6.get_ipv6_addr_by_EUI64(
q_const.IPV6_LLA_PREFIX, q_const.IPV6_LLA_PREFIX,
mac_address)) mac_address))
@ -416,8 +421,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
def security_group_rules_for_ports(self, context, ports): def security_group_rules_for_ports(self, context, ports):
rules_in_db = self._select_rules_for_ports(context, ports) rules_in_db = self._select_rules_for_ports(context, ports)
for (binding, rule_in_db) in rules_in_db: for (port_id, rule_in_db) in rules_in_db:
port_id = binding['port_id']
port = ports[port_id] port = ports[port_id]
direction = rule_in_db['direction'] direction = rule_in_db['direction']
rule_dict = { rule_dict = {

View File

@ -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.

View File

@ -28,6 +28,7 @@ from neutron.db.vpn import vpn_validator
from neutron.extensions import vpnaas from neutron.extensions import vpnaas
from neutron import manager from neutron import manager
from neutron.openstack.common import excutils 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 log as logging
from neutron.openstack.common import uuidutils from neutron.openstack.common import uuidutils
from neutron.plugins.common import constants from neutron.plugins.common import constants
@ -601,6 +602,16 @@ class VPNPluginDb(vpnaas.VPNPluginBase, base_db.CommonDbMixin):
router_id=router_id, router_id=router_id,
vpnservice_id=vpnservices[0]['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(): class VPNPluginRpcDbMixin():
def _get_agent_hosting_vpn_services(self, context, host): def _get_agent_hosting_vpn_services(self, context, host):
@ -646,7 +657,7 @@ class VPNPluginRpcDbMixin():
vpnservice_db = self._get_vpnservice( vpnservice_db = self._get_vpnservice(
context, vpnservice['id']) context, vpnservice['id'])
except vpnaas.VPNServiceNotFound: except vpnaas.VPNServiceNotFound:
LOG.warn(_('vpnservice %s in db is already deleted'), LOG.warn(_LW('vpnservice %s in db is already deleted'),
vpnservice['id']) vpnservice['id'])
continue continue

View File

@ -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.

View File

@ -127,6 +127,19 @@ class FirewallInternalDriverError(qexception.NeutronException):
message = _("%(driver)s: Internal driver error.") 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_protocol_values = [None, constants.TCP, constants.UDP, constants.ICMP]
fw_valid_action_values = [constants.FWAAS_ALLOW, constants.FWAAS_DENY] fw_valid_action_values = [constants.FWAAS_ALLOW, constants.FWAAS_DENY]
@ -139,15 +152,15 @@ def convert_protocol(value):
if 0 <= val <= 255: if 0 <= val <= 255:
return val return val
else: else:
raise FirewallRuleInvalidProtocol(protocol=value, raise FirewallRuleInvalidProtocol(
values= protocol=value,
fw_valid_protocol_values) values=fw_valid_protocol_values)
elif value.lower() in fw_valid_protocol_values: elif value.lower() in fw_valid_protocol_values:
return value.lower() return value.lower()
else: else:
raise FirewallRuleInvalidProtocol(protocol=value, raise FirewallRuleInvalidProtocol(
values= protocol=value,
fw_valid_protocol_values) values=fw_valid_protocol_values)
def convert_action_to_case_insensitive(value): def convert_action_to_case_insensitive(value):

View File

@ -100,7 +100,20 @@ RESOURCE_ATTRIBUTE_MAP = {
'is_visible': True}, 'is_visible': True},
EXTERNAL_GW_INFO: {'allow_post': True, 'allow_put': True, EXTERNAL_GW_INFO: {'allow_post': True, 'allow_put': True,
'is_visible': True, 'default': None, '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': { 'floatingips': {
'id': {'allow_post': False, 'allow_put': False, 'id': {'allow_post': False, 'allow_put': False,
@ -174,6 +187,7 @@ class L3(extensions.ExtensionDescriptor):
"""Returns Ext Resources.""" """Returns Ext Resources."""
plural_mappings = resource_helper.build_plural_mappings( plural_mappings = resource_helper.build_plural_mappings(
{}, RESOURCE_ATTRIBUTE_MAP) {}, RESOURCE_ATTRIBUTE_MAP)
plural_mappings['external_fixed_ips'] = 'external_fixed_ip'
attr.PLURALS.update(plural_mappings) attr.PLURALS.update(plural_mappings)
action_map = {'router': {'add_router_interface': 'PUT', action_map = {'router': {'add_router_interface': 'PUT',
'remove_router_interface': 'PUT'}} 'remove_router_interface': 'PUT'}}

View File

@ -29,7 +29,13 @@ EXTENDED_ATTRIBUTES_2_0 = {
{'type:dict_or_nodata': {'type:dict_or_nodata':
{'network_id': {'type:uuid': None, 'required': True}, {'network_id': {'type:uuid': None, 'required': True},
'enable_snat': {'type:boolean': None, 'required': False, '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}
}
}}}} }}}}

View File

@ -21,7 +21,7 @@ from neutron.common import exceptions
HA_INFO = 'ha' HA_INFO = 'ha'
EXTENDED_ATTRIBUTES_2_0 = { EXTENDED_ATTRIBUTES_2_0 = {
'routers': { '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, 'default': attributes.ATTR_NOT_SPECIFIED, 'is_visible': True,
'enforce_policy': True, 'enforce_policy': True,
'convert_to': attributes.convert_to_boolean_if_not_none} 'convert_to': attributes.convert_to_boolean_if_not_none}

View File

@ -13,8 +13,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import sys
from oslo.config import cfg from oslo.config import cfg
import webob import webob
@ -22,6 +20,7 @@ from neutron.api import extensions
from neutron.api.v2 import attributes from neutron.api.v2 import attributes
from neutron.api.v2 import base from neutron.api.v2 import base
from neutron.api.v2 import resource from neutron.api.v2 import resource
from neutron.common import constants as const
from neutron.common import exceptions as n_exc from neutron.common import exceptions as n_exc
from neutron import manager from neutron import manager
from neutron.openstack.common import importutils from neutron.openstack.common import importutils
@ -55,7 +54,7 @@ class QuotaSetsController(wsgi.Controller):
'allow_post': False, 'allow_post': False,
'allow_put': True, 'allow_put': True,
'convert_to': attributes.convert_to_int, 'convert_to': attributes.convert_to_int,
'validate': {'type:range': [-1, sys.maxsize]}, 'validate': {'type:range': [-1, const.DB_INTEGER_MAX_VALUE]},
'is_visible': True} 'is_visible': True}
self._update_extended_attributes = False self._update_extended_attributes = False

View File

@ -64,6 +64,10 @@ class RouterInUseByVPNService(qexception.InUse):
message = _("Router %(router_id)s is used by VPNService %(vpnservice_id)s") 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): class VPNStateInvalidToUpdate(qexception.BadRequest):
message = _("Invalid state %(state)s of vpnaas resource %(id)s" message = _("Invalid state %(state)s of vpnaas resource %(id)s"
" for updating") " for updating")

View File

@ -79,7 +79,19 @@ def no_author_tags(physical_line):
return pos, "N322: Don't use author tags" 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): def factory(register):
register(validate_log_translations) register(validate_log_translations)
register(use_jsonutils) register(use_jsonutils)
register(no_author_tags) register(no_author_tags)
register(check_assert_called_once)

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Neutron\n" "Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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: 2014-08-17 05:19+0000\n" "PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" "Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: German (http://www.transifex.com/projects/p/neutron/language/" "Language-Team: German (http://www.transifex.com/projects/p/neutron/language/"
"de/)\n" "de/)\n"
@ -20,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: neutron/policy.py:106 #: neutron/policy.py:110
#, python-format #, python-format
msgid "" msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "" 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 #: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system." msgid "IPv6 is not enabled on this system."
msgstr "" msgstr ""
#: neutron/db/l3_agentschedulers_db.py:82 #: neutron/db/l3_agentschedulers_db.py:83
msgid "" msgid ""
"Skipping period L3 agent status check because automatic router rescheduling " "Skipping period L3 agent status check because automatic router rescheduling "
"is disabled." "is disabled."
@ -55,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted" msgid "%d probe(s) deleted"
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:126
#, python-format #, python-format
msgid "Skipping periodic task %(task)s because its interval is negative" 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" msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Überspringe periodische Aufgabe %(task)s weil sie deaktiviert ist" msgstr "Überspringe periodische Aufgabe %(task)s weil sie deaktiviert ist"
#: neutron/openstack/common/service.py:176 #: neutron/openstack/common/service.py:174
#, python-format #, python-format
msgid "Caught %s, exiting" msgid "Caught %s, exiting"
msgstr "%s abgefangen. Vorgang wird beendet" 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" msgid "Parent process has died unexpectedly, exiting"
msgstr "" msgstr ""
"Übergeordneter Prozess wurde unerwartet abgebrochen. Vorgang wird beendet" "Übergeordneter Prozess wurde unerwartet abgebrochen. Vorgang wird beendet"
#: neutron/openstack/common/service.py:271 #: neutron/openstack/common/service.py:263
#, python-format #, python-format
msgid "Child caught %s, exiting" msgid "Child caught %s, exiting"
msgstr "Untergeordnetes Element %s abgefangen; Vorgang wird beendet" 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" msgid "Forking too fast, sleeping"
msgstr "Verzweigung zu schnell; im Ruhemodus" msgstr "Verzweigung zu schnell; im Ruhemodus"
#: neutron/openstack/common/service.py:329 #: neutron/openstack/common/service.py:321
#, python-format #, python-format
msgid "Started child %d" msgid "Started child %d"
msgstr "Untergeordnetes Element %d gestartet" msgstr "Untergeordnetes Element %d gestartet"
#: neutron/openstack/common/service.py:339 #: neutron/openstack/common/service.py:331
#, python-format #, python-format
msgid "Starting %d workers" msgid "Starting %d workers"
msgstr "Starten von %d Workers" msgstr "Starten von %d Workers"
#: neutron/openstack/common/service.py:356 #: neutron/openstack/common/service.py:348
#, python-format #, python-format
msgid "Child %(pid)d killed by signal %(sig)d" msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Untergeordnetes Element %(pid)d durch Signal %(sig)d abgebrochen" msgstr "Untergeordnetes Element %(pid)d durch Signal %(sig)d abgebrochen"
#: neutron/openstack/common/service.py:360 #: neutron/openstack/common/service.py:352
#, python-format #, python-format
msgid "Child %(pid)s exited with status %(code)d" msgid "Child %(pid)s exited with status %(code)d"
msgstr "Untergeordnete %(pid)s mit Status %(code)d beendet" msgstr "Untergeordnete %(pid)s mit Status %(code)d beendet"
#: neutron/openstack/common/service.py:399 #: neutron/openstack/common/service.py:391
#, python-format #, python-format
msgid "Caught %s, stopping children" msgid "Caught %s, stopping children"
msgstr "%s abgefangen, untergeordnete Elemente werden gestoppt" 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." msgid "Wait called after thread killed. Cleaning up."
msgstr "Warten aufgerufen nach dem der Thread abgebrochen wurde. Bereinige." msgstr "Warten aufgerufen nach dem der Thread abgebrochen wurde. Bereinige."
#: neutron/openstack/common/service.py:424 #: neutron/openstack/common/service.py:416
#, python-format #, python-format
msgid "Waiting on %d children to exit" msgid "Waiting on %d children to exit"
msgstr "Warten auf Beenden von %d untergeordneten Elementen" 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 ..." msgid "APIC service agent starting ..."
msgstr "" 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" msgid "APIC service agent started"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format #, python-format
msgid "APIC host agent: agent starting on %s" msgid "APIC host agent: agent starting on %s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format #, python-format
msgid "APIC host agent: started on %s" msgid "APIC host agent: started on %s"
msgstr "" msgstr ""
@ -142,68 +214,57 @@ msgstr ""
msgid "Agent out of sync with plugin!" msgid "Agent out of sync with plugin!"
msgstr "Agent nicht synchron mit Plug-in!" 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" msgid "Starting the sync between Neutron and VSD"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:60 #: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully" msgid "Sync between Neutron and VSD completed successfully"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:137 #: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set" msgid "No bridge is set"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:140 #: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format #, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s" msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:147 #: neutron/plugins/ofagent/agent/arp_lib.py:163
#, python-format
msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:152
msgid "drop non tenant packet" msgid "drop non tenant packet"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:157 #: neutron/plugins/ofagent/agent/arp_lib.py:182
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
#, python-format #, python-format
msgid "unknown network %s" msgid "unknown network %s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... " msgid "Agent initialized successfully, now running... "
msgstr "" msgstr "Agent erfolgreich initialisiert, läuft jetzt... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format #, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
msgstr "" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format #, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format #, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format #, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
msgstr "" msgstr ""
"Zuordnung von physischem Netz %(physical_network)s zu Brücke %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format #, python-format
@ -215,7 +276,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format #, python-format
msgid "Port %(device)s updated. Details: %(details)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format #, python-format
@ -225,17 +286,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format #, python-format
msgid "Attachment %s removed" msgid "Attachment %s removed"
msgstr "" msgstr "Zusatzeinheit %s entfernt"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!" 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 "" 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 #, python-format
msgid "Scanning config files %s for Cisco CSR configurations" msgid "Scanning config files %s for Cisco CSR configurations"
msgstr "" 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 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format #, python-format
msgid "spawned: %d" msgid "spawned: %d"

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Neutron\n" "Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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: 2014-07-18 20:49+0000\n" "PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" "Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: English (Australia) (http://www.transifex.com/projects/p/" "Language-Team: English (Australia) (http://www.transifex.com/projects/p/"
"neutron/language/en_AU/)\n" "neutron/language/en_AU/)\n"
@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: neutron/policy.py:106 #: neutron/policy.py:110
#, python-format #, python-format
msgid "" msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "" 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 #: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system." msgid "IPv6 is not enabled on this system."
msgstr "" msgstr ""
#: neutron/db/l3_agentschedulers_db.py:82 #: neutron/db/l3_agentschedulers_db.py:83
msgid "" msgid ""
"Skipping period L3 agent status check because automatic router rescheduling " "Skipping period L3 agent status check because automatic router rescheduling "
"is disabled." "is disabled."
@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted" msgid "%d probe(s) deleted"
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:126
#, python-format #, python-format
msgid "Skipping periodic task %(task)s because its interval is negative" 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" msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "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 #, python-format
msgid "Caught %s, exiting" msgid "Caught %s, exiting"
msgstr "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" msgid "Parent process has died unexpectedly, exiting"
msgstr "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 #, python-format
msgid "Child caught %s, exiting" msgid "Child caught %s, exiting"
msgstr "" msgstr ""
#: neutron/openstack/common/service.py:310 #: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping" msgid "Forking too fast, sleeping"
msgstr "Forking too fast, sleeping" msgstr "Forking too fast, sleeping"
#: neutron/openstack/common/service.py:329 #: neutron/openstack/common/service.py:321
#, python-format #, python-format
msgid "Started child %d" msgid "Started child %d"
msgstr "Started child %d" msgstr "Started child %d"
#: neutron/openstack/common/service.py:339 #: neutron/openstack/common/service.py:331
#, python-format #, python-format
msgid "Starting %d workers" msgid "Starting %d workers"
msgstr "Starting %d workers" msgstr "Starting %d workers"
#: neutron/openstack/common/service.py:356 #: neutron/openstack/common/service.py:348
#, python-format #, python-format
msgid "Child %(pid)d killed by signal %(sig)d" msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "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 #, python-format
msgid "Child %(pid)s exited with status %(code)d" msgid "Child %(pid)s exited with status %(code)d"
msgstr "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 #, python-format
msgid "Caught %s, stopping children" msgid "Caught %s, stopping children"
msgstr "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." msgid "Wait called after thread killed. Cleaning up."
msgstr "" msgstr ""
#: neutron/openstack/common/service.py:424 #: neutron/openstack/common/service.py:416
#, python-format #, python-format
msgid "Waiting on %d children to exit" msgid "Waiting on %d children to exit"
msgstr "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 ..." msgid "APIC service agent starting ..."
msgstr "" 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" msgid "APIC service agent started"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format #, python-format
msgid "APIC host agent: agent starting on %s" msgid "APIC host agent: agent starting on %s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format #, python-format
msgid "APIC host agent: started on %s" msgid "APIC host agent: started on %s"
msgstr "" msgstr ""
@ -139,41 +211,28 @@ msgstr ""
msgid "Agent out of sync with plugin!" 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" msgid "Starting the sync between Neutron and VSD"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:60 #: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully" msgid "Sync between Neutron and VSD completed successfully"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:137 #: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set" msgid "No bridge is set"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:140 #: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format #, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s" msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:147 #: neutron/plugins/ofagent/agent/arp_lib.py:163
#, python-format
msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:152
msgid "drop non tenant packet" msgid "drop non tenant packet"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:157 #: neutron/plugins/ofagent/agent/arp_lib.py:182
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
#, python-format #, python-format
msgid "unknown network %s" msgid "unknown network %s"
msgstr "" msgstr ""
@ -228,11 +287,47 @@ msgstr ""
msgid "Agent tunnel out of sync with plugin!" msgid "Agent tunnel out of sync with plugin!"
msgstr "" 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 #, python-format
msgid "Scanning config files %s for Cisco CSR configurations" msgid "Scanning config files %s for Cisco CSR configurations"
msgstr "" 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 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format #, python-format
msgid "spawned: %d" msgid "spawned: %d"

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -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 <EMAIL@ADDRESS>\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"

View File

@ -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 <andi@gowling.com>, 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 <jenkins@openstack.org>\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 ""

View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Neutron\n" "Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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: 2014-08-17 05:19+0000\n" "PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" "Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/" "Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/"
"neutron/language/en_GB/)\n" "neutron/language/en_GB/)\n"
@ -20,18 +20,70 @@ msgstr ""
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: neutron/policy.py:106 #: neutron/policy.py:110
#, python-format #, python-format
msgid "" msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "" msgstr ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "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 #: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system." msgid "IPv6 is not enabled on this system."
msgstr "" msgstr ""
#: neutron/db/l3_agentschedulers_db.py:82 #: neutron/db/l3_agentschedulers_db.py:83
msgid "" msgid ""
"Skipping period L3 agent status check because automatic router rescheduling " "Skipping period L3 agent status check because automatic router rescheduling "
"is disabled." "is disabled."
@ -56,6 +108,21 @@ msgstr ""
msgid "%d probe(s) deleted" msgid "%d probe(s) deleted"
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:126
#, python-format #, python-format
msgid "Skipping periodic task %(task)s because its interval is negative" 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" msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "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 #, python-format
msgid "Caught %s, exiting" msgid "Caught %s, exiting"
msgstr "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" msgid "Parent process has died unexpectedly, exiting"
msgstr "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 #, python-format
msgid "Child caught %s, exiting" msgid "Child caught %s, exiting"
msgstr "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" msgid "Forking too fast, sleeping"
msgstr "Forking too fast, sleeping" msgstr "Forking too fast, sleeping"
#: neutron/openstack/common/service.py:329 #: neutron/openstack/common/service.py:321
#, python-format #, python-format
msgid "Started child %d" msgid "Started child %d"
msgstr "Started child %d" msgstr "Started child %d"
#: neutron/openstack/common/service.py:339 #: neutron/openstack/common/service.py:331
#, python-format #, python-format
msgid "Starting %d workers" msgid "Starting %d workers"
msgstr "Starting %d workers" msgstr "Starting %d workers"
#: neutron/openstack/common/service.py:356 #: neutron/openstack/common/service.py:348
#, python-format #, python-format
msgid "Child %(pid)d killed by signal %(sig)d" msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "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 #, python-format
msgid "Child %(pid)s exited with status %(code)d" msgid "Child %(pid)s exited with status %(code)d"
msgstr "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 #, python-format
msgid "Caught %s, stopping children" msgid "Caught %s, stopping children"
msgstr "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." msgid "Wait called after thread killed. Cleaning up."
msgstr "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 #, python-format
msgid "Waiting on %d children to exit" msgid "Waiting on %d children to exit"
msgstr "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 ..." msgid "APIC service agent starting ..."
msgstr "" 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" msgid "APIC service agent started"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format #, python-format
msgid "APIC host agent: agent starting on %s" msgid "APIC host agent: agent starting on %s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format #, python-format
msgid "APIC host agent: started on %s" msgid "APIC host agent: started on %s"
msgstr "" msgstr ""
@ -141,41 +213,28 @@ msgstr ""
msgid "Agent out of sync with plugin!" 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" msgid "Starting the sync between Neutron and VSD"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:60 #: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully" msgid "Sync between Neutron and VSD completed successfully"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:137 #: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set" msgid "No bridge is set"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:140 #: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format #, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s" msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:147 #: neutron/plugins/ofagent/agent/arp_lib.py:163
#, python-format
msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:152
msgid "drop non tenant packet" msgid "drop non tenant packet"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:157 #: neutron/plugins/ofagent/agent/arp_lib.py:182
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
#, python-format #, python-format
msgid "unknown network %s" msgid "unknown network %s"
msgstr "" msgstr ""
@ -230,11 +289,47 @@ msgstr ""
msgid "Agent tunnel out of sync with plugin!" msgid "Agent tunnel out of sync with plugin!"
msgstr "" 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 #, python-format
msgid "Scanning config files %s for Cisco CSR configurations" msgid "Scanning config files %s for Cisco CSR configurations"
msgstr "" 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 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format #, python-format
msgid "spawned: %d" msgid "spawned: %d"

View File

@ -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 <andi@gowling.com>, 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 <andi@gowling.com>\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 ""

File diff suppressed because it is too large Load Diff

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Neutron\n" "Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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: 2014-07-18 20:49+0000\n" "PO-Revision-Date: 2014-10-21 11:04+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" "Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/neutron/language/" "Language-Team: Spanish (http://www.transifex.com/projects/p/neutron/language/"
"es/)\n" "es/)\n"
@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: neutron/policy.py:106 #: neutron/policy.py:110
#, python-format #, python-format
msgid "" msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "" 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 #: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system." msgid "IPv6 is not enabled on this system."
msgstr "" msgstr ""
#: neutron/db/l3_agentschedulers_db.py:82 #: neutron/db/l3_agentschedulers_db.py:83
msgid "" msgid ""
"Skipping period L3 agent status check because automatic router rescheduling " "Skipping period L3 agent status check because automatic router rescheduling "
"is disabled." "is disabled."
@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted" msgid "%d probe(s) deleted"
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:126
#, python-format #, python-format
msgid "Skipping periodic task %(task)s because its interval is negative" 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" msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Omitiendo la tarea periódica %(task)s porque está inhabilitada" 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 #, python-format
msgid "Caught %s, exiting" msgid "Caught %s, exiting"
msgstr "Se ha captado %s, saliendo" 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" msgid "Parent process has died unexpectedly, exiting"
msgstr "El proceso padre se ha detenido inesperadamente, saliendo" msgstr "El proceso padre se ha detenido inesperadamente, saliendo"
#: neutron/openstack/common/service.py:271 #: neutron/openstack/common/service.py:263
#, python-format #, python-format
msgid "Child caught %s, exiting" 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" msgid "Forking too fast, sleeping"
msgstr "Bifurcación demasiado rápida, en reposo" msgstr "Bifurcación demasiado rápida, en reposo"
#: neutron/openstack/common/service.py:329 #: neutron/openstack/common/service.py:321
#, python-format #, python-format
msgid "Started child %d" msgid "Started child %d"
msgstr "Se ha iniciado el hijo %d" msgstr "Se ha iniciado el hijo %d"
#: neutron/openstack/common/service.py:339 #: neutron/openstack/common/service.py:331
#, python-format #, python-format
msgid "Starting %d workers" msgid "Starting %d workers"
msgstr "Iniciando %d trabajadores" msgstr "Iniciando %d trabajadores"
#: neutron/openstack/common/service.py:356 #: neutron/openstack/common/service.py:348
#, python-format #, python-format
msgid "Child %(pid)d killed by signal %(sig)d" msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Hijo %(pid)d matado por señal %(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 #, python-format
msgid "Child %(pid)s exited with status %(code)d" msgid "Child %(pid)s exited with status %(code)d"
msgstr "El hijo %(pid)s ha salido con el estado %(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 #, python-format
msgid "Caught %s, stopping children" msgid "Caught %s, stopping children"
msgstr "Se ha captado %s, deteniendo hijos" 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." msgid "Wait called after thread killed. Cleaning up."
msgstr "" msgstr ""
#: neutron/openstack/common/service.py:424 #: neutron/openstack/common/service.py:416
#, python-format #, python-format
msgid "Waiting on %d children to exit" msgid "Waiting on %d children to exit"
msgstr "En espera de %d hijos para salir" 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 ..." msgid "APIC service agent starting ..."
msgstr "" 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" msgid "APIC service agent started"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format #, python-format
msgid "APIC host agent: agent starting on %s" msgid "APIC host agent: agent starting on %s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format #, python-format
msgid "APIC host agent: started on %s" msgid "APIC host agent: started on %s"
msgstr "" msgstr ""
@ -137,43 +209,30 @@ msgstr ""
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907
msgid "Agent out of sync with plugin!" 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" msgid "Starting the sync between Neutron and VSD"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:60 #: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully" msgid "Sync between Neutron and VSD completed successfully"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:137 #: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set" msgid "No bridge is set"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:140 #: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format #, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s" msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:147 #: neutron/plugins/ofagent/agent/arp_lib.py:163
#, python-format
msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:152
msgid "drop non tenant packet" msgid "drop non tenant packet"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:157 #: neutron/plugins/ofagent/agent/arp_lib.py:182
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
#, python-format #, python-format
msgid "unknown network %s" msgid "unknown network %s"
msgstr "" msgstr ""
@ -181,26 +240,28 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... " msgid "Agent initialized successfully, now running... "
msgstr "" msgstr ""
"El agente se ha inicializado satisfactoriamente, ahora se está ejecutando... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format #, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format #, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format #, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format #, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
msgstr "" msgstr ""
"Correlacionando la red física %(physical_network)s con el puente %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format #, python-format
@ -212,7 +273,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format #, python-format
msgid "Port %(device)s updated. Details: %(details)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format #, python-format
@ -222,17 +283,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format #, python-format
msgid "Attachment %s removed" msgid "Attachment %s removed"
msgstr "" msgstr "Se ha eliminado el adjunto %s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!" 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 "" 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 #, python-format
msgid "Scanning config files %s for Cisco CSR configurations" msgid "Scanning config files %s for Cisco CSR configurations"
msgstr "" 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 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format #, python-format
msgid "spawned: %d" msgid "spawned: %d"

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -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 <EMAIL@ADDRESS>\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"

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -3,12 +3,13 @@
# This file is distributed under the same license as the neutron project. # This file is distributed under the same license as the neutron project.
# #
# Translators: # Translators:
# Maxime COQUEREL <max.coquerel@gmail.com>, 2014
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Neutron\n" "Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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: 2014-08-12 21:40+0000\n" "PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" "Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: French (http://www.transifex.com/projects/p/neutron/language/" "Language-Team: French (http://www.transifex.com/projects/p/neutron/language/"
"fr/)\n" "fr/)\n"
@ -19,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: neutron/policy.py:106 #: neutron/policy.py:110
#, python-format #, python-format
msgid "" msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "" msgstr ""
#: neutron/common/ipv6_utils.py:62 #: neutron/agent/securitygroups_rpc.py:80
msgid "IPv6 is not enabled on this system." 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 "" 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 "" msgid ""
"Skipping period L3 agent status check because automatic router rescheduling " "Skipping period L3 agent status check because automatic router rescheduling "
"is disabled." "is disabled."
@ -54,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted" msgid "%d probe(s) deleted"
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:126
#, python-format #, python-format
msgid "Skipping periodic task %(task)s because its interval is negative" 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" msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Tâche périodique %(task)s car elle est désactivée" 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 #, python-format
msgid "Caught %s, exiting" msgid "Caught %s, exiting"
msgstr "%s interceptée, sortie" msgstr "%s interceptée, sortie"
#: neutron/openstack/common/service.py:240 #: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting" msgid "Parent process has died unexpectedly, exiting"
msgstr "Processus parent arrêté de manière inattendue, sortie" msgstr "Processus parent arrêté de manière inattendue, sortie"
#: neutron/openstack/common/service.py:271 #: neutron/openstack/common/service.py:263
#, python-format #, python-format
msgid "Child caught %s, exiting" 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" msgid "Forking too fast, sleeping"
msgstr "Bifurcation trop rapide, pause" msgstr "Bifurcation trop rapide, pause"
#: neutron/openstack/common/service.py:329 #: neutron/openstack/common/service.py:321
#, python-format #, python-format
msgid "Started child %d" msgid "Started child %d"
msgstr "Enfant démarré %d" msgstr "Enfant démarré %d"
#: neutron/openstack/common/service.py:339 #: neutron/openstack/common/service.py:331
#, python-format #, python-format
msgid "Starting %d workers" msgid "Starting %d workers"
msgstr "Démarrage des travailleurs %d" msgstr "Démarrage des travailleurs %d"
#: neutron/openstack/common/service.py:356 #: neutron/openstack/common/service.py:348
#, python-format #, python-format
msgid "Child %(pid)d killed by signal %(sig)d" msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Enfant %(pid)d arrêté par le 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 #, python-format
msgid "Child %(pid)s exited with status %(code)d" msgid "Child %(pid)s exited with status %(code)d"
msgstr "Processus fils %(pid)s terminé avec le 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 #, python-format
msgid "Caught %s, stopping children" msgid "Caught %s, stopping children"
msgstr "%s interceptée, arrêt de l'enfant" 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." msgid "Wait called after thread killed. Cleaning up."
msgstr "Pause demandée après suppression de thread. Nettoyage." msgstr "Pause demandée après suppression de thread. Nettoyage."
#: neutron/openstack/common/service.py:424 #: neutron/openstack/common/service.py:416
#, python-format #, python-format
msgid "Waiting on %d children to exit" msgid "Waiting on %d children to exit"
msgstr "En attente %d enfants pour sortie" 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 ..." 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" 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 #, python-format
msgid "APIC host agent: agent starting on %s" msgid "APIC host agent: agent starting on %s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format #, python-format
msgid "APIC host agent: started on %s" msgid "APIC host agent: started on %s"
msgstr "" msgstr ""
@ -139,68 +212,59 @@ msgstr ""
msgid "Agent out of sync with plugin!" msgid "Agent out of sync with plugin!"
msgstr "Agent non synchronisé avec le plug-in !" 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" msgid "Starting the sync between Neutron and VSD"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:60 #: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully" msgid "Sync between Neutron and VSD completed successfully"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:137 #: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set" msgid "No bridge is set"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:140 #: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format #, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s" 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 #: neutron/plugins/ofagent/agent/arp_lib.py:163
#, python-format
msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:152
msgid "drop non tenant packet" msgid "drop non tenant packet"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:157 #: neutron/plugins/ofagent/agent/arp_lib.py:182
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
#, python-format #, python-format
msgid "unknown network %s" msgid "unknown network %s"
msgstr "" msgstr "réseau inconnu %s "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... " 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format #, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
msgstr "" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format #, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
msgstr "" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format #, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format #, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format #, python-format
@ -212,26 +276,63 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format #, python-format
msgid "Port %(device)s updated. Details: %(details)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format #, python-format
msgid "Configuration for device %s completed." msgid "Configuration for device %s completed."
msgstr "" msgstr "Configuration complète de l'équipement %s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format #, python-format
msgid "Attachment %s removed" msgid "Attachment %s removed"
msgstr "" msgstr "Connexion %s retirée"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!" 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 "" 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 #, python-format
msgid "Scanning config files %s for Cisco CSR configurations" msgid "Scanning config files %s for Cisco CSR configurations"
msgstr "" 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 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format #, python-format
@ -241,4 +342,4 @@ msgstr ""
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:75 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:75
#, python-format #, python-format
msgid "_handle_request called: %s" msgid "_handle_request called: %s"
msgstr "" msgstr "_handle_request called: %s"

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -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 <pieralbertopierini@gmail.com>, 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 <pieralbertopierini@gmail.com>\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 ""

View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Neutron\n" "Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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: 2014-08-17 05:19+0000\n" "PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" "Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/neutron/language/" "Language-Team: Italian (http://www.transifex.com/projects/p/neutron/language/"
"it/)\n" "it/)\n"
@ -20,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: neutron/policy.py:106 #: neutron/policy.py:110
#, python-format #, python-format
msgid "" msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "" 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 #: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system." msgid "IPv6 is not enabled on this system."
msgstr "" msgstr ""
#: neutron/db/l3_agentschedulers_db.py:82 #: neutron/db/l3_agentschedulers_db.py:83
msgid "" msgid ""
"Skipping period L3 agent status check because automatic router rescheduling " "Skipping period L3 agent status check because automatic router rescheduling "
"is disabled." "is disabled."
@ -55,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted" msgid "%d probe(s) deleted"
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:126
#, python-format #, python-format
msgid "Skipping periodic task %(task)s because its interval is negative" 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" msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Abbadono dell'attività periodica %(task)s perché è disabilitata" msgstr "Abbadono dell'attività periodica %(task)s perché è disabilitata"
#: neutron/openstack/common/service.py:176 #: neutron/openstack/common/service.py:174
#, python-format #, python-format
msgid "Caught %s, exiting" msgid "Caught %s, exiting"
msgstr "Rilevato %s, esistente" msgstr "Rilevato %s, esistente"
#: neutron/openstack/common/service.py:240 #: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting" msgid "Parent process has died unexpectedly, exiting"
msgstr "Il processo principale è stato interrotto inaspettatamente, uscire" msgstr "Il processo principale è stato interrotto inaspettatamente, uscire"
#: neutron/openstack/common/service.py:271 #: neutron/openstack/common/service.py:263
#, python-format #, python-format
msgid "Child caught %s, exiting" msgid "Child caught %s, exiting"
msgstr "Cogliere Child %s, uscendo" msgstr "Cogliere Child %s, uscendo"
#: neutron/openstack/common/service.py:310 #: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping" msgid "Forking too fast, sleeping"
msgstr "Sblocco troppo veloce, attendere" msgstr "Sblocco troppo veloce, attendere"
#: neutron/openstack/common/service.py:329 #: neutron/openstack/common/service.py:321
#, python-format #, python-format
msgid "Started child %d" msgid "Started child %d"
msgstr "Child avviato %d" msgstr "Child avviato %d"
#: neutron/openstack/common/service.py:339 #: neutron/openstack/common/service.py:331
#, python-format #, python-format
msgid "Starting %d workers" msgid "Starting %d workers"
msgstr "Avvio %d operatori" msgstr "Avvio %d operatori"
#: neutron/openstack/common/service.py:356 #: neutron/openstack/common/service.py:348
#, python-format #, python-format
msgid "Child %(pid)d killed by signal %(sig)d" msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Child %(pid)d interrotto dal segnale %(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 #, python-format
msgid "Child %(pid)s exited with status %(code)d" msgid "Child %(pid)s exited with status %(code)d"
msgstr "Child %(pid)s terminato con stato %(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 #, python-format
msgid "Caught %s, stopping children" msgid "Caught %s, stopping children"
msgstr "Intercettato %s, arresto in corso dei 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." msgid "Wait called after thread killed. Cleaning up."
msgstr "Attendere la chiamata dopo l'uccisione de filo. Bonifica." msgstr "Attendere la chiamata dopo l'uccisione de filo. Bonifica."
#: neutron/openstack/common/service.py:424 #: neutron/openstack/common/service.py:416
#, python-format #, python-format
msgid "Waiting on %d children to exit" msgid "Waiting on %d children to exit"
msgstr "In attesa %d degli elementi secondari per uscire" 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 ..." msgid "APIC service agent starting ..."
msgstr "" 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" msgid "APIC service agent started"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format #, python-format
msgid "APIC host agent: agent starting on %s" msgid "APIC host agent: agent starting on %s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format #, python-format
msgid "APIC host agent: started on %s" msgid "APIC host agent: started on %s"
msgstr "" msgstr ""
@ -141,68 +213,55 @@ msgstr ""
msgid "Agent out of sync with plugin!" msgid "Agent out of sync with plugin!"
msgstr "Agent non sincronizzato con il 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" msgid "Starting the sync between Neutron and VSD"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:60 #: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully" msgid "Sync between Neutron and VSD completed successfully"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:137 #: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set" msgid "No bridge is set"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:140 #: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format #, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s" msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:147 #: neutron/plugins/ofagent/agent/arp_lib.py:163
#, python-format
msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:152
msgid "drop non tenant packet" msgid "drop non tenant packet"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:157 #: neutron/plugins/ofagent/agent/arp_lib.py:182
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
#, python-format #, python-format
msgid "unknown network %s" msgid "unknown network %s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... " msgid "Agent initialized successfully, now running... "
msgstr "" msgstr "Agent inizializzato correttamente, ora in esecuzione... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format #, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format #, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format #, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format #, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format #, python-format
@ -214,7 +273,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format #, python-format
msgid "Port %(device)s updated. Details: %(details)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format #, python-format
@ -224,17 +283,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format #, python-format
msgid "Attachment %s removed" msgid "Attachment %s removed"
msgstr "" msgstr "Collegamento %s rimosso"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!" 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 "" 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 #, python-format
msgid "Scanning config files %s for Cisco CSR configurations" msgid "Scanning config files %s for Cisco CSR configurations"
msgstr "" 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 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format #, python-format
msgid "spawned: %d" msgid "spawned: %d"

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -3,12 +3,13 @@
# This file is distributed under the same license as the neutron project. # This file is distributed under the same license as the neutron project.
# #
# Translators: # Translators:
# Kuo(Kyohei MORIYAMA) <>, 2014
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Neutron\n" "Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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: 2014-07-18 20:49+0000\n" "PO-Revision-Date: 2014-10-21 11:04+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" "Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Japanese (http://www.transifex.com/projects/p/neutron/" "Language-Team: Japanese (http://www.transifex.com/projects/p/neutron/"
"language/ja/)\n" "language/ja/)\n"
@ -19,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: neutron/policy.py:106 #: neutron/policy.py:110
#, python-format #, python-format
msgid "" msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "" msgstr ""
#: neutron/common/ipv6_utils.py:62 #: neutron/agent/securitygroups_rpc.py:80
msgid "IPv6 is not enabled on this system." msgid "Disabled security-group extension."
msgstr "security-group 拡張を無効にしました。"
#: neutron/agent/securitygroups_rpc.py:82
msgid "Disabled allowed-address-pairs extension."
msgstr "" 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 " このシステムでは、 IP6が有効ではありません。"
#: neutron/db/l3_agentschedulers_db.py:83
msgid "" msgid ""
"Skipping period L3 agent status check because automatic router rescheduling " "Skipping period L3 agent status check because automatic router rescheduling "
"is disabled." "is disabled."
@ -54,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted" msgid "%d probe(s) deleted"
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:126
#, python-format #, python-format
msgid "Skipping periodic task %(task)s because its interval is negative" 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" msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "タスクが使用不可であるため、定期タスク %(task)s をスキップしています" msgstr "タスクが使用不可であるため、定期タスク %(task)s をスキップしています"
#: neutron/openstack/common/service.py:176 #: neutron/openstack/common/service.py:174
#, python-format #, python-format
msgid "Caught %s, exiting" msgid "Caught %s, exiting"
msgstr "%s が見つかりました。終了しています" msgstr "%s が見つかりました。終了しています"
#: neutron/openstack/common/service.py:240 #: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting" msgid "Parent process has died unexpectedly, exiting"
msgstr "親プロセスが予期せずに停止しました。終了しています" msgstr "親プロセスが予期せずに停止しました。終了しています"
#: neutron/openstack/common/service.py:271 #: neutron/openstack/common/service.py:263
#, python-format #, python-format
msgid "Child caught %s, exiting" msgid "Child caught %s, exiting"
msgstr "" msgstr ""
#: neutron/openstack/common/service.py:310 #: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping" msgid "Forking too fast, sleeping"
msgstr "fork が早すぎます。スリープ状態にしています" msgstr "fork が早すぎます。スリープ状態にしています"
#: neutron/openstack/common/service.py:329 #: neutron/openstack/common/service.py:321
#, python-format #, python-format
msgid "Started child %d" msgid "Started child %d"
msgstr "子 %d を開始しました" msgstr "子 %d を開始しました"
#: neutron/openstack/common/service.py:339 #: neutron/openstack/common/service.py:331
#, python-format #, python-format
msgid "Starting %d workers" msgid "Starting %d workers"
msgstr "%d ワーカーを開始しています" msgstr "%d ワーカーを開始しています"
#: neutron/openstack/common/service.py:356 #: neutron/openstack/common/service.py:348
#, python-format #, python-format
msgid "Child %(pid)d killed by signal %(sig)d" msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "子 %(pid)d がシグナル %(sig)d によって強制終了されました" msgstr "子 %(pid)d がシグナル %(sig)d によって強制終了されました"
#: neutron/openstack/common/service.py:360 #: neutron/openstack/common/service.py:352
#, python-format #, python-format
msgid "Child %(pid)s exited with status %(code)d" msgid "Child %(pid)s exited with status %(code)d"
msgstr "子 %(pid)s が状況 %(code)d で終了しました" msgstr "子 %(pid)s が状況 %(code)d で終了しました"
#: neutron/openstack/common/service.py:399 #: neutron/openstack/common/service.py:391
#, python-format #, python-format
msgid "Caught %s, stopping children" msgid "Caught %s, stopping children"
msgstr "%s が見つかりました。子を停止しています" msgstr "%s が見つかりました。子を停止しています"
#: neutron/openstack/common/service.py:408 #: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up." msgid "Wait called after thread killed. Cleaning up."
msgstr "" msgstr ""
#: neutron/openstack/common/service.py:424 #: neutron/openstack/common/service.py:416
#, python-format #, python-format
msgid "Waiting on %d children to exit" msgid "Waiting on %d children to exit"
msgstr "%d 個の子で終了を待機しています" 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 ..." msgid "APIC service agent starting ..."
msgstr "" 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" msgid "APIC service agent started"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format #, python-format
msgid "APIC host agent: agent starting on %s" msgid "APIC host agent: agent starting on %s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format #, python-format
msgid "APIC host agent: started on %s" msgid "APIC host agent: started on %s"
msgstr "" msgstr ""
@ -137,70 +210,60 @@ msgstr ""
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907
msgid "Agent out of sync with plugin!" 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" msgid "Starting the sync between Neutron and VSD"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:60 #: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully" msgid "Sync between Neutron and VSD completed successfully"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:137 #: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set" msgid "No bridge is set"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:140 #: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format #, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s" msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:147 #: neutron/plugins/ofagent/agent/arp_lib.py:163
#, python-format
msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:152
msgid "drop non tenant packet" msgid "drop non tenant packet"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:157 #: neutron/plugins/ofagent/agent/arp_lib.py:182
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
#, python-format #, python-format
msgid "unknown network %s" msgid "unknown network %s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... " msgid "Agent initialized successfully, now running... "
msgstr "" msgstr "エージェントが正常に初期化されました。現在実行中です... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format #, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format #, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format #, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format #, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format #, python-format
@ -212,7 +275,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format #, python-format
msgid "Port %(device)s updated. Details: %(details)s" msgid "Port %(device)s updated. Details: %(details)s"
msgstr "" msgstr "ポート %(device)s が更新されました。詳細: %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format #, python-format
@ -222,17 +285,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format #, python-format
msgid "Attachment %s removed" msgid "Attachment %s removed"
msgstr "" msgstr "接続機構 %s が削除されました"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!" 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 "" 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 #, python-format
msgid "Scanning config files %s for Cisco CSR configurations" msgid "Scanning config files %s for Cisco CSR configurations"
msgstr "" 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 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format #, python-format
msgid "spawned: %d" msgid "spawned: %d"

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Neutron\n" "Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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: 2014-07-18 20:49+0000\n" "PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" "Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/neutron/" "Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/neutron/"
"language/ko_KR/)\n" "language/ko_KR/)\n"
@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: neutron/policy.py:106 #: neutron/policy.py:110
#, python-format #, python-format
msgid "" msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s" "Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "" 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 #: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system." msgid "IPv6 is not enabled on this system."
msgstr "" msgstr ""
#: neutron/db/l3_agentschedulers_db.py:82 #: neutron/db/l3_agentschedulers_db.py:83
msgid "" msgid ""
"Skipping period L3 agent status check because automatic router rescheduling " "Skipping period L3 agent status check because automatic router rescheduling "
"is disabled." "is disabled."
@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted" msgid "%d probe(s) deleted"
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:126
#, python-format #, python-format
msgid "Skipping periodic task %(task)s because its interval is negative" 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" msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "사용 안하기 때문에 주기적 태스크 %(task)s을(를) 건너뜀" msgstr "사용 안하기 때문에 주기적 태스크 %(task)s을(를) 건너뜀"
#: neutron/openstack/common/service.py:176 #: neutron/openstack/common/service.py:174
#, python-format #, python-format
msgid "Caught %s, exiting" msgid "Caught %s, exiting"
msgstr "%s 발견, 종료 중" msgstr "%s 발견, 종료 중"
#: neutron/openstack/common/service.py:240 #: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting" msgid "Parent process has died unexpectedly, exiting"
msgstr "상위 프로세스가 예기치 않게 정지했습니다. 종료 중" msgstr "상위 프로세스가 예기치 않게 정지했습니다. 종료 중"
#: neutron/openstack/common/service.py:271 #: neutron/openstack/common/service.py:263
#, python-format #, python-format
msgid "Child caught %s, exiting" 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" msgid "Forking too fast, sleeping"
msgstr "포크가 너무 빠름. 정지 중" msgstr "포크가 너무 빠름. 정지 중"
#: neutron/openstack/common/service.py:329 #: neutron/openstack/common/service.py:321
#, python-format #, python-format
msgid "Started child %d" msgid "Started child %d"
msgstr "%d 하위를 시작했음" msgstr "%d 하위를 시작했음"
#: neutron/openstack/common/service.py:339 #: neutron/openstack/common/service.py:331
#, python-format #, python-format
msgid "Starting %d workers" msgid "Starting %d workers"
msgstr "%d 작업자 시작 중" msgstr "%d 작업자 시작 중"
#: neutron/openstack/common/service.py:356 #: neutron/openstack/common/service.py:348
#, python-format #, python-format
msgid "Child %(pid)d killed by signal %(sig)d" msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "%(pid)d 하위가 %(sig)d 신호에 의해 강제 종료됨" msgstr "%(pid)d 하위가 %(sig)d 신호에 의해 강제 종료됨"
#: neutron/openstack/common/service.py:360 #: neutron/openstack/common/service.py:352
#, python-format #, python-format
msgid "Child %(pid)s exited with status %(code)d" msgid "Child %(pid)s exited with status %(code)d"
msgstr "%(pid)s 하위가 %(code)d 상태와 함께 종료했음" msgstr "%(pid)s 하위가 %(code)d 상태와 함께 종료했음"
#: neutron/openstack/common/service.py:399 #: neutron/openstack/common/service.py:391
#, python-format #, python-format
msgid "Caught %s, stopping children" msgid "Caught %s, stopping children"
msgstr "%s 발견, 하위 중지 중" msgstr "%s 발견, 하위 중지 중"
#: neutron/openstack/common/service.py:408 #: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up." msgid "Wait called after thread killed. Cleaning up."
msgstr "" msgstr "쓰레드가 죽기를 기다려서, 지웁니다. "
#: neutron/openstack/common/service.py:424 #: neutron/openstack/common/service.py:416
#, python-format #, python-format
msgid "Waiting on %d children to exit" msgid "Waiting on %d children to exit"
msgstr "%d 하위에서 종료하기를 대기 중임" 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 ..." msgid "APIC service agent starting ..."
msgstr "" 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" msgid "APIC service agent started"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format #, python-format
msgid "APIC host agent: agent starting on %s" msgid "APIC host agent: agent starting on %s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format #, python-format
msgid "APIC host agent: started on %s" msgid "APIC host agent: started on %s"
msgstr "" msgstr ""
@ -137,70 +209,57 @@ msgstr ""
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379 #: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907
msgid "Agent out of sync with plugin!" 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" msgid "Starting the sync between Neutron and VSD"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:60 #: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully" msgid "Sync between Neutron and VSD completed successfully"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:137 #: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set" msgid "No bridge is set"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:140 #: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format #, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s" msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:147 #: neutron/plugins/ofagent/agent/arp_lib.py:163
#, python-format
msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:152
msgid "drop non tenant packet" msgid "drop non tenant packet"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/arp_lib.py:157 #: neutron/plugins/ofagent/agent/arp_lib.py:182
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
#, python-format #, python-format
msgid "unknown network %s" msgid "unknown network %s"
msgstr "" msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... " msgid "Agent initialized successfully, now running... "
msgstr "" msgstr "에이전트가 초기화되었으며, 지금 실행 중... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format #, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format #, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format #, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format #, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" 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 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format #, python-format
@ -212,7 +271,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format #, python-format
msgid "Port %(device)s updated. Details: %(details)s" msgid "Port %(device)s updated. Details: %(details)s"
msgstr "" msgstr "%(device)s 포트가 업데이트되었습니다. 세부사항: %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format #, python-format
@ -222,17 +281,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format #, python-format
msgid "Attachment %s removed" msgid "Attachment %s removed"
msgstr "" msgstr "첨부 %s이(가) 제거됨"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912 #: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!" 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 "" 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 #, python-format
msgid "Scanning config files %s for Cisco CSR configurations" msgid "Scanning config files %s for Cisco CSR configurations"
msgstr "" 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 #: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format #, python-format
msgid "spawned: %d" msgid "spawned: %d"

View File

@ -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 <jenkins@openstack.org>\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 ""

View File

@ -6,9 +6,9 @@
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" 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" "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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,45 +17,69 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.3\n" "Generated-By: Babel 1.3\n"
#: neutron/policy.py:115 #: neutron/policy.py:119
#, python-format #, python-format
msgid "" msgid ""
"Backward compatibility unavailable for deprecated policy %s. The policy " "Backward compatibility unavailable for deprecated policy %s. The policy "
"will not be enforced" "will not be enforced"
msgstr "" msgstr ""
#: neutron/policy.py:280 #: neutron/policy.py:311
#, python-format #, python-format
msgid "Policy check error while calling %s!" msgid "Policy check error while calling %s!"
msgstr "" msgstr ""
#: neutron/agent/l3_agent.py:1852
#, python-format
msgid "Removing incompatible router '%s'"
msgstr ""
#: neutron/agent/l3_ha_agent.py:136 #: neutron/agent/l3_ha_agent.py:136
#, python-format #, python-format
msgid "Unable to process HA router %s without ha port" msgid "Unable to process HA router %s without ha port"
msgstr "" msgstr ""
#: neutron/agent/linux/external_process.py:230 #: neutron/agent/linux/external_process.py:227
#, python-format #, python-format
msgid "" msgid ""
"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The " "%(service)s for %(resource_type)s with uuid %(uuid)s not found. The "
"process should not have died" "process should not have died"
msgstr "" msgstr ""
#: neutron/agent/linux/external_process.py:250 #: neutron/agent/linux/external_process.py:247
#, python-format #, python-format
msgid "respawning %(service)s for uuid %(uuid)s" msgid "respawning %(service)s for uuid %(uuid)s"
msgstr "" 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" msgid "Exiting agent as programmed in check_child_processes_actions"
msgstr "" 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 #: neutron/cmd/sanity_check.py:58
msgid "" msgid ""
"Nova notifications are enabled, but novaclient is not installed. Either " "Nova notifications are enabled, but novaclient is not installed. Either "
"disable nova notifications or install python-novaclient." "disable nova notifications or install python-novaclient."
msgstr "" 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 #: neutron/openstack/common/excutils.py:76
#, python-format #, python-format
msgid "Original exception being dropped: %s" msgid "Original exception being dropped: %s"
@ -66,53 +90,62 @@ msgstr ""
msgid "Unexpected exception occurred %d time(s)... retrying." msgid "Unexpected exception occurred %d time(s)... retrying."
msgstr "" 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 #: neutron/openstack/common/periodic_task.py:202
#, python-format #, python-format
msgid "Error during %(full_task_name)s: %(e)s" msgid "Error during %(full_task_name)s: %(e)s"
msgstr "" msgstr ""
#: neutron/openstack/common/service.py:188 #: neutron/openstack/common/service.py:269
msgid "Exception during rpc cleanup."
msgstr ""
#: neutron/openstack/common/service.py:277
msgid "Unhandled exception" msgid "Unhandled exception"
msgstr "" msgstr ""
#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283 #: neutron/plugins/cisco/models/virt_phy_sw_v2.py:279
#, python-format #, python-format
msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s" msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/type_gre.py:80 #: neutron/plugins/ml2/drivers/type_gre.py:86
#, python-format #, python-format
msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s" msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/type_vxlan.py:87 #: neutron/plugins/ml2/drivers/type_vxlan.py:92
#, python-format #, python-format
msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s" msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
msgstr "" 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" msgid "APIC service agent: failed in reporting state"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:205
#, python-format #, python-format
msgid "No such interface (ignored): %s" msgid "No such interface (ignored): %s"
msgstr "" 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" msgid "APIC service agent: exception in LLDP parsing"
msgstr "" msgstr ""
#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312 #: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:310
#, python-format #, python-format
msgid "APIC service agent: can not get MACaddr for %s" msgid "APIC service agent: can not get MACaddr for %s"
msgstr "" 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" msgid "APIC host agent: failed in reporting state"
msgstr "" msgstr ""
@ -120,7 +153,7 @@ msgstr ""
msgid "Error in agent event loop" msgid "Error in agent event loop"
msgstr "" msgstr ""
#: neutron/plugins/nuage/syncmanager.py:56 #: neutron/plugins/nuage/syncmanager.py:55
#, python-format #, python-format
msgid "Cannot complete the sync between Neutron and VSD because of error:%s" msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
msgstr "" msgstr ""
@ -198,7 +231,7 @@ msgstr ""
msgid "Error while processing VIF ports" msgid "Error while processing VIF ports"
msgstr "" msgstr ""
#: neutron/plugins/vmware/plugins/base.py:2089 #: neutron/plugins/vmware/plugins/base.py:2098
#, python-format #, python-format
msgid "" msgid ""
"Rolling back database changes for gateway device %s because of an error " "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" msgid "Not enough candidates, a HA router needs at least %s agents"
msgstr "" 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 #, python-format
msgid "Config file parse error: %s" msgid "Config file parse error: %s"
msgstr "" msgstr ""
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:75
#, python-format #, python-format
msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid" msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
msgstr "" msgstr ""
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:88
#, python-format #, python-format
msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting" msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
msgstr "" msgstr ""
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:96
#, python-format #, python-format
msgid "Ignoring Cisco CSR for router %s - timeout is not a floating point number" msgid "Ignoring Cisco CSR for router %s - timeout is not a floating point number"
msgstr "" 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 #, python-format
msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address" msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
msgstr "" msgstr ""
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:118
#, python-format #, python-format
msgid "Malformed interface name for Cisco CSR router entry - %s" msgid "Malformed interface name for Cisco CSR router entry - %s"
msgstr "" msgstr ""
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:154
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:201
msgid "No routers found in INI file!" msgid "No routers found in INI file!"
msgstr "" msgstr ""
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:173
#, python-format #, python-format
msgid "Unable to lookup router ID based on router's public IP (%s) in INI file" msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
msgstr "" msgstr ""
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:176
#, python-format #, python-format
msgid "No matching routers on host %s" msgid "No matching routers on host %s"
msgstr "" msgstr ""
#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211 #: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:210
#, python-format #, python-format
msgid "Unable to find host for router %s" msgid "Unable to find host for router %s"
msgstr "" msgstr ""

Some files were not shown because too many files have changed in this diff Show More