From 3b0934e9f11b1bc9bf339681f2b5abad77a995e7 Mon Sep 17 00:00:00 2001 From: Kyle Mestery Date: Thu, 24 Sep 2015 13:09:48 +0000 Subject: [PATCH 01/20] Update default branch in .gitreview to stable/liberty Change-Id: I5463e1ffb9e7fc772ba27dd7b7d7d2414a526b5a Signed-off-by: Kyle Mestery --- .gitreview | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitreview b/.gitreview index 184583f0d66..e32805c1388 100644 --- a/.gitreview +++ b/.gitreview @@ -2,3 +2,4 @@ host=review.openstack.org port=29418 project=openstack/neutron.git +defaultbranch=stable/liberty From 0782a0b38172d37267b9400246b2d5b54c3cf67c Mon Sep 17 00:00:00 2001 From: Salvatore Orlando Date: Thu, 24 Sep 2015 05:45:40 -0700 Subject: [PATCH 02/20] Fix quota usage tracker for security group rules This simple patch ensures usage for security group rules is marked as dirty when a security group rule is deleted. To this aim, the security group rule is deleted using ORM in order to ensure the sqlalchemy even if fired. Closes-Bug: #1499339 Change-Id: I1e81fe03fed14ec438cea5d7675f66caeb91afd8 (cherry picked from commit 851b1b4bbbaa965f190bfacab03fd6ece80ad0ec) --- neutron/db/securitygroups_db.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/neutron/db/securitygroups_db.py b/neutron/db/securitygroups_db.py index 7c589046990..ded5a323d29 100644 --- a/neutron/db/securitygroups_db.py +++ b/neutron/db/securitygroups_db.py @@ -614,8 +614,13 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase): raise ext_sg.SecurityGroupRuleInUse(id=id, reason=reason) with context.session.begin(subtransactions=True): - query = self._model_query(context, SecurityGroupRule) - if query.filter(SecurityGroupRule.id == id).delete() == 0: + query = self._model_query(context, SecurityGroupRule).filter( + SecurityGroupRule.id == id) + try: + # As there is a filter on a primary key it is not possible for + # MultipleResultsFound to be raised + context.session.delete(query.one()) + except exc.NoResultFound: raise ext_sg.SecurityGroupRuleNotFound(id=id) registry.notify( From 892a325d7e66a164a74c5bafdf7e0d460af275d9 Mon Sep 17 00:00:00 2001 From: Andreas Jaeger Date: Thu, 24 Sep 2015 20:53:09 +0200 Subject: [PATCH 03/20] Cleanup of Translations In preparation for the release, do some cleanups for translations. Removes all po files that are partially translated. The translation team has decided to exclude files with less than 66 % of translated content. There is no content lost, all data is in the translation server, we just remove it from the repository. This updates also recreates pot (translation source files) to reflect the state of the repository in case there was no recent import for them. This change needs to be done manually since the automatic import does not handle some of these cases. Change-Id: I597258484d388091366bf9baed6e87dafb3f0cc3 --- .../locale/de/LC_MESSAGES/neutron-log-info.po | 202 --------- .../locale/es/LC_MESSAGES/neutron-log-info.po | 384 ------------------ .../locale/fr/LC_MESSAGES/neutron-log-info.po | 332 --------------- .../locale/it/LC_MESSAGES/neutron-log-info.po | 201 --------- .../locale/ja/LC_MESSAGES/neutron-log-info.po | 206 ---------- .../ko_KR/LC_MESSAGES/neutron-log-info.po | 229 ----------- neutron/locale/neutron.pot | 94 +++-- .../pt_BR/LC_MESSAGES/neutron-log-info.po | 298 -------------- .../zh_CN/LC_MESSAGES/neutron-log-info.po | 334 --------------- .../zh_TW/LC_MESSAGES/neutron-log-info.po | 195 --------- 10 files changed, 49 insertions(+), 2426 deletions(-) delete mode 100644 neutron/locale/de/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/es/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/fr/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/it/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/ja/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po delete mode 100644 neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po diff --git a/neutron/locale/de/LC_MESSAGES/neutron-log-info.po b/neutron/locale/de/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 7e012defe09..00000000000 --- a/neutron/locale/de/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,202 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Carsten Duch , 2014 -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: German\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 2.0\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s hat einen Fehler zurückgegeben: %(exception)s" - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s mit HTTP %(status)d zurückgegeben" - -msgid "Agent initialized successfully, now running... " -msgstr "Agent erfolgreich initialisiert, läuft jetzt... " - -msgid "Agent out of sync with plugin!" -msgstr "Agent nicht synchron mit Plug-in!" - -msgid "Agent tunnel out of sync with plugin!" -msgstr "Agententunnel nicht synchron mit Plug-in!" - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "Zugeordnetes VLAN (%d) aus dem Pool" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Das Zulassen der Sortierung ist aktiviert, da die native Paginierung die " -"native Sortierung erfordert" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" -"Zuweisung von %(vlan_id)s als lokale VLAN-Adresse für net-id=%(net_uuid)s" - -#, python-format -msgid "Attachment %s removed" -msgstr "Zusatzeinheit %s entfernt" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "Versuch, ungefilterten Portfilter %r zu entfernen" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "Versuch, ungefilterten Portfilter %s zu aktualisieren" - -#, python-format -msgid "Config paste file: %s" -msgstr "Konfigurations-Paste-Datei: %s" - -msgid "DHCP agent started" -msgstr "DHCP-Agent gestartet" - -#, python-format -msgid "Device %s already exists" -msgstr "Gerät %s ist bereits vorhanden" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "Gerät %s nicht für Plug-in definiert" - -msgid "Disabled security-group extension." -msgstr "Sicherheitsgruppenerweiterung wurde inaktiviert." - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "Ungültige IP-Adresse in Pool gefunden: %(start)s - %(end)s:" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Überschneidungen bei Bereichen gefunden: %(l_range)s und %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "Pool gefunden, der größer ist als Teilnetz-CIDR:%(start)s - %(end)s" - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Ausgelöste HTTP-Ausnahme: %s" - -msgid "Initializing extension manager." -msgstr "Erweiterungsmanager wird initialisiert." - -#, python-format -msgid "Interface mappings: %s" -msgstr "Schnittstellenzuordnungen: %s" - -msgid "L3 agent started" -msgstr "Agent der Ebene 3 gestartet" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "RPC-Dämon für Linux-Brückenagent gestartet!" - -#, python-format -msgid "Loaded extension: %s" -msgstr "Geladene Erweiterung: %s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "Laden von Plug-in: %s" - -msgid "Logging enabled!" -msgstr "Protokollfunktion aktiviert!" - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" -"Zuordnung von physischem Netz %(physical_network)s zu Brücke %(bridge)s" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Bereiche für Netz-VLAN: %s" - -msgid "OVS cleanup completed successfully" -msgstr "OVS-Bereinigungsprozedur erfolgreich abgeschlossen" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Port %(device)s aktualisiert. Details: %(details)s" - -#, python-format -msgid "Port %s updated." -msgstr "Port %s aktualisiert." - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Vorbereiten von Filtern für Geräte %s" - -msgid "Provider rule updated" -msgstr "Provider-Regel aktualisiert" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC-'agent_id': %s" - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "Zurückfordern von vlan = %(vlan_id)s von net-id = %(net_uuid)s" - -msgid "Refresh firewall rules" -msgstr "Firewallregeln aktualisieren" - -#, python-format -msgid "Remove device filter for %r" -msgstr "Gerätefilter für %r entfernen" - -#, python-format -msgid "Security group member updated %r" -msgstr "Sicherheitsgruppenmitglied aktualisiert %r" - -#, python-format -msgid "Security group rule updated %r" -msgstr "Sicherheitsgruppenregel aktualisiert %r" - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "" -"Port %s wird übersprungen, da keine IP-Adresse auf ihm konfiguriert ist" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" -"Angegebene IP-Adressen stimmen nicht mit der Teilnetz-IP-Version überein" - -msgid "Synchronizing state" -msgstr "Synchronisation von Status" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"Überprüfung für CIDR: %(new_cidr)s fehlgeschlagen - Überschneidung mit " -"Teilnetz %(subnet_id)s (CIDR: %(cidr)s)" - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "'agent_updated' (Agent aktualisiert) durch Serverseite %s!" diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po b/neutron/locale/es/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 70e203166f2..00000000000 --- a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,384 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# jhonangel jose mireles rodriguez , 2015 -# Pablo Sanchez , 2015 -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev207\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-18 06:06+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Spanish (http://www.transifex.com/openstack/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 2.0\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "%(action)s falló (error de cliente): %(exc)s" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "%(prog)s versión %(version)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s ha devuelto un error: %(exception)s" - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "Se ha devuelto %(url)s con HTTP %(status)d" - -#, python-format -msgid "%d probe(s) deleted" -msgstr "Se ha eliminado el Analizador(es) %d" - -#, python-format -msgid "Adding network %(net)s to agent %(agent)s on host %(host)s" -msgstr "Agregando red %(net)s al agente %(agent)s en el host %(host)s" - -#, python-format -msgid "Agent %s already present" -msgstr "El agente %s ya está presente." - -#, python-format -msgid "Agent Gateway port does not exist, so create one: %s" -msgstr "El puerto pasarela del agente no existe, por lo tanto crear uno: %s" - -msgid "Agent initialized successfully, now running... " -msgstr "" -"El agente se ha inicializado satisfactoriamente, ahora se está ejecutando... " - -msgid "Agent out of sync with plugin!" -msgstr "El agente está fuera de sincronización con el plug-in." - -msgid "Agent tunnel out of sync with plugin!" -msgstr "Túnel de agente fuera de sincronización con el plug-in. " - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "Vlan asignada (%d) de la agrupación" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Permitir ordenación está habilitado porque la paginación nativa requiere " -"ordenación nativa" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "Asignando %(vlan_id)s como vlan local para net-id=%(net_uuid)s" - -#, python-format -msgid "Attachment %s removed" -msgstr "Se ha eliminado el adjunto %s" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "Se ha intentado eliminar el filtro de puerto que no está filtrado %r" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "Se ha intentado actualizar el filtro de puerto que no está filtrado %s" - -#, python-format -msgid "" -"Cannot apply dhcp option %(opt)s because it's ip_version %(version)d is not " -"in port's address IP versions" -msgstr "" -"No se puede aplicar la opción dhcp %(opt)s porque su ip_version %(version)d " -"no está en la versión IP de la dirección del puerto" - -#, python-format -msgid "Centralizing distributed router %s is not supported" -msgstr "No se soporta centralizar el enrutador distribuido %s" - -#, python-format -msgid "Cleaning bridge: %s" -msgstr "LImpiando puente: %s" - -#, python-format -msgid "Config paste file: %s" -msgstr "Archivo de configuración de pegar: %s" - -msgid "DHCP agent started" -msgstr "Se ha iniciado al agente DHCP" - -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" -"El proveedor por defecto no esta especificado para el tipo de servicio %s" - -#, python-format -msgid "Deleting port: %s" -msgstr "Destruyendo puerto: %s" - -#, python-format -msgid "Destroying IPset: %s" -msgstr "Destruyendo IPset: %s" - -#, python-format -msgid "Destroying IPsets with prefix: %s" -msgstr "Destruyendo IPset con prefijo: %s" - -#, python-format -msgid "Device %s already exists" -msgstr "El dispositivo %s ya existe" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "El dispositivo %s no está definido en el plug-in" - -msgid "Disabled allowed-address-pairs extension." -msgstr "La extensión allowed-address-pairs se ha inhabilitado." - -msgid "Disabled security-group extension." -msgstr "La extensión security-group se ha inhabilitado." - -msgid "Disabled vlantransparent extension." -msgstr "La extensión vlantransparent se ha inhabilitado." - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "" -"Se ha encontrado una dirección IP no válida en la agrupación: %(start)s - " -"%(end)s:" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Rangos de solapamiento encontrados: %(l_range)s y %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "" -"Se ha encontrado una agrupación mayor que el CIDR de subred: %(start)s - " -"%(end)s" - -#, python-format -msgid "" -"Found port (%(port_id)s, %(ip)s) having IP allocation on subnet %(subnet)s, " -"cannot delete" -msgstr "" -"Se encontró el puerto (%(port_id)s, %(ip)s) con la asignación de IP en la " -"subred %(subnet)s, no se puede eliminar." - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Excepción de HTTP emitida: %s" - -#, python-format -msgid "" -"Heartbeat received from %(type)s agent on host %(host)s, uuid %(uuid)s after " -"%(delta)s" -msgstr "" -"Heartbeat recibido del agente %(type)s en el host %(host)s, uuid %(uuid)s " -"después de %(delta)s" - -msgid "IPset cleanup completed successfully" -msgstr "La limpieza de IPset se ha completado satisfactoriamente" - -msgid "IPv6 is not enabled on this system." -msgstr "IPv6 no esta habitado en el sistema." - -msgid "Initializing CRD client... " -msgstr "Inicialización de cliente CRD..." - -msgid "Initializing extension manager." -msgstr "Inicializando gestor de ampliación." - -#, python-format -msgid "Interface mappings: %s" -msgstr "Correlaciones de interfaz: %s" - -msgid "L3 agent started" -msgstr "Se ha iniciado al agente L3" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "Se ha iniciado el daemon RPC de agente de LinuxBridge." - -#, python-format -msgid "Loaded extension: %s" -msgstr "Ampliación cargada: %s" - -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "Se ha cargado quota_driver %s." - -#, python-format -msgid "Loading Metering driver %s" -msgstr "Cargando controlador de medición %s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "Cargando complementos: %s" - -#, python-format -msgid "Loading core plugin: %s" -msgstr "Cargando complemento principal: %s" - -#, python-format -msgid "Loading interface driver %s" -msgstr "Cargando controlador de interfaz %s" - -msgid "Logging enabled!" -msgstr "Registro habilitado." - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" -"Correlacionando la red física %(physical_network)s con el puente %(bridge)s" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Rangos de VLAN de red: %s" - -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "Se ha iniciado el servicio Neutron, escuchando en %(host)s:%(port)s" - -msgid "No ip allocation set" -msgstr "No se ha configurado la asignación IP" - -msgid "No ports here to refresh firewall" -msgstr "No hay puertos aqui para actualizar firewall" - -#, python-format -msgid "Nova event response: %s" -msgstr "Respuesta de evento Nova: %s" - -msgid "OVS cleanup completed successfully" -msgstr "La limpieza de OVS se ha completado satisfactoriamente" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Se ha actualizado el puerto %(device)s. Detalles: %(details)s" - -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "El puerto %(port_id)s no está presente en el puente %(br_name)s" - -#, python-format -msgid "Port %s updated." -msgstr "El puerto %s se ha actualizado." - -#, python-format -msgid "Ports %s removed" -msgstr "Se ha eliminado los puertos %s" - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Preparando filtros para dispositivos %s" - -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "El proceso se ejecuta con uid/gid: %(uid)s/%(gid)s" - -msgid "Provider rule updated" -msgstr "Se ha actualizado regla de proveedor" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "agent_id de RPC: %s" - -msgid "RPC was already started in parent process by plugin." -msgstr "RPC ya fue iniciado en el proceso padre por el complemento." - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "Reclamando vlan = %(vlan_id)s de net-id = %(net_uuid)s" - -msgid "Refresh firewall rules" -msgstr "Renovar reglas de cortafuegos" - -#, python-format -msgid "Remove device filter for %r" -msgstr "Eliminar filtro de dispositivo para %r" - -#, python-format -msgid "Removing iptables rule for IPset: %s" -msgstr "Eliminando regla de iptables para IPset: %s" - -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "El enrutador %(router_id)s ha hecho la transición a %(state)s" - -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "" -"Router %s no es controlado por este agente.Fue posiblemente borrado " -"concurrentemente" - -#, python-format -msgid "SNAT interface port list does not exist, so create one: %s" -msgstr "El puerto de la interfaz SNAT no existe, por lo tanto crear uno: %s" - -#, python-format -msgid "Security group member updated %r" -msgstr "Se ha actualizado el miembro de grupo de seguridad %r" - -#, python-format -msgid "Security group rule updated %r" -msgstr "Se ha actualizado la regla de grupo de seguridad %r" - -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "El complemento principal soporta el servicio %s" - -#, python-format -msgid "" -"Skipping method %s as firewall is disabled or configured as " -"NoopFirewallDriver." -msgstr "" -"Saltando el método %s, ya que el cortafuegos esta inhabilitado o configurado " -"como NoopFirewallDriver." - -msgid "" -"Skipping periodic DHCP agent status check because automatic network " -"rescheduling is disabled." -msgstr "" -"Omitiendo la verificación de estado del agente DHCP porque la re-" -"planificación automática de red esta inhabilitada." - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "Saltando el puerto %s, ya que no hay ninguna IP configurada en él" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" -"Las direcciones IP especificadas no coinciden con la versión de IP de subred " - -msgid "Stopping linuxbridge agent." -msgstr "Deteniendo agente linuxbridge." - -msgid "Synchronizing state" -msgstr "Sincronizando estado" - -msgid "Synchronizing state complete" -msgstr "Sincronizando estado completado" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"Se ha encontrado un error en validación para CIDR: %(new_cidr)s; se solapa " -"con la subred %(subnet_id)s (CIDR: %(cidr)s)" - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated por el lado del servidor %s!" diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 2b2d585178b..00000000000 --- a/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,332 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Maxime COQUEREL , 2014-2015 -# Patte D , 2015 -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev207\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-18 06:06+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: French (http://www.transifex.com/openstack/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 2.0\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "Échec %(action)s (Erreur client): %(exc)s" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "%(prog)s version %(version)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s a retourné une erreur : %(exception)s." - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s retourné avec HTTP %(status)d" - -#, python-format -msgid "%d probe(s) deleted" -msgstr "Sonde(s) %d supprimées" - -#, python-format -msgid "Adding %s to list of bridges." -msgstr "Ajout %s à la liste de ponts." - -#, python-format -msgid "Agent %s already present" -msgstr "Agent %s déjà présent" - -msgid "Agent initialised successfully, now running... " -msgstr "Agent initialisé avec succès, en cours d'exécution..." - -msgid "Agent initialized successfully, now running... " -msgstr "Agent initialisé avec succès, en cours d'exécution... " - -msgid "Agent out of sync with plugin!" -msgstr "Agent non synchronisé avec le plug-in !" - -msgid "Agent tunnel out of sync with plugin!" -msgstr "Tunnel d'agent désynchronisé avec le plug-in !" - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "Réseau VLAN alloué (%d) depuis le pool" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Autorisation de tri activée car la mise en page native nécessite le tri natif" - -#, python-format -msgid "Ancillary Ports %s added" -msgstr "Ports auxillaires %s ajoutés" - -#, python-format -msgid "Ancillary ports %s removed" -msgstr "Ports auxillaires %s supprimés" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" -"Affectation de %(vlan_id)s comme réseau local virtuel pour net-id = " -"%(net_uuid)s" - -#, python-format -msgid "Attachment %s removed" -msgstr "Connexion %s retirée" - -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "Tentative %(count)s de liaison port %(port)s" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "" -"Tentative effectuée de suppression du filtre de ports (sans filtrage %r)" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "" -"Tentative effectuée de mise à jour du filtre de ports (sans filtrage %s)" - -#, python-format -msgid "" -"Binding info for port %s was not found, it might have been deleted already." -msgstr "" -"L'information de liaison pour le port %s n'a pas été trouvée, elle peut déjà " -"avoir été effacée." - -#, python-format -msgid "Cleaning bridge: %s" -msgstr "Supprimer le pont: %s" - -#, python-format -msgid "Config paste file: %s" -msgstr "Config du fichier de collage : %s" - -msgid "DHCP agent started" -msgstr "Agent DHCP démarré" - -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "" -"Le fournisseur par défaut n'est pas spécifié pour le type de service %s" - -#, python-format -msgid "Deleting port: %s" -msgstr "Supprimer le port: %s" - -#, python-format -msgid "Device %s already exists" -msgstr "L'unité %s existe déjà" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "Unité %s non définie sur le plug-in" - -#, python-format -msgid "Device with MAC %s not defined on plugin" -msgstr "Appareil avec adresse MAC %s non-défini dans le plugin" - -msgid "Disabled security-group extension." -msgstr "Extension du groupe de sécurité désactivée." - -#, python-format -msgid "Exclude Devices: %s" -msgstr "Equipements exclus: %s" - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "Adresse IP non valide trouvée dans le pool : %(start)s - %(end)s :" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Chevauchement d'intervalles trouvés : %(l_range)s et %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "" -"Un pool plus volumineux que le routage CIDR de sous-réseau %(start)s - " -"%(end)s a été trouvé." - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Exception HTTP générée : %s" - -msgid "IPv6 is not enabled on this system." -msgstr "IPv6 n'est pas activé sur le système." - -msgid "Initializing extension manager." -msgstr "Initialisation du gestionnaire d'extension." - -#, python-format -msgid "Interface mappings: %s" -msgstr "Mappages d'interface : %s" - -msgid "L3 agent started" -msgstr "Agent de niveau 3 démarré" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "Serveur démon RPC de l'agent LinuxBridge démarré !" - -#, python-format -msgid "Loaded extension: %s" -msgstr "Extension chargée : %s" - -#, python-format -msgid "Loaded quota_driver: %s." -msgstr "Chargement quota_driver: %s." - -#, python-format -msgid "Loading Metering driver %s" -msgstr "Chargement du pilote de Mesures %s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "Chargement du plug-in : %s" - -#, python-format -msgid "Loading core plugin: %s" -msgstr "Chargement du plugin core: %s" - -#, python-format -msgid "Loading interface driver %s" -msgstr "Chargement de pilote d'interface %s" - -msgid "Logging enabled!" -msgstr "Consignation activée !" - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "Mappage du réseau physique %(physical_network)s sur le pont %(bridge)s" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Plages de réseau local virtuel de réseau : %s" - -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "Service Neutron démarré, en écoute sur %(host)s:%(port)s" - -#, python-format -msgid "No device with MAC %s defined on agent." -msgstr "Aucun équipement avec MAC %s défini sur l'agent." - -msgid "OVS cleanup completed successfully" -msgstr "Le nettoyage d'OVS s'est terminé avec succès." - -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "Mappages d'Équipements Physiques: %s" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Port %(device)s mis à jour. Détails : %(details)s" - -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "Port %(port_id)s n'est pas présent dans le pont %(br_name)s" - -#, python-format -msgid "Port %s updated." -msgstr "Port %s mis à jour." - -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "Le port %s a été effacé en même temps" - -#, python-format -msgid "Ports %s removed" -msgstr "Ports %s supprimés" - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Préparation des filtres pour les unités %s" - -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "Le processus est exécuté avec uid/gid: %(uid)s/%(gid)s" - -msgid "Provider rule updated" -msgstr "Règle de fournisseur mise à jour" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "agent_id RPC : %s" - -msgid "RPC was already started in parent process by plugin." -msgstr "Le plugin avait déjà lancé les RPC dans le processus parent." - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "" -"Récupération du réseau local virtuel = %(vlan_id)s à partir de net-id = " -"%(net_uuid)s" - -msgid "Refresh firewall rules" -msgstr "Régénération des règles de pare-feu" - -#, python-format -msgid "Remove device filter for %r" -msgstr "Suppression du filtre d'unités pour %r" - -#, python-format -msgid "Security group member updated %r" -msgstr "Membre de groupe de sécurité mis à jour %r" - -#, python-format -msgid "Security group rule updated %r" -msgstr "Règle de groupe de sécurité mise à jour %r" - -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "Le service %s est supporté par le core plugin" - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "Ignorer le port %s car aucune adresse IP n'est configurée" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" -"Les adresses IP spécifiées ne correspondent à la version IP du sous-réseau" - -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "Le sous-réseau %s a été effacé en même temps" - -msgid "Synchronizing state" -msgstr "Etat de synchronisation" - -msgid "Synchronizing state complete" -msgstr "Etat de synchronisation complet" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"La validation du routage CIDR %(new_cidr)s a échoué : il chevauche le sous-" -"réseau %(subnet_id)s (CIDR : %(cidr)s) " - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated au niveau du serveur %s !" diff --git a/neutron/locale/it/LC_MESSAGES/neutron-log-info.po b/neutron/locale/it/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 28a55c2ad5d..00000000000 --- a/neutron/locale/it/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,201 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# PierAlberto , 2014 -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev207\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-18 06:06+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Italian (http://www.transifex.com/openstack/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 2.0\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s ha restituito un errore: %(exception)s" - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s restituito con HTTP %(status)d" - -msgid "Agent initialized successfully, now running... " -msgstr "Agent inizializzato correttamente, ora in esecuzione... " - -msgid "Agent out of sync with plugin!" -msgstr "Agent non sincronizzato con il plugin!" - -msgid "Agent tunnel out of sync with plugin!" -msgstr "Il tunnel agent non è sincronizzato con il plugin!" - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "vlan (%d) allocata dal pool" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Consenti ordinamento è abilitato in quanto la paginaziona nativa richiede " -"l'ordinamento nativo" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "Assegnazione %(vlan_id)s come vlan locale per net-id=%(net_uuid)s" - -#, python-format -msgid "Attachment %s removed" -msgstr "Collegamento %s rimosso" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "Tentativo di rimuovere il filtro della porta che non è filtrata %r" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "Tentativo di aggiornare il filtro della porta che non è filtrata %s" - -#, python-format -msgid "Config paste file: %s" -msgstr "Configurazione file paste: %s" - -msgid "DHCP agent started" -msgstr "Agent DHCP avviato" - -#, python-format -msgid "Device %s already exists" -msgstr "L'unità %s già esiste" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "Unità %s non definita nel plugin" - -msgid "Disabled security-group extension." -msgstr "Estensione di security-group disabilitata." - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "Trovato un indirizzo IP invalido nel pool: %(start)s - %(end)s:" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Trovati gli intervalli di sovrapposizione: %(l_range)s e %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "Trovato un pool più grande della sottorete CIDR:%(start)s - %(end)s" - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Generata eccezione HTTP: %s" - -msgid "Initializing extension manager." -msgstr "Inizializzazione gestore estensioni." - -#, python-format -msgid "Interface mappings: %s" -msgstr "Associazioni interfaccia: %s" - -msgid "L3 agent started" -msgstr "Agent L3 avviato" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "LinuxBridge Agent RPC Daemon avviato!" - -#, python-format -msgid "Loaded extension: %s" -msgstr "Estensione caricata: %s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "Caricamento plugin: %s" - -msgid "Logging enabled!" -msgstr "Accesso abilitato!" - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "Associazione rete fisica %(physical_network)s al bridge %(bridge)s" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Intervalli di rete VLAN: %s" - -msgid "OVS cleanup completed successfully" -msgstr "Ripulitura di OVS completata correttamente" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Porta %(device)s aggiornata. Dettagli: %(details)s" - -#, python-format -msgid "Port %s updated." -msgstr "Porta %s aggiornata." - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Preparazione filtri per i dispositivi %s" - -msgid "Provider rule updated" -msgstr "Provider regola aggiornato" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "agent-id RPC: %s" - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "Recupero vlan = %(vlan_id)s da net-id = %(net_uuid)s" - -msgid "Refresh firewall rules" -msgstr "Aggiorna regole firewall" - -#, python-format -msgid "Remove device filter for %r" -msgstr "Rimuovi filtro dispositivo per %r" - -#, python-format -msgid "Security group member updated %r" -msgstr "Membro gruppo di sicurezza aggiornato %r" - -#, python-format -msgid "Security group rule updated %r" -msgstr "Regola gruppo di sicurezza aggiornata %r" - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "La porta %s viene ignorata in quanto non ha nessun IP configurato" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "" -"Gli indirizzi IP specificati non corrispondono alla versione IP della " -"sottorete" - -msgid "Synchronizing state" -msgstr "Stato sincronizzazione" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"Convalida per CIDR: %(new_cidr)s non riuscita - si sovrappone con la " -"sottorete %(subnet_id)s (CIDR: %(cidr)s)" - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated dal lato server %s!" diff --git a/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po b/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 11df0a4f802..00000000000 --- a/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,206 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Sasuke(Kyohei MORIYAMA) <>, 2014 -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev207\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-18 06:06+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Japanese (http://www.transifex.com/openstack/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 2.0\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s が障害を返しました: %(exception)s" - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "HTTP %(status)d の %(url)s が返されました" - -msgid "Agent initialized successfully, now running... " -msgstr "エージェントが正常に初期化されました。現在実行中です... " - -msgid "Agent out of sync with plugin!" -msgstr "エージェントがプラグインと非同期です。" - -msgid "Agent tunnel out of sync with plugin!" -msgstr "エージェント・トンネルがプラグインと非同期です" - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "プールからの割り振り済み VLAN (%d)" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"ネイティブ・ページ編集にはネイティブ・ソートが必要なため、ソートの許可が有効" -"になっています" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "" -"%(vlan_id)s を net-id=%(net_uuid)s のローカル VLAN として割り当てています" - -#, python-format -msgid "Attachment %s removed" -msgstr "接続機構 %s が削除されました" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "フィルター処理されていないポート・フィルター %r を削除しようとしました" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "フィルター処理されていないポート・フィルター %s を更新しようとしました" - -#, python-format -msgid "Config paste file: %s" -msgstr "構成貼り付けファイル: %s" - -msgid "DHCP agent started" -msgstr "DHCP エージェントが始動しました" - -#, python-format -msgid "Device %s already exists" -msgstr "デバイス %s は既に存在します" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "デバイス %s がプラグインで定義されていません" - -msgid "Disabled security-group extension." -msgstr "security-group 拡張を無効にしました。" - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "プールで無効な IP アドレスが見つかりました: %(start)s から %(end)s:" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "オーバーラップする範囲が見つかりました: %(l_range)s から %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "" -"サブネット CIDR より大きいプールが見つかりました: %(start)s から %(end)s" - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "HTTP 例外がスローされました: %s" - -msgid "IPv6 is not enabled on this system." -msgstr " このシステムでは、 IPv6が有効ではありません。" - -msgid "Initializing extension manager." -msgstr "拡張マネージャーを初期化しています。" - -#, python-format -msgid "Interface mappings: %s" -msgstr "インターフェース・マッピング: %s" - -msgid "L3 agent started" -msgstr "L3 エージェントが始動しました" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "LinuxBridge Agent RPC デーモンが開始しました。" - -#, python-format -msgid "Loaded extension: %s" -msgstr "拡張をロードしました: %s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "プラグインの読み込み中: %s" - -msgid "Logging enabled!" -msgstr "ロギングは有効です" - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "" -"物理ネットワーク %(physical_network)s をブリッジ %(bridge)s にマップしていま" -"す" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "ネットワーク VLAN の範囲: %s" - -msgid "OVS cleanup completed successfully" -msgstr "OVS のクリーンアップが正常に完了しました" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "ポート %(device)s が更新されました。詳細: %(details)s" - -#, python-format -msgid "Port %s updated." -msgstr "ポート %s が更新されました。" - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "デバイス %s のフィルターを準備中" - -msgid "Provider rule updated" -msgstr "プロバイダー・ルールが更新されました" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC agent_id: %s" - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "VLAN = %(vlan_id)s を net-id = %(net_uuid)s から再利用中" - -msgid "Refresh firewall rules" -msgstr "ファイアウォール・ルールの最新表示" - -#, python-format -msgid "Remove device filter for %r" -msgstr "%r のデバイス・フィルターを削除" - -#, python-format -msgid "Security group member updated %r" -msgstr "セキュリティー・グループ・メンバーが %r を更新しました" - -#, python-format -msgid "Security group rule updated %r" -msgstr "セキュリティー・グループ・ルールが %r を更新しました" - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "ポート %s には IP が構成されていないため、このポートをスキップします" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "指定された IP アドレスが、サブネット IP バージョンと一致しません" - -msgid "Synchronizing state" -msgstr "状態の同期中" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"CIDR %(new_cidr)s の検証が失敗しました。サブネット %(subnet_id)s (CIDR: " -"%(cidr)s) とオーバーラップしています" - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "サーバー・サイド %s による agent_updated!" diff --git a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po b/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 4f61875d2a8..00000000000 --- a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,229 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev207\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-18 06:06+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Korean (Korea) (http://www.transifex.com/openstack/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 2.0\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s이(가) 결함을 리턴함: %(exception)s" - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s이(가) HTTP %(status)d(으)로 리턴되었음" - -msgid "Agent initialized successfully, now running... " -msgstr "에이전트가 초기화되었으며, 지금 실행 중... " - -msgid "Agent out of sync with plugin!" -msgstr "에이전트가 플러그인과 동기화되지 않았습니다!" - -msgid "Agent tunnel out of sync with plugin!" -msgstr "에이전트 터널이 플러그인과 동기화되지 않았습니다!" - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "풀에서 할당된 vlan(%d)" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"네이티브 페이지 번호 매기기에 네이티브 정렬이 필요하므로 정렬을 사용할 수 있" -"음" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "%(vlan_id)s을(를) net-id=%(net_uuid)s에 대한 로컬 vlan으로 지정 중" - -#, python-format -msgid "Attachment %s removed" -msgstr "첨부 %s이(가) 제거됨" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "필터링된 %r이(가) 아닌 포트 필터를 제거하려고 시도함" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "필터링된 %s이(가) 아닌 포트 필터를 업데이트하려고 시도함" - -#, python-format -msgid "Config paste file: %s" -msgstr "구성 붙여넣기 파일: %s" - -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "매커니즘 드라이버 이름을 설정했습니다: %s" - -#, python-format -msgid "Configured type driver names: %s" -msgstr "형식 드라이버 이름을 설정했습니다: %s" - -msgid "DHCP agent started" -msgstr "DHCP 에이전트가 시작됨" - -#, python-format -msgid "Device %s already exists" -msgstr "%s 디바이스가 이미 존재함" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "%s 디바이스가 플러그인에서 정의되지 않음" - -msgid "Disabled security-group extension." -msgstr "보안 그룹 확장을 사용하지 않습니다. " - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "풀에서 올바르지 않은 IP 주소 발견: %(start)s - %(end)s:" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "겹치는 범위 발견: %(l_range)s 및 %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "서브넷 CIDR보다 큰 풀 발견: %(start)s - %(end)s" - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "HTTP 예외 처리: %s" - -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "'%s' 형식 드라이버 초기화중" - -msgid "Initializing extension manager." -msgstr "확장기능 관리자를 초기화 중입니다. " - -#, python-format -msgid "Interface mappings: %s" -msgstr "인터페이스 맵핑: %s" - -msgid "L3 agent started" -msgstr "L3 에이전트가 시작됨" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "LinuxBridge 에이전트 RPC 디먼이 시작되었습니다!" - -#, python-format -msgid "Loaded extension: %s" -msgstr "로드된 확장: %s" - -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "매커니즘 드라이버 이름을 불러왔습니다: %s" - -#, python-format -msgid "Loaded type driver names: %s" -msgstr "형식 드라이버 이름을 불러왔습니다: %s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "로딩 플러그인: %s" - -msgid "Logging enabled!" -msgstr "로깅 사용!" - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "실제 네트워크 %(physical_network)s을(를) 브릿지 %(bridge)s에 맵핑 중" - -msgid "Modular L2 Plugin initialization complete" -msgstr "모듈러 L2 플러그인 초기화를 완료했습니다" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "네트워크 VLAN 범위: %s" - -msgid "OVS cleanup completed successfully" -msgstr "OVS 정리가 완료됨" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "%(device)s 포트가 업데이트되었습니다. 세부사항: %(details)s" - -#, python-format -msgid "Port %s updated." -msgstr "%s 포트가 업데이트되었습니다. " - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "%s 디바이스에 대한 필터 준비" - -msgid "Provider rule updated" -msgstr "제공자 규칙이 업데이트됨" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC agent_id: %s" - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "net-id = %(net_uuid)s에서 vlan = %(vlan_id)s 재확보 중" - -msgid "Refresh firewall rules" -msgstr "방화벽 규칙 새로 고치기" - -#, python-format -msgid "Registered types: %s" -msgstr "등록된 형식: %s" - -#, python-format -msgid "Remove device filter for %r" -msgstr "%r의 디바이스 필터 제거" - -#, python-format -msgid "Security group member updated %r" -msgstr "보안 그룹 멤버가 %r을(를) 업데이트함" - -#, python-format -msgid "Security group rule updated %r" -msgstr "보안 그룹 규칙이 %r을(를) 업데이트함" - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "구성된 IP가 없어서 포트 %s을(를) 건너뜀" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "지정된 IP 주소가 서브넷 IP 버전과 일치하지 않음" - -msgid "Synchronizing state" -msgstr "상태 동기화 중" - -#, python-format -msgid "Tenant network_types: %s" -msgstr "network_types를 임대합니다: %s" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"CIDR %(new_cidr)s 유효성 검증 실패 - 서브넷 %(subnet_id)s(CIDR: %(cidr)s)과" -"(와) 겹침" - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "서버측 %s!에 의한 agent_updated" diff --git a/neutron/locale/neutron.pot b/neutron/locale/neutron.pot index a0bc4c8433d..13778ad7d8e 100644 --- a/neutron/locale/neutron.pot +++ b/neutron/locale/neutron.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev278\n" +"Project-Id-Version: neutron 7.0.0.dev347.g23e9734\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-09-24 20:52+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2423,11 +2423,11 @@ msgid "" "admin_state_up to False prior to upgrade." msgstr "" -#: neutron/db/l3_dvr_db.py:534 +#: neutron/db/l3_dvr_db.py:541 msgid "Unable to create the Agent Gateway Port" msgstr "" -#: neutron/db/l3_dvr_db.py:565 +#: neutron/db/l3_dvr_db.py:572 msgid "Unable to create the SNAT Interface Port" msgstr "" @@ -3481,7 +3481,7 @@ msgstr "" #: neutron/plugins/ml2/drivers/linuxbridge/agent/common/config.py:58 #: neutron/plugins/ml2/drivers/mech_sriov/agent/common/config.py:58 #: neutron/plugins/ml2/drivers/mlnx/agent/config.py:43 -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:73 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:74 #: neutron/plugins/oneconvergence/lib/config.py:45 msgid "" "The number of seconds the agent will wait between polling for local " @@ -3802,14 +3802,14 @@ msgid "List of :" msgstr "" #: neutron/plugins/ml2/drivers/linuxbridge/agent/common/config.py:61 -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:117 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:118 msgid "" "Set new timeout in seconds for new rpc calls after agent receives " "SIGTERM. If value is set to 0, rpc timeout won't be changed" msgstr "" #: neutron/plugins/ml2/drivers/linuxbridge/agent/common/config.py:69 -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:100 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:101 msgid "" "Enable suppression of ARP responses that don't match an IP address that " "belongs to the port from which they originate. Note: This prevents the " @@ -3973,95 +3973,95 @@ msgstr "" msgid "Tunneling cannot be enabled without a valid local_ip." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:30 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:31 msgid "Integration bridge to use." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:32 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:33 msgid "Tunnel bridge to use." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:34 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:35 msgid "Peer patch port in integration bridge for tunnel bridge." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:37 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:38 msgid "Peer patch port in tunnel bridge for integration bridge." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:40 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:41 msgid "Local IP address of tunnel endpoint." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:43 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:44 msgid "List of :. Deprecated for ofagent." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:46 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:47 msgid "" "Use veths instead of patch ports to interconnect the integration bridge " "to physical bridges." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:50 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:51 msgid "OpenFlow interface to use." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:54 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:55 msgid "OVS datapath to use." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:56 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:57 msgid "" "Address to listen on for OpenFlow connections. Used only for 'native' " "driver." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:59 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:60 msgid "Port to listen on for OpenFlow connections. Used only for 'native' driver." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:62 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:63 msgid "" "Timeout in seconds to wait for the local switch connecting the " "controller. Used only for 'native' driver." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:66 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:67 msgid "" "Timeout in seconds to wait for a single OpenFlow request. Used only for " "'native' driver." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:77 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:78 msgid "Minimize polling by monitoring ovsdb for interface changes." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:81 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:82 msgid "" "The number of seconds to wait before respawning the ovsdb monitor after " "losing communication with it." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:84 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:85 msgid "Network types supported by the agent (gre and/or vxlan)." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:87 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:88 msgid "The UDP port to use for VXLAN tunnels." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:89 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:90 msgid "MTU size of veth interfaces" msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:91 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:92 msgid "" "Use ML2 l2population mechanism driver to learn remote MAC and IPs and " "improve tunnel scalability." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:94 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:95 msgid "" "Enable local ARP responder if it is supported. Requires OVS 2.1 and ML2 " "l2population driver. Allows the switch (when supporting an overlay) to " @@ -4069,28 +4069,32 @@ msgid "" "broadcast into the overlay." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:112 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:113 msgid "" "Set or un-set the don't fragment (DF) bit on outgoing IP packet carrying " "GRE/VXLAN tunnel." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:115 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:116 msgid "Make the l2 agent run in DVR mode." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:121 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:122 msgid "" "Reset flow table on start. Setting this to True will cause brief traffic " "interruption." msgstr "" -#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:124 +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:125 msgid "" "Set or un-set the tunnel header checksum on outgoing IP packet carrying " "GRE/VXLAN tunnel." msgstr "" +#: neutron/plugins/ml2/drivers/openvswitch/agent/common/config.py:129 +msgid "Selects the Agent Type reported" +msgstr "" + #: neutron/plugins/oneconvergence/lib/config.py:24 msgid "NVSD Controller IP address" msgstr "" @@ -4236,50 +4240,50 @@ msgid "" "::[:default]" msgstr "" -#: neutron/services/provider_configuration.py:142 +#: neutron/services/provider_configuration.py:138 #, python-format msgid "Provider name is limited by 255 characters: %s" msgstr "" -#: neutron/services/provider_configuration.py:155 +#: neutron/services/provider_configuration.py:151 msgid "Invalid service provider format" msgstr "" -#: neutron/services/provider_configuration.py:163 +#: neutron/services/provider_configuration.py:159 #, python-format msgid "Invalid provider format. Last part should be 'default' or empty: %s" msgstr "" -#: neutron/services/provider_configuration.py:178 +#: neutron/services/provider_configuration.py:174 #, python-format msgid "" "Service provider '%(provider)s' could not be found for service type " "%(service_type)s" msgstr "" -#: neutron/services/provider_configuration.py:183 +#: neutron/services/provider_configuration.py:179 #, python-format msgid "Service type %(service_type)s does not have a default service provider" msgstr "" -#: neutron/services/provider_configuration.py:188 +#: neutron/services/provider_configuration.py:184 #, python-format msgid "" "Resource '%(resource_id)s' is already associated with provider " "'%(provider)s' for service type '%(service_type)s'" msgstr "" -#: neutron/services/provider_configuration.py:202 +#: neutron/services/provider_configuration.py:198 #, python-format msgid "Driver %s is not unique across providers" msgstr "" -#: neutron/services/provider_configuration.py:212 +#: neutron/services/provider_configuration.py:208 #, python-format msgid "Multiple default providers for service %s" msgstr "" -#: neutron/services/provider_configuration.py:223 +#: neutron/services/provider_configuration.py:219 #, python-format msgid "Multiple providers specified for service %s" msgstr "" @@ -4455,12 +4459,12 @@ msgid "" "operation." msgstr "" -#: neutron/tests/unit/plugins/ml2/test_plugin.py:478 +#: neutron/tests/unit/plugins/ml2/test_plugin.py:493 #, python-format msgid "Deleting port %s" msgstr "" -#: neutron/tests/unit/plugins/ml2/test_plugin.py:479 +#: neutron/tests/unit/plugins/ml2/test_plugin.py:494 #, python-format msgid "The port '%s' was deleted" msgstr "" @@ -4490,9 +4494,9 @@ msgid "" "network %(network)s with segments to bind %(segments_to_bind)s" msgstr "" -#: neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py:1185 -#: neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py:1204 -#: neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py:1223 +#: neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py:1217 +#: neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py:1236 +#: neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py:1255 #, python-format msgid "Failed to set-up %(type)s tunnel port to %(ip)s" msgstr "" diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 2ac1af6677a..00000000000 --- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,298 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# Andre Campos Bezerra , 2015 -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev207\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-18 06:06+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/openstack/" -"neutron/language/pt_BR/)\n" -"Language: pt-BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "%(type)s faixas de ID: %(range)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s retornou uma falha: %(exception)s" - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s retornado com HTTP %(status)d" - -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "" -"Adicionado segmento %(id)s de tipo %(network_type)s para a rede " -"%(network_id)s" - -#, python-format -msgid "Adding %s to list of bridges." -msgstr "Adicionando %s na lista de pontes." - -msgid "Agent initialized successfully, now running... " -msgstr "Agente inicializado com êxito; em execução agora... " - -msgid "Agent out of sync with plugin!" -msgstr "Agente fora de sincronização com o plug-in!" - -msgid "Agent tunnel out of sync with plugin!" -msgstr "Túnel do agente fora de sincronização com o plug-in!" - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "alocada VLAN (%d) do pool" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "" -"Permitir que a classificação seja ativada porque a paginação nativa requer " -"classificação nativa" - -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "Nomes permitidos de rede flat physical_network : %s" - -msgid "Arbitrary flat physical_network names allowed" -msgstr "Nomes arbitrários de rede flat physical_network permitidos" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "Designando %(vlan_id)s como vlan local para net-id=%(net_uuid)s" - -#, python-format -msgid "Attachment %s removed" -msgstr "Anexo %s removido" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "Tentou remover o filtro de porta que não foi filtrado %r" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "Tentou atualizar o filtro de porta que não foi filtrado %s" - -#, python-format -msgid "Config paste file: %s" -msgstr "Arquivo de colagem configurado: %s" - -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "Configurados nomes para o driver de mecanismo: %s" - -#, python-format -msgid "Configured type driver names: %s" -msgstr "Configurado nomes para o driver de tipo: %s" - -msgid "DHCP agent started" -msgstr "Agente DHCP iniciado" - -#, python-format -msgid "Default provider is not specified for service type %s" -msgstr "Provedor padrão não foi especificado para o tipo de serviço %s" - -#, python-format -msgid "Deleting port: %s" -msgstr "Deletando porta: %s" - -#, python-format -msgid "Device %s already exists" -msgstr "O dispositivo %s já existe" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "Dispositivo %s não definido no plug-in" - -msgid "Disabled security-group extension." -msgstr "Extensão de grupo de segurança desativada." - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "Localizado endereço IP inválido no pool: %(start)s - %(end)s:" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "Localizados intervalos de sobreposição: %(l_range)s e %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "Localizado pool maior que a sub-rede CIDR:%(start)s - %(end)s" - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "Exceção de HTTP lançada: %s" - -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "inicializando driver para o tipo '%s'" - -msgid "Initializing extension manager." -msgstr "Inicializando o Extension Manager." - -#, python-format -msgid "Initializing mechanism driver '%s'" -msgstr "Inicializando driver de mecanismo '%s'" - -#, python-format -msgid "Interface mappings: %s" -msgstr "Mapeamentos da interface: %s" - -msgid "L3 agent started" -msgstr "Agente L3 iniciado" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "Daemon RPC do Agente LinuxBridge Iniciado!" - -#, python-format -msgid "Loaded extension: %s" -msgstr "Extensão carregada: %s" - -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "Carregados nomes do driver de mecanismo: %s" - -#, python-format -msgid "Loaded type driver names: %s" -msgstr "Carregados nomes do driver de tipo: %s" - -#, python-format -msgid "Loading Metering driver %s" -msgstr "Carregando driver de medição %s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "Carregando Plug-in: %s" - -msgid "Logging enabled!" -msgstr "Criação de log ativada!" - -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "Inicialização do ML2 FlatTypeDriver concluída" - -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "Inicialização do ML2 LocalTypeDriver concluída" - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "Mapeamento de rede física %(physical_network)s para a ponte %(bridge)s" - -msgid "Modular L2 Plugin initialization complete" -msgstr "Inicialização de plug-in L2 modular concluída" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "Intervalos de VLAN de rede: %s" - -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "Serviço Neutron iniciado, escutando em %(host)s:%(port)s" - -msgid "No ports here to refresh firewall" -msgstr "Nenhuma porta aqui para atualizar firewall" - -msgid "OVS cleanup completed successfully" -msgstr "Limpeza de OVS concluída com êxito" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "Porta %(device)s atualizada. Detalhes: %(details)s" - -#, python-format -msgid "Port %s updated." -msgstr "Porta %s atualizada." - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "Preparando filtros para dispositivos %s" - -msgid "Provider rule updated" -msgstr "Regra do provedor atualizada" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "agent_id de RPC: %s" - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "Recuperando vlan = %(vlan_id)s a partir de net-id = %(net_uuid)s" - -msgid "Refresh firewall rules" -msgstr "Atualizar regras de firewall" - -#, python-format -msgid "Registered mechanism drivers: %s" -msgstr "Registrados drivers de mecanismo : %s" - -#, python-format -msgid "Registered types: %s" -msgstr "Tipos registrados: %s" - -#, python-format -msgid "Remove device filter for %r" -msgstr "Remover filtro de dispositivo para %r" - -msgid "SNAT already bound to a service node." -msgstr "SNAT já conectado a um nó de serviço." - -#, python-format -msgid "Security group member updated %r" -msgstr "Membro do grupo de segurança atualizado %r" - -#, python-format -msgid "Security group rule updated %r" -msgstr "Regra do grupo de segurança atualizada %r" - -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "Serviço %s é suportado pelo plugin núcleo" - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "Ignorando a porta %s porque nenhum IP está configurado nela" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "Endereços IP especificado não correspondem à versão do IP da sub-rede" - -msgid "Synchronizing state" -msgstr "Sincronizando estado" - -msgid "Synchronizing state complete" -msgstr "Sincronizando estado finalizado" - -#, python-format -msgid "Tenant network_types: %s" -msgstr "Tipos de network_types: %s" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"A validação para CIDR: %(new_cidr)s falhou - se sobrepõe com a sub-rede " -"%(subnet_id)s (CIDR: %(cidr)s)" - -msgid "VlanTypeDriver initialization complete" -msgstr "Inicialização do VlanTypeDriver concluída" - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated por lado do servidor %s!" diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 9f8dbfa24ad..00000000000 --- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,334 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# 汪军 , 2015 -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev207\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-18 06:06+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Chinese (China) (http://www.transifex.com/openstack/neutron/" -"language/zh_CN/)\n" -"Language: zh-CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(action)s failed (client error): %(exc)s" -msgstr "%(action)s 失败 (客户端错误): %(exc)s" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(prog)s version %(version)s" -msgstr "%(prog)s 版本 %(version)s" - -#, python-format -msgid "%(type)s ID ranges: %(range)s" -msgstr "%(type)s ID 范围: %(range)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s 返回了故障:%(exception)s" - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s 随HTTP %(status)d返回" - -#, python-format -msgid "" -"Added segment %(id)s of type %(network_type)s for network %(network_id)s" -msgstr "增添segment%(id)s种类%(network_type)s在网络%(network_id)s" - -msgid "Agent initialized successfully, now running... " -msgstr "代理已成功初始化,现在正在运行..." - -msgid "Agent out of sync with plugin!" -msgstr "代理与插件不同步!" - -msgid "Agent tunnel out of sync with plugin!" -msgstr "代理隧道与插件不同步!" - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "已从池分配 vlan (%d)" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "已启用允许排序,因为本机分页需要本机排序" - -#, python-format -msgid "Allowable flat physical_network names: %s" -msgstr "可以使用的平面物理网络名字: %s" - -msgid "Arbitrary flat physical_network names allowed" -msgstr "允许平面物理网络使用任意名字" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "对于网络标识 %(net_uuid)s,正在将 %(vlan_id)s 分配为本地 vlan" - -#, python-format -msgid "Attachment %s removed" -msgstr "已除去附件 %s" - -#, python-format -msgid "Attempt %(count)s to bind port %(port)s" -msgstr "尝试 %(count)s 次绑定端口 %(port)s" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "已尝试除去未过滤的端口过滤器 %r" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "已尝试更新未过滤的端口过滤器 %s" - -#, python-format -msgid "Config paste file: %s" -msgstr "配置粘贴文件:%s" - -#, python-format -msgid "Configured mechanism driver names: %s" -msgstr "配置装置驱动名称: %s" - -#, python-format -msgid "Configured type driver names: %s" -msgstr "配置类型驱动名字: %s" - -msgid "DHCP agent started" -msgstr "已启动 DHCP 代理" - -#, python-format -msgid "Deleting port: %s" -msgstr "正在删除端口: %s" - -#, python-format -msgid "Device %s already exists" -msgstr "设备 %s 已存在" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "未在插件上定义设备 %s" - -msgid "Disabled security-group extension." -msgstr "已禁用安全组扩展。" - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "在池中找到无效 IP 地址:%(start)s - %(end)s:" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "找到重叠范围:%(l_range)s 和 %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "找到超过子网 CIDR (%(start)s - %(end)s) 的池" - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "HTTP 异常抛出:%s" - -msgid "IPv6 is not enabled on this system." -msgstr "IPv6在本系统上未使能。" - -msgid "Initializing CRD client... " -msgstr "正在初始化CRD客户端 ..." - -#, python-format -msgid "Initializing driver for type '%s'" -msgstr "为类型 '%s'初始化驱动" - -#, python-format -msgid "Initializing extension driver '%s'" -msgstr "初始化扩展驱动 '%s'" - -msgid "Initializing extension manager." -msgstr "正在初始化扩展管理员。" - -#, python-format -msgid "Interface mappings: %s" -msgstr "接口映射:%s" - -msgid "L3 agent started" -msgstr "已启动 L3 代理" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "LinuxBridge 代理 RPC 守护程序已启动!" - -#, python-format -msgid "Loaded extension: %s" -msgstr "加载的扩展:%s" - -#, python-format -msgid "Loaded mechanism driver names: %s" -msgstr "已加载的装置驱动名称: %s" - -#, python-format -msgid "Loaded type driver names: %s" -msgstr "已加载驱动程序: %s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "正在装入插件:%s" - -#, python-format -msgid "Loading core plugin: %s" -msgstr "加载核心插件: %s" - -#, python-format -msgid "Loading interface driver %s" -msgstr "正在加载接口驱动 %s" - -msgid "Logging enabled!" -msgstr "已启用日志记录!" - -msgid "ML2 FlatTypeDriver initialization complete" -msgstr "完成ML2 FlatTypeDriver的初始化" - -msgid "ML2 LocalTypeDriver initialization complete" -msgstr "完成L2插件模块初始化" - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "正在将物理网络 %(physical_network)s 映射至网桥 %(bridge)s" - -msgid "Modular L2 Plugin initialization complete" -msgstr "L2插件模块初始化完成" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "网络 VLAN 范围:%s" - -#, python-format -msgid "Neutron service started, listening on %(host)s:%(port)s" -msgstr "Neutron服务启动,正在%(host)s:%(port)s上监听" - -#, python-format -msgid "Nova event response: %s" -msgstr "Nova 事件响应: %s" - -msgid "OVS cleanup completed successfully" -msgstr "OVS 清除已成功完成" - -#, python-format -msgid "Physical Devices mappings: %s" -msgstr "物理设备映射:%s" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "端口 %(device)s 已更新。详细信息:%(details)s" - -#, python-format -msgid "Port %(port_id)s not present in bridge %(br_name)s" -msgstr "端口 %(port_id)s 在桥 %(br_name)s中不存在" - -#, python-format -msgid "Port %s updated." -msgstr "端口 %s 已更新。" - -#, python-format -msgid "Port %s was deleted concurrently" -msgstr "端口 %s 被同时删除" - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "正在为设备 %s 准备过滤器" - -#, python-format -msgid "Process runs with uid/gid: %(uid)s/%(gid)s" -msgstr "进程运行uid/gid: %(uid)s/%(gid)s" - -msgid "Provider rule updated" -msgstr "已更新提供程序规则" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC agent_id:%s" - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "正在从网络标识 %(net_uuid)s 恢复 vlan %(vlan_id)s" - -msgid "Refresh firewall rules" -msgstr "请刷新防火墙规则" - -#, python-format -msgid "Registered types: %s" -msgstr "已注册类型: %s" - -#, python-format -msgid "Remove device filter for %r" -msgstr "请为 %r 除去设备过滤器" - -#, python-format -msgid "Router %(router_id)s transitioned to %(state)s" -msgstr "路由器%(router_id)s 转换为%(state)s" - -#, python-format -msgid "" -"Router %s is not managed by this agent. It was possibly deleted concurrently." -msgstr "路由器%s没有被改该代理管理。可能已经被删除。" - -msgid "SNAT already bound to a service node." -msgstr "SNAT 已经绑定到服务节点。" - -#, python-format -msgid "Security group member updated %r" -msgstr "已更新安全组成员 %r" - -#, python-format -msgid "Security group rule updated %r" -msgstr "已更新安全组规则 %r" - -#, python-format -msgid "Service %s is supported by the core plugin" -msgstr "服务%s由核心插件支持" - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "正在跳过端口 %s,因为没有在该端口上配置任何 IP" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "指定的 IP 地址与子网 IP 版本不匹配" - -#, python-format -msgid "Subnet %s was deleted concurrently" -msgstr "子网 %s 同时被删除 " - -msgid "Synchronizing state" -msgstr "正在使状态同步" - -msgid "Synchronizing state complete" -msgstr "同步状态完成" - -#, python-format -msgid "Tenant network_types: %s" -msgstr "项目网络类型: %s" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"针对 CIDR %(new_cidr)s 的验证失败 - 与子网 %(subnet_id)s(CIDR 为 %(cidr)s)" -"重叠" - -msgid "VlanTypeDriver initialization complete" -msgstr "Vlan类型驱动初始化完成" - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "服务器端 %s 已更新代理!" diff --git a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po b/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po deleted file mode 100644 index 17f60834d7a..00000000000 --- a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po +++ /dev/null @@ -1,195 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# -# Translators: -# OpenStack Infra , 2015. #zanata -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev207\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-18 06:06+0000\n" -"PO-Revision-Date: 2015-08-01 03:37+0000\n" -"Last-Translator: openstackjenkins \n" -"Language-Team: Chinese (Taiwan) (http://www.transifex.com/openstack/neutron/" -"language/zh_TW/)\n" -"Language: zh-TW\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Zanata 3.7.1\n" - -#, python-format -msgid "%(method)s %(url)s" -msgstr "%(method)s %(url)s" - -#, python-format -msgid "%(url)s returned a fault: %(exception)s" -msgstr "%(url)s 傳回了錯誤:%(exception)s" - -#, python-format -msgid "%(url)s returned with HTTP %(status)d" -msgstr "%(url)s 傳回了 HTTP %(status)d" - -msgid "Agent initialized successfully, now running... " -msgstr "已順利地起始設定代理程式,現正在執行中..." - -msgid "Agent out of sync with plugin!" -msgstr "代理程式與外掛程式不同步!" - -msgid "Agent tunnel out of sync with plugin!" -msgstr "代理程式通道與外掛程式不同步!" - -#, python-format -msgid "Allocated vlan (%d) from the pool" -msgstr "已從儲存區配置 VLAN (%d)" - -msgid "" -"Allow sorting is enabled because native pagination requires native sorting" -msgstr "已啟用容許排序,因為原生分頁需要原生排序" - -#, python-format -msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s" -msgstr "正在將 %(vlan_id)s 指派為 net-id = %(net_uuid)s 的本端 VLAN" - -#, python-format -msgid "Attachment %s removed" -msgstr "已移除連接裝置 %s" - -#, python-format -msgid "Attempted to remove port filter which is not filtered %r" -msgstr "已嘗試移除未過濾的埠過濾器 %r" - -#, python-format -msgid "Attempted to update port filter which is not filtered %s" -msgstr "已嘗試更新未過濾的埠過濾器 %s" - -#, python-format -msgid "Config paste file: %s" -msgstr "配置貼上檔案:%s" - -msgid "DHCP agent started" -msgstr "已啟動 DHCP 代理程式" - -#, python-format -msgid "Device %s already exists" -msgstr "裝置 %s 已存在" - -#, python-format -msgid "Device %s not defined on plugin" -msgstr "外掛程式上未定義裝置 %s" - -msgid "Disabled security-group extension." -msgstr "已停用安全群組延伸。" - -#, python-format -msgid "Found invalid IP address in pool: %(start)s - %(end)s:" -msgstr "在儲存區中發現無效的 IP 位址:%(start)s - %(end)s:" - -#, python-format -msgid "Found overlapping ranges: %(l_range)s and %(r_range)s" -msgstr "發現重疊的範圍:%(l_range)s 及 %(r_range)s" - -#, python-format -msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s" -msgstr "找到的儲存區大於子網路 CIDR:%(start)s - %(end)s" - -#, python-format -msgid "HTTP exception thrown: %s" -msgstr "已擲出 HTTP 異常狀況:%s" - -msgid "Initializing extension manager." -msgstr "正在起始設定延伸管理程式。" - -#, python-format -msgid "Interface mappings: %s" -msgstr "介面對映:%s" - -msgid "L3 agent started" -msgstr "已啟動 L3 代理程式" - -msgid "LinuxBridge Agent RPC Daemon Started!" -msgstr "已啟動「LinuxBridge 代理程式 RPC 常駐程式」!" - -#, python-format -msgid "Loaded extension: %s" -msgstr "已載入延伸:%s" - -#, python-format -msgid "Loading Plugin: %s" -msgstr "正在載入外掛程式:%s" - -msgid "Logging enabled!" -msgstr "已啟用記載!" - -#, python-format -msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s" -msgstr "正在將實體網路 %(physical_network)s 對映到橋接器 %(bridge)s" - -#, python-format -msgid "Network VLAN ranges: %s" -msgstr "網路 VLAN 範圍:%s" - -msgid "OVS cleanup completed successfully" -msgstr "已順利完成 OVS 清理" - -#, python-format -msgid "Port %(device)s updated. Details: %(details)s" -msgstr "已更新埠 %(device)s。詳細資料:%(details)s" - -#, python-format -msgid "Port %s updated." -msgstr "已更新埠 %s。" - -#, python-format -msgid "Preparing filters for devices %s" -msgstr "正在準備裝置 %s 的過濾器" - -msgid "Provider rule updated" -msgstr "已更新提供者規則" - -#, python-format -msgid "RPC agent_id: %s" -msgstr "RPC agent_id:%s" - -#, python-format -msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s" -msgstr "正在從 net-id = %(net_uuid)s 收回 VLAN = %(vlan_id)s" - -msgid "Refresh firewall rules" -msgstr "重新整理防火牆規則" - -#, python-format -msgid "Remove device filter for %r" -msgstr "移除 %r 的裝置過濾器" - -#, python-format -msgid "Security group member updated %r" -msgstr "安全群組成員已更新 %r" - -#, python-format -msgid "Security group rule updated %r" -msgstr "安全群組規則已更新 %r" - -#, python-format -msgid "Skipping port %s as no IP is configure on it" -msgstr "正在跳過埠 %s,因為其上沒有配置 IP" - -msgid "Specified IP addresses do not match the subnet IP version" -msgstr "指定的 IP 位址與子網路 IP 版本不符" - -msgid "Synchronizing state" -msgstr "正在同步化狀態" - -#, python-format -msgid "" -"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet " -"%(subnet_id)s (CIDR: %(cidr)s)" -msgstr "" -"驗證 CIDR %(new_cidr)s 失敗 - 與子網路 %(subnet_id)s (CIDR %(cidr)s) 重疊" - -#, python-format -msgid "agent_updated by server side %s!" -msgstr "agent_updated 是由伺服器端 %s 執行!" From 69662eb3cad925a3933f2ba3e5ef03dbde52ffc9 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Fri, 18 Sep 2015 07:15:45 -0700 Subject: [PATCH 04/20] Don't write DHCP opts for SLAAC entries Change I81b4669eadaa9119e08c6a5e1d2a7b5959babdcc caused DHCP options to be written for SLAAC entries when they previously were not. This restores the previous behavior. Closes-Bug: #1499054 Change-Id: I81400305f166d62aa4612aab54602abb8178b64c (cherry picked from commit 22f5fef5251cff9dbce35ca9a0ec8ea3b42f359c) --- neutron/agent/linux/dhcp.py | 21 ++++++++++++----- neutron/tests/unit/agent/linux/test_dhcp.py | 26 +++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index c79f6577dbe..d47abfca1ec 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -512,7 +512,9 @@ class Dnsmasq(DhcpLocalProcess): # an IPv6 address because of stateless DHCPv6 network. host_name, # Host name. name, # Canonical hostname in the format 'hostname[.domain]'. - no_dhcp, # A flag indicating that the address doesn't need DHCP. + no_dhcp, # A flag indicating that the address doesn't need a DHCP + # IP address. + no_opts, # A flag indication that options shouldn't be written ) """ v6_nets = dict((subnet.id, subnet) for subnet in @@ -528,10 +530,14 @@ class Dnsmasq(DhcpLocalProcess): dns_ip_map = {d.ip_address: d for d in dns_assignment} for alloc in fixed_ips: no_dhcp = False + no_opts = False if alloc.subnet_id in v6_nets: addr_mode = v6_nets[alloc.subnet_id].ipv6_address_mode no_dhcp = addr_mode in (constants.IPV6_SLAAC, constants.DHCPV6_STATELESS) + # we don't setup anything for SLAAC. It doesn't make sense + # to provide options for a client that won't use DHCP + no_opts = addr_mode == constants.IPV6_SLAAC # If dns_name attribute is supported by ports API, return the # dns_assignment generated by the Neutron server. Otherwise, @@ -545,7 +551,7 @@ class Dnsmasq(DhcpLocalProcess): fqdn = hostname if self.conf.dhcp_domain: fqdn = '%s.%s' % (fqdn, self.conf.dhcp_domain) - yield (port, alloc, hostname, fqdn, no_dhcp) + yield (port, alloc, hostname, fqdn, no_dhcp, no_opts) def _get_port_extra_dhcp_opts(self, port): return getattr(port, edo_ext.EXTRADHCPOPTS, False) @@ -577,7 +583,8 @@ class Dnsmasq(DhcpLocalProcess): timestamp = int(time.time()) + self.conf.dhcp_lease_duration dhcp_enabled_subnet_ids = [s.id for s in self.network.subnets if s.enable_dhcp] - for (port, alloc, hostname, name, no_dhcp) in self._iter_hosts(): + for host_tuple in self._iter_hosts(): + port, alloc, hostname, name, no_dhcp, no_opts = host_tuple # don't write ip address which belongs to a dhcp disabled subnet # or an IPv6 SLAAC/stateless subnet if no_dhcp or alloc.subnet_id not in dhcp_enabled_subnet_ids: @@ -627,9 +634,10 @@ class Dnsmasq(DhcpLocalProcess): if s.enable_dhcp] # NOTE(ihrachyshka): the loop should not log anything inside it, to # avoid potential performance drop when lots of hosts are dumped - for (port, alloc, hostname, name, no_dhcp) in self._iter_hosts(): + for host_tuple in self._iter_hosts(): + port, alloc, hostname, name, no_dhcp, no_opts = host_tuple if no_dhcp: - if self._get_port_extra_dhcp_opts(port): + if not no_opts and self._get_port_extra_dhcp_opts(port): buf.write('%s,%s%s\n' % (port.mac_address, 'set:', port.id)) continue @@ -722,7 +730,8 @@ class Dnsmasq(DhcpLocalProcess): file. """ buf = six.StringIO() - for (port, alloc, hostname, fqdn, no_dhcp) in self._iter_hosts(): + for host_tuple in self._iter_hosts(): + port, alloc, hostname, fqdn, no_dhcp, no_opts = host_tuple # It is compulsory to write the `fqdn` before the `hostname` in # order to obtain it in PTR responses. if alloc: diff --git a/neutron/tests/unit/agent/linux/test_dhcp.py b/neutron/tests/unit/agent/linux/test_dhcp.py index 929cc2d35d6..c28c51c9233 100644 --- a/neutron/tests/unit/agent/linux/test_dhcp.py +++ b/neutron/tests/unit/agent/linux/test_dhcp.py @@ -729,6 +729,19 @@ class FakeDualStackNetworkSingleDHCP(object): ports = [FakePort1(), FakePort4(), FakeRouterPort()] +class FakeDualStackNetworkingSingleDHCPTags(object): + id = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee' + + subnets = [FakeV4Subnet(), FakeV6SubnetSlaac()] + ports = [FakePort1(), FakePort4(), FakeRouterPort()] + + def __init__(self): + for port in self.ports: + port.extra_dhcp_opts = [ + DhcpOpt(opt_name='tag:ipxe,bootfile-name', + opt_value='pxelinux.0')] + + class FakeV4NetworkMultipleTags(object): id = 'dddddddd-dddd-dddd-dddd-dddddddddddd' subnets = [FakeV4Subnet()] @@ -1852,6 +1865,19 @@ class TestDnsmasq(TestBase): self.safe.assert_has_calls([mock.call(exp_host_name, exp_host_data), mock.call(exp_opt_name, exp_opt_data)]) + def test_host_file_on_net_with_v6_slaac_and_v4(self): + exp_host_name = '/dhcp/eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee/host' + exp_host_data = ( + '00:00:80:aa:bb:cc,host-192-168-0-2.openstacklocal.,192.168.0.2,' + 'set:eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee\n' + '00:16:3E:C2:77:1D,host-192-168-0-4.openstacklocal.,192.168.0.4,' + 'set:gggggggg-gggg-gggg-gggg-gggggggggggg\n00:00:0f:rr:rr:rr,' + 'host-192-168-0-1.openstacklocal.,192.168.0.1,' + 'set:rrrrrrrr-rrrr-rrrr-rrrr-rrrrrrrrrrrr\n').lstrip() + dm = self._get_dnsmasq(FakeDualStackNetworkingSingleDHCPTags()) + dm._output_hosts_file() + self.safe.assert_has_calls([mock.call(exp_host_name, exp_host_data)]) + def test_host_and_opts_file_on_net_with_V6_stateless_and_V4_subnets( self): exp_host_name = '/dhcp/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb/host' From 2ed841f58d931bc9a2d29172d26c03d7cb6862e6 Mon Sep 17 00:00:00 2001 From: Terry Wilson Date: Mon, 28 Sep 2015 17:42:25 -0500 Subject: [PATCH 05/20] Check idl.run() return value before blocking The IDL change_seqno can change as a result of running idl.run(), and it returns True if there has been a change. The existing code would block without checking the return value, and therefor could block until another change occurred, or the timeout was reached. Closes-Bug: #1501090 Change-Id: I9b7aac2755e6e6b69165023e01583337f9d30f15 (cherry picked from commit 5dba2ac71c16cfd11937cf4becbaabd5b807678d) --- neutron/agent/ovsdb/native/idlutils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/neutron/agent/ovsdb/native/idlutils.py b/neutron/agent/ovsdb/native/idlutils.py index 22aa0008a36..b02acd30553 100644 --- a/neutron/agent/ovsdb/native/idlutils.py +++ b/neutron/agent/ovsdb/native/idlutils.py @@ -115,8 +115,7 @@ def wait_for_change(_idl, timeout, seqno=None): if seqno is None: seqno = _idl.change_seqno stop = time.time() + timeout - while _idl.change_seqno == seqno: - _idl.run() + while _idl.change_seqno == seqno and not _idl.run(): ovs_poller = poller.Poller() _idl.wait(ovs_poller) ovs_poller.timer_wait(timeout * 1000) From 48a9cd433c09bbf4b80a4665f625cd3754db0f00 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Fri, 2 Oct 2015 06:33:59 +0000 Subject: [PATCH 06/20] Imported Translations from Zanata For more information about this automatic import see: https://wiki.openstack.org/wiki/Translations/Infrastructure Change-Id: Ib6bba07a6f0cb3c2f9eda98c5f9f0c93c84e2ea0 --- neutron/locale/de/LC_MESSAGES/neutron.po | 7 +- neutron/locale/es/LC_MESSAGES/neutron.po | 7 +- neutron/locale/fr/LC_MESSAGES/neutron.po | 65 ++++++++++- neutron/locale/it/LC_MESSAGES/neutron.po | 7 +- neutron/locale/ja/LC_MESSAGES/neutron.po | 121 +++++++++++--------- neutron/locale/ko_KR/LC_MESSAGES/neutron.po | 7 +- neutron/locale/neutron-log-critical.pot | 19 --- neutron/locale/pt_BR/LC_MESSAGES/neutron.po | 7 +- neutron/locale/ru/LC_MESSAGES/neutron.po | 7 +- neutron/locale/tr_TR/LC_MESSAGES/neutron.po | 7 +- neutron/locale/zh_CN/LC_MESSAGES/neutron.po | 7 +- neutron/locale/zh_TW/LC_MESSAGES/neutron.po | 7 +- 12 files changed, 164 insertions(+), 104 deletions(-) delete mode 100644 neutron/locale/neutron-log-critical.pot diff --git a/neutron/locale/de/LC_MESSAGES/neutron.po b/neutron/locale/de/LC_MESSAGES/neutron.po index f9abe1b23d7..f1950c6c7ac 100644 --- a/neutron/locale/de/LC_MESSAGES/neutron.po +++ b/neutron/locale/de/LC_MESSAGES/neutron.po @@ -8,17 +8,18 @@ # Tom Cocozzello , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-06 10:15+0000\n" "Last-Translator: openstackjenkins \n" +"Language: de\n" "Language-Team: German\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" diff --git a/neutron/locale/es/LC_MESSAGES/neutron.po b/neutron/locale/es/LC_MESSAGES/neutron.po index 2fe61002818..aa2315401a3 100644 --- a/neutron/locale/es/LC_MESSAGES/neutron.po +++ b/neutron/locale/es/LC_MESSAGES/neutron.po @@ -8,18 +8,19 @@ # Tom Cocozzello , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-06 10:15+0000\n" "Last-Translator: openstackjenkins \n" +"Language: es\n" "Language-Team: Spanish (http://www.transifex.com/openstack/neutron/language/" "es/)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" diff --git a/neutron/locale/fr/LC_MESSAGES/neutron.po b/neutron/locale/fr/LC_MESSAGES/neutron.po index 4c47ee9b73e..72e18880e69 100644 --- a/neutron/locale/fr/LC_MESSAGES/neutron.po +++ b/neutron/locale/fr/LC_MESSAGES/neutron.po @@ -6,22 +6,24 @@ # François Bureau, 2013 # Maxime COQUEREL , 2014-2015 # Patrice LACHANCE , 2013 +# Cedric Savignan , 2015. #zanata # OpenStack Infra , 2015. #zanata # Tom Cocozzello , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" -"PO-Revision-Date: 2015-09-06 10:15+0000\n" -"Last-Translator: openstackjenkins \n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" +"PO-Revision-Date: 2015-09-25 12:37+0000\n" +"Last-Translator: Cedric Savignan \n" +"Language: fr\n" "Language-Team: French (http://www.transifex.com/openstack/neutron/language/" "fr/)\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" @@ -217,6 +219,9 @@ msgstr "'%s' doit être un nombre décimal non négatif." msgid "'%s' should be non-negative" msgstr "'%s' ne doit pas être négatif." +msgid "'.' searches are not implemented" +msgstr "'.' recherches ne sont pas implémentées. " + msgid "0 is not allowed as CIDR prefix length" msgstr "La longueur 0 n'est pas autorisée pour le préfixe CIDR" @@ -511,6 +516,10 @@ msgstr "Impossible de créer une ressource pour un autre titulaire" msgid "Cannot disable enable_dhcp with ipv6 attributes set" msgstr "Impossible de désactiver enable_dhcp avec des attributs ipv6 définis" +#, python-format +msgid "Cannot find %(table)s with %(col)s=%(match)s" +msgstr "Impossible de trouver %(table)s avec %(col)s=%(match)s" + #, python-format msgid "" "Cannot have multiple router ports with the same network id if both contain " @@ -743,6 +752,12 @@ msgstr "Supprimez l'espace de nom en supprimant toutes les unités." msgid "Deleting port %s" msgstr "Suppression du port %s" +msgid "Destroy IPsets even if there is an iptables reference." +msgstr "Détruire les IPsets même s'il y a une référence iptables." + +msgid "Destroy all IPsets." +msgstr "Destruction de tous les IPsets." + msgid "" "Determines if connections are allowed to be held open by clients after a " "request is fulfilled. A value of False will ensure that the socket " @@ -780,6 +795,15 @@ msgstr "" msgid "Domain to use for building the hostnames" msgstr "Domaine à utiliser pour générer les noms d'hôte" +msgid "" +"Domain to use for building the hostnames.This option is deprecated. It has " +"been moved to neutron.conf as dns_domain. It will removed from here in a " +"future release" +msgstr "" +"Domaine à utiliser pour construire les noms d’hôtes. Cette option est " +"devenue obsolète. Elle a été remplacée par dns_domain dans neutron.conf. " +"Elle sera supprimée dans une version future." + msgid "Downgrade no longer supported" msgstr "La rétromigration n'est plus prise en charge" @@ -1013,6 +1037,9 @@ msgstr "" msgid "Extension with alias %s does not exist" msgstr "L'extension avec l'alias %s n'existe pas" +msgid "Extensions list to use" +msgstr "Liste d'extensions à utiliser." + #, python-format msgid "Extensions not found: %(extensions)s" msgstr "Extensions non trouvé: %(extensions)s " @@ -1260,6 +1287,9 @@ msgstr "Adresse IP utilisée par le serveur de métadonnées Nova" msgid "IP allocation requires subnet_id or ip_address" msgstr "L'allocation d'adresse IP requiert subnet_id ou ip_address" +msgid "IPAM driver to use." +msgstr "Pilote IPAM à utiliser." + #, python-format msgid "" "IPTablesManager.apply failed to apply the following set of iptables rules:\n" @@ -1479,6 +1509,10 @@ msgstr "" "Format de fournisseur non valide. La dernière partie doit être 'default' ou " "vide : %s" +#, python-format +msgid "Invalid resource type %(resource_type)s" +msgstr "Ressource type %(resource_type)s non valide" + #, python-format msgid "Invalid route: %s" msgstr "Chemin non valide : %s" @@ -2011,6 +2045,10 @@ msgstr "Type de SE du commutateur" msgid "OS Version number" msgstr "Numéro de version OS" +#, python-format +msgid "Object %(id)s not found." +msgstr "Objet %(id)s non trouvé." + #, python-format msgid "Object action %(action)s failed because: %(reason)s" msgstr "L'action de l'objet %(action)s a échoué car : %(reason)s" @@ -2184,6 +2222,19 @@ msgstr "Protocole d'accès aux métadonnées de nova, HTTP ou https" msgid "Provider name is limited by 255 characters: %s" msgstr "Le nom de fournisseur est limité à 255 caractères : %s" +#, python-format +msgid "QoS Policy %(policy_id)s is used by %(object_type)s %(object_id)s." +msgstr "" +"Stratégie QoS %(policy_id)s est utilisée par %(object_type)s %(object_id)s." + +#, python-format +msgid "QoS policy %(policy_id)s could not be found" +msgstr "Stratégie QoS %(policy_id)s introuvable" + +#, python-format +msgid "QoS rule %(rule_id)s for policy %(policy_id)s could not be found" +msgstr "Règle de QoS %(rule_id)s pour la stratégie %(policy_id)s introuvable" + #, python-format msgid "Quota exceeded for resources: %(overs)s" msgstr "Quota dépassé pour les ressources : %(overs)s" @@ -2255,6 +2306,10 @@ msgstr "" "Le sous-réseau demandé avec le routage CIDR : %(cidr)s pour le réseau : " "%(network_id)s chevauche un autre sous-réseau" +#, python-format +msgid "Resource %(resource_id)s of type %(resource_type)s not found" +msgstr "Ressource %(resource_id)s de type %(resource_type)s non trouvée." + #, python-format msgid "" "Resource '%(resource_id)s' is already associated with provider " diff --git a/neutron/locale/it/LC_MESSAGES/neutron.po b/neutron/locale/it/LC_MESSAGES/neutron.po index b7c26c47037..9ade0b0cf63 100644 --- a/neutron/locale/it/LC_MESSAGES/neutron.po +++ b/neutron/locale/it/LC_MESSAGES/neutron.po @@ -7,18 +7,19 @@ # Tom Cocozzello , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-06 10:15+0000\n" "Last-Translator: openstackjenkins \n" +"Language: it\n" "Language-Team: Italian (http://www.transifex.com/openstack/neutron/language/" "it/)\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" diff --git a/neutron/locale/ja/LC_MESSAGES/neutron.po b/neutron/locale/ja/LC_MESSAGES/neutron.po index d4deb79c9de..0c9d8734bb5 100644 --- a/neutron/locale/ja/LC_MESSAGES/neutron.po +++ b/neutron/locale/ja/LC_MESSAGES/neutron.po @@ -7,22 +7,24 @@ # Sasuke(Kyohei MORIYAMA) <>, 2015 # NachiUeno , 2013 # Tomoyuki KATO , 2013 +# Akihiro Motoki , 2015. #zanata # OpenStack Infra , 2015. #zanata # Tom Cocozzello , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" -"PO-Revision-Date: 2015-09-06 10:15+0000\n" -"Last-Translator: openstackjenkins \n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" +"PO-Revision-Date: 2015-09-23 08:01+0000\n" +"Last-Translator: Akihiro Motoki \n" +"Language: ja\n" "Language-Team: Japanese (http://www.transifex.com/openstack/neutron/language/" "ja/)\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" @@ -285,9 +287,9 @@ msgstr "" "ます" msgid "Agent should implement routers with no gateway" -msgstr "エージェントは、ゲートウェイなしでルーターを実装する必要があります" +msgstr "エージェントは、ゲートウェイなしのルーターを扱える必要があります" -#, python-format +#, fuzzy, python-format msgid "Agent updated: %(payload)s" msgstr "エージェントがアップデートされました: %(payload)s" @@ -316,7 +318,7 @@ msgstr "" "除される予定です。" msgid "Allow running metadata proxy." -msgstr "メタデータプロキシの動作許可します" +msgstr "メタデータプロキシーの動作許可します" msgid "Allow sending resource operation notification to DHCP agent" msgstr "DHCP エージェントへのリソース操作通知の送信を許可" @@ -518,6 +520,7 @@ msgstr "" "%(router_type)s ルーター %(router_id)s を %(agent_mode)s L3 エージェント " "%(agent_id)s でホストできません。" +#, fuzzy msgid "Cannot match priority on flow deletion or modification" msgstr "flowの削除か設定の優先度が一致できません" @@ -542,6 +545,7 @@ msgstr "読み取り専用属性 %s を更新できません" msgid "Certificate Authority public key (CA cert) file for ssl" msgstr "ssl の認証局公開鍵 (CA cert) ファイル" +#, fuzzy msgid "Certificate file to use when starting the server securely" msgstr "サーバーを安全に始動するときに使用される証明書ファイル" @@ -621,6 +625,7 @@ msgstr "CIDR %(cidr)s のイーサネット・タイプ値 %(ethertype)s が競 msgid "Connection is closed by the server." msgstr "接続がサーバーによってクローズされました。" +#, fuzzy msgid "" "Controls whether the neutron security group API is enabled in the server. It " "should be false when using no security groups or using the nova security " @@ -630,7 +635,7 @@ msgstr "" "す。セキュリティー・グループを使用しない場合、または Nova セキュリティー・グ" "ループ API を使用する場合には、False にする必要があります。" -#, python-format +#, fuzzy, python-format msgid "Could not bind to %(host)s:%(port)s after trying for %(time)d seconds" msgstr "%(time)d 秒間の試行後に %(host)s:%(port)s にバインドできませんでした" @@ -638,6 +643,7 @@ msgstr "%(time)d 秒間の試行後に %(host)s:%(port)s にバインドでき msgid "Could not create a %(resource)s under tenant %(tenant_id)s" msgstr "%(resource)s をテナント %(tenant_id)s 下で作成できませんでした" +#, fuzzy msgid "Could not deserialize data" msgstr "データを非直列化することができませんでした" @@ -718,6 +724,7 @@ msgstr "すべてのデバイスを削除して、名前空間を削除します msgid "Deleting port %s" msgstr "ポート %s を削除しています" +#, fuzzy msgid "" "Determines if connections are allowed to be held open by clients after a " "request is fulfilled. A value of False will ensure that the socket " @@ -757,6 +764,7 @@ msgstr "ダウングレードは現在ではサポートされていません" msgid "Driver %s is not unique across providers" msgstr "ドライバー %s はプロバイダー全体で固有ではありません" +#, fuzzy msgid "Driver for security groups firewall in the L2 agent" msgstr "L2エージェントのセキュリティグループファイアウォールのドライバ" @@ -1109,7 +1117,7 @@ msgstr "" "ません" msgid "Force ip_lib calls to use the root helper" -msgstr "ip_lib 呼び出しでルート・ヘルパーを強制的に使用します" +msgstr "ip_lib 呼び出しでルートヘルパーを強制的に使用します" #, python-format msgid "Found duplicate extension: %(alias)s" @@ -1151,7 +1159,7 @@ msgstr "" "場合: エージェント有効グループ)。" msgid "Group (gid or name) running this process after its initialization" -msgstr "このプロセスを初期化後に実行しているグループ (gid または名前)" +msgstr "初期化後にこのプロセスを実行するグループ (gid または名前)" msgid "HTTP URL of OpenDaylight REST interface." msgstr "OpenDaylight REST インターフェースの HTTP URL。" @@ -1201,7 +1209,7 @@ msgid "ID of the project that MidoNet admin user belongs to." msgstr "MidoNet admin ユーザーが属するプロジェクトの ID。" msgid "ID of the router" -msgstr "ルータのID" +msgstr "ルータの ID" #, python-format msgid "" @@ -1266,8 +1274,8 @@ msgid "" "If namespaces is disabled, the l3 agent can only configure a router that has " "the matching router ID." msgstr "" -"名前空間が無効の場合、l3 エージェントは、一致するルーター ID を持つルーターの" -"みを構成できます。" +"名前空間が無効の場合、l3 エージェントは、このルーター ID に一致する ID を持つ" +"ルーターのみを構成できます。" msgid "If set, ignore any SSL validation issues." msgstr "設定されている場合、すべての SSL 検証問題を無視します。" @@ -1550,7 +1558,7 @@ msgid "Location for Metadata Proxy UNIX domain socket." msgstr "メタデータ・プロキシー UNIX ドメイン・ソケットのロケーション" msgid "Location of Metadata Proxy UNIX domain socket" -msgstr "メタデータ・プロキシー UNIX ドメイン・ソケットのロケーション" +msgstr "メタデータプロキシー UNIX ドメインソケットの場所" msgid "Location of ca certificates file to use for CRD client requests." msgstr "CRD クライアント要求に使用するための CA 証明書ファイルのロケーション。" @@ -1579,6 +1587,7 @@ msgstr "veth インターフェースの MTU サイズ" msgid "Make the l2 agent run in DVR mode." msgstr "l2 エージェントを DVR モードで実行します。" +#, fuzzy msgid "Malformed request body" msgstr "誤った形式の要求本体" @@ -1590,7 +1599,7 @@ msgid "Management Security Zone id" msgstr "管理セキュリティー・ゾーン id" msgid "Max header line to accommodate large tokens" -msgstr "ラージ・トークンを収容するための最大ヘッダー行" +msgstr "ラージトークンを収容するための最大ヘッダー行" msgid "Maximum number of DNS nameservers" msgstr "DNS ネーム・サーバーの最大数" @@ -1672,7 +1681,7 @@ msgstr "" msgid "Multiple default providers for service %s" msgstr "サービス %s のデフォルト・プロバイダーが複数あります" -#, python-format +#, fuzzy, python-format msgid "Multiple plugins for service %s were configured" msgstr "サービス %s の複数のプラグインが構成されていました" @@ -1722,7 +1731,7 @@ msgid "Name of Open vSwitch bridge to use" msgstr "使用する Open vSwitch ブリッジの名前" msgid "Name of bridge used for external network traffic." -msgstr "外部ネットワーク・トラフィックに使用されるブリッジの名前。" +msgstr "外部ネットワークトラフィックに使用されるブリッジの名前。" msgid "" "Name of nova region to use. Useful if keystone manages more than one region." @@ -1798,7 +1807,7 @@ msgid "Neutron Service Type Management" msgstr "Neutron サービス・タイプ管理" msgid "Neutron core_plugin not configured!" -msgstr "Neutron core_plugin は設定されていません。" +msgstr "Neutron core_plugin が設定されていません。" msgid "Neutron plugin provider module" msgstr "Neutronプラグインプロバイダモジュール" @@ -1858,12 +1867,14 @@ msgstr "Vyatta vRouter のインスタンスの Nova VM フレーバー。" msgid "Nova image id for instances of Vyatta vRouter." msgstr "Vyatta vRouter のインスタンスの Nova イメージ ID。" +#, fuzzy msgid "Number of RPC worker processes for service" -msgstr "サービスのRPCワーカプロセスの数" +msgstr "サービスの RPC ワーカプロセスの数" msgid "Number of backlog requests to configure the metadata server socket with" msgstr "メタデータ・サーバー・ソケットの構成に使用されるバックログ要求の数" +#, fuzzy msgid "Number of backlog requests to configure the socket with" msgstr "ソケットを構成するためのバックログ要求の数" @@ -1996,10 +2007,10 @@ msgstr "" "での認証プラグインが推奨されています。" msgid "Path to PID file for this process" -msgstr "このプロセス用の PID ファイルへのパス" +msgstr "このプロセス用の PID ファイルのパス" msgid "Path to the router directory" -msgstr "ルーター・ディレクトリーへのパス" +msgstr "ルーターディレクトリーのパス" msgid "Peer patch port in integration bridge for tunnel bridge." msgstr "トンネル・ブリッジの統合ブリッジ内のピア・パッチ・ポート。" @@ -2080,6 +2091,7 @@ msgstr "" "プレフィックス「%(prefix)s」は IPv%(version)s プールではサポートされていませ" "ん" +#, fuzzy msgid "Private key file to use when starting the server securely" msgstr "サーバーを安全に始動するときに使用される秘密鍵ファイル" @@ -2098,10 +2110,10 @@ msgid "Probe created : %s " msgstr "作成されたプローブ: %s " msgid "Process is already started" -msgstr "プロセスは既に実行されています" +msgstr "プロセスが既に実行されています" msgid "Process is not running." -msgstr "プロセスは実行されていません" +msgstr "プロセスが実行されていません" msgid "Protocol to access nova metadata, http or https" msgstr "Nova メタデータ、http、または https にアクセスするためのプロトコル" @@ -2118,8 +2130,8 @@ msgid "" "Range of seconds to randomly delay when starting the periodic task scheduler " "to reduce stampeding. (Disable by setting to 0)" msgstr "" -"集中状態を緩和するため、定期タスク・スケジューラーを開始するときにランダムに" -"遅延する時間 (秒) の範囲。(無効にするには 0 に設定)" +"集中状態を緩和するため、定期タスクスケジューラーの開始時に挿入するランダムな" +"遅延時間 (秒) の範囲。(無効にするには 0 に設定)" msgid "Rbridge id of provider edge router(s)" msgstr "プロバイダー・エッジ・ルーターのブリッジ ID。" @@ -2192,10 +2204,10 @@ msgid "Resources required" msgstr "リソースが必要です" msgid "Root helper application." -msgstr "ルート・ヘルパー・アプリケーション。" +msgstr "ルートヘルパーアプリケーション。" msgid "Root helper daemon application to use when possible." -msgstr "可能な場合に使用するルート・ヘルパー・デーモン・アプリケーション。" +msgstr "利用可能な場合に使用するルートヘルパーのデーモンアプリケーション。" msgid "Root permissions are required to drop privileges." msgstr "特権を除去するにはルート許可が必要です。" @@ -2304,8 +2316,8 @@ msgid "" "Send this many gratuitous ARPs for HA setup, if less than or equal to 0, the " "feature is disabled" msgstr "" -"HA セットアップ用に指定数の Gratuitous ARP を送信します。Gratuitous ARP が 0 " -"以下の場合、この機能は無効です" +"HA セットアップ用に指定数の Gratuitous ARP を送信します。値が 0 以下の場合、" +"この機能は無効です" #, python-format msgid "" @@ -2335,6 +2347,7 @@ msgstr "" "GRE/VXLAN トンネルを構成した発信 IP パケットで、フラグメント禁止 (DF) ビット" "を設定または設定解除します。" +#, fuzzy msgid "" "Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not " "supported on OS X." @@ -2422,7 +2435,7 @@ msgid "TCP Port to listen for metadata server requests." msgstr "メタデータ・サーバー要求を listen するための TCP ポート。" msgid "TCP Port used by Neutron metadata namespace proxy." -msgstr "Neutronメタデータ名前空間ぷろきしによってしようされるTCP Port" +msgstr "Neutron メタデータ名前空間プロキシーが使用する TCP Port" msgid "TCP Port used by Nova metadata server." msgstr "Nova メタデータ・サーバーによって使用される TCP ポート。" @@ -2687,6 +2700,7 @@ msgstr "" "ます。中央ノード (または devstack などの単一ホスト・デプロイメント) 上で実行" "中の L3 の場合、このモードを使用する必要があります。" +#, fuzzy msgid "" "Timeout for client connections socket operations. If an incoming connection " "is idle for this number of seconds it will be closed. A value of '0' means " @@ -2696,7 +2710,7 @@ msgstr "" "であると閉じられます。値「0」は永続的に待機することを意味します。" msgid "Timeout in seconds for ovs-vsctl commands" -msgstr "ovs-vsctlコマンドのタイムアウト(秒)" +msgstr "ovs-vsctl コマンドのタイムアウト(秒)" msgid "Timeout value for connecting to CRD service in seconds." msgstr "CRD サービスへの接続用タイムアウト値 (秒)。" @@ -2704,6 +2718,7 @@ msgstr "CRD サービスへの接続用タイムアウト値 (秒)。" msgid "Tomcat session timeout in minutes." msgstr "Tomcat セッション・タイムアウト (分)。" +#, fuzzy msgid "Top-level directory for maintaining dhcp state" msgstr "DHCP の状態を維持するための最上位ディレクトリー" @@ -2882,7 +2897,7 @@ msgstr "ネットワークを作成できません。トンネル ID %(tunnel_id msgid "Unable to delete subnet pool: %(reason)s" msgstr "サブネット・プールを削除できません: %(reason)s" -#, python-format +#, fuzzy, python-format msgid "Unable to determine mac address for %s" msgstr "%s のMACアドレス収集ができません" @@ -2894,7 +2909,7 @@ msgstr "要求本体で '%s' が見つかりません" msgid "Unable to find any IP address on external network %(net_id)s." msgstr "外部ネットワーク %(net_id)s 上で IP アドレスが見つかりません" -#, python-format +#, fuzzy, python-format msgid "Unable to find resource name in %s" msgstr "%sの中のリソース名を見つけることはできません" @@ -2926,8 +2941,8 @@ msgid "" "Unable to identify a target field from:%s. Match should be in the form " "%%()s" msgstr "" -"%s からターゲット・フィールドを特定できません。一致の形式は " -"%%()s でなければなりません" +"%s からターゲットフィールドを特定できません。一致の形式は %%()s " +"でなければなりません" #, python-format msgid "Unable to load %(app_name)s from configuration file %(config_path)s." @@ -2941,7 +2956,7 @@ msgstr "" "ネットワーク %(network)s の共有設定を再構成できません。複数のテナントによって" "使用されています" -#, python-format +#, fuzzy, python-format msgid "" "Unable to verify match:%(match)s as the parent resource: %(res)s was not " "found" @@ -3020,13 +3035,13 @@ msgstr "--delta と相対リビジョンの両方ではなく一方を使用し msgid "Use ipset to speed-up the iptables based security groups." msgstr "" -"iptables ベース・セキュリティー・グループの速度を上げるには、ipset を使用しま" +"iptables ベースのセキュリティーグループの速度を向上するには、ipset を使用しま" "す。" msgid "Use the root helper to read the namespaces from the operating system." msgstr "" -"オペレーティング・システムから名前空間を読み取るにはルート・ヘルパーを使用し" -"ます。" +"オペレーティングシステムから名前空間を読み取るにはルートヘルパーを使用しま" +"す。" msgid "" "Use veths instead of patch ports to interconnect the integration bridge to " @@ -3047,7 +3062,7 @@ msgstr "" "場合: エージェント有効ユーザー)。" msgid "User (uid or name) running this process after its initialization" -msgstr "このプロセスを初期化後に実行しているユーザー (uid または名前)" +msgstr "初期化後にこのプロセスを実行するユーザー (uid または名前)" #, python-format msgid "User does not have admin privileges: %(reason)s" @@ -3064,7 +3079,7 @@ msgid "Uses veth for an interface or not" msgstr "インターフェースに veth を使用するかどうか" msgid "VRRP authentication password" -msgstr "VRRP認証パスワード" +msgstr "VRRP 認証パスワード" msgid "VRRP authentication type" msgstr "VRRP 認証タイプ" @@ -3122,17 +3137,17 @@ msgid "" "desired, it needs to be done via a subnet allocated to the network and not " "through this parameter. " msgstr "" -"IPv6 では、自動的に割り当てられたリンク・ローカル・アドレス (LLA) を使用でき" -"るため、外部ゲートウェイに使用するネットワークにはサブネットを関連付ける必要" -"はありません。ただし、IPv6 ゲートウェイ・アドレスはデフォルト経路のネクスト・" -"ホップとして使用するために必要です。IPv6 ゲートウェイ・アドレスをここで構成し" -"ない場合にのみ、アップストリーム・ルーターのルーター通知 (RA) からデフォルト" -"経路を取得するように Neutron ルーターが構成されます。この場合、これらの RA を" -"送信するようにアップストリーム・ルーターを構成することも必要です。" -"ipv6_gateway を構成する場合、これはアップストリーム・ルーター上のインター" -"フェースの LLA でなければなりません。グローバル・ユニーク・アドレス (GUA) を" -"使用したネクスト・ホップが必要な場合は、このパラメーターを使用するのではな" -"く、ネットワークに割り振られたサブネットを介してこれを行う必要があります。" +"IPv6 では、自動的に割り当てられたリンクローカルアドレス (LLA) を使用できるた" +"め、外部ゲートウェイに使用するネットワークにはサブネットを関連付ける必要はあ" +"りません。ただし、IPv6 ゲートウェイアドレスはデフォルト経路のネクストホップと" +"して使用するために必要です。IPv6 ゲートウェイアドレスをここで構成しない場合に" +"のみ、上流ルーターのルーター広告 (RA) からデフォルト経路を取得するように " +"Neutron ルーターが構成されます。この場合、これらの RA を送信するように上流" +"ルーターを構成することも必要です。ipv6_gateway を構成する場合、これは上流ルー" +"ター上のインターフェースの LLA でなければなりません。グローバルユニークアドレ" +"ス (GUA) を使用したネクストホップが必要な場合は、このパラメーターを使用するの" +"ではなく、ネットワークに割り振られたサブネットを介してこれを行う必要がありま" +"す。" msgid "You must implement __call__" msgstr "__call__ を実装する必要があります" diff --git a/neutron/locale/ko_KR/LC_MESSAGES/neutron.po b/neutron/locale/ko_KR/LC_MESSAGES/neutron.po index 82f029fc16b..569d8a383d1 100644 --- a/neutron/locale/ko_KR/LC_MESSAGES/neutron.po +++ b/neutron/locale/ko_KR/LC_MESSAGES/neutron.po @@ -9,18 +9,19 @@ # OpenStack Infra , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-06 10:15+0000\n" "Last-Translator: openstackjenkins \n" +"Language: ko_KR\n" "Language-Team: Korean (Korea) (http://www.transifex.com/openstack/neutron/" "language/ko_KR/)\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" diff --git a/neutron/locale/neutron-log-critical.pot b/neutron/locale/neutron-log-critical.pot deleted file mode 100644 index 5f9f03f9e88..00000000000 --- a/neutron/locale/neutron-log-critical.pot +++ /dev/null @@ -1,19 +0,0 @@ -# Translations template for neutron. -# Copyright (C) 2015 ORGANIZATION -# This file is distributed under the same license as the neutron project. -# FIRST AUTHOR , 2015. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: neutron 7.0.0.0b3.dev96\n" -"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-08-10 06:11+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" - diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron.po index 2fae20029ce..c1db32ddbed 100644 --- a/neutron/locale/pt_BR/LC_MESSAGES/neutron.po +++ b/neutron/locale/pt_BR/LC_MESSAGES/neutron.po @@ -8,18 +8,19 @@ # OpenStack Infra , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-06 10:15+0000\n" "Last-Translator: openstackjenkins \n" +"Language: pt_BR\n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/openstack/" "neutron/language/pt_BR/)\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" diff --git a/neutron/locale/ru/LC_MESSAGES/neutron.po b/neutron/locale/ru/LC_MESSAGES/neutron.po index 2e84fd59ae1..9e46ceb7160 100644 --- a/neutron/locale/ru/LC_MESSAGES/neutron.po +++ b/neutron/locale/ru/LC_MESSAGES/neutron.po @@ -7,11 +7,12 @@ # OpenStack Infra , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-06 10:15+0000\n" "Last-Translator: openstackjenkins \n" +"Language: ru\n" "Language-Team: Russian (http://www.transifex.com/openstack/neutron/language/" "ru/)\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" @@ -20,7 +21,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" diff --git a/neutron/locale/tr_TR/LC_MESSAGES/neutron.po b/neutron/locale/tr_TR/LC_MESSAGES/neutron.po index 03fc781c769..417ddb0bdf2 100644 --- a/neutron/locale/tr_TR/LC_MESSAGES/neutron.po +++ b/neutron/locale/tr_TR/LC_MESSAGES/neutron.po @@ -9,18 +9,19 @@ # OpenStack Infra , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-16 08:28+0000\n" "Last-Translator: Andreas Jaeger \n" +"Language: tr_TR\n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/openstack/neutron/" "language/tr_TR/)\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron.po index c96336cb7af..b5b2a5957fe 100644 --- a/neutron/locale/zh_CN/LC_MESSAGES/neutron.po +++ b/neutron/locale/zh_CN/LC_MESSAGES/neutron.po @@ -14,18 +14,19 @@ # OpenStack Infra , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-06 10:15+0000\n" "Last-Translator: openstackjenkins \n" +"Language: zh_Hans_CN\n" "Language-Team: Chinese (China) (http://www.transifex.com/openstack/neutron/" "language/zh_CN/)\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" diff --git a/neutron/locale/zh_TW/LC_MESSAGES/neutron.po b/neutron/locale/zh_TW/LC_MESSAGES/neutron.po index 95402e3741f..3fdaf828a2f 100644 --- a/neutron/locale/zh_TW/LC_MESSAGES/neutron.po +++ b/neutron/locale/zh_TW/LC_MESSAGES/neutron.po @@ -7,18 +7,19 @@ # OpenStack Infra , 2015. #zanata msgid "" msgstr "" -"Project-Id-Version: neutron 7.0.0.0b4.dev276\n" +"Project-Id-Version: neutron 8.0.0.dev315\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2015-09-22 07:41+0000\n" +"POT-Creation-Date: 2015-10-02 06:33+0000\n" "PO-Revision-Date: 2015-09-06 10:15+0000\n" "Last-Translator: openstackjenkins \n" +"Language: zh_Hant_TW\n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/openstack/neutron/" "language/zh_TW/)\n" "Plural-Forms: nplurals=1; plural=0\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.0\n" +"Generated-By: Babel 2.1.1\n" #, python-format msgid "" From 13b6d76da361178ea0b84baf4831a4c7f53e29c7 Mon Sep 17 00:00:00 2001 From: Ihar Hrachyshka Date: Thu, 1 Oct 2015 17:13:25 +0200 Subject: [PATCH 07/20] metadata: don't crash proxy on non-unicode user data We attempt to log every successful metadata response with LOG.debug. But as per oslo.log docs [1], we should make sure that what we pass into the library is unicode. Http.request returns a tuple of Response object and a string, which is bytes in Python 2.x [2]. That's why we need to convert the response content to unicode before passing it into oslo.log. To achieve it, we utilize encodeutils.safe_decode with 'replace' errors handling strategy, so that we don't get exceptions on input that does not conform unicode. For the unit test case, we pass a string that is not expected to convert to unicode with errors='strict' strategy or similar, and check that we still don't crash. While at it, we remove a check for the number of log calls being triggered, because it's something that we should avoid validating in test cases, and it cannot trigger a real bug. The mock that was used to count the number would also hide the bug that we try to reproduce. Note that the bug does not require debug to be set because the crash occurs before oslo.log machinery decides it should not log the message. [1]: http://docs.openstack.org/developer/oslo.log/usage.html#no-more-implicit-conversion-to-unicode-str [2]: http://bitworking.org/projects/httplib2/doc/html/libhttplib2.html#httplib2.Http.request Closes-Bug: #1501772 Change-Id: I6a32c40ff117fae43913386134c8981539697ce8 (cherry picked from commit 80e3d9be4923ecad17377b1d15c8392b8a43dac6) --- neutron/agent/metadata/namespace_proxy.py | 3 ++- .../unit/agent/metadata/test_namespace_proxy.py | 17 ++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/neutron/agent/metadata/namespace_proxy.py b/neutron/agent/metadata/namespace_proxy.py index 5cdde8c67fc..8f6ee2e7615 100644 --- a/neutron/agent/metadata/namespace_proxy.py +++ b/neutron/agent/metadata/namespace_proxy.py @@ -15,6 +15,7 @@ import httplib2 from oslo_config import cfg from oslo_log import log as logging +from oslo_utils import encodeutils import six import six.moves.urllib.parse as urlparse import webob @@ -88,7 +89,7 @@ class NetworkMetadataProxyHandler(object): if resp.status == 200: LOG.debug(resp) - LOG.debug(content) + LOG.debug(encodeutils.safe_decode(content, errors='replace')) response = webob.Response() response.status = resp.status response.headers['Content-Type'] = resp['content-type'] diff --git a/neutron/tests/unit/agent/metadata/test_namespace_proxy.py b/neutron/tests/unit/agent/metadata/test_namespace_proxy.py index 8403ecaf490..7952a18a1ec 100644 --- a/neutron/tests/unit/agent/metadata/test_namespace_proxy.py +++ b/neutron/tests/unit/agent/metadata/test_namespace_proxy.py @@ -21,6 +21,7 @@ from neutron.agent.metadata import namespace_proxy as ns_proxy from neutron.common import exceptions from neutron.common import utils from neutron.tests import base +from neutron import wsgi class FakeConf(object): @@ -38,9 +39,6 @@ class FakeConf(object): class TestNetworkMetadataProxyHandler(base.BaseTestCase): def setUp(self): super(TestNetworkMetadataProxyHandler, self).setUp() - self.log_p = mock.patch.object(ns_proxy, 'LOG') - self.log = self.log_p.start() - self.handler = ns_proxy.NetworkMetadataProxyHandler('router_id') def test_call(self): @@ -67,7 +65,6 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): proxy_req.side_effect = Exception retval = self.handler(req) self.assertIsInstance(retval, webob.exc.HTTPInternalServerError) - self.assertEqual(len(self.log.mock_calls), 2) self.assertTrue(proxy_req.called) def test_proxy_request_router_200(self): @@ -100,13 +97,13 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): self.assertEqual(retval.headers['Content-Type'], 'text/plain') self.assertEqual(b'content', retval.body) - def test_proxy_request_network_200(self): + def _test_proxy_request_network_200(self, content): self.handler.network_id = 'network_id' resp = mock.MagicMock(status=200) with mock.patch('httplib2.Http') as mock_http: resp.__getitem__.return_value = "application/json" - mock_http.return_value.request.return_value = (resp, '{}') + mock_http.return_value.request.return_value = (resp, content) retval = self.handler._proxy_request('192.168.1.1', 'GET', @@ -129,7 +126,13 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): self.assertEqual(retval.headers['Content-Type'], 'application/json') - self.assertEqual(b'{}', retval.body) + self.assertEqual(wsgi.encode_body(content), retval.body) + + def test_proxy_request_network_200(self): + self._test_proxy_request_network_200('{}') + + def test_proxy_request_network_200_unicode_in_content(self): + self._test_proxy_request_network_200('Gl\xfcck') def _test_proxy_request_network_4xx(self, status, method, expected): self.handler.network_id = 'network_id' From d1d5f2a3bc11fbaa61dcbcce7de2be03b88dd606 Mon Sep 17 00:00:00 2001 From: Salvatore Orlando Date: Thu, 1 Oct 2015 16:07:59 -0700 Subject: [PATCH 08/20] Pecan: Fix quota enforcement Ensure that core resources, and not only extension resources, are registered with the quota engine. Otherwise no enforcement will happen for them. Further, do not pass anymore the 'resource name' to the resource's count method as it is not necessary anymore since Liberty. Change-Id: I895b4e69e50dbf1aac39e07eba07c3e3ff30808a Closes-bug: #1501948 (cherry picked from commit 809ac2161577ef354b75713c0d5210e03fa16d6a) --- neutron/pecan_wsgi/hooks/quota_enforcement.py | 3 --- neutron/pecan_wsgi/startup.py | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/neutron/pecan_wsgi/hooks/quota_enforcement.py b/neutron/pecan_wsgi/hooks/quota_enforcement.py index bc9e46d6344..e1e4a0b6104 100644 --- a/neutron/pecan_wsgi/hooks/quota_enforcement.py +++ b/neutron/pecan_wsgi/hooks/quota_enforcement.py @@ -18,7 +18,6 @@ from pecan import hooks from neutron.common import exceptions from neutron import manager -from neutron.pecan_wsgi.hooks import attribute_population from neutron import quota @@ -45,8 +44,6 @@ class QuotaEnforcementHook(hooks.PecanHook): count = quota.QUOTAS.count(neutron_context, resource, plugin, - attribute_population._plural( - resource), tenant_id) delta = deltas.get(tenant_id, 0) + 1 kwargs = {resource: count + delta} diff --git a/neutron/pecan_wsgi/startup.py b/neutron/pecan_wsgi/startup.py index 758ac258843..bdb87e2aedf 100644 --- a/neutron/pecan_wsgi/startup.py +++ b/neutron/pecan_wsgi/startup.py @@ -22,6 +22,7 @@ from neutron.i18n import _LI, _LW from neutron import manager from neutron.pecan_wsgi.controllers import root from neutron import policy +from neutron.quota import resource_registry LOG = log.getLogger(__name__) @@ -100,6 +101,19 @@ def initialize_all(): LOG.debug("There are already controllers for resource:%s", resource) + # NOTE(salv-orlando): If you are care about code quality, please read below + # Hackiness is strong with the piece of code below. It is used for + # populating resource plurals and registering resources with the quota + # engine, but the method it calls were not coinceived with this aim. + # Therefore it only leverages side-effects from those methods. Moreover, + # as it is really not advisable to load an instance of + # neutron.api.v2.router.APIRouter just to register resources with the + # quota engine, core resources are explicitly registered here. + # TODO(salv-orlando): The Pecan WSGI support should provide its own + # solution to manage resource plurals and registration of resources with + # the quota engine + for resource in router.RESOURCES.keys(): + resource_registry.register_resource_by_name(resource) for ext in ext_mgr.extensions.values(): # make each extension populate its plurals if hasattr(ext, 'get_resources'): From dd197db312f4bc5a2a661c86125b06d71c45e742 Mon Sep 17 00:00:00 2001 From: Toni Ylenius Date: Wed, 5 Aug 2015 15:06:00 +0300 Subject: [PATCH 09/20] usage_audit: Fix usage_audit to work with ML2 The script didn't work with the ML2 plugin as router related functionality is moved to the L3 router service plugin. The fix assumes that the L3 router service plugin is in use, and this seems to apply to most of the current core plugins. Change-Id: If3eb7bde4a5b8b9ca2ac0bd7327325f6c0ad620a Closes-Bug: 1481692 (cherry picked from commit 2bded62d6a6a141e610a06e5f40bb28c0b26da5c) --- neutron/cmd/usage_audit.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/neutron/cmd/usage_audit.py b/neutron/cmd/usage_audit.py index 72fdaf127e1..402d92c5423 100644 --- a/neutron/cmd/usage_audit.py +++ b/neutron/cmd/usage_audit.py @@ -23,6 +23,7 @@ from neutron.common import config from neutron.common import rpc as n_rpc from neutron import context from neutron import manager +from neutron.plugins.common import constants def main(): @@ -31,6 +32,8 @@ def main(): cxt = context.get_admin_context() plugin = manager.NeutronManager.get_plugin() + l3_plugin = manager.NeutronManager.get_service_plugins().get( + constants.L3_ROUTER_NAT) notifier = n_rpc.get_notifier('network') for network in plugin.get_networks(cxt): notifier.info(cxt, 'network.exists', {'network': network}) @@ -38,7 +41,7 @@ def main(): notifier.info(cxt, 'subnet.exists', {'subnet': subnet}) for port in plugin.get_ports(cxt): notifier.info(cxt, 'port.exists', {'port': port}) - for router in plugin.get_routers(cxt): + for router in l3_plugin.get_routers(cxt): notifier.info(cxt, 'router.exists', {'router': router}) - for floatingip in plugin.get_floatingips(cxt): + for floatingip in l3_plugin.get_floatingips(cxt): notifier.info(cxt, 'floatingip.exists', {'floatingip': floatingip}) From 155746c171c24d11e77d9624e9af31b45dad87f3 Mon Sep 17 00:00:00 2001 From: Adelina Tuvenie Date: Thu, 24 Sep 2015 06:17:06 -0700 Subject: [PATCH 10/20] Fixes 'ovs-agent fails to start on Windows beacause of SIGHUP' Change Ic0cf8a9ca7f3a16b556a6825e2979471ae136c33 has added the handling of SIGHUP in neutron_ovs_agent. This does not work on Windows as there is no SIGHUP signal on windows. The fix consists in checking if signal has SIGHUP attr before setting the handler for SIGHUP. Change-Id: I08258580252d68db222cbb9db7812ff1dfb37a56 Closes-Bug: #1499345 (cherry picked from commit 584bb1aad8647872cb8722beeb84e9ec08abc208) --- .../plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py index fc7e0c832b6..b18716e8613 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py @@ -1784,7 +1784,8 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, # Start everything. LOG.info(_LI("Agent initialized successfully, now running... ")) signal.signal(signal.SIGTERM, self._handle_sigterm) - signal.signal(signal.SIGHUP, self._handle_sighup) + if hasattr(signal, 'SIGHUP'): + signal.signal(signal.SIGHUP, self._handle_sighup) with polling.get_polling_manager( self.minimize_polling, self.ovsdb_monitor_respawn_interval) as pm: From 18344140bd0aae61dd6f50667d719cd9cfe149cb Mon Sep 17 00:00:00 2001 From: James Page Date: Thu, 1 Oct 2015 11:54:28 +0100 Subject: [PATCH 11/20] Use format to convert ints to strings This ensures that on 32bit architectures, where sometimes an implicit long is created, the resulting string does not contain a 'L' suffix as generated by the hex function. Change-Id: I264f90d68009963fe7a217c2170e1cf2f46ae2bb Closes-Bug: 1501703 (cherry picked from commit 49883f1b2bfc9a4f06b1d336553d7f0ab4289a0d) --- neutron/agent/linux/ip_lib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py index 551341a1814..b0ae964ef17 100644 --- a/neutron/agent/linux/ip_lib.py +++ b/neutron/agent/linux/ip_lib.py @@ -331,7 +331,7 @@ class IpRuleCommand(IpCommandBase): integers.append(0xffffffff) # We now have two integers in a list. Convert to canonical string. - return '/'.join(map(hex, integers)) + return '{0:#x}/{1:#x}'.format(*integers) def canonicalize(item): k, v = item From cf1689438079de264dd4a61cccaf2ad8b0bd05b9 Mon Sep 17 00:00:00 2001 From: Adelina Tuvenie Date: Mon, 21 Sep 2015 23:51:42 -0700 Subject: [PATCH 12/20] Fixes 'ovs-agent cannot start on Windows because root_helper opt is not found' Change Ie1224f8a1c17268cd7d1c474ed82fdfb8852eaa8 removed config.register_root_helper() from ovs_neutron_agent:main, thus the agent cannot start on Windows since root_helper config option is never registered. The fix consists in adding config.register_root_helper in the Windows side utils. Closes-Bug: #1497930 Change-Id: I6adc3b869c9564cac3ab99174b8fe47584213e59 (cherry picked from commit 074f82d3ec18fd591e9d1805676dfe13bd508510) --- neutron/agent/common/utils.py | 3 +++ neutron/agent/linux/utils.py | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/neutron/agent/common/utils.py b/neutron/agent/common/utils.py index 2b50da21704..a6255709b24 100644 --- a/neutron/agent/common/utils.py +++ b/neutron/agent/common/utils.py @@ -15,9 +15,11 @@ import os +from oslo_config import cfg from oslo_log import log as logging from oslo_utils import importutils +from neutron.agent.common import config from neutron.i18n import _LE @@ -28,6 +30,7 @@ else: LOG = logging.getLogger(__name__) +config.register_root_helper(cfg.CONF) execute = utils.execute diff --git a/neutron/agent/linux/utils.py b/neutron/agent/linux/utils.py index b3f7a0bd1ec..83e54ef0ec1 100644 --- a/neutron/agent/linux/utils.py +++ b/neutron/agent/linux/utils.py @@ -44,7 +44,6 @@ from neutron import wsgi LOG = logging.getLogger(__name__) -config.register_root_helper(cfg.CONF) class RootwrapDaemonHelper(object): From c66fa826ab2f25a21f8c2fa9a386aff1e54c7427 Mon Sep 17 00:00:00 2001 From: Terry Wilson Date: Mon, 28 Sep 2015 21:01:30 -0500 Subject: [PATCH 13/20] Just call set-manager if connecting fails Instead of calling set-manager every init, only call it when getting the schema fails inside of Connection.start() which is only called once. Closes-Bug: #1499784 Change-Id: Ib28cd912e1f2eba318a6b0a82269919a1c95312d (cherry picked from commit c561c7c20acef7227e2eab2be30a2626e16d2354) --- neutron/agent/ovsdb/impl_idl.py | 6 ------ neutron/agent/ovsdb/native/connection.py | 19 +++++++++++++++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/neutron/agent/ovsdb/impl_idl.py b/neutron/agent/ovsdb/impl_idl.py index c4459b94e86..86c757d262f 100644 --- a/neutron/agent/ovsdb/impl_idl.py +++ b/neutron/agent/ovsdb/impl_idl.py @@ -23,7 +23,6 @@ from ovs.db import idl from neutron.agent.ovsdb import api from neutron.agent.ovsdb.native import commands as cmd from neutron.agent.ovsdb.native import connection -from neutron.agent.ovsdb.native import helpers from neutron.agent.ovsdb.native import idlutils from neutron.i18n import _LE @@ -123,11 +122,6 @@ class OvsdbIdl(api.API): def __init__(self, context): super(OvsdbIdl, self).__init__(context) - # it's a chicken and egg problem: by default, the manager that - # corresponds to the connection URI is in most cases not enabled in - # local ovsdb, so we still need ovs-vsctl to set it to allow - # connections - helpers.enable_connection_uri(self.ovsdb_connection.connection) OvsdbIdl.ovsdb_connection.start() self.idl = OvsdbIdl.ovsdb_connection.idl diff --git a/neutron/agent/ovsdb/native/connection.py b/neutron/agent/ovsdb/native/connection.py index 7f2b10a1566..56cd7cc6553 100644 --- a/neutron/agent/ovsdb/native/connection.py +++ b/neutron/agent/ovsdb/native/connection.py @@ -19,7 +19,9 @@ import traceback from ovs.db import idl from ovs import poller +import retrying +from neutron.agent.ovsdb.native import helpers from neutron.agent.ovsdb.native import idlutils @@ -62,8 +64,21 @@ class Connection(object): if self.idl is not None: return - helper = idlutils.get_schema_helper(self.connection, - self.schema_name) + try: + helper = idlutils.get_schema_helper(self.connection, + self.schema_name) + except Exception: + # We may have failed do to set-manager not being called + helpers.enable_connection_uri(self.connection) + + # There is a small window for a race, so retry up to a second + @retrying.retry(wait_exponential_multiplier=10, + stop_max_delay=1000) + def do_get_schema_helper(): + return idlutils.get_schema_helper(self.connection, + self.schema_name) + helper = do_get_schema_helper() + helper.register_all() self.idl = idl.Idl(self.connection, helper) idlutils.wait_for_change(self.idl, self.timeout) From 677687a3aad20e61f47b3ecbc9b0f4686e817653 Mon Sep 17 00:00:00 2001 From: Bogdan Tabor Date: Wed, 23 Sep 2015 10:52:25 +0200 Subject: [PATCH 14/20] /common/utils.py py34 incompatibility Fixes bug found during unit test of get_random_string() method. For Python3 it is required to encode string as bytes object before hashing. Related-blueprint: neutron-python3 Closes-bug: #1502148 Change-Id: I93061a831b45fc8b3ede0211af665ce02f36f38a (cherry picked from commit 3d54459c2971f01581354c8a6b9c58abea7743d8) --- neutron/common/utils.py | 3 ++- neutron/tests/unit/common/test_utils.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/neutron/common/utils.py b/neutron/common/utils.py index da003b9ae5d..1fe6ab1ce5c 100644 --- a/neutron/common/utils.py +++ b/neutron/common/utils.py @@ -312,7 +312,8 @@ def get_random_string(length): rndstr = "" random.seed(datetime.datetime.now().microsecond) while len(rndstr) < length: - rndstr += hashlib.sha224(str(random.random())).hexdigest() + base_str = str(random.random()).encode('utf-8') + rndstr += hashlib.sha224(base_str).hexdigest() return rndstr[0:length] diff --git a/neutron/tests/unit/common/test_utils.py b/neutron/tests/unit/common/test_utils.py index 973a938dc71..90992606f9d 100644 --- a/neutron/tests/unit/common/test_utils.py +++ b/neutron/tests/unit/common/test_utils.py @@ -13,6 +13,7 @@ # under the License. import errno +import re import eventlet import mock @@ -706,3 +707,12 @@ class TestRoundVal(base.BaseTestCase): (1, 1.49), (2, 1.5)): self.assertEqual(expected, utils.round_val(value)) + + +class TestGetRandomString(base.BaseTestCase): + def test_get_random_string(self): + length = 127 + random_string = utils.get_random_string(length) + self.assertEqual(length, len(random_string)) + regex = re.compile('^[0-9a-fA-F]+$') + self.assertIsNotNone(regex.match(random_string)) From f3bb778dcb213d81aa62e504afb10b3bac614bb4 Mon Sep 17 00:00:00 2001 From: Henry Gessau Date: Sun, 27 Sep 2015 15:36:59 -0400 Subject: [PATCH 15/20] Tag the alembic migration revisions for Liberty Previously when we had one repo with one alembic branch we would create a milestone revision on that single branch. Now we have multiple repos and expand/contract branches for each repo. So from now on we tag the final revision on every branch when we make a milestone release. Update the cli to support the command: neutron-db-manage upgrade where becomes an alias for all the revisions for a milestone. Closes-Bug: #1499033 Change-Id: I38623986dd574bec01fe147f9c6a747f3f512bb7 (cherry picked from commit 52236764a3a7c23ec24a86ccb84bc6737e2a4791) Conflicts: neutron/db/migration/cli.py neutron/tests/unit/db/test_migration.py --- neutron/db/migration/__init__.py | 7 ++++ ...f11ca47297_drop_cisco_monolithic_tables.py | 8 +++- .../34af2b5c5a59_add_dns_name_to_port.py | 13 ++++-- neutron/db/migration/cli.py | 35 ++++++++++++---- neutron/tests/unit/db/test_migration.py | 42 +++++++++++++++++++ 5 files changed, 92 insertions(+), 13 deletions(-) diff --git a/neutron/db/migration/__init__.py b/neutron/db/migration/__init__.py index 5561e884d59..81b49108308 100644 --- a/neutron/db/migration/__init__.py +++ b/neutron/db/migration/__init__.py @@ -21,6 +21,13 @@ from alembic import op import sqlalchemy as sa from sqlalchemy.engine import reflection +# Neutron milestones for upgrade aliases +LIBERTY = 'liberty' + +NEUTRON_MILESTONES = [ + # earlier milestones were not tagged + LIBERTY, +] CREATION_OPERATIONS = (sa.sql.ddl.CreateIndex, sa.sql.ddl.CreateTable, diff --git a/neutron/db/migration/alembic_migrations/versions/liberty/contract/4af11ca47297_drop_cisco_monolithic_tables.py b/neutron/db/migration/alembic_migrations/versions/liberty/contract/4af11ca47297_drop_cisco_monolithic_tables.py index ee39fa95291..7a91b79b31e 100644 --- a/neutron/db/migration/alembic_migrations/versions/liberty/contract/4af11ca47297_drop_cisco_monolithic_tables.py +++ b/neutron/db/migration/alembic_migrations/versions/liberty/contract/4af11ca47297_drop_cisco_monolithic_tables.py @@ -21,11 +21,17 @@ Create Date: 2015-08-13 08:01:19.709839 """ +from alembic import op + +from neutron.db import migration + + # revision identifiers, used by Alembic. revision = '4af11ca47297' down_revision = '11926bcfe72d' -from alembic import op +# milestone identifier, used by neutron-db-manage +neutron_milestone = [migration.LIBERTY] def upgrade(): diff --git a/neutron/db/migration/alembic_migrations/versions/liberty/expand/34af2b5c5a59_add_dns_name_to_port.py b/neutron/db/migration/alembic_migrations/versions/liberty/expand/34af2b5c5a59_add_dns_name_to_port.py index ba523ae655b..3b2707c74b9 100644 --- a/neutron/db/migration/alembic_migrations/versions/liberty/expand/34af2b5c5a59_add_dns_name_to_port.py +++ b/neutron/db/migration/alembic_migrations/versions/liberty/expand/34af2b5c5a59_add_dns_name_to_port.py @@ -21,14 +21,19 @@ Create Date: 2015-08-23 00:22:47.618593 """ +from alembic import op +import sqlalchemy as sa + +from neutron.db import migration +from neutron.extensions import dns + + # revision identifiers, used by Alembic. revision = '34af2b5c5a59' down_revision = '9859ac9c136' -from alembic import op -import sqlalchemy as sa - -from neutron.extensions import dns +# milestone identifier, used by neutron-db-manage +neutron_milestone = [migration.LIBERTY] def upgrade(): diff --git a/neutron/db/migration/cli.py b/neutron/db/migration/cli.py index 4c7ea5b1be3..4c4169a0c0d 100644 --- a/neutron/db/migration/cli.py +++ b/neutron/db/migration/cli.py @@ -25,12 +25,13 @@ from oslo_utils import importutils import pkg_resources from neutron.common import utils +from neutron.db import migration # TODO(ihrachyshka): maintain separate HEAD files per branch HEAD_FILENAME = 'HEAD' HEADS_FILENAME = 'HEADS' -CURRENT_RELEASE = "liberty" +CURRENT_RELEASE = migration.LIBERTY EXPAND_BRANCH = 'expand' CONTRACT_BRANCH = 'contract' @@ -126,8 +127,20 @@ def add_alembic_subparser(sub, cmd): return sub.add_parser(cmd, help=getattr(alembic_command, cmd).__doc__) +def _find_milestone_revisions(config, milestone, branch=None): + """Return the revision(s) for a given milestone.""" + script = alembic_script.ScriptDirectory.from_config(config) + return [ + (m.revision, label) + for m in script.walk_revisions(base='base', head='heads') + for label in (m.branch_labels or [None]) + if milestone in getattr(m.module, 'neutron_milestone', []) and + (branch is None or branch in m.branch_labels) + ] + + def do_upgrade(config, cmd): - desc = None + branch = None if ((CONF.command.revision or CONF.command.delta) and (CONF.command.expand or CONF.command.contract)): @@ -135,11 +148,11 @@ def do_upgrade(config, cmd): 'Phase upgrade options do not accept revision specification')) if CONF.command.expand: - desc = EXPAND_BRANCH + branch = EXPAND_BRANCH revision = _get_branch_head(EXPAND_BRANCH) elif CONF.command.contract: - desc = CONTRACT_BRANCH + branch = CONTRACT_BRANCH revision = _get_branch_head(CONTRACT_BRANCH) elif not CONF.command.revision and not CONF.command.delta: @@ -165,10 +178,16 @@ def do_upgrade(config, cmd): if revision == 'head': revision = 'heads' - if not CONF.command.sql: - run_sanity_checks(config, revision) - do_alembic_command(config, cmd, revision=revision, - desc=desc, sql=CONF.command.sql) + if revision in migration.NEUTRON_MILESTONES: + revisions = _find_milestone_revisions(config, revision, branch) + else: + revisions = [(revision, branch)] + + for revision, branch in revisions: + if not CONF.command.sql: + run_sanity_checks(config, revision) + do_alembic_command(config, cmd, revision=revision, + desc=branch, sql=CONF.command.sql) def no_downgrade(config, cmd): diff --git a/neutron/tests/unit/db/test_migration.py b/neutron/tests/unit/db/test_migration.py index 399fc5070f3..a88a6e93ca4 100644 --- a/neutron/tests/unit/db/test_migration.py +++ b/neutron/tests/unit/db/test_migration.py @@ -26,6 +26,7 @@ import mock import pkg_resources import sqlalchemy as sa +from neutron.common import utils from neutron.db import migration from neutron.db.migration import autogen from neutron.db.migration import cli @@ -45,6 +46,8 @@ class FakeRevision(object): labels = set() self.branch_labels = labels self.down_revision = down_revision + self.revision = utils.get_random_string(10) + self.module = mock.MagicMock() class MigrationEntrypointsMemento(fixtures.Fixture): @@ -601,6 +604,45 @@ class TestCli(base.BaseTestCase): alembic_ag_api.render_python_code(contract.upgrade_ops) ) + @mock.patch('alembic.script.ScriptDirectory.walk_revisions') + def test__find_milestone_revisions_one_branch(self, walk_mock): + c_revs = [FakeRevision(labels={cli.CONTRACT_BRANCH}) for r in range(5)] + c_revs[1].module.neutron_milestone = [migration.LIBERTY] + + walk_mock.return_value = c_revs + m = cli._find_milestone_revisions(self.configs[0], 'liberty', + cli.CONTRACT_BRANCH) + self.assertEqual(1, len(m)) + m = cli._find_milestone_revisions(self.configs[0], 'liberty', + cli.EXPAND_BRANCH) + self.assertEqual(0, len(m)) + + @mock.patch('alembic.script.ScriptDirectory.walk_revisions') + def test__find_milestone_revisions_two_branches(self, walk_mock): + c_revs = [FakeRevision(labels={cli.CONTRACT_BRANCH}) for r in range(5)] + c_revs[1].module.neutron_milestone = [migration.LIBERTY] + e_revs = [FakeRevision(labels={cli.EXPAND_BRANCH}) for r in range(5)] + e_revs[3].module.neutron_milestone = [migration.LIBERTY] + + walk_mock.return_value = c_revs + e_revs + m = cli._find_milestone_revisions(self.configs[0], 'liberty') + self.assertEqual(2, len(m)) + + m = cli._find_milestone_revisions(self.configs[0], 'mitaka') + self.assertEqual(0, len(m)) + + @mock.patch('alembic.script.ScriptDirectory.walk_revisions') + def test__find_milestone_revisions_branchless(self, walk_mock): + revisions = [FakeRevision() for r in range(5)] + revisions[2].module.neutron_milestone = [migration.LIBERTY] + + walk_mock.return_value = revisions + m = cli._find_milestone_revisions(self.configs[0], 'liberty') + self.assertEqual(1, len(m)) + + m = cli._find_milestone_revisions(self.configs[0], 'mitaka') + self.assertEqual(0, len(m)) + class TestSafetyChecks(base.BaseTestCase): From 08971b0fb61170e86319c6801d6b1021d5944e3c Mon Sep 17 00:00:00 2001 From: Matt Riedemann Date: Thu, 1 Oct 2015 06:55:14 -0700 Subject: [PATCH 16/20] Do not log an error when deleting a linuxbridge does not exist When you're racing to teardown and relying on RPC, it should not be considered an error that a bridge does not exist when you're trying to delete it anyway. This is better served as debug level information. For context, this shows up over 1000 times in successful gate-tempest-dsvm-neutron-linuxbridge job runs in a week so it's probably safe to say it's not contributing to test failures. Closes-Bug: #1501779 Change-Id: I8e9b27e010d033291497f4e660a97bbae92e75b1 (cherry picked from commit a9dc48f5a4616a505824c3e8520c3dce7436f1b1) --- .../ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py b/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py index 5c094984029..028acc29012 100644 --- a/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py @@ -530,7 +530,7 @@ class LinuxBridgeManager(object): LOG.debug("Done deleting bridge %s", bridge_name) else: - LOG.error(_LE("Cannot delete bridge %s, does not exist"), + LOG.debug("Cannot delete bridge %s; it does not exist", bridge_name) def remove_empty_bridges(self): From a7fa6f9a37c976d971b1be5896ebb6241c815475 Mon Sep 17 00:00:00 2001 From: Nir Magnezi Date: Thu, 24 Sep 2015 17:49:15 +0300 Subject: [PATCH 17/20] The option force_metadata=True breaks the dhcp agent Patch I5f6ee9788717c3d4f1f2e2a4b9734fdd8dd92b40 has an issue with force_metadata = True. Using the option force_metadata=True while enable_isolated_metadata=False (which is the default), will break the dhcp agent because the variable subnet_to_interface_ip is being referenced before assignment. Co-Authored-By: Jakub Libosvar Change-Id: I4e1d918e3a24dd483ee134021f587ae4520bf431 Closes-Bug: #1499406 (cherry picked from commit 473c338ff8c5526157d297b7e90d5e4f5e94cbb9) --- neutron/agent/linux/dhcp.py | 2 +- neutron/tests/unit/agent/linux/test_dhcp.py | 30 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index d47abfca1ec..9e8b53f20dc 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -752,7 +752,7 @@ class Dnsmasq(DhcpLocalProcess): def _generate_opts_per_subnet(self): options = [] subnet_index_map = {} - if self.conf.enable_isolated_metadata: + if self.conf.enable_isolated_metadata or self.conf.force_metadata: subnet_to_interface_ip = self._make_subnet_interface_ip_map() isolated_subnets = self.get_isolated_subnets(self.network) for i, subnet in enumerate(self.network.subnets): diff --git a/neutron/tests/unit/agent/linux/test_dhcp.py b/neutron/tests/unit/agent/linux/test_dhcp.py index c28c51c9233..1a25247837c 100644 --- a/neutron/tests/unit/agent/linux/test_dhcp.py +++ b/neutron/tests/unit/agent/linux/test_dhcp.py @@ -1933,6 +1933,36 @@ class TestDnsmasq(TestBase): self.assertTrue(dhcp.Dnsmasq.should_enable_metadata(self.conf, mock.ANY)) + def _test__generate_opts_per_subnet_helper(self, config_opts, + expected_mdt_ip): + for key, value in config_opts.items(): + self.conf.set_override(key, value) + dm = self._get_dnsmasq(FakeNetworkDhcpPort) + with mock.patch('neutron.agent.linux.ip_lib.IPDevice') as ipdev_mock: + list_addr = ipdev_mock.return_value.addr.list + list_addr.return_value = [{'cidr': alloc.ip_address + '/24'} + for alloc in FakeDhcpPort.fixed_ips] + options, idx_map = dm._generate_opts_per_subnet() + + contains_metadata_ip = any(['%s/32' % dhcp.METADATA_DEFAULT_IP in line + for line in options]) + self.assertEqual(expected_mdt_ip, contains_metadata_ip) + + def test__generate_opts_per_subnet_no_metadata(self): + config = {'enable_isolated_metadata': False, + 'force_metadata': False} + self._test__generate_opts_per_subnet_helper(config, False) + + def test__generate_opts_per_subnet_isolated_metadata_with_router(self): + config = {'enable_isolated_metadata': True, + 'force_metadata': False} + self._test__generate_opts_per_subnet_helper(config, True) + + def test__generate_opts_per_subnet_forced_metadata(self): + config = {'enable_isolated_metadata': False, + 'force_metadata': True} + self._test__generate_opts_per_subnet_helper(config, True) + class TestDeviceManager(TestConfBase): From fb40dbbce9ac17ee43d8921aa62c28f1ea723fba Mon Sep 17 00:00:00 2001 From: shihanzhang Date: Fri, 18 Sep 2015 10:38:43 +0800 Subject: [PATCH 18/20] Execute ipset command using check_exit_code When l2 agent execute ipset command, we should pass parameter 'check_exit_code' to self.execute acording to action. The intention is to safely fail if we try to destroy a non existing set, or delete a non existing member. Otherwise the agent gets stuck in a loop if such situation happens. Such kind of event would be logged as errors. Change-Id: If67330523d114d6da13d0280851e7138a51d08f7 Closes-bug: #1497074 --- neutron/agent/linux/ipset_manager.py | 9 ++++---- .../functional/agent/linux/test_ipset.py | 1 - .../unit/agent/linux/test_ipset_manager.py | 21 ++++++++++++------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/neutron/agent/linux/ipset_manager.py b/neutron/agent/linux/ipset_manager.py index ebcc72dc1c2..a0fc7021855 100644 --- a/neutron/agent/linux/ipset_manager.py +++ b/neutron/agent/linux/ipset_manager.py @@ -124,7 +124,7 @@ class IpsetManager(object): def _del_member_from_set(self, set_name, member_ip): cmd = ['ipset', 'del', set_name, member_ip] - self._apply(cmd) + self._apply(cmd, fail_on_errors=False) self.ipset_sets[set_name].remove(member_ip) def _create_set(self, set_name, ethertype): @@ -133,13 +133,14 @@ class IpsetManager(object): self._apply(cmd) self.ipset_sets[set_name] = [] - def _apply(self, cmd, input=None): + def _apply(self, cmd, input=None, fail_on_errors=True): input = '\n'.join(input) if input else None cmd_ns = [] if self.namespace: cmd_ns.extend(['ip', 'netns', 'exec', self.namespace]) cmd_ns.extend(cmd) - self.execute(cmd_ns, run_as_root=True, process_input=input) + self.execute(cmd_ns, run_as_root=True, process_input=input, + check_exit_code=fail_on_errors) def _get_new_set_ips(self, set_name, expected_ips): new_member_ips = (set(expected_ips) - @@ -175,5 +176,5 @@ class IpsetManager(object): def _destroy(self, set_name, forced=False): if set_name in self.ipset_sets or forced: cmd = ['ipset', 'destroy', set_name] - self._apply(cmd) + self._apply(cmd, fail_on_errors=False) self.ipset_sets.pop(set_name, None) diff --git a/neutron/tests/functional/agent/linux/test_ipset.py b/neutron/tests/functional/agent/linux/test_ipset.py index a575ad6318b..2a7794304d5 100644 --- a/neutron/tests/functional/agent/linux/test_ipset.py +++ b/neutron/tests/functional/agent/linux/test_ipset.py @@ -97,6 +97,5 @@ class IpsetManagerTestCase(IpsetBase): self.source.assert_ping(self.destination.ip) def test_destroy_ipset_set(self): - self.assertRaises(RuntimeError, self.ipset._destroy, self.ipset_name) self._remove_iptables_ipset_rules() self.ipset._destroy(self.ipset_name) diff --git a/neutron/tests/unit/agent/linux/test_ipset_manager.py b/neutron/tests/unit/agent/linux/test_ipset_manager.py index 2b5a58a6dd7..8b5b91cb8cd 100644 --- a/neutron/tests/unit/agent/linux/test_ipset_manager.py +++ b/neutron/tests/unit/agent/linux/test_ipset_manager.py @@ -67,19 +67,23 @@ class BaseIpsetManagerTest(base.BaseTestCase): self.expected_calls.extend([ mock.call(['ipset', 'restore', '-exist'], process_input=input, - run_as_root=True), + run_as_root=True, + check_exit_code=True), mock.call(['ipset', 'swap', TEST_SET_NAME_NEW, TEST_SET_NAME], process_input=None, - run_as_root=True), + run_as_root=True, + check_exit_code=True), mock.call(['ipset', 'destroy', TEST_SET_NAME_NEW], process_input=None, - run_as_root=True)]) + run_as_root=True, + check_exit_code=False)]) def expect_add(self, addresses): self.expected_calls.extend( mock.call(['ipset', 'add', '-exist', TEST_SET_NAME, ip], process_input=None, - run_as_root=True) + run_as_root=True, + check_exit_code=True) for ip in self.ipset._sanitize_addresses(addresses)) def expect_del(self, addresses): @@ -87,7 +91,8 @@ class BaseIpsetManagerTest(base.BaseTestCase): self.expected_calls.extend( mock.call(['ipset', 'del', TEST_SET_NAME, ip], process_input=None, - run_as_root=True) + run_as_root=True, + check_exit_code=False) for ip in self.ipset._sanitize_addresses(addresses)) def expect_create(self): @@ -95,13 +100,15 @@ class BaseIpsetManagerTest(base.BaseTestCase): mock.call(['ipset', 'create', '-exist', TEST_SET_NAME, 'hash:net', 'family', 'inet'], process_input=None, - run_as_root=True)) + run_as_root=True, + check_exit_code=True)) def expect_destroy(self): self.expected_calls.append( mock.call(['ipset', 'destroy', TEST_SET_NAME], process_input=None, - run_as_root=True)) + run_as_root=True, + check_exit_code=False)) def add_first_ip(self): self.expect_set([FAKE_IPS[0]]) From 0b07910f33ed26fbdd13530eafbdefd74104424d Mon Sep 17 00:00:00 2001 From: Gary Kotton Date: Sun, 27 Sep 2015 00:24:31 -0700 Subject: [PATCH 19/20] DHCP: protect against case when device name is None There are edge cases when the agent attempts to unplug an interface and the device does not exist. Change-Id: I6917ec94f685f3dd3bff6aa1d43dc56aab76274a Closes-bug: #1498370 (cherry picked from commit caebc8fb8e8d9782746c3cc3ddc86f786342c819) --- neutron/agent/linux/dhcp.py | 5 ++++- neutron/tests/unit/agent/dhcp/test_agent.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index 9e8b53f20dc..279d2ca7bed 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -1225,7 +1225,10 @@ class DeviceManager(object): def destroy(self, network, device_name): """Destroy the device used for the network's DHCP on this host.""" - self.driver.unplug(device_name, namespace=network.namespace) + if device_name: + self.driver.unplug(device_name, namespace=network.namespace) + else: + LOG.debug('No interface exists for network %s', network.id) self.plugin.release_dhcp_port(network.id, self.get_device_id(network)) diff --git a/neutron/tests/unit/agent/dhcp/test_agent.py b/neutron/tests/unit/agent/dhcp/test_agent.py index ae5594a8ef2..89ff045f553 100644 --- a/neutron/tests/unit/agent/dhcp/test_agent.py +++ b/neutron/tests/unit/agent/dhcp/test_agent.py @@ -1393,6 +1393,26 @@ class TestDeviceManager(base.BaseTestCase): plugin.assert_has_calls( [mock.call.release_dhcp_port(fake_net.id, mock.ANY)]) + def test_destroy_with_none(self): + fake_net = dhcp.NetModel( + True, dict(id=FAKE_NETWORK_UUID, + tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa')) + + with mock.patch('neutron.agent.linux.interface.NullDriver') as dvr_cls: + mock_driver = mock.MagicMock() + mock_driver.get_device_name.return_value = 'tap12345678-12' + dvr_cls.return_value = mock_driver + + plugin = mock.Mock() + + dh = dhcp.DeviceManager(cfg.CONF, plugin) + dh.destroy(fake_net, None) + + dvr_cls.assert_called_once_with(cfg.CONF) + plugin.assert_has_calls( + [mock.call.release_dhcp_port(fake_net.id, mock.ANY)]) + self.assertFalse(mock_driver.called) + def test_get_interface_name(self): fake_net = dhcp.NetModel( True, dict(id='12345678-1234-5678-1234567890ab', From 6dcfe3a9362ae5fcf18e5cfb59663e43446cd59c Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Tue, 6 Oct 2015 19:28:47 -0700 Subject: [PATCH 20/20] Mock oslo policy HTTPCheck instead of urllib We were mocking internal behavior of oslo policy by patching urllib. This will break with the upcoming oslo release that switches to requests. This patch changes the mock to the HTTPCheck level and we can leave implementation details testing up to oslo_policy. Change-Id: I07957f01307e25f1547197c720eea6e3e7f0ef5a Closes-Bug: #1503890 (cherry picked from commit a0f1d9d6de1560be91d3001c8ac9f880a7a5a7e0) Add testresources used by oslo.db fixture If we use oslo.db fixtures, we'll need the package or the next version of oslo.db release will break us. Closes-Bug: #1503501 Change-Id: I7dfbf240333095d91a414ba15a439bdc4804eb25 (cherry picked from commit 86ad967e40c2c6752ec0fb46cfd3098ede0c7178) Fix functional test_server tests Now oslo.service 0.10.0 no longer sends SIGHUP to parent and children services. This was a chance introduced by 286a6ea, and since it invalidated the very logic under test, this must be revised. (cherry picked from commit 090fe713592c2b6398d999bfa03b80cbb2054609) Change-Id: I18a11283925369bc918002477774f196010a1bc3 Closes-bug: #1505438 (cherry picked from commit 090fe713592c2b6398d999bfa03b80cbb2054609) Make test_server work with older versions of oslo.service Change I18a11283925369bc918002477774f196010a1bc3 fixed the test for oslo.service >= 0.10.0, but it also broke it for older versions of oslo.service. Since the library has minimal version of >= 0.7.0 in requirements.txt, test should pass for those versions too. Now, instead of validating that either reset() or restart() of workers are triggered on SIGHUP, just validate that .start() is triggered the expected number of times (either way, no matter how oslo.service decide to clean up the children, they exit and then are respawned). Change-Id: I41f9d3af780b3178b075bc1e7084f417a2bd1378 Closes-Bug: #1505645 (cherry picked from commit 7bb40921660cf29beb68e338e205499efd6ffa36) Fixed multiple py34 gate issues 1. Scope mock of 'open' to module By mocking 'open' at the module level, we can avoid affecting 'open' calls from other modules. 2. Stop using LOG.exception in contexts with no sys.exc_info set Python 3.4 logger fills in record.exc_info with sys.exc_info() result [1], and then it uses it to determine the current exception [2] to append to the log message. Since there is no exception, exc_info[1] is None, and we get AttributeError inside traceback module. It's actually a bug in Python interpreter that it attempt to access the attribute when there is no exception. It turns out that it's fixed in latest master of cPython [3] (the intent of the patch does not seem relevant, but it removes the offending code while reshuffling the code). Note that now cPython correctly checks the exception value before accessing its attributes [4]. The patch in cPython that resulted in the failure is [5] and is present since initial Python 3k releases. The patch in fixtures that broke us is [6]. [1]: https://hg.python.org/cpython/file/tip/Lib/logging/__init__.py#l1412 [2]: https://hg.python.org/cpython/file/tip/Lib/logging/__init__.py#l575 [3]: https://hg.python.org/cpython/rev/73afda5a4e4c [4]: https://hg.python.org/cpython/rev/73afda5a4e4c#l6.484 [5]: https://hg.python.org/cpython/rev/2ee09afee126 [6]: https://github.com/testing-cabal/fixtures/commit/67dd2956943261e845a866dab155208c51da937e Closes-Bug: #1503847 Closes-Bug: #1504053 Co-Authored-By: Ihar Hrachyshka Change-Id: I456b7846b8a53e4d3f8c91583685e0e1eaa84719 (cherry picked from commit 8f58bbf38f5984e70d6e0be7427deb99d7782d1d) --- neutron/manager.py | 14 ++++-- neutron/policy.py | 4 +- neutron/services/provider_configuration.py | 4 +- neutron/tests/functional/test_server.py | 56 ++++++++++------------ neutron/tests/unit/db/test_migration.py | 2 +- neutron/tests/unit/test_policy.py | 29 +++++------ test-requirements.txt | 1 + 7 files changed, 53 insertions(+), 57 deletions(-) diff --git a/neutron/manager.py b/neutron/manager.py index a2f22b16fa5..51c9bf5cf48 100644 --- a/neutron/manager.py +++ b/neutron/manager.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +import sys import weakref from oslo_config import cfg @@ -136,19 +137,22 @@ class NeutronManager(object): @staticmethod def load_class_for_provider(namespace, plugin_provider): if not plugin_provider: - LOG.exception(_LE("Error, plugin is not set")) + LOG.error(_LE("Error, plugin is not set")) raise ImportError(_("Plugin not found.")) try: # Try to resolve plugin by name mgr = driver.DriverManager(namespace, plugin_provider) plugin_class = mgr.driver - except RuntimeError as e1: + except RuntimeError: + e1_info = sys.exc_info() # fallback to class name try: plugin_class = importutils.import_class(plugin_provider) - except ImportError as e2: - LOG.exception(_LE("Error loading plugin by name, %s"), e1) - LOG.exception(_LE("Error loading plugin by class, %s"), e2) + except ImportError: + LOG.error(_LE("Error loading plugin by name"), + exc_info=e1_info) + LOG.error(_LE("Error loading plugin by class"), + exc_info=True) raise ImportError(_("Plugin not found.")) return plugin_class diff --git a/neutron/policy.py b/neutron/policy.py index 99286a02661..351b96b84df 100644 --- a/neutron/policy.py +++ b/neutron/policy.py @@ -230,7 +230,7 @@ class OwnerCheck(policy.Check): # If we are here split failed with both separators err_reason = (_("Unable to find resource name in %s") % self.target_field) - LOG.exception(err_reason) + LOG.error(err_reason) raise exceptions.PolicyCheckError( policy="%s:%s" % (self.kind, self.match), reason=err_reason) @@ -240,7 +240,7 @@ class OwnerCheck(policy.Check): err_reason = (_("Unable to verify match:%(match)s as the " "parent resource: %(res)s was not found") % {'match': self.match, 'res': parent_res}) - LOG.exception(err_reason) + LOG.error(err_reason) raise exceptions.PolicyCheckError( policy="%s:%s" % (self.kind, self.match), reason=err_reason) diff --git a/neutron/services/provider_configuration.py b/neutron/services/provider_configuration.py index 9f8981be823..c2837855a30 100644 --- a/neutron/services/provider_configuration.py +++ b/neutron/services/provider_configuration.py @@ -197,7 +197,7 @@ class ProviderConfiguration(object): if v['driver'] == driver: msg = (_("Driver %s is not unique across providers") % driver) - LOG.exception(msg) + LOG.error(msg) raise n_exc.Invalid(msg) def _ensure_default_unique(self, type, default): @@ -207,7 +207,7 @@ class ProviderConfiguration(object): if k[0] == type and v['default']: msg = _("Multiple default providers " "for service %s") % type - LOG.exception(msg) + LOG.error(msg) raise n_exc.Invalid(msg) def add_provider(self, provider): diff --git a/neutron/tests/functional/test_server.py b/neutron/tests/functional/test_server.py index e85dcec9b17..e04b31b1fad 100644 --- a/neutron/tests/functional/test_server.py +++ b/neutron/tests/functional/test_server.py @@ -34,8 +34,8 @@ from neutron import wsgi CONF = cfg.CONF # This message will be written to temporary file each time -# reset method is called. -FAKE_RESET_MSG = "reset".encode("utf-8") +# start method is called. +FAKE_START_MSG = "start".encode("utf-8") TARGET_PLUGIN = 'neutron.plugins.ml2.plugin.Ml2Plugin' @@ -118,28 +118,26 @@ class TestNeutronServer(base.BaseTestCase): return [proc.pid for proc in psutil.process_iter() if proc.pid == self.service_pid] - def _fake_reset(self): - """Writes FAKE_RESET_MSG to temporary file on each call.""" - + def _fake_start(self): with open(self.temp_file, 'a') as f: - f.write(FAKE_RESET_MSG) + f.write(FAKE_START_MSG) def _test_restart_service_on_sighup(self, service, workers=0): - """Test that a service correctly restarts on receiving SIGHUP. + """Test that a service correctly (re)starts on receiving SIGHUP. 1. Start a service with a given number of workers. 2. Send SIGHUP to the service. - 3. Wait for workers (if any) to restart. - 4. Assert that the pids of the workers didn't change after restart. + 3. Wait for workers (if any) to (re)start. """ - start_workers = self._start_server(callback=service, workers=workers) - + self._start_server(callback=service, workers=workers) os.kill(self.service_pid, signal.SIGHUP) - # Wait for temp file to be created and its size become equal - # to size of FAKE_RESET_MSG repeated (workers + 1) times. - expected_size = len(FAKE_RESET_MSG) * (workers + 1) + expected_msg = FAKE_START_MSG * workers * 2 + + # Wait for temp file to be created and its size reaching the expected + # value + expected_size = len(expected_msg) condition = lambda: (os.path.isfile(self.temp_file) and os.stat(self.temp_file).st_size == expected_size) @@ -152,16 +150,12 @@ class TestNeutronServer(base.BaseTestCase): {'filename': self.temp_file, 'size': expected_size})) - # Verify that reset has been called for parent process in which - # a service was started and for each worker by checking that - # FAKE_RESET_MSG has been written to temp file workers + 1 times. + # Verify that start has been called twice for each worker (one for + # initial start, and the second one on SIGHUP after children were + # terminated). with open(self.temp_file, 'r') as f: res = f.readline() - self.assertEqual(FAKE_RESET_MSG * (workers + 1), res) - - # Make sure worker pids don't change - end_workers = self._get_workers() - self.assertEqual(start_workers, end_workers) + self.assertEqual(expected_msg, res) class TestWsgiServer(TestNeutronServer): @@ -197,10 +191,10 @@ class TestWsgiServer(TestNeutronServer): def _run_wsgi(self, workers=0): """Start WSGI server with a test application.""" - # Mock reset method to check that it is being called - # on receiving SIGHUP. - with mock.patch("neutron.wsgi.WorkerService.reset") as reset_method: - reset_method.side_effect = self._fake_reset + # Mock start method to check that children are started again on + # receiving SIGHUP. + with mock.patch("neutron.wsgi.WorkerService.start") as start_method: + start_method.side_effect = self._fake_start server = wsgi.Server("Test") server.start(self.application, 0, "0.0.0.0", @@ -235,13 +229,13 @@ class TestRPCServer(TestNeutronServer): def _serve_rpc(self, workers=0): """Start RPC server with a given number of workers.""" - # Mock reset method to check that it is being called - # on receiving SIGHUP. - with mock.patch("neutron.service.RpcWorker.reset") as reset_method: + # Mock start method to check that children are started again on + # receiving SIGHUP. + with mock.patch("neutron.service.RpcWorker.start") as start_method: with mock.patch( "neutron.manager.NeutronManager.get_plugin" ) as get_plugin: - reset_method.side_effect = self._fake_reset + start_method.side_effect = self._fake_start get_plugin.return_value = self.plugin CONF.set_override("rpc_workers", workers) @@ -285,7 +279,7 @@ class TestPluginWorker(TestNeutronServer): pass # Make both ABC happy and ensure 'self' is correct - FakeWorker.reset = self._fake_reset + FakeWorker.start = self._fake_start workers = [FakeWorker()] self.plugin.return_value.get_workers.return_value = workers self._test_restart_service_on_sighup(service=self._start_plugin, diff --git a/neutron/tests/unit/db/test_migration.py b/neutron/tests/unit/db/test_migration.py index a88a6e93ca4..0ae98f2d0f9 100644 --- a/neutron/tests/unit/db/test_migration.py +++ b/neutron/tests/unit/db/test_migration.py @@ -308,7 +308,7 @@ class TestCli(base.BaseTestCase): mock.patch.object(cli, '_use_separate_migration_branches', return_value=not branchless): fc.return_value.get_heads.return_value = heads - with mock.patch('six.moves.builtins.open') as mock_open: + with mock.patch.object(cli, 'open') as mock_open: mock_open.return_value.__enter__ = lambda s: s mock_open.return_value.__exit__ = mock.Mock() mock_open.return_value.read.return_value = ( diff --git a/neutron/tests/unit/test_policy.py b/neutron/tests/unit/test_policy.py index ed230179fdf..bed9740c925 100644 --- a/neutron/tests/unit/test_policy.py +++ b/neutron/tests/unit/test_policy.py @@ -19,8 +19,6 @@ import mock from oslo_policy import policy as oslo_policy from oslo_serialization import jsonutils from oslo_utils import importutils -import six -import six.moves.urllib.request as urlrequest import neutron from neutron.api.v2 import attributes @@ -105,25 +103,24 @@ class PolicyTestCase(base.BaseTestCase): result = policy.enforce(self.context, action, self.target) self.assertEqual(result, True) - @mock.patch.object(urlrequest, 'urlopen', - return_value=six.StringIO("True")) - def test_enforce_http_true(self, mock_urlrequest): + #TODO(kevinbenton): replace these private method mocks with a fixture + @mock.patch.object(oslo_policy._checks.HttpCheck, '__call__', + return_value=True) + def test_enforce_http_true(self, mock_httpcheck): action = "example:get_http" target = {} result = policy.enforce(self.context, action, target) self.assertEqual(result, True) - def test_enforce_http_false(self): - - def fakeurlopen(url, post_data): - return six.StringIO("False") - - with mock.patch.object(urlrequest, 'urlopen', new=fakeurlopen): - action = "example:get_http" - target = {} - self.assertRaises(oslo_policy.PolicyNotAuthorized, - policy.enforce, self.context, - action, target) + #TODO(kevinbenton): replace these private method mocks with a fixture + @mock.patch.object(oslo_policy._checks.HttpCheck, '__call__', + return_value=False) + def test_enforce_http_false(self, mock_httpcheck): + action = "example:get_http" + target = {} + self.assertRaises(oslo_policy.PolicyNotAuthorized, + policy.enforce, self.context, + action, target) def test_templatized_enforcement(self): target_mine = {'tenant_id': 'fake'} diff --git a/test-requirements.txt b/test-requirements.txt index ac9738eabe7..cc612953b21 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -13,6 +13,7 @@ sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 oslosphinx>=2.5.0 # Apache-2.0 testrepository>=0.0.18 testtools>=1.4.0 +testresources>=0.2.4 testscenarios>=0.4 WebTest>=2.0 oslotest>=1.10.0 # Apache-2.0