summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Mestery <mestery@mestery.com>2014-10-24 10:53:51 +0000
committerKyle Mestery <mestery@mestery.com>2014-10-24 11:05:20 +0000
commitc089154a94e5872efc95eab33d3d0c9de8619fe4 (patch)
treefcdb005225c1a698915c37355beef4c0b90e3884
parent4ed88624b1a13671f10f17431bf21861d15d0b4a (diff)
parentcc400e266c99087113b3599d170e93c6d9f2d664 (diff)
downloadneutron-c089154a94e5872efc95eab33d3d0c9de8619fe4.tar.gz
Merge remote-tracking branch 'origin' into merge-branch
This commit merges the master neutron branch into the feature/lbaasv2 branch. This is needed to get the feature/lbaasv2 branch building again. Change-Id: Iba59aa20adc6b369b4b9d250afee406159287ba1
-rw-r--r--.pylintrc124
-rw-r--r--HACKING.rst1
-rw-r--r--doc/source/devref/db_layer.rst9
-rw-r--r--etc/neutron.conf9
-rw-r--r--etc/neutron/plugins/cisco/cisco_cfg_agent.ini15
-rw-r--r--etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini63
-rw-r--r--etc/neutron/rootwrap.d/l3.filters3
-rw-r--r--neutron/agent/__init__.py14
-rw-r--r--neutron/agent/common/__init__.py14
-rw-r--r--neutron/agent/common/config.py9
-rw-r--r--neutron/agent/firewall.py14
-rw-r--r--neutron/agent/l2population_rpc.py4
-rw-r--r--neutron/agent/l3_agent.py212
-rw-r--r--neutron/agent/linux/__init__.py14
-rw-r--r--neutron/agent/linux/dhcp.py3
-rw-r--r--neutron/agent/linux/external_process.py8
-rw-r--r--neutron/agent/linux/interface.py63
-rw-r--r--neutron/agent/linux/ip_lib.py5
-rw-r--r--neutron/agent/linux/iptables_comments.py34
-rw-r--r--neutron/agent/linux/iptables_firewall.py59
-rw-r--r--neutron/agent/linux/iptables_manager.py32
-rw-r--r--neutron/agent/linux/ovs_lib.py46
-rw-r--r--neutron/agent/linux/utils.py31
-rw-r--r--neutron/agent/metadata/__init__.py13
-rw-r--r--neutron/agent/metadata/agent.py22
-rw-r--r--neutron/agent/metadata/namespace_proxy.py2
-rw-r--r--neutron/agent/securitygroups_rpc.py41
-rw-r--r--neutron/api/rpc/handlers/dhcp_rpc.py8
-rw-r--r--neutron/api/rpc/handlers/dvr_rpc.py5
-rw-r--r--neutron/api/v2/attributes.py4
-rw-r--r--neutron/api/v2/base.py4
-rw-r--r--neutron/cmd/__init__.py14
-rw-r--r--neutron/cmd/sanity_check.py6
-rw-r--r--neutron/common/config.py2
-rw-r--r--neutron/common/constants.py10
-rw-r--r--neutron/common/exceptions.py4
-rw-r--r--neutron/db/db_base_plugin_v2.py84
-rw-r--r--neutron/db/firewall/__init__.py14
-rw-r--r--neutron/db/firewall/firewall_db.py79
-rw-r--r--neutron/db/l3_agentschedulers_db.py34
-rw-r--r--neutron/db/l3_db.py187
-rw-r--r--neutron/db/l3_dvr_db.py125
-rw-r--r--neutron/db/l3_dvrscheduler_db.py14
-rw-r--r--neutron/db/l3_gwmode_db.py8
-rw-r--r--neutron/db/l3_hamode_db.py21
-rw-r--r--neutron/db/loadbalancer/__init__.py13
-rw-r--r--neutron/db/metering/__init__.py13
-rw-r--r--neutron/db/metering/metering_db.py4
-rw-r--r--neutron/db/migration/alembic_migrations/env.py1
-rw-r--r--neutron/db/migration/alembic_migrations/versions/1f71e54a85e7_ml2_net_seg_model.py40
-rw-r--r--neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py107
-rw-r--r--neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py12
-rw-r--r--neutron/db/migration/alembic_migrations/versions/44621190bc02_add_uniqueconstraint_ipavailability_ranges.py61
-rw-r--r--neutron/db/migration/alembic_migrations/versions/544673ac99ab_add_router_port_table.py65
-rw-r--r--neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py7
-rw-r--r--neutron/db/migration/alembic_migrations/versions/HEAD2
-rw-r--r--neutron/db/migration/alembic_migrations/versions/juno_release.py36
-rw-r--r--neutron/db/migration/cli.py12
-rwxr-xr-xneutron/db/migration/migrate_to_ml2.py44
-rw-r--r--neutron/db/models_v2.py13
-rw-r--r--neutron/db/securitygroups_db.py13
-rw-r--r--neutron/db/securitygroups_rpc_base.py56
-rw-r--r--neutron/db/vpn/__init__.py14
-rw-r--r--neutron/db/vpn/vpn_db.py13
-rw-r--r--neutron/debug/__init__.py14
-rw-r--r--neutron/extensions/firewall.py25
-rw-r--r--neutron/extensions/l3.py16
-rw-r--r--neutron/extensions/l3_ext_gw_mode.py8
-rw-r--r--neutron/extensions/l3_ext_ha_mode.py2
-rw-r--r--neutron/extensions/quotasv2.py5
-rw-r--r--neutron/extensions/vpnaas.py4
-rw-r--r--neutron/hacking/checks.py12
-rw-r--r--neutron/locale/de/LC_MESSAGES/neutron-log-error.po263
-rw-r--r--neutron/locale/de/LC_MESSAGES/neutron-log-info.po185
-rw-r--r--neutron/locale/de/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/locale/en_AU/LC_MESSAGES/neutron-log-error.po263
-rw-r--r--neutron/locale/en_AU/LC_MESSAGES/neutron-log-info.po173
-rw-r--r--neutron/locale/en_AU/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/locale/en_GB/LC_MESSAGES/neutron-log-critical.po20
-rw-r--r--neutron/locale/en_GB/LC_MESSAGES/neutron-log-error.po268
-rw-r--r--neutron/locale/en_GB/LC_MESSAGES/neutron-log-info.po173
-rw-r--r--neutron/locale/en_GB/LC_MESSAGES/neutron-log-warning.po159
-rw-r--r--neutron/locale/en_US/LC_MESSAGES/neutron.po16682
-rw-r--r--neutron/locale/es/LC_MESSAGES/neutron-log-error.po263
-rw-r--r--neutron/locale/es/LC_MESSAGES/neutron-log-info.po189
-rw-r--r--neutron/locale/es/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/locale/fr/LC_MESSAGES/neutron-log-critical.po23
-rw-r--r--neutron/locale/fr/LC_MESSAGES/neutron-log-error.po263
-rw-r--r--neutron/locale/fr/LC_MESSAGES/neutron-log-info.po205
-rw-r--r--neutron/locale/fr/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/locale/it/LC_MESSAGES/neutron-log-error.po264
-rw-r--r--neutron/locale/it/LC_MESSAGES/neutron-log-info.po187
-rw-r--r--neutron/locale/it/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/locale/ja/LC_MESSAGES/neutron-log-error.po263
-rw-r--r--neutron/locale/ja/LC_MESSAGES/neutron-log-info.po191
-rw-r--r--neutron/locale/ja/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/locale/ko_KR/LC_MESSAGES/neutron-log-error.po263
-rw-r--r--neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po193
-rw-r--r--neutron/locale/ko_KR/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/locale/neutron-log-error.pot150
-rw-r--r--neutron/locale/neutron-log-info.pot173
-rw-r--r--neutron/locale/neutron-log-warning.pot97
-rw-r--r--neutron/locale/neutron.pot5501
-rw-r--r--neutron/locale/pt_BR/LC_MESSAGES/neutron-log-error.po265
-rw-r--r--neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po191
-rw-r--r--neutron/locale/pt_BR/LC_MESSAGES/neutron-log-warning.po159
-rw-r--r--neutron/locale/sr/LC_MESSAGES/neutron-log-warning.po157
-rw-r--r--neutron/locale/te_IN/LC_MESSAGES/neutron-log-critical.po21
-rw-r--r--neutron/locale/te_IN/LC_MESSAGES/neutron-log-error.po266
-rw-r--r--neutron/locale/te_IN/LC_MESSAGES/neutron-log-info.po173
-rw-r--r--neutron/locale/te_IN/LC_MESSAGES/neutron-log-warning.po158
-rw-r--r--neutron/locale/vi_VN/LC_MESSAGES/neutron-log-info.po173
-rw-r--r--neutron/locale/zh_CN/LC_MESSAGES/neutron-log-error.po263
-rw-r--r--neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po187
-rw-r--r--neutron/locale/zh_CN/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po189
-rw-r--r--neutron/locale/zh_TW/LC_MESSAGES/neutron-log-warning.po156
-rw-r--r--neutron/notifiers/nova.py10
-rw-r--r--neutron/openstack/common/__init__.py17
-rw-r--r--neutron/openstack/common/_i18n.py40
-rw-r--r--neutron/openstack/common/cache/_backends/memory.py5
-rw-r--r--neutron/openstack/common/cache/backends.py83
-rw-r--r--neutron/openstack/common/cache/cache.py4
-rw-r--r--neutron/openstack/common/eventlet_backdoor.py9
-rw-r--r--neutron/openstack/common/fileutils.py26
-rw-r--r--neutron/openstack/common/lockutils.py169
-rw-r--r--neutron/openstack/common/log.py162
-rw-r--r--neutron/openstack/common/loopingcall.py46
-rw-r--r--neutron/openstack/common/service.py10
-rw-r--r--neutron/openstack/common/sslutils.py98
-rw-r--r--neutron/openstack/common/systemd.py4
-rw-r--r--neutron/openstack/common/threadgroup.py28
-rw-r--r--neutron/openstack/common/versionutils.py148
-rw-r--r--neutron/plugins/bigswitch/__init__.py14
-rw-r--r--neutron/plugins/bigswitch/db/__init__.py14
-rw-r--r--neutron/plugins/bigswitch/extensions/__init__.py14
-rw-r--r--neutron/plugins/bigswitch/plugin.py2
-rw-r--r--neutron/plugins/bigswitch/servermanager.py11
-rw-r--r--neutron/plugins/bigswitch/tests/__init__.py14
-rw-r--r--neutron/plugins/brocade/NeutronPlugin.py6
-rw-r--r--neutron/plugins/brocade/__init__.py14
-rw-r--r--neutron/plugins/brocade/db/__init__.py14
-rw-r--r--neutron/plugins/brocade/nos/__init__.py14
-rw-r--r--neutron/plugins/cisco/__init__.py13
-rw-r--r--neutron/plugins/cisco/cfg_agent/cfg_agent.py8
-rw-r--r--neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py2
-rw-r--r--neutron/plugins/cisco/cfg_agent/device_status.py9
-rw-r--r--neutron/plugins/cisco/common/__init__.py13
-rw-r--r--neutron/plugins/cisco/db/__init__.py13
-rw-r--r--neutron/plugins/cisco/db/l3/device_handling_db.py22
-rw-r--r--neutron/plugins/cisco/db/n1kv_db_v2.py28
-rw-r--r--neutron/plugins/cisco/extensions/__init__.py14
-rw-r--r--neutron/plugins/cisco/extensions/qos.py2
-rw-r--r--neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py2
-rw-r--r--neutron/plugins/cisco/models/__init__.py13
-rw-r--r--neutron/plugins/cisco/n1kv/__init__.py13
-rw-r--r--neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py5
-rw-r--r--neutron/plugins/common/__init__.py14
-rw-r--r--neutron/plugins/embrane/__init__.py14
-rw-r--r--neutron/plugins/embrane/agent/__init__.py14
-rw-r--r--neutron/plugins/embrane/agent/operations/__init__.py14
-rw-r--r--neutron/plugins/embrane/common/__init__.py14
-rw-r--r--neutron/plugins/embrane/l2base/__init__.py14
-rw-r--r--neutron/plugins/embrane/l2base/fake/__init__.py14
-rw-r--r--neutron/plugins/embrane/plugins/__init__.py14
-rw-r--r--neutron/plugins/hyperv/__init__.py14
-rw-r--r--neutron/plugins/hyperv/agent/__init__.py14
-rw-r--r--neutron/plugins/hyperv/common/__init__.py14
-rw-r--r--neutron/plugins/linuxbridge/README125
-rwxr-xr-xneutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py7
-rw-r--r--neutron/plugins/linuxbridge/common/__init__.py13
-rw-r--r--neutron/plugins/linuxbridge/db/__init__.py13
-rw-r--r--neutron/plugins/linuxbridge/db/l2network_db_v2.py238
-rw-r--r--neutron/plugins/linuxbridge/lb_neutron_plugin.py546
-rw-r--r--neutron/plugins/metaplugin/__init__.py14
-rw-r--r--neutron/plugins/metaplugin/common/__init__.py14
-rw-r--r--neutron/plugins/midonet/__init__.py15
-rw-r--r--neutron/plugins/midonet/agent/__init__.py14
-rw-r--r--neutron/plugins/midonet/common/__init__.py14
-rw-r--r--neutron/plugins/midonet/midonet_lib.py3
-rw-r--r--neutron/plugins/ml2/__init__.py14
-rw-r--r--neutron/plugins/ml2/common/__init__.py14
-rw-r--r--neutron/plugins/ml2/db.py7
-rw-r--r--neutron/plugins/ml2/drivers/__init__.py14
-rw-r--r--neutron/plugins/ml2/drivers/arista/__init__.py14
-rw-r--r--neutron/plugins/ml2/drivers/arista/arista_l3_driver.py68
-rw-r--r--neutron/plugins/ml2/drivers/l2pop/__init__.py14
-rw-r--r--neutron/plugins/ml2/drivers/l2pop/mech_driver.py27
-rw-r--r--neutron/plugins/ml2/drivers/mechanism_odl.py103
-rw-r--r--neutron/plugins/ml2/managers.py5
-rw-r--r--neutron/plugins/ml2/models.py1
-rw-r--r--neutron/plugins/ml2/plugin.py99
-rw-r--r--neutron/plugins/ml2/rpc.py3
-rw-r--r--neutron/plugins/mlnx/__init__.py14
-rw-r--r--neutron/plugins/mlnx/agent/__init__.py14
-rw-r--r--neutron/plugins/mlnx/common/__init__.py14
-rw-r--r--neutron/plugins/mlnx/common/comm_utils.py3
-rw-r--r--neutron/plugins/mlnx/db/__init__.py14
-rw-r--r--neutron/plugins/mlnx/mlnx_plugin.py6
-rw-r--r--neutron/plugins/nec/__init__.py13
-rw-r--r--neutron/plugins/nec/agent/__init__.py13
-rw-r--r--neutron/plugins/nec/common/__init__.py13
-rw-r--r--neutron/plugins/nec/db/__init__.py13
-rw-r--r--neutron/plugins/nec/extensions/__init__.py13
-rw-r--r--neutron/plugins/nuage/nuage_models.py6
-rw-r--r--neutron/plugins/nuage/nuagedb.py1
-rw-r--r--neutron/plugins/nuage/plugin.py34
-rw-r--r--neutron/plugins/ofagent/agent/arp_lib.py25
-rw-r--r--neutron/plugins/ofagent/agent/ports.py8
-rw-r--r--neutron/plugins/openvswitch/README8
-rw-r--r--neutron/plugins/openvswitch/common/__init__.py13
-rw-r--r--neutron/plugins/openvswitch/common/config.py13
-rw-r--r--neutron/plugins/openvswitch/ovs_db_v2.py396
-rw-r--r--neutron/plugins/openvswitch/ovs_neutron_plugin.py651
-rw-r--r--neutron/plugins/plumgrid/__init__.py13
-rw-r--r--neutron/plugins/plumgrid/common/__init__.py13
-rw-r--r--neutron/plugins/plumgrid/drivers/__init__.py13
-rw-r--r--neutron/plugins/plumgrid/plumgrid_plugin/__init__.py13
-rw-r--r--neutron/plugins/ryu/common/__init__.py13
-rw-r--r--neutron/plugins/vmware/api_client/base.py5
-rw-r--r--neutron/plugins/vmware/common/utils.py2
-rw-r--r--neutron/plugins/vmware/dhcp_meta/__init__.py14
-rw-r--r--neutron/plugins/vmware/extensions/distributedrouter.py39
-rw-r--r--neutron/plugins/vmware/nsxlib/l2gateway.py4
-rw-r--r--neutron/plugins/vmware/plugins/base.py67
-rw-r--r--neutron/plugins/vmware/plugins/service.py52
-rw-r--r--neutron/plugins/vmware/vshield/__init__.py14
-rw-r--r--neutron/plugins/vmware/vshield/edge_appliance_driver.py58
-rw-r--r--neutron/plugins/vmware/vshield/tasks/tasks.py4
-rw-r--r--neutron/plugins/vmware/vshield/vcns.py6
-rw-r--r--neutron/policy.py51
-rw-r--r--neutron/scheduler/__init__.py14
-rw-r--r--neutron/service.py2
-rw-r--r--neutron/services/__init__.py14
-rw-r--r--neutron/services/firewall/__init__.py14
-rw-r--r--neutron/services/firewall/agents/__init__.py14
-rw-r--r--neutron/services/firewall/agents/l3reference/__init__.py14
-rwxr-xr-xneutron/services/firewall/agents/varmour/__init__.py14
-rw-r--r--neutron/services/firewall/drivers/__init__.py14
-rw-r--r--neutron/services/firewall/drivers/linux/__init__.py14
-rwxr-xr-xneutron/services/firewall/drivers/varmour/__init__.py14
-rw-r--r--neutron/services/l3_router/__init__.py14
-rw-r--r--neutron/services/l3_router/brocade/l3_router_plugin.py16
-rw-r--r--neutron/services/l3_router/l3_arista.py7
-rw-r--r--neutron/services/loadbalancer/__init__.py14
-rw-r--r--neutron/services/loadbalancer/drivers/__init__.py13
-rw-r--r--neutron/services/loadbalancer/drivers/haproxy/__init__.py13
-rw-r--r--neutron/services/loadbalancer/drivers/radware/__init__.py13
-rw-r--r--neutron/services/metering/__init__.py13
-rw-r--r--neutron/services/metering/agents/__init__.py13
-rw-r--r--neutron/services/metering/drivers/__init__.py13
-rw-r--r--neutron/services/metering/drivers/iptables/__init__.py13
-rw-r--r--neutron/services/metering/drivers/noop/__init__.py13
-rw-r--r--neutron/services/vpn/__init__.py14
-rw-r--r--neutron/services/vpn/agent.py8
-rw-r--r--neutron/services/vpn/common/__init__.py14
-rw-r--r--neutron/services/vpn/device_drivers/cisco_csr_rest_client.py30
-rw-r--r--neutron/services/vpn/device_drivers/cisco_ipsec.py90
-rw-r--r--neutron/services/vpn/device_drivers/ipsec.py5
-rw-r--r--neutron/services/vpn/plugin.py3
-rw-r--r--neutron/services/vpn/service_drivers/__init__.py4
-rw-r--r--neutron/services/vpn/service_drivers/cisco_cfg_loader.py7
-rw-r--r--neutron/services/vpn/service_drivers/cisco_csr_db.py23
-rw-r--r--neutron/services/vpn/service_drivers/cisco_ipsec.py4
-rw-r--r--neutron/tests/__init__.py14
-rw-r--r--neutron/tests/base.py20
-rw-r--r--neutron/tests/etc/neutron.conf.test2
-rw-r--r--neutron/tests/functional/__init__.py13
-rw-r--r--neutron/tests/functional/agent/__init__.py13
-rw-r--r--neutron/tests/functional/agent/linux/__init__.py13
-rw-r--r--neutron/tests/functional/agent/linux/test_process_monitor.py1
-rw-r--r--neutron/tests/unit/agent/__init__.py13
-rw-r--r--neutron/tests/unit/agent/linux/__init__.py13
-rw-r--r--neutron/tests/unit/agent/linux/test_ovs_lib.py45
-rw-r--r--neutron/tests/unit/agent/test_l2population_rpc.py14
-rw-r--r--neutron/tests/unit/bigswitch/__init__.py14
-rw-r--r--neutron/tests/unit/bigswitch/test_restproxy_plugin.py7
-rw-r--r--neutron/tests/unit/bigswitch/test_servermanager.py9
-rw-r--r--neutron/tests/unit/brocade/__init__.py15
-rw-r--r--neutron/tests/unit/cisco/__init__.py14
-rw-r--r--neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py2
-rw-r--r--neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py2
-rw-r--r--neutron/tests/unit/cisco/n1kv/__init__.py13
-rw-r--r--neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py45
-rw-r--r--neutron/tests/unit/db/__init__.py13
-rw-r--r--neutron/tests/unit/db/firewall/__init__.py13
-rw-r--r--neutron/tests/unit/db/firewall/test_db_firewall.py73
-rw-r--r--neutron/tests/unit/db/loadbalancer/__init__.py13
-rw-r--r--neutron/tests/unit/db/metering/__init__.py13
-rw-r--r--neutron/tests/unit/db/test_l3_dvr_db.py49
-rw-r--r--neutron/tests/unit/db/test_l3_ha_db.py61
-rw-r--r--neutron/tests/unit/db/test_migration.py343
-rw-r--r--neutron/tests/unit/db/vpn/__init__.py14
-rw-r--r--neutron/tests/unit/db/vpn/test_db_vpnaas.py51
-rw-r--r--neutron/tests/unit/embrane/__init__.py14
-rw-r--r--neutron/tests/unit/extensions/__init__.py13
-rw-r--r--neutron/tests/unit/hyperv/__init__.py14
-rw-r--r--neutron/tests/unit/linuxbridge/__init__.py14
-rw-r--r--neutron/tests/unit/linuxbridge/test_agent_scheduler.py34
-rw-r--r--neutron/tests/unit/linuxbridge/test_lb_db.py169
-rw-r--r--neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py4
-rw-r--r--neutron/tests/unit/linuxbridge/test_lb_security_group.py97
-rw-r--r--neutron/tests/unit/linuxbridge/test_linuxbridge_plugin.py127
-rw-r--r--neutron/tests/unit/linuxbridge/test_rpcapi.py143
-rw-r--r--neutron/tests/unit/metaplugin/__init__.py14
-rw-r--r--neutron/tests/unit/midonet/__init__.py15
-rw-r--r--neutron/tests/unit/midonet/test_midonet_lib.py14
-rw-r--r--neutron/tests/unit/ml2/__init__.py14
-rw-r--r--neutron/tests/unit/ml2/drivers/__init__.py14
-rw-r--r--neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py63
-rw-r--r--neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py20
-rw-r--r--neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py11
-rw-r--r--neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py74
-rw-r--r--neutron/tests/unit/ml2/drivers/test_l2population.py16
-rw-r--r--neutron/tests/unit/ml2/test_mechanism_odl.py192
-rw-r--r--neutron/tests/unit/ml2/test_ml2_plugin.py175
-rw-r--r--neutron/tests/unit/mlnx/__init__.py14
-rw-r--r--neutron/tests/unit/mlnx/test_mlnx_comm_utils.py3
-rw-r--r--neutron/tests/unit/nec/__init__.py13
-rw-r--r--neutron/tests/unit/nec/test_agent_scheduler.py2
-rw-r--r--neutron/tests/unit/nuage/test_nuage_plugin.py53
-rw-r--r--neutron/tests/unit/ofagent/test_arp_lib.py22
-rw-r--r--neutron/tests/unit/ofagent/test_ofa_flows.py81
-rw-r--r--neutron/tests/unit/ofagent/test_ofa_neutron_agent.py12
-rw-r--r--neutron/tests/unit/ofagent/test_ofa_ports.py3
-rw-r--r--neutron/tests/unit/opencontrail/test_contrail_plugin.py16
-rw-r--r--neutron/tests/unit/openvswitch/__init__.py14
-rw-r--r--neutron/tests/unit/openvswitch/test_agent_scheduler.py79
-rw-r--r--neutron/tests/unit/openvswitch/test_openvswitch_plugin.py159
-rw-r--r--neutron/tests/unit/openvswitch/test_ovs_db.py315
-rw-r--r--neutron/tests/unit/openvswitch/test_ovs_defaults.py3
-rw-r--r--neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py24
-rw-r--r--neutron/tests/unit/openvswitch/test_ovs_rpcapi.py134
-rw-r--r--neutron/tests/unit/openvswitch/test_ovs_security_group.py101
-rw-r--r--neutron/tests/unit/plumgrid/__init__.py13
-rw-r--r--neutron/tests/unit/ryu/__init__.py14
-rw-r--r--neutron/tests/unit/services/__init__.py13
-rw-r--r--neutron/tests/unit/services/firewall/__init__.py13
-rw-r--r--neutron/tests/unit/services/firewall/agents/__init__.py13
-rw-r--r--neutron/tests/unit/services/firewall/agents/l3reference/__init__.py13
-rw-r--r--neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py3
-rwxr-xr-xneutron/tests/unit/services/firewall/agents/varmour/__init__.py14
-rw-r--r--neutron/tests/unit/services/firewall/drivers/__init__.py13
-rw-r--r--neutron/tests/unit/services/firewall/drivers/linux/__init__.py13
-rwxr-xr-xneutron/tests/unit/services/firewall/drivers/varmour/__init__.py14
-rw-r--r--neutron/tests/unit/services/firewall/test_fwaas_plugin.py73
-rw-r--r--neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py3
-rw-r--r--neutron/tests/unit/services/loadbalancer/__init__.py13
-rw-r--r--neutron/tests/unit/services/loadbalancer/drivers/__init__.py13
-rw-r--r--neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py13
-rw-r--r--neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py27
-rw-r--r--neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py13
-rw-r--r--neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py24
-rw-r--r--neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py3
-rw-r--r--neutron/tests/unit/services/metering/__init__.py13
-rw-r--r--neutron/tests/unit/services/metering/drivers/__init__.py13
-rw-r--r--neutron/tests/unit/services/vpn/__init__.py14
-rw-r--r--neutron/tests/unit/services/vpn/device_drivers/__init__.py14
-rw-r--r--neutron/tests/unit/services/vpn/device_drivers/cisco_csr_mock.py577
-rw-r--r--neutron/tests/unit/services/vpn/device_drivers/notest_cisco_csr_rest.py1358
-rw-r--r--neutron/tests/unit/services/vpn/device_drivers/test_cisco_csr_rest.py1626
-rw-r--r--neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py6
-rw-r--r--neutron/tests/unit/services/vpn/service_drivers/__init__.py14
-rw-r--r--neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py8
-rw-r--r--neutron/tests/unit/services/vpn/test_vpn_agent.py23
-rw-r--r--neutron/tests/unit/test_api_v2.py75
-rw-r--r--neutron/tests/unit/test_db_plugin.py224
-rw-r--r--neutron/tests/unit/test_dhcp_agent.py53
-rw-r--r--neutron/tests/unit/test_dhcp_rpc.py35
-rw-r--r--neutron/tests/unit/test_extension_ext_gw_mode.py11
-rw-r--r--neutron/tests/unit/test_extension_extended_attribute.py4
-rw-r--r--neutron/tests/unit/test_extension_extraroute.py2
-rw-r--r--neutron/tests/unit/test_extension_firewall.py29
-rw-r--r--neutron/tests/unit/test_extension_security_group.py10
-rw-r--r--neutron/tests/unit/test_hacking.py18
-rw-r--r--neutron/tests/unit/test_iptables_firewall.py540
-rw-r--r--neutron/tests/unit/test_iptables_manager.py111
-rw-r--r--neutron/tests/unit/test_l3_agent.py330
-rw-r--r--neutron/tests/unit/test_l3_plugin.py20
-rw-r--r--neutron/tests/unit/test_l3_schedulers.py11
-rw-r--r--neutron/tests/unit/test_linux_dhcp.py33
-rw-r--r--neutron/tests/unit/test_linux_external_process.py11
-rw-r--r--neutron/tests/unit/test_linux_ip_lib.py10
-rw-r--r--neutron/tests/unit/test_metadata_agent.py30
-rw-r--r--neutron/tests/unit/test_metadata_namespace_proxy.py44
-rw-r--r--neutron/tests/unit/test_policy.py43
-rw-r--r--neutron/tests/unit/test_quota_ext.py15
-rw-r--r--neutron/tests/unit/test_security_groups_rpc.py93
-rw-r--r--neutron/tests/unit/test_wsgi.py6
-rw-r--r--neutron/tests/unit/testlib_api.py17
-rw-r--r--neutron/tests/unit/vmware/nsxlib/test_l2gateway.py7
-rw-r--r--neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py55
-rw-r--r--neutron/wsgi.py32
-rw-r--r--openstack-common.conf2
-rw-r--r--requirements.txt20
-rw-r--r--setup.cfg6
-rw-r--r--test-requirements.txt10
-rw-r--r--tox.ini13
398 files changed, 11073 insertions, 35008 deletions
diff --git a/.pylintrc b/.pylintrc
index 87fbcd3b3d..394adcb8b8 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -2,17 +2,97 @@
[MASTER]
# Add <file or directory> to the black list. It should be a base name, not a
# path. You may set this option multiple times.
-ignore=test
+#
+# Note the 'openstack' below is intended to match only
+# neutron.openstack.common. If we ever have another 'openstack'
+# dirname, then we'll need to expand the ignore features in pylint :/
+ignore=.git,tests,openstack
-[Messages Control]
-# NOTE(justinsb): We might want to have a 2nd strict pylintrc in future
-# C0111: Don't require docstrings on every method
-# W0511: TODOs in code comments are fine.
-# W0142: *args and **kwargs are fine.
-# W0622: Redefining id is fine.
-disable=C0111,W0511,W0142,W0622
+[MESSAGES CONTROL]
+# NOTE(gus): This is a long list. A number of these are important and
+# should be re-enabled once the offending code is fixed (or marked
+# with a local disable)
+disable=
+# "F" Fatal errors that prevent further processing
+ import-error,
+# "I" Informational noise
+ locally-disabled,
+# "E" Error for important programming issues (likely bugs)
+ access-member-before-definition,
+ assignment-from-no-return,
+ bad-except-order,
+ bad-super-call,
+ maybe-no-member,
+ no-member,
+ no-method-argument,
+ no-name-in-module,
+ no-self-argument,
+ not-callable,
+ no-value-for-parameter,
+ super-on-old-class,
+ too-few-format-args,
+# "W" Warnings for stylistic problems or minor programming issues
+ abstract-method,
+ anomalous-backslash-in-string,
+ anomalous-unicode-escape-in-string,
+ arguments-differ,
+ attribute-defined-outside-init,
+ bad-builtin,
+ bad-indentation,
+ broad-except,
+ dangerous-default-value,
+ deprecated-lambda,
+ duplicate-key,
+ expression-not-assigned,
+ fixme,
+ global-statement,
+ global-variable-not-assigned,
+ logging-not-lazy,
+ lost-exception,
+ no-init,
+ non-parent-init-called,
+ pointless-string-statement,
+ protected-access,
+ redefined-builtin,
+ redefined-outer-name,
+ redefine-in-handler,
+ signature-differs,
+ star-args,
+ super-init-not-called,
+ undefined-loop-variable,
+ unnecessary-lambda,
+ unnecessary-pass,
+ unpacking-non-sequence,
+ unreachable,
+ unused-argument,
+ unused-import,
+ unused-variable,
+ useless-else-on-loop,
+# "C" Coding convention violations
+ bad-continuation,
+ invalid-name,
+ missing-docstring,
+ old-style-class,
+ superfluous-parens,
+# "R" Refactor recommendations
+ abstract-class-little-used,
+ abstract-class-not-used,
+ cyclic-import,
+ duplicate-code,
+ interface-not-implemented,
+ no-self-use,
+ too-few-public-methods,
+ too-many-ancestors,
+ too-many-arguments,
+ too-many-branches,
+ too-many-instance-attributes,
+ too-many-lines,
+ too-many-locals,
+ too-many-public-methods,
+ too-many-return-statements,
+ too-many-statements
-[Basic]
+[BASIC]
# Variable names can be 1 to 31 characters long, with lowercase and underscores
variable-rgx=[a-z_][a-z0-9_]{0,30}$
@@ -21,7 +101,7 @@ argument-rgx=[a-z_][a-z0-9_]{1,30}$
# Method names should be at least 3 characters long
# and be lowecased with underscores
-method-rgx=([a-z_][a-z0-9_]{2,50}|setUp|tearDown)$
+method-rgx=([a-z_][a-z0-9_]{2,}|setUp|tearDown)$
# Module names matching neutron-* are ok (files in bin/)
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+)|(neutron-[a-z0-9_-]+))$
@@ -29,14 +109,26 @@ module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+)|(neutron-[a-z0-9_-]+))$
# Don't require docstrings on tests.
no-docstring-rgx=((__.*__)|([tT]est.*)|setUp|tearDown)$
-[Design]
-max-public-methods=100
-min-public-methods=0
-max-args=6
-
-[Variables]
+[FORMAT]
+# Maximum number of characters on a single line.
+max-line-length=79
+[VARIABLES]
# List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible.
# _ is used by our localization
additional-builtins=_
+
+[CLASSES]
+# List of interface methods to ignore, separated by a comma.
+ignore-iface-methods=
+
+[IMPORTS]
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=
+# should use openstack.common.jsonutils
+ json
+
+[REPORTS]
+# Tells whether to display a full report or only the messages
+reports=no
diff --git a/HACKING.rst b/HACKING.rst
index a0595952ca..b12291a1c0 100644
--- a/HACKING.rst
+++ b/HACKING.rst
@@ -12,6 +12,7 @@ Neutron Specific Commandments
- [N321] Validate that jsonutils module is used instead of json
- [N322] We do not use @authors tags in source files. We have git to track
authorship.
+- [N323] assert_called_once() is not a valid method
Creating Unit Tests
-------------------
diff --git a/doc/source/devref/db_layer.rst b/doc/source/devref/db_layer.rst
index 54eff65b78..bacd773160 100644
--- a/doc/source/devref/db_layer.rst
+++ b/doc/source/devref/db_layer.rst
@@ -1,2 +1,11 @@
Neutron Database Layer
======================
+
+
+Testing database and models sync
+--------------------------------
+
+.. automodule:: neutron.tests.unit.db.test_migration
+
+.. autoclass:: _TestModelsMigrations
+ :members:
diff --git a/etc/neutron.conf b/etc/neutron.conf
index a61afbd471..24e788c7f8 100644
--- a/etc/neutron.conf
+++ b/etc/neutron.conf
@@ -251,6 +251,11 @@ lock_path = $state_path/lock
# The uuid of the admin nova tenant
# nova_admin_tenant_id =
+# The name of the admin nova tenant. If the uuid of the admin nova tenant
+# is set, this is optional. Useful for cases where the uuid of the admin
+# nova tenant is not available when configuration is being done.
+# nova_admin_tenant_name =
+
# Password for connection to nova in admin context.
# nova_admin_password =
@@ -555,6 +560,10 @@ lock_path = $state_path/lock
# Change to "sudo" to skip the filtering and just run the comand directly
# root_helper = sudo
+# Set to true to add comments to generated iptables rules that describe
+# each rule's purpose. (System must support the iptables comments module.)
+# comment_iptables_rules = True
+
# =========== items for agent management extension =============
# seconds between nodes reporting state to server; should be less than
# agent_down_time, best if it is half or less than agent_down_time
diff --git a/etc/neutron/plugins/cisco/cisco_cfg_agent.ini b/etc/neutron/plugins/cisco/cisco_cfg_agent.ini
new file mode 100644
index 0000000000..d99e838278
--- /dev/null
+++ b/etc/neutron/plugins/cisco/cisco_cfg_agent.ini
@@ -0,0 +1,15 @@
+[cfg_agent]
+# (IntOpt) Interval in seconds for processing of service updates.
+# That is when the config agent's process_services() loop executes
+# and it lets each service helper to process its service resources.
+# rpc_loop_interval = 10
+
+# (StrOpt) Period-separated module path to the routing service helper class.
+# routing_svc_helper_class = neutron.plugins.cisco.cfg_agent.service_helpers.routing_svc_helper.RoutingServiceHelper
+
+# (IntOpt) Timeout value in seconds for connecting to a hosting device.
+# device_connection_timeout = 30
+
+# (IntOpt) The time in seconds until a backlogged hosting device is
+# presumed dead or booted to an error state.
+# hosting_device_dead_timeout = 300
diff --git a/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini b/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
index 9c8e6b5889..232ca71d36 100644
--- a/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
+++ b/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
@@ -1,52 +1,13 @@
[ovs]
-# (StrOpt) Type of network to allocate for tenant networks. The
-# default value 'local' is useful only for single-box testing and
-# provides no connectivity between hosts. You MUST either change this
-# to 'vlan' and configure network_vlan_ranges below or change this to
-# 'gre' or 'vxlan' and configure tunnel_id_ranges below in order for
-# tenant networks to provide connectivity between hosts. Set to 'none'
-# to disable creation of tenant networks.
-#
-# tenant_network_type = local
-# Example: tenant_network_type = gre
-# Example: tenant_network_type = vxlan
-
-# (ListOpt) Comma-separated list of
-# <physical_network>[:<vlan_min>:<vlan_max>] tuples enumerating ranges
-# of VLAN IDs on named physical networks that are available for
-# allocation. All physical networks listed are available for flat and
-# VLAN provider network creation. Specified ranges of VLAN IDs are
-# available for tenant network allocation if tenant_network_type is
-# 'vlan'. If empty, only gre, vxlan and local networks may be created.
-#
-# network_vlan_ranges =
-# Example: network_vlan_ranges = physnet1:1000:2999
-
# (BoolOpt) Set to True in the server and the agents to enable support
# for GRE or VXLAN networks. Requires kernel support for OVS patch ports and
# GRE or VXLAN tunneling.
#
# WARNING: This option will be deprecated in the Icehouse release, at which
-# point setting tunnel_type below will be required to enable
-# tunneling.
+# point setting tunnel_types will be required to enable tunneling.
#
# enable_tunneling = False
-# (StrOpt) The type of tunnel network, if any, supported by the plugin. If
-# this is set, it will cause tunneling to be enabled. If this is not set and
-# the option enable_tunneling is set, this will default to 'gre'.
-#
-# tunnel_type =
-# Example: tunnel_type = gre
-# Example: tunnel_type = vxlan
-
-# (ListOpt) Comma-separated list of <tun_min>:<tun_max> tuples
-# enumerating ranges of GRE or VXLAN tunnel IDs that are available for
-# tenant network allocation if tenant_network_type is 'gre' or 'vxlan'.
-#
-# tunnel_id_ranges =
-# Example: tunnel_id_ranges = 1:1000
-
# Do not change this parameter unless you have a good reason to.
# This is the name of the OVS integration bridge. There is one per hypervisor.
# The integration bridge acts as a virtual "patch bay". All VM VIFs are
@@ -55,7 +16,7 @@
#
# integration_bridge = br-int
-# Only used for the agent if tunnel_id_ranges (above) is not empty for
+# Only used for the agent if tunnel_id_ranges is not empty for
# the server. In most cases, the default value should be fine.
#
# tunnel_bridge = br-tun
@@ -66,7 +27,7 @@
# Peer patch port in tunnel bridge for integration bridge
# tun_peer_patch_port = patch-int
-# Uncomment this line for the agent if tunnel_id_ranges (above) is not
+# Uncomment this line for the agent if tunnel_id_ranges is not
# empty for the server. Set local-ip to be the local IP address of
# this hypervisor.
#
@@ -77,8 +38,8 @@
# bridge names to be used for flat and VLAN networks. The length of
# bridge names should be no more than 11. Each bridge must
# exist, and should have a physical network interface configured as a
-# port. All physical networks listed in network_vlan_ranges on the
-# server should have mappings to appropriate bridges on each agent.
+# port. All physical networks configured on the server should have
+# mappings to appropriate bridges on each agent.
#
# bridge_mappings =
# Example: bridge_mappings = physnet1:br-eth1
@@ -102,10 +63,8 @@
# (ListOpt) The types of tenant network tunnels supported by the agent.
# Setting this will enable tunneling support in the agent. This can be set to
# either 'gre' or 'vxlan'. If this is unset, it will default to [] and
-# disable tunneling support in the agent. When running the agent with the OVS
-# plugin, this value must be the same as "tunnel_type" in the "[ovs]" section.
-# When running the agent with ML2, you can specify as many values here as
-# your compute hosts supports.
+# disable tunneling support in the agent.
+# You can specify as many values here as your compute hosts supports.
#
# tunnel_types =
# Example: tunnel_types = gre
@@ -164,25 +123,17 @@
#
# 1. With VLANs on eth1.
# [ovs]
-# network_vlan_ranges = default:2000:3999
-# tunnel_id_ranges =
# integration_bridge = br-int
# bridge_mappings = default:br-eth1
#
# 2. With GRE tunneling.
# [ovs]
-# network_vlan_ranges =
-# tunnel_id_ranges = 1:1000
# integration_bridge = br-int
# tunnel_bridge = br-tun
# local_ip = 10.0.0.3
#
# 3. With VXLAN tunneling.
# [ovs]
-# network_vlan_ranges =
-# tenant_network_type = vxlan
-# tunnel_type = vxlan
-# tunnel_id_ranges = 1:1000
# integration_bridge = br-int
# tunnel_bridge = br-tun
# local_ip = 10.0.0.3
diff --git a/etc/neutron/rootwrap.d/l3.filters b/etc/neutron/rootwrap.d/l3.filters
index 6563169827..9a3031822a 100644
--- a/etc/neutron/rootwrap.d/l3.filters
+++ b/etc/neutron/rootwrap.d/l3.filters
@@ -46,3 +46,6 @@ ip6tables-restore: CommandFilter, ip6tables-restore, root
# Keepalived
keepalived: CommandFilter, keepalived, root
kill_keepalived: KillFilter, root, /usr/sbin/keepalived, -HUP, -15, -9
+
+# l3 agent to delete floatingip's conntrack state
+conntrack: CommandFilter, conntrack, root
diff --git a/neutron/agent/__init__.py b/neutron/agent/__init__.py
index bf3075ddd8..e69de29bb2 100644
--- a/neutron/agent/__init__.py
+++ b/neutron/agent/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/agent/common/__init__.py b/neutron/agent/common/__init__.py
index bf3075ddd8..e69de29bb2 100644
--- a/neutron/agent/common/__init__.py
+++ b/neutron/agent/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/agent/common/config.py b/neutron/agent/common/config.py
index d939560903..3ee41dde85 100644
--- a/neutron/agent/common/config.py
+++ b/neutron/agent/common/config.py
@@ -46,6 +46,11 @@ USE_NAMESPACES_OPTS = [
help=_("Allow overlapping IP.")),
]
+IPTABLES_OPTS = [
+ cfg.BoolOpt('comment_iptables_rules', default=True,
+ help=_("Add comments to iptables rules.")),
+]
+
def get_log_args(conf, log_file_name):
cmd_args = []
@@ -92,6 +97,10 @@ def register_use_namespaces_opts_helper(conf):
conf.register_opts(USE_NAMESPACES_OPTS)
+def register_iptables_opts(conf):
+ conf.register_opts(IPTABLES_OPTS, 'AGENT')
+
+
def get_root_helper(conf):
root_helper = conf.AGENT.root_helper
if root_helper != 'sudo':
diff --git a/neutron/agent/firewall.py b/neutron/agent/firewall.py
index 7ce1f99209..8ce8e7b16b 100644
--- a/neutron/agent/firewall.py
+++ b/neutron/agent/firewall.py
@@ -105,6 +105,14 @@ class FirewallDriver(object):
finally:
self.filter_defer_apply_off()
+ def update_security_group_members(self, sg_id, ips):
+ """Update group members in a security group."""
+ raise NotImplementedError()
+
+ def update_security_group_rules(self, sg_id, rules):
+ """Update rules in a security group."""
+ raise NotImplementedError()
+
class NoopFirewallDriver(FirewallDriver):
"""Noop Firewall Driver.
@@ -134,3 +142,9 @@ class NoopFirewallDriver(FirewallDriver):
@property
def ports(self):
return {}
+
+ def update_security_group_members(self, sg_id, ips):
+ pass
+
+ def update_security_group_rules(self, sg_id, rules):
+ pass
diff --git a/neutron/agent/l2population_rpc.py b/neutron/agent/l2population_rpc.py
index 737e2493ef..2798eee5e7 100644
--- a/neutron/agent/l2population_rpc.py
+++ b/neutron/agent/l2population_rpc.py
@@ -242,12 +242,12 @@ class L2populationRpcCallBackTunnelMixin(L2populationRpcCallBackMixin):
if agent_ip == local_ip:
continue
- after = state.get('after')
+ after = state.get('after', [])
for mac, ip in after:
self.setup_entry_for_arp_reply(br, 'add', lvm.vlan, mac,
ip)
- before = state.get('before')
+ before = state.get('before', [])
for mac, ip in before:
self.setup_entry_for_arp_reply(br, 'remove', lvm.vlan, mac,
ip)
diff --git a/neutron/agent/l3_agent.py b/neutron/agent/l3_agent.py
index 84953bc2e2..03f21d2bb7 100644
--- a/neutron/agent/l3_agent.py
+++ b/neutron/agent/l3_agent.py
@@ -22,6 +22,7 @@ eventlet.monkey_patch()
import netaddr
import os
from oslo.config import cfg
+from oslo import messaging
import Queue
from neutron.agent.common import config
@@ -34,13 +35,15 @@ from neutron.agent.linux import ra
from neutron.agent import rpc as agent_rpc
from neutron.common import config as common_config
from neutron.common import constants as l3_constants
+from neutron.common import exceptions as n_exc
from neutron.common import ipv6_utils
from neutron.common import rpc as n_rpc
from neutron.common import topics
from neutron.common import utils as common_utils
-from neutron import context
+from neutron import context as n_context
from neutron import manager
from neutron.openstack.common import excutils
+from neutron.openstack.common.gettextutils import _LE, _LW
from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall
@@ -241,7 +244,7 @@ class LinkLocalAllocator(object):
class RouterInfo(l3_ha_agent.RouterMixin):
def __init__(self, router_id, root_helper, use_namespaces, router,
- use_ipv6=False):
+ use_ipv6=False, ns_name=None):
self.router_id = router_id
self.ex_gw_port = None
self._snat_enabled = None
@@ -254,7 +257,7 @@ class RouterInfo(l3_ha_agent.RouterMixin):
self.use_namespaces = use_namespaces
# Invoke the setter for establishing initial SNAT action
self.router = router
- self.ns_name = NS_PREFIX + router_id if use_namespaces else None
+ self.ns_name = ns_name
self.iptables_manager = iptables_manager.IptablesManager(
root_helper=root_helper,
use_ipv6=use_ipv6,
@@ -518,31 +521,47 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
LOG.error(msg)
raise SystemExit(1)
- self.context = context.get_admin_context_without_session()
+ self.context = n_context.get_admin_context_without_session()
self.plugin_rpc = L3PluginApi(topics.L3PLUGIN, host)
self.fullsync = True
- self.updated_routers = set()
- self.removed_routers = set()
self.sync_progress = False
# Get the list of service plugins from Neutron Server
- try:
- self.neutron_service_plugins = (
- self.plugin_rpc.get_service_plugin_list(self.context))
- except n_rpc.RemoteError as e:
- LOG.warning(_('l3-agent cannot check service plugins '
- 'enabled at the neutron server when startup '
- 'due to RPC error. It happens when the server '
- 'does not support this RPC API. If the error '
- 'is UnsupportedVersion you can ignore '
- 'this warning. Detail message: %s'), e)
- self.neutron_service_plugins = None
+ # This is the first place where we contact neutron-server on startup
+ # so retry in case its not ready to respond.
+ retry_count = 5
+ while True:
+ retry_count = retry_count - 1
+ try:
+ self.neutron_service_plugins = (
+ self.plugin_rpc.get_service_plugin_list(self.context))
+ except n_rpc.RemoteError as e:
+ with excutils.save_and_reraise_exception() as ctx:
+ ctx.reraise = False
+ LOG.warning(_LW('l3-agent cannot check service plugins '
+ 'enabled at the neutron server when '
+ 'startup due to RPC error. It happens '
+ 'when the server does not support this '
+ 'RPC API. If the error is '
+ 'UnsupportedVersion you can ignore this '
+ 'warning. Detail message: %s'), e)
+ self.neutron_service_plugins = None
+ except messaging.MessagingTimeout as e:
+ with excutils.save_and_reraise_exception() as ctx:
+ if retry_count > 0:
+ ctx.reraise = False
+ LOG.warning(_LW('l3-agent cannot check service '
+ 'plugins enabled on the neutron '
+ 'server. Retrying. '
+ 'Detail message: %s'), e)
+ continue
+ break
self._clean_stale_namespaces = self.conf.use_namespaces
# dvr data
self.agent_gateway_port = None
- self.agent_fip_count = 0
+ self.fip_ns_subscribers = set()
self.local_subnets = LinkLocalAllocator(
os.path.join(self.conf.state_path, 'fip-linklocal-networks'),
FIP_LL_SUBNET)
@@ -554,6 +573,15 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
self.target_ex_net_id = None
self.use_ipv6 = ipv6_utils.is_enabled()
+ def _fip_ns_subscribe(self, router_id):
+ is_first = (len(self.fip_ns_subscribers) == 0)
+ self.fip_ns_subscribers.add(router_id)
+ return is_first
+
+ def _fip_ns_unsubscribe(self, router_id):
+ self.fip_ns_subscribers.discard(router_id)
+ return len(self.fip_ns_subscribers) == 0
+
def _check_config_params(self):
"""Check items in configuration files.
@@ -588,16 +616,22 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
'for namespace cleanup.'))
return set()
+ def _get_routers_namespaces(self, router_ids):
+ namespaces = set(self.get_ns_name(rid) for rid in router_ids)
+ namespaces.update(self.get_snat_ns_name(rid) for rid in router_ids)
+ return namespaces
+
def _cleanup_namespaces(self, router_namespaces, router_ids):
"""Destroy stale router namespaces on host when L3 agent restarts
- This routine is called when self._clean_stale_namespaces is True.
+ This routine is called when self._clean_stale_namespaces is True.
The argument router_namespaces is the list of all routers namespaces
The argument router_ids is the list of ids for known routers.
"""
- ns_to_ignore = set(NS_PREFIX + id for id in router_ids)
- ns_to_ignore.update(SNAT_NS_PREFIX + id for id in router_ids)
+ # Don't destroy namespaces of routers this agent handles.
+ ns_to_ignore = self._get_routers_namespaces(router_ids)
+
ns_to_destroy = router_namespaces - ns_to_ignore
self._destroy_stale_router_namespaces(ns_to_destroy)
@@ -610,7 +644,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
one attempt will be made to delete them.
"""
for ns in router_namespaces:
- ra.disable_ipv6_ra(ns[len(NS_PREFIX):], ns, self.root_helper)
try:
self._destroy_namespace(ns)
except RuntimeError:
@@ -620,8 +653,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
def _destroy_namespace(self, ns):
if ns.startswith(NS_PREFIX):
- if self.conf.enable_metadata_proxy:
- self._destroy_metadata_proxy(ns[len(NS_PREFIX):], ns)
self._destroy_router_namespace(ns)
elif ns.startswith(FIP_NS_PREFIX):
self._destroy_fip_namespace(ns)
@@ -670,6 +701,10 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
self.agent_gateway_port = None
def _destroy_router_namespace(self, ns):
+ router_id = ns[len(NS_PREFIX):]
+ ra.disable_ipv6_ra(router_id, ns, self.root_helper)
+ if self.conf.enable_metadata_proxy:
+ self._destroy_metadata_proxy(router_id, ns)
ns_ip = ip_lib.IPWrapper(self.root_helper, namespace=ns)
for d in ns_ip.get_devices(exclude_loopback=True):
if d.name.startswith(INTERNAL_DEV_PREFIX):
@@ -727,9 +762,14 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
raise Exception(msg)
def _router_added(self, router_id, router):
- ri = RouterInfo(router_id, self.root_helper,
- self.conf.use_namespaces, router,
- use_ipv6=self.use_ipv6)
+ ns_name = (self.get_ns_name(router_id)
+ if self.conf.use_namespaces else None)
+ ri = RouterInfo(router_id=router_id,
+ root_helper=self.root_helper,
+ use_namespaces=self.conf.use_namespaces,
+ router=router,
+ use_ipv6=self.use_ipv6,
+ ns_name=ns_name)
self.router_info[router_id] = ri
if self.conf.use_namespaces:
self._create_router_namespace(ri)
@@ -768,15 +808,13 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
for c, r in self.metadata_nat_rules():
ri.iptables_manager.ipv4['nat'].remove_rule(c, r)
ri.iptables_manager.apply()
- if self.conf.enable_metadata_proxy:
- self._destroy_metadata_proxy(ri.router_id, ri.ns_name)
del self.router_info[router_id]
self._destroy_router_namespace(ri.ns_name)
def _get_metadata_proxy_callback(self, router_id):
def callback(pid_file):
- metadata_proxy_socket = cfg.CONF.metadata_proxy_socket
+ metadata_proxy_socket = self.conf.metadata_proxy_socket
proxy_cmd = ['neutron-ns-metadata-proxy',
'--pid_file=%s' % pid_file,
'--metadata_proxy_socket=%s' % metadata_proxy_socket,
@@ -784,7 +822,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
'--state_path=%s' % self.conf.state_path,
'--metadata_port=%s' % self.conf.metadata_port]
proxy_cmd.extend(config.get_log_args(
- cfg.CONF, 'neutron-ns-metadata-proxy-%s.log' %
+ self.conf, 'neutron-ns-metadata-proxy-%s.log' %
router_id))
return proxy_cmd
@@ -948,7 +986,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
# Process SNAT/DNAT rules for floating IPs
fip_statuses = {}
try:
- if ex_gw_port or ri.ex_gw_port:
+ if ex_gw_port:
existing_floating_ips = ri.floating_ips
self.process_router_floating_ip_nat_rules(ri)
ri.iptables_manager.defer_apply_off()
@@ -962,7 +1000,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
for fip in ri.router.get(l3_constants.FLOATINGIP_KEY, []):
fip_statuses[fip['id']] = l3_constants.FLOATINGIP_STATUS_ERROR
- if ex_gw_port or ri.ex_gw_port:
+ if ex_gw_port:
# Identify floating IPs which were disabled
ri.floating_ips = set(fip_statuses.keys())
for fip_id in existing_floating_ips - ri.floating_ips:
@@ -1066,9 +1104,11 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
if ri.router['distributed']:
# filter out only FIPs for this host/agent
floating_ips = [i for i in floating_ips if i['host'] == self.host]
- if floating_ips and self.agent_gateway_port is None:
- self._create_agent_gateway_port(ri, floating_ips[0]
- ['floating_network_id'])
+ if floating_ips:
+ is_first = self._fip_ns_subscribe(ri.router_id)
+ if is_first:
+ self._create_agent_gateway_port(ri, floating_ips[0]
+ ['floating_network_id'])
if self.agent_gateway_port:
if floating_ips and ri.dist_fip_count == 0:
@@ -1115,6 +1155,9 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
else:
net = netaddr.IPNetwork(ip_cidr)
device.addr.delete(net.version, ip_cidr)
+ self.driver.delete_conntrack_state(root_helper=self.root_helper,
+ namespace=ri.ns_name,
+ ip=ip_cidr)
if ri.router['distributed']:
self.floating_ip_removed_dist(ri, ip_cidr)
@@ -1215,6 +1258,9 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
def get_fip_ns_name(self, ext_net_id):
return (FIP_NS_PREFIX + ext_net_id)
+ def get_ns_name(self, router_id):
+ return (NS_PREFIX + router_id)
+
def get_snat_ns_name(self, router_id):
return (SNAT_NS_PREFIX + router_id)
@@ -1384,7 +1430,7 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
self._snat_redirect_remove(ri, p, internal_interface)
if self.conf.agent_mode == 'dvr_snat' and (
- ex_gw_port['binding:host_id'] == self.host):
+ ri.router['gw_port_host'] == self.host):
ns_name = self.get_snat_ns_name(ri.router['id'])
else:
# not hosting agent - no work to do
@@ -1626,7 +1672,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
interface_name, floating_ip,
distributed=True)
# update internal structures
- self.agent_fip_count = self.agent_fip_count + 1
ri.dist_fip_count = ri.dist_fip_count + 1
def floating_ip_removed_dist(self, ri, fip_cidr):
@@ -1660,10 +1705,10 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
self.local_subnets.release(ri.router_id)
ri.rtr_fip_subnet = None
ns_ip.del_veth(fip_2_rtr_name)
- # clean up fip-namespace if this is the last FIP
- self.agent_fip_count = self.agent_fip_count - 1
- if self.agent_fip_count == 0:
- self._destroy_fip_namespace(fip_ns_name)
+ is_last = self._fip_ns_unsubscribe(ri.router_id)
+ # clean up fip-namespace if this is the last FIP
+ if is_last:
+ self._destroy_fip_namespace(fip_ns_name)
def floating_forward_rules(self, floating_ip, fixed_ip):
return [('PREROUTING', '-d %s -j DNAT --to %s' %
@@ -1742,51 +1787,38 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
LOG.debug(_('Got router added to agent :%r'), payload)
self.routers_updated(context, payload)
- def _process_routers(self, routers, all_routers=False):
- pool = eventlet.GreenPool()
+ def _process_router_if_compatible(self, router):
if (self.conf.external_network_bridge and
not ip_lib.device_exists(self.conf.external_network_bridge)):
LOG.error(_("The external network bridge '%s' does not exist"),
self.conf.external_network_bridge)
return
+ # If namespaces are disabled, only process the router associated
+ # with the configured agent id.
+ if (not self.conf.use_namespaces and
+ router['id'] != self.conf.router_id):
+ raise n_exc.RouterNotCompatibleWithAgent(router_id=router['id'])
+
+ # Either ex_net_id or handle_internal_only_routers must be set
+ ex_net_id = (router['external_gateway_info'] or {}).get('network_id')
+ if not ex_net_id and not self.conf.handle_internal_only_routers:
+ raise n_exc.RouterNotCompatibleWithAgent(router_id=router['id'])
+
+ # If target_ex_net_id and ex_net_id are set they must be equal
target_ex_net_id = self._fetch_external_net_id()
- # if routers are all the routers we have (They are from router sync on
- # starting or when error occurs during running), we seek the
- # routers which should be removed.
- # If routers are from server side notification, we seek them
- # from subset of incoming routers and ones we have now.
- if all_routers:
- prev_router_ids = set(self.router_info)
- else:
- prev_router_ids = set(self.router_info) & set(
- [router['id'] for router in routers])
- cur_router_ids = set()
- for r in routers:
- # If namespaces are disabled, only process the router associated
- # with the configured agent id.
- if (not self.conf.use_namespaces and
- r['id'] != self.conf.router_id):
- continue
- ex_net_id = (r['external_gateway_info'] or {}).get('network_id')
- if not ex_net_id and not self.conf.handle_internal_only_routers:
- continue
- if (target_ex_net_id and ex_net_id and
- ex_net_id != target_ex_net_id):
- # Double check that our single external_net_id has not changed
- # by forcing a check by RPC.
- if (ex_net_id != self._fetch_external_net_id(force=True)):
- continue
- cur_router_ids.add(r['id'])
- if r['id'] not in self.router_info:
- self._router_added(r['id'], r)
- ri = self.router_info[r['id']]
- ri.router = r
- pool.spawn_n(self.process_router, ri)
- # identify and remove routers that no longer exist
- for router_id in prev_router_ids - cur_router_ids:
- pool.spawn_n(self._router_removed, router_id)
- pool.waitall()
+ if (target_ex_net_id and ex_net_id and ex_net_id != target_ex_net_id):
+ # Double check that our single external_net_id has not changed
+ # by forcing a check by RPC.
+ if ex_net_id != self._fetch_external_net_id(force=True):
+ raise n_exc.RouterNotCompatibleWithAgent(
+ router_id=router['id'])
+
+ if router['id'] not in self.router_info:
+ self._router_added(router['id'], router)
+ ri = self.router_info[router['id']]
+ ri.router = router
+ self.process_router(ri)
def _process_router_update(self):
for rp, update in self._queue.each_update_to_next_router():
@@ -1810,7 +1842,15 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
self._router_removed(update.id)
continue
- self._process_routers([router])
+ try:
+ self._process_router_if_compatible(router)
+ except n_exc.RouterNotCompatibleWithAgent as e:
+ LOG.exception(e.msg)
+ # Was the router previously handled by this agent?
+ if router['id'] in self.router_info:
+ LOG.error(_LE("Removing incompatible router '%s'"),
+ router['id'])
+ self._router_removed(router['id'])
LOG.debug("Finished a router update for %s", update.id)
rp.fetched_and_processed(update.timestamp)
@@ -1820,12 +1860,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
while True:
pool.spawn_n(self._process_router_update)
- def _process_router_delete(self):
- current_removed_routers = list(self.removed_routers)
- for router_id in current_removed_routers:
- self._router_removed(router_id)
- self.removed_routers.remove(router_id)
-
def _router_ids(self):
if not self.conf.use_namespaces:
return [self.conf.router_id]
@@ -1851,8 +1885,6 @@ class L3NATAgent(firewall_l3_agent.FWaaSL3AgentRpcCallback,
try:
router_ids = self._router_ids()
- self.updated_routers.clear()
- self.removed_routers.clear()
timestamp = timeutils.utcnow()
routers = self.plugin_rpc.get_routers(
context, router_ids)
@@ -1946,7 +1978,7 @@ class L3NATAgentWithStateReport(L3NATAgent):
'interface_driver': self.conf.interface_driver},
'start_flag': True,
'agent_type': l3_constants.AGENT_TYPE_L3}
- report_interval = cfg.CONF.AGENT.report_interval
+ report_interval = self.conf.AGENT.report_interval
self.use_call = True
if report_interval:
self.heartbeat = loopingcall.FixedIntervalLoopingCall(
diff --git a/neutron/agent/linux/__init__.py b/neutron/agent/linux/__init__.py
index bf3075ddd8..e69de29bb2 100644
--- a/neutron/agent/linux/__init__.py
+++ b/neutron/agent/linux/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py
index aba75af571..51e89913d4 100644
--- a/neutron/agent/linux/dhcp.py
+++ b/neutron/agent/linux/dhcp.py
@@ -730,7 +730,8 @@ class Dnsmasq(DhcpLocalProcess):
subnets = dict((subnet.id, subnet) for subnet in network.subnets)
for port in network.ports:
- if port.device_owner != constants.DEVICE_OWNER_ROUTER_INTF:
+ if port.device_owner not in (constants.DEVICE_OWNER_ROUTER_INTF,
+ constants.DEVICE_OWNER_DVR_INTERFACE):
continue
for alloc in port.fixed_ips:
if subnets[alloc.subnet_id].gateway_ip == alloc.ip_address:
diff --git a/neutron/agent/linux/external_process.py b/neutron/agent/linux/external_process.py
index b9d581210a..ffea1247ac 100644
--- a/neutron/agent/linux/external_process.py
+++ b/neutron/agent/linux/external_process.py
@@ -30,14 +30,12 @@ OPTS = [
cfg.StrOpt('external_pids',
default='$state_path/external/pids',
help=_('Location to store child pid files')),
- cfg.BoolOpt('check_child_processes', default=False,
- help=_("Periodically check child processes")),
cfg.StrOpt('check_child_processes_action', default='respawn',
choices=['respawn', 'exit'],
help=_('Action to be executed when a child process dies')),
- cfg.IntOpt('check_child_processes_interval', default=60,
+ cfg.IntOpt('check_child_processes_interval', default=0,
help=_('Interval between checks of child process liveness '
- '(seconds)')),
+ '(seconds), use 0 to disable')),
]
@@ -156,7 +154,7 @@ class ProcessMonitor(object):
self._process_managers = {}
- if self._config.check_child_processes:
+ if self._config.check_child_processes_interval:
self._spawn_checking_thread()
def enable(self, uuid, cmd_callback, namespace=None, service=None,
diff --git a/neutron/agent/linux/interface.py b/neutron/agent/linux/interface.py
index 77b8365c4b..538527b07c 100644
--- a/neutron/agent/linux/interface.py
+++ b/neutron/agent/linux/interface.py
@@ -23,8 +23,10 @@ from neutron.agent.common import config
from neutron.agent.linux import ip_lib
from neutron.agent.linux import ovs_lib
from neutron.agent.linux import utils
+from neutron.common import constants as n_const
from neutron.common import exceptions
from neutron.extensions import flavor
+from neutron.openstack.common.gettextutils import _LE
from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging
@@ -71,7 +73,7 @@ class LinuxInterfaceDriver(object):
# from linux IF_NAMESIZE
DEV_NAME_LEN = 14
- DEV_NAME_PREFIX = 'tap'
+ DEV_NAME_PREFIX = n_const.TAP_DEVICE_PREFIX
def __init__(self, conf):
self.conf = conf
@@ -110,6 +112,9 @@ class LinuxInterfaceDriver(object):
for ip_cidr, ip_version in previous.items():
if ip_cidr not in preserve_ips:
device.addr.delete(ip_version, ip_cidr)
+ self.delete_conntrack_state(root_helper=self.root_helper,
+ namespace=namespace,
+ ip=ip_cidr)
if gateway:
device.route.add_gateway(gateway)
@@ -121,6 +126,43 @@ class LinuxInterfaceDriver(object):
for route in existing_onlink_routes - new_onlink_routes:
device.route.delete_onlink_route(route)
+ def delete_conntrack_state(self, root_helper, namespace, ip):
+ """Delete conntrack state associated with an IP address.
+
+ This terminates any active connections through an IP. Call this soon
+ after removing the IP address from an interface so that new connections
+ cannot be created before the IP address is gone.
+
+ root_helper: root_helper to gain root access to call conntrack
+ namespace: the name of the namespace where the IP has been configured
+ ip: the IP address for which state should be removed. This can be
+ passed as a string with or without /NN. A netaddr.IPAddress or
+ netaddr.Network representing the IP address can also be passed.
+ """
+ ip_str = str(netaddr.IPNetwork(ip).ip)
+ ip_wrapper = ip_lib.IPWrapper(root_helper, namespace=namespace)
+
+ # Delete conntrack state for ingress traffic
+ # If 0 flow entries have been deleted
+ # conntrack -D will return 1
+ try:
+ ip_wrapper.netns.execute(["conntrack", "-D", "-d", ip_str],
+ check_exit_code=True,
+ extra_ok_codes=[1])
+
+ except RuntimeError:
+ LOG.exception(_LE("Failed deleting ingress connection state of"
+ " floatingip %s"), ip_str)
+
+ # Delete conntrack state for egress traffic
+ try:
+ ip_wrapper.netns.execute(["conntrack", "-D", "-q", ip_str],
+ check_exit_code=True,
+ extra_ok_codes=[1])
+ except RuntimeError:
+ LOG.exception(_LE("Failed deleting egress connection state of"
+ " floatingip %s"), ip_str)
+
def check_bridge_exists(self, bridge):
if not ip_lib.device_exists(bridge):
raise exceptions.BridgeDoesNotExist(bridge=bridge)
@@ -150,7 +192,7 @@ class NullDriver(LinuxInterfaceDriver):
class OVSInterfaceDriver(LinuxInterfaceDriver):
"""Driver for creating an internal interface on an OVS bridge."""
- DEV_NAME_PREFIX = 'tap'
+ DEV_NAME_PREFIX = n_const.TAP_DEVICE_PREFIX
def __init__(self, conf):
super(OVSInterfaceDriver, self).__init__(conf)
@@ -159,7 +201,8 @@ class OVSInterfaceDriver(LinuxInterfaceDriver):
def _get_tap_name(self, dev_name, prefix=None):
if self.conf.ovs_use_veth:
- dev_name = dev_name.replace(prefix or self.DEV_NAME_PREFIX, 'tap')
+ dev_name = dev_name.replace(prefix or self.DEV_NAME_PREFIX,
+ n_const.TAP_DEVICE_PREFIX)
return dev_name
def _ovs_add_port(self, bridge, device_name, port_id, mac_address,
@@ -254,7 +297,8 @@ class MidonetInterfaceDriver(LinuxInterfaceDriver):
self.root_helper,
namespace=namespace):
ip = ip_lib.IPWrapper(self.root_helper)
- tap_name = device_name.replace(prefix or 'tap', 'tap')
+ tap_name = device_name.replace(prefix or n_const.TAP_DEVICE_PREFIX,
+ n_const.TAP_DEVICE_PREFIX)
# Create ns_dev in a namespace if one is configured.
root_dev, ns_dev = ip.add_veth(tap_name, device_name,
@@ -293,14 +337,15 @@ class MidonetInterfaceDriver(LinuxInterfaceDriver):
class IVSInterfaceDriver(LinuxInterfaceDriver):
"""Driver for creating an internal interface on an IVS bridge."""
- DEV_NAME_PREFIX = 'tap'
+ DEV_NAME_PREFIX = n_const.TAP_DEVICE_PREFIX
def __init__(self, conf):
super(IVSInterfaceDriver, self).__init__(conf)
self.DEV_NAME_PREFIX = 'ns-'
def _get_tap_name(self, dev_name, prefix=None):
- dev_name = dev_name.replace(prefix or self.DEV_NAME_PREFIX, 'tap')
+ dev_name = dev_name.replace(prefix or self.DEV_NAME_PREFIX,
+ n_const.TAP_DEVICE_PREFIX)
return dev_name
def _ivs_add_port(self, device_name, port_id, mac_address):
@@ -367,10 +412,8 @@ class BridgeInterfaceDriver(LinuxInterfaceDriver):
ip = ip_lib.IPWrapper(self.root_helper)
# Enable agent to define the prefix
- if prefix:
- tap_name = device_name.replace(prefix, 'tap')
- else:
- tap_name = device_name.replace(self.DEV_NAME_PREFIX, 'tap')
+ tap_name = device_name.replace(prefix or self.DEV_NAME_PREFIX,
+ n_const.TAP_DEVICE_PREFIX)
# Create ns_veth in a namespace if one is configured.
root_veth, ns_veth = ip.add_veth(tap_name, device_name,
namespace2=namespace)
diff --git a/neutron/agent/linux/ip_lib.py b/neutron/agent/linux/ip_lib.py
index f085b4ded8..1d32a5497f 100644
--- a/neutron/agent/linux/ip_lib.py
+++ b/neutron/agent/linux/ip_lib.py
@@ -532,7 +532,8 @@ class IpNetnsCommand(IpCommandBase):
def delete(self, name):
self._as_root('delete', name, use_root_namespace=True)
- def execute(self, cmds, addl_env={}, check_exit_code=True):
+ def execute(self, cmds, addl_env={}, check_exit_code=True,
+ extra_ok_codes=None):
ns_params = []
if self._parent.namespace:
if not self._parent.root_helper:
@@ -546,7 +547,7 @@ class IpNetnsCommand(IpCommandBase):
return utils.execute(
ns_params + env_params + list(cmds),
root_helper=self._parent.root_helper,
- check_exit_code=check_exit_code)
+ check_exit_code=check_exit_code, extra_ok_codes=extra_ok_codes)
def exists(self, name):
output = self._parent._execute('o', 'netns', ['list'])
diff --git a/neutron/agent/linux/iptables_comments.py b/neutron/agent/linux/iptables_comments.py
new file mode 100644
index 0000000000..641b2ef865
--- /dev/null
+++ b/neutron/agent/linux/iptables_comments.py
@@ -0,0 +1,34 @@
+# Copyright 2014 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""iptables comments"""
+
+# Do not translate these comments. These comments cannot contain a quote or
+# an escape character because they will end up in a call to iptables and
+# could interfere with other parameters.
+
+SNAT_OUT = 'Perform source NAT on outgoing traffic.'
+UNMATCH_DROP = 'Default drop rule for unmatched traffic.'
+VM_INT_SG = 'Direct traffic from the VM interface to the security group chain.'
+SG_TO_VM_SG = 'Jump to the VM specific chain.'
+INPUT_TO_SG = 'Direct incoming traffic from VM to the security group chain.'
+PAIR_ALLOW = 'Allow traffic from defined IP/MAC pairs.'
+PAIR_DROP = 'Drop traffic without an IP/MAC allow rule.'
+DHCP_CLIENT = 'Allow DHCP client traffic.'
+DHCP_SPOOF = 'Prevent DHCP Spoofing by VM.'
+UNMATCHED = 'Send unmatched traffic to the fallback chain.'
+STATELESS_DROP = 'Drop packets that are not associated with a state.'
+ALLOW_ASSOC = ('Direct packets associated with a known session to the RETURN '
+ 'chain.')
+IPV6_RA_ALLOW = 'Allow IPv6 ICMP traffic to allow RA packets.'
diff --git a/neutron/agent/linux/iptables_firewall.py b/neutron/agent/linux/iptables_firewall.py
index 5f050b91aa..102e90634a 100644
--- a/neutron/agent/linux/iptables_firewall.py
+++ b/neutron/agent/linux/iptables_firewall.py
@@ -18,6 +18,7 @@ from oslo.config import cfg
from neutron.agent import firewall
from neutron.agent.linux import ipset_manager
+from neutron.agent.linux import iptables_comments as ic
from neutron.agent.linux import iptables_manager
from neutron.common import constants
from neutron.common import ipv6_utils
@@ -40,6 +41,7 @@ LINUX_DEV_LEN = 14
IPSET_CHAIN_LEN = 20
IPSET_CHANGE_BULK_THRESHOLD = 10
IPSET_ADD_BULK_THRESHOLD = 5
+comment_rule = iptables_manager.comment_rule
class IptablesFirewallDriver(firewall.FirewallDriver):
@@ -146,9 +148,11 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
def _add_fallback_chain_v4v6(self):
self.iptables.ipv4['filter'].add_chain('sg-fallback')
- self.iptables.ipv4['filter'].add_rule('sg-fallback', '-j DROP')
+ self.iptables.ipv4['filter'].add_rule('sg-fallback', '-j DROP',
+ comment=ic.UNMATCH_DROP)
self.iptables.ipv6['filter'].add_chain('sg-fallback')
- self.iptables.ipv6['filter'].add_rule('sg-fallback', '-j DROP')
+ self.iptables.ipv6['filter'].add_rule('sg-fallback', '-j DROP',
+ comment=ic.UNMATCH_DROP)
def _add_chain_by_name_v4v6(self, chain_name):
self.iptables.ipv6['filter'].add_chain(chain_name)
@@ -158,12 +162,15 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
self.iptables.ipv4['filter'].ensure_remove_chain(chain_name)
self.iptables.ipv6['filter'].ensure_remove_chain(chain_name)
- def _add_rule_to_chain_v4v6(self, chain_name, ipv4_rules, ipv6_rules):
+ def _add_rule_to_chain_v4v6(self, chain_name, ipv4_rules, ipv6_rules,
+ comment=None):
for rule in ipv4_rules:
- self.iptables.ipv4['filter'].add_rule(chain_name, rule)
+ self.iptables.ipv4['filter'].add_rule(chain_name, rule,
+ comment=comment)
for rule in ipv6_rules:
- self.iptables.ipv6['filter'].add_rule(chain_name, rule)
+ self.iptables.ipv6['filter'].add_rule(chain_name, rule,
+ comment=comment)
def _get_device_name(self, port):
return port['device']
@@ -183,17 +190,20 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
'-j $%s' % (self.IPTABLES_DIRECTION[direction],
device,
SG_CHAIN)]
- self._add_rule_to_chain_v4v6('FORWARD', jump_rule, jump_rule)
+ self._add_rule_to_chain_v4v6('FORWARD', jump_rule, jump_rule,
+ comment=ic.VM_INT_SG)
# jump to the chain based on the device
jump_rule = ['-m physdev --%s %s --physdev-is-bridged '
'-j $%s' % (self.IPTABLES_DIRECTION[direction],
device,
chain_name)]
- self._add_rule_to_chain_v4v6(SG_CHAIN, jump_rule, jump_rule)
+ self._add_rule_to_chain_v4v6(SG_CHAIN, jump_rule, jump_rule,
+ comment=ic.SG_TO_VM_SG)
if direction == EGRESS_DIRECTION:
- self._add_rule_to_chain_v4v6('INPUT', jump_rule, jump_rule)
+ self._add_rule_to_chain_v4v6('INPUT', jump_rule, jump_rule,
+ comment=ic.INPUT_TO_SG)
def _split_sgr_by_ethertype(self, security_group_rules):
ipv4_sg_rules = []
@@ -222,12 +232,12 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
# of the list after the allowed_address_pair rules.
table.add_rule(chain_name,
'-m mac --mac-source %s -j RETURN'
- % mac)
+ % mac, comment=ic.PAIR_ALLOW)
else:
table.add_rule(chain_name,
'-m mac --mac-source %s -s %s -j RETURN'
- % (mac, ip))
- table.add_rule(chain_name, '-j DROP')
+ % (mac, ip), comment=ic.PAIR_ALLOW)
+ table.add_rule(chain_name, '-j DROP', comment=ic.PAIR_DROP)
rules.append('-j $%s' % chain_name)
def _build_ipv4v6_mac_ip_list(self, mac, ip_address, mac_ipv4_pairs,
@@ -239,9 +249,12 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
def _spoofing_rule(self, port, ipv4_rules, ipv6_rules):
#Note(nati) allow dhcp or RA packet
- ipv4_rules += ['-p udp -m udp --sport 68 --dport 67 -j RETURN']
- ipv6_rules += ['-p icmpv6 -j RETURN']
- ipv6_rules += ['-p udp -m udp --sport 546 --dport 547 -j RETURN']
+ ipv4_rules += [comment_rule('-p udp -m udp --sport 68 --dport 67 '
+ '-j RETURN', comment=ic.DHCP_CLIENT)]
+ ipv6_rules += [comment_rule('-p icmpv6 -j RETURN',
+ comment=ic.IPV6_RA_ALLOW)]
+ ipv6_rules += [comment_rule('-p udp -m udp --sport 546 --dport 547 '
+ '-j RETURN', comment=None)]
mac_ipv4_pairs = []
mac_ipv6_pairs = []
@@ -266,8 +279,10 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
def _drop_dhcp_rule(self, ipv4_rules, ipv6_rules):
#Note(nati) Drop dhcp packet from VM
- ipv4_rules += ['-p udp -m udp --sport 67 --dport 68 -j DROP']
- ipv6_rules += ['-p udp -m udp --sport 547 --dport 546 -j DROP']
+ ipv4_rules += [comment_rule('-p udp -m udp --sport 67 --dport 68 '
+ '-j DROP', comment=ic.DHCP_SPOOF)]
+ ipv6_rules += [comment_rule('-p udp -m udp --sport 547 --dport 546 '
+ '-j DROP', comment=None)]
def _accept_inbound_icmpv6(self):
# Allow multicast listener, neighbor solicitation and
@@ -454,18 +469,22 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
args += ['-j RETURN']
iptables_rules += [' '.join(args)]
- iptables_rules += ['-j $sg-fallback']
+ iptables_rules += [comment_rule('-j $sg-fallback',
+ comment=ic.UNMATCHED)]
return iptables_rules
def _drop_invalid_packets(self, iptables_rules):
# Always drop invalid packets
- iptables_rules += ['-m state --state ' 'INVALID -j DROP']
+ iptables_rules += [comment_rule('-m state --state ' 'INVALID -j DROP',
+ comment=ic.STATELESS_DROP)]
return iptables_rules
def _allow_established(self, iptables_rules):
# Allow established connections
- iptables_rules += ['-m state --state RELATED,ESTABLISHED -j RETURN']
+ iptables_rules += [comment_rule(
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=ic.ALLOW_ASSOC)]
return iptables_rules
def _protocol_arg(self, protocol):
@@ -560,7 +579,7 @@ class IptablesFirewallDriver(firewall.FirewallDriver):
class OVSHybridIptablesFirewallDriver(IptablesFirewallDriver):
- OVS_HYBRID_TAP_PREFIX = 'tap'
+ OVS_HYBRID_TAP_PREFIX = constants.TAP_DEVICE_PREFIX
def _port_chain_name(self, port, direction):
return iptables_manager.get_chain_name(
diff --git a/neutron/agent/linux/iptables_manager.py b/neutron/agent/linux/iptables_manager.py
index 613a929cab..6af69ad32e 100644
--- a/neutron/agent/linux/iptables_manager.py
+++ b/neutron/agent/linux/iptables_manager.py
@@ -22,6 +22,10 @@ import inspect
import os
import re
+from oslo.config import cfg
+
+from neutron.agent.common import config
+from neutron.agent.linux import iptables_comments as ic
from neutron.agent.linux import utils as linux_utils
from neutron.common import utils
from neutron.openstack.common import excutils
@@ -51,6 +55,12 @@ MAX_CHAIN_LEN_NOWRAP = 28
IPTABLES_ERROR_LINES_OF_CONTEXT = 5
+def comment_rule(rule, comment):
+ if not cfg.CONF.AGENT.comment_iptables_rules or not comment:
+ return rule
+ return '%s -m comment --comment "%s"' % (rule, comment)
+
+
def get_chain_name(chain_name, wrap=True):
if wrap:
return chain_name[:MAX_CHAIN_LEN_WRAP]
@@ -67,13 +77,14 @@ class IptablesRule(object):
"""
def __init__(self, chain, rule, wrap=True, top=False,
- binary_name=binary_name, tag=None):
+ binary_name=binary_name, tag=None, comment=None):
self.chain = get_chain_name(chain, wrap)
self.rule = rule
self.wrap = wrap
self.top = top
self.wrap_name = binary_name[:16]
self.tag = tag
+ self.comment = comment
def __eq__(self, other):
return ((self.chain == other.chain) and
@@ -89,7 +100,7 @@ class IptablesRule(object):
chain = '%s-%s' % (self.wrap_name, self.chain)
else:
chain = self.chain
- return '-A %s %s' % (chain, self.rule)
+ return comment_rule('-A %s %s' % (chain, self.rule), self.comment)
class IptablesTable(object):
@@ -182,7 +193,8 @@ class IptablesTable(object):
self.rules = [r for r in self.rules
if jump_snippet not in r.rule]
- def add_rule(self, chain, rule, wrap=True, top=False, tag=None):
+ def add_rule(self, chain, rule, wrap=True, top=False, tag=None,
+ comment=None):
"""Add a rule to the table.
This is just like what you'd feed to iptables, just without
@@ -202,7 +214,7 @@ class IptablesTable(object):
self._wrap_target_chain(e, wrap) for e in rule.split(' '))
self.rules.append(IptablesRule(chain, rule, wrap, top, self.wrap_name,
- tag))
+ tag, comment))
def _wrap_target_chain(self, s, wrap):
if s.startswith('$'):
@@ -210,7 +222,7 @@ class IptablesTable(object):
return s
- def remove_rule(self, chain, rule, wrap=True, top=False):
+ def remove_rule(self, chain, rule, wrap=True, top=False, comment=None):
"""Remove a rule from a chain.
Note: The rule must be exactly identical to the one that was added.
@@ -225,10 +237,12 @@ class IptablesTable(object):
self._wrap_target_chain(e, wrap) for e in rule.split(' '))
self.rules.remove(IptablesRule(chain, rule, wrap, top,
- self.wrap_name))
+ self.wrap_name,
+ comment=comment))
if not wrap:
self.remove_rules.append(IptablesRule(chain, rule, wrap, top,
- self.wrap_name))
+ self.wrap_name,
+ comment=comment))
except ValueError:
LOG.warn(_('Tried to remove rule that was not there:'
' %(chain)r %(rule)r %(wrap)r %(top)r'),
@@ -288,6 +302,7 @@ class IptablesManager(object):
else:
self.execute = linux_utils.execute
+ config.register_iptables_opts(cfg.CONF)
self.use_ipv6 = use_ipv6
self.root_helper = root_helper
self.namespace = namespace
@@ -351,7 +366,8 @@ class IptablesManager(object):
# chain so that it's applied last.
self.ipv4['nat'].add_chain('snat')
self.ipv4['nat'].add_rule('neutron-postrouting-bottom',
- '-j $snat', wrap=False)
+ '-j $snat', wrap=False,
+ comment=ic.SNAT_OUT)
# And then we add a float-snat chain and jump to first thing in
# the snat chain.
diff --git a/neutron/agent/linux/ovs_lib.py b/neutron/agent/linux/ovs_lib.py
index 2013ba170c..64cf4eebbb 100644
--- a/neutron/agent/linux/ovs_lib.py
+++ b/neutron/agent/linux/ovs_lib.py
@@ -22,6 +22,7 @@ from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils
from neutron.common import exceptions
from neutron.openstack.common import excutils
+from neutron.openstack.common.gettextutils import _LI, _LW
from neutron.openstack.common import jsonutils
from neutron.openstack.common import log as logging
from neutron.plugins.common import constants
@@ -401,29 +402,28 @@ class OVSBridge(BaseOVS):
# an exeception which will be captured in this block.
# We won't deal with the possibility of ovs-vsctl return multiple
# rows since the interface identifier is unique
- data = json_result['data'][0]
- port_name = data[name_idx]
- switch = get_bridge_for_iface(self.root_helper, port_name)
- if switch != self.br_name:
- LOG.info(_("Port: %(port_name)s is on %(switch)s,"
- " not on %(br_name)s"), {'port_name': port_name,
- 'switch': switch,
- 'br_name': self.br_name})
- return
- ofport = data[ofport_idx]
- # ofport must be integer otherwise return None
- if not isinstance(ofport, int) or ofport == -1:
- LOG.warn(_("ofport: %(ofport)s for VIF: %(vif)s is not a "
- "positive integer"), {'ofport': ofport,
- 'vif': port_id})
- return
- # Find VIF's mac address in external ids
- ext_id_dict = dict((item[0], item[1]) for item in
- data[ext_ids_idx][1])
- vif_mac = ext_id_dict['attached-mac']
- return VifPort(port_name, ofport, port_id, vif_mac, self)
- except Exception as e:
- LOG.warn(_("Unable to parse interface details. Exception: %s"), e)
+ for data in json_result['data']:
+ port_name = data[name_idx]
+ switch = get_bridge_for_iface(self.root_helper, port_name)
+ if switch != self.br_name:
+ continue
+ ofport = data[ofport_idx]
+ # ofport must be integer otherwise return None
+ if not isinstance(ofport, int) or ofport == -1:
+ LOG.warn(_LW("ofport: %(ofport)s for VIF: %(vif)s is not a"
+ " positive integer"), {'ofport': ofport,
+ 'vif': port_id})
+ return
+ # Find VIF's mac address in external ids
+ ext_id_dict = dict((item[0], item[1]) for item in
+ data[ext_ids_idx][1])
+ vif_mac = ext_id_dict['attached-mac']
+ return VifPort(port_name, ofport, port_id, vif_mac, self)
+ LOG.info(_LI("Port %(port_id)s not present in bridge %(br_name)s"),
+ {'port_id': port_id, 'br_name': self.br_name})
+ except Exception as error:
+ LOG.warn(_LW("Unable to parse interface details. Exception: %s"),
+ error)
return
def delete_ports(self, all_ports=False):
diff --git a/neutron/agent/linux/utils.py b/neutron/agent/linux/utils.py
index e82a0d1496..8243468919 100644
--- a/neutron/agent/linux/utils.py
+++ b/neutron/agent/linux/utils.py
@@ -14,9 +14,9 @@
# under the License.
import fcntl
+import glob
import os
import shlex
-import shutil
import socket
import struct
import tempfile
@@ -58,7 +58,8 @@ def create_process(cmd, root_helper=None, addl_env=None):
def execute(cmd, root_helper=None, process_input=None, addl_env=None,
- check_exit_code=True, return_stderr=False, log_fail_as_error=True):
+ check_exit_code=True, return_stderr=False, log_fail_as_error=True,
+ extra_ok_codes=None):
try:
obj, cmd = create_process(cmd, root_helper=root_helper,
addl_env=addl_env)
@@ -70,6 +71,10 @@ def execute(cmd, root_helper=None, process_input=None, addl_env=None,
"Stderr: %(stderr)r") % {'cmd': cmd, 'code': obj.returncode,
'stdout': _stdout, 'stderr': _stderr}
+ extra_ok_codes = extra_ok_codes or []
+ if obj.returncode and obj.returncode in extra_ok_codes:
+ obj.returncode = None
+
if obj.returncode and log_fail_as_error:
LOG.error(m)
else:
@@ -129,19 +134,19 @@ def find_child_pids(pid):
return [x.strip() for x in raw_pids.split('\n') if x.strip()]
-def _get_conf_dir(cfg_root, uuid, ensure_conf_dir):
- confs_dir = os.path.abspath(os.path.normpath(cfg_root))
- conf_dir = os.path.join(confs_dir, uuid)
+def _get_conf_base(cfg_root, uuid, ensure_conf_dir):
+ conf_dir = os.path.abspath(os.path.normpath(cfg_root))
+ conf_base = os.path.join(conf_dir, uuid)
if ensure_conf_dir:
if not os.path.isdir(conf_dir):
os.makedirs(conf_dir, 0o755)
- return conf_dir
+ return conf_base
def get_conf_file_name(cfg_root, uuid, cfg_file, ensure_conf_dir=False):
"""Returns the file name for a given kind of config file."""
- conf_dir = _get_conf_dir(cfg_root, uuid, ensure_conf_dir)
- return os.path.join(conf_dir, cfg_file)
+ conf_base = _get_conf_base(cfg_root, uuid, ensure_conf_dir)
+ return "%s.%s" % (conf_base, cfg_file)
def get_value_from_conf_file(cfg_root, uuid, cfg_file, converter=None):
@@ -163,15 +168,13 @@ def get_value_from_conf_file(cfg_root, uuid, cfg_file, converter=None):
def remove_conf_files(cfg_root, uuid):
- conf_dir = _get_conf_dir(cfg_root, uuid, False)
- shutil.rmtree(conf_dir, ignore_errors=True)
+ conf_base = _get_conf_base(cfg_root, uuid, False)
+ for file_path in glob.iglob("%s.*" % conf_base):
+ os.unlink(file_path)
def remove_conf_file(cfg_root, uuid, cfg_file):
- """Remove a config file. Remove the directory if this is the last file."""
+ """Remove a config file."""
conf_file = get_conf_file_name(cfg_root, uuid, cfg_file)
if os.path.exists(conf_file):
os.unlink(conf_file)
- conf_dir = _get_conf_dir(cfg_root, uuid, False)
- if not os.listdir(conf_dir):
- shutil.rmtree(conf_dir, ignore_errors=True)
diff --git a/neutron/agent/metadata/__init__.py b/neutron/agent/metadata/__init__.py
index 20c9a03a02..e69de29bb2 100644
--- a/neutron/agent/metadata/__init__.py
+++ b/neutron/agent/metadata/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 New Dream Network, LLC (DreamHost)
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/agent/metadata/agent.py b/neutron/agent/metadata/agent.py
index 5a943fd135..4017057b3c 100644
--- a/neutron/agent/metadata/agent.py
+++ b/neutron/agent/metadata/agent.py
@@ -38,7 +38,6 @@ from neutron.openstack.common.cache import cache
from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall
-from neutron.openstack.common import service
from neutron import wsgi
LOG = logging.getLogger(__name__)
@@ -210,9 +209,10 @@ class MetadataProxyHandler(object):
req.query_string,
''))
- h = httplib2.Http(ca_certs=self.conf.auth_ca_cert,
- disable_ssl_certificate_validation=
- self.conf.nova_metadata_insecure)
+ h = httplib2.Http(
+ ca_certs=self.conf.auth_ca_cert,
+ disable_ssl_certificate_validation=self.conf.nova_metadata_insecure
+ )
if self.conf.nova_client_cert and self.conf.nova_client_priv_key:
h.add_certificate(self.conf.nova_client_priv_key,
self.conf.nova_client_cert,
@@ -232,6 +232,8 @@ class MetadataProxyHandler(object):
)
LOG.warn(msg)
return webob.exc.HTTPForbidden()
+ elif resp.status == 400:
+ return webob.exc.HTTPBadRequest()
elif resp.status == 404:
return webob.exc.HTTPNotFound()
elif resp.status == 409:
@@ -278,16 +280,8 @@ class UnixDomainWSGIServer(wsgi.Server):
self._socket = eventlet.listen(file_socket,
family=socket.AF_UNIX,
backlog=backlog)
- if workers < 1:
- # For the case where only one process is required.
- self._server = self.pool.spawn_n(self._run, application,
- self._socket)
- else:
- # Minimize the cost of checking for child exit by extending the
- # wait interval past the default of 0.01s.
- self._launcher = service.ProcessLauncher(wait_interval=1.0)
- self._server = WorkerService(self, application)
- self._launcher.launch_service(self._server, workers=workers)
+
+ self._launch(application, workers=workers)
def _run(self, application, socket):
"""Start a WSGI service in a new green thread."""
diff --git a/neutron/agent/metadata/namespace_proxy.py b/neutron/agent/metadata/namespace_proxy.py
index 1c2f9cb0f0..cfac4c4c3f 100644
--- a/neutron/agent/metadata/namespace_proxy.py
+++ b/neutron/agent/metadata/namespace_proxy.py
@@ -110,6 +110,8 @@ class NetworkMetadataProxyHandler(object):
response.headers['Content-Type'] = resp['content-type']
response.body = content
return response
+ elif resp.status == 400:
+ return webob.exc.HTTPBadRequest()
elif resp.status == 404:
return webob.exc.HTTPNotFound()
elif resp.status == 409:
diff --git a/neutron/agent/securitygroups_rpc.py b/neutron/agent/securitygroups_rpc.py
index 17b544502e..3da4d347f0 100644
--- a/neutron/agent/securitygroups_rpc.py
+++ b/neutron/agent/securitygroups_rpc.py
@@ -14,11 +14,14 @@
# under the License.
#
+import functools
+
from oslo.config import cfg
from oslo import messaging
+from neutron.agent import firewall
from neutron.common import topics
-from neutron.openstack.common.gettextutils import _LW
+from neutron.openstack.common.gettextutils import _LI, _LW
from neutron.openstack.common import importutils
from neutron.openstack.common import log as logging
@@ -74,9 +77,9 @@ def _disable_extension(extension, aliases):
def disable_security_group_extension_by_config(aliases):
if not is_firewall_enabled():
- LOG.info(_('Disabled security-group extension.'))
+ LOG.info(_LI('Disabled security-group extension.'))
_disable_extension('security-group', aliases)
- LOG.info(_('Disabled allowed-address-pairs extension.'))
+ LOG.info(_LI('Disabled allowed-address-pairs extension.'))
_disable_extension('allowed-address-pairs', aliases)
@@ -187,10 +190,23 @@ class SecurityGroupAgentRpcMixin(object):
return False
return True
+ def skip_if_noopfirewall_or_firewall_disabled(func):
+ @functools.wraps(func)
+ def decorated_function(self, *args, **kwargs):
+ if (isinstance(self.firewall, firewall.NoopFirewallDriver) or
+ not is_firewall_enabled()):
+ LOG.info(_LI("Skipping method %s as firewall is disabled "
+ "or configured as NoopFirewallDriver."),
+ func.__name__)
+ else:
+ return func(self, *args, **kwargs)
+ return decorated_function
+
+ @skip_if_noopfirewall_or_firewall_disabled
def prepare_devices_filter(self, device_ids):
if not device_ids:
return
- LOG.info(_("Preparing filters for devices %s"), device_ids)
+ LOG.info(_LI("Preparing filters for devices %s"), device_ids)
if self.use_enhanced_rpc:
devices_info = self.plugin_rpc.security_group_info_for_devices(
self.context, list(device_ids))
@@ -220,15 +236,15 @@ class SecurityGroupAgentRpcMixin(object):
remote_sg_id, member_ips)
def security_groups_rule_updated(self, security_groups):
- LOG.info(_("Security group "
- "rule updated %r"), security_groups)
+ LOG.info(_LI("Security group "
+ "rule updated %r"), security_groups)
self._security_group_updated(
security_groups,
'security_groups')
def security_groups_member_updated(self, security_groups):
- LOG.info(_("Security group "
- "member updated %r"), security_groups)
+ LOG.info(_LI("Security group "
+ "member updated %r"), security_groups)
self._security_group_updated(
security_groups,
'security_group_source_groups')
@@ -249,7 +265,7 @@ class SecurityGroupAgentRpcMixin(object):
self.refresh_firewall(devices)
def security_groups_provider_updated(self):
- LOG.info(_("Provider rule updated"))
+ LOG.info(_LI("Provider rule updated"))
if self.defer_refresh_firewall:
# NOTE(salv-orlando): A 'global refresh' might not be
# necessary if the subnet for which the provider rules
@@ -261,7 +277,7 @@ class SecurityGroupAgentRpcMixin(object):
def remove_devices_filter(self, device_ids):
if not device_ids:
return
- LOG.info(_("Remove device filter for %r"), device_ids)
+ LOG.info(_LI("Remove device filter for %r"), device_ids)
with self.firewall.defer_apply():
for device_id in device_ids:
device = self.firewall.ports.get(device_id)
@@ -269,12 +285,13 @@ class SecurityGroupAgentRpcMixin(object):
continue
self.firewall.remove_port_filter(device)
+ @skip_if_noopfirewall_or_firewall_disabled
def refresh_firewall(self, device_ids=None):
- LOG.info(_("Refresh firewall rules"))
+ LOG.info(_LI("Refresh firewall rules"))
if not device_ids:
device_ids = self.firewall.ports.keys()
if not device_ids:
- LOG.info(_("No ports here to refresh firewall"))
+ LOG.info(_LI("No ports here to refresh firewall"))
return
if self.use_enhanced_rpc:
devices_info = self.plugin_rpc.security_group_info_for_devices(
diff --git a/neutron/api/rpc/handlers/dhcp_rpc.py b/neutron/api/rpc/handlers/dhcp_rpc.py
index 56016be708..58317eac4b 100644
--- a/neutron/api/rpc/handlers/dhcp_rpc.py
+++ b/neutron/api/rpc/handlers/dhcp_rpc.py
@@ -60,7 +60,7 @@ class DhcpRpcCallback(n_rpc.RpcCallback):
if action == 'create_port':
return plugin.create_port(context, port)
elif action == 'update_port':
- return plugin.update_port(context, port['id'], port['port'])
+ return plugin.update_port(context, port['id'], port)
else:
msg = _('Unrecognized action')
raise n_exc.Invalid(message=msg)
@@ -282,13 +282,11 @@ class DhcpRpcCallback(n_rpc.RpcCallback):
def update_dhcp_port(self, context, **kwargs):
"""Update the dhcp port."""
host = kwargs.get('host')
- port_id = kwargs.get('port_id')
port = kwargs.get('port')
+ port['id'] = kwargs.get('port_id')
LOG.debug(_('Update dhcp port %(port)s '
'from %(host)s.'),
{'port': port,
'host': host})
plugin = manager.NeutronManager.get_plugin()
- return self._port_action(plugin, context,
- {'id': port_id, 'port': port},
- 'update_port')
+ return self._port_action(plugin, context, port, 'update_port')
diff --git a/neutron/api/rpc/handlers/dvr_rpc.py b/neutron/api/rpc/handlers/dvr_rpc.py
index f4d0233a56..e9028cf647 100644
--- a/neutron/api/rpc/handlers/dvr_rpc.py
+++ b/neutron/api/rpc/handlers/dvr_rpc.py
@@ -115,8 +115,6 @@ class DVRAgentRpcApiMixin(object):
class DVRAgentRpcCallbackMixin(object):
"""Agent-side RPC (implementation) for plugin-to-agent interaction."""
- dvr_agent = None
-
def dvr_mac_address_update(self, context, **kwargs):
"""Callback for dvr_mac_addresses update.
@@ -124,7 +122,4 @@ class DVRAgentRpcCallbackMixin(object):
"""
dvr_macs = kwargs.get('dvr_macs', [])
LOG.debug("dvr_macs updated on remote: %s", dvr_macs)
- if not self.dvr_agent:
- LOG.warn(_("DVR agent binding currently not set."))
- return
self.dvr_agent.dvr_mac_address_update(dvr_macs)
diff --git a/neutron/api/v2/attributes.py b/neutron/api/v2/attributes.py
index 0cf1816a42..83471f946e 100644
--- a/neutron/api/v2/attributes.py
+++ b/neutron/api/v2/attributes.py
@@ -729,11 +729,11 @@ RESOURCE_ATTRIBUTE_MAP = {
'default': True,
'convert_to': convert_to_boolean,
'is_visible': True},
- 'ipv6_ra_mode': {'allow_post': True, 'allow_put': True,
+ 'ipv6_ra_mode': {'allow_post': True, 'allow_put': False,
'default': ATTR_NOT_SPECIFIED,
'validate': {'type:values': constants.IPV6_MODES},
'is_visible': True},
- 'ipv6_address_mode': {'allow_post': True, 'allow_put': True,
+ 'ipv6_address_mode': {'allow_post': True, 'allow_put': False,
'default': ATTR_NOT_SPECIFIED,
'validate': {'type:values':
constants.IPV6_MODES},
diff --git a/neutron/api/v2/base.py b/neutron/api/v2/base.py
index a8bf20555e..53c11b9d21 100644
--- a/neutron/api/v2/base.py
+++ b/neutron/api/v2/base.py
@@ -513,6 +513,10 @@ class Controller(object):
parent_id=parent_id)
orig_object_copy = copy.copy(orig_obj)
orig_obj.update(body[self._resource])
+ # Make a list of attributes to be updated to inform the policy engine
+ # which attributes are set explicitly so that it can distinguish them
+ # from the ones that are set to their default values.
+ orig_obj[const.ATTRIBUTES_TO_UPDATE] = body[self._resource].keys()
try:
policy.enforce(request.context,
action,
diff --git a/neutron/cmd/__init__.py b/neutron/cmd/__init__.py
index e82932559d..e69de29bb2 100644
--- a/neutron/cmd/__init__.py
+++ b/neutron/cmd/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/cmd/sanity_check.py b/neutron/cmd/sanity_check.py
index 4b1be1bb70..e2d1e640dd 100644
--- a/neutron/cmd/sanity_check.py
+++ b/neutron/cmd/sanity_check.py
@@ -104,11 +104,7 @@ def enable_tests_from_config():
def all_tests_passed():
- res = True
- for opt in OPTS:
- if cfg.CONF.get(opt.name):
- res &= opt.callback()
- return res
+ return all(opt.callback() for opt in OPTS if cfg.CONF.get(opt.name))
def main():
diff --git a/neutron/common/config.py b/neutron/common/config.py
index cda8d0503b..7f60851a60 100644
--- a/neutron/common/config.py
+++ b/neutron/common/config.py
@@ -101,6 +101,8 @@ core_opts = [
secret=True),
cfg.StrOpt('nova_admin_tenant_id',
help=_('The uuid of the admin nova tenant')),
+ cfg.StrOpt('nova_admin_tenant_name',
+ help=_('The name of the admin nova tenant')),
cfg.StrOpt('nova_admin_auth_url',
default='http://localhost:5000/v2.0',
help=_('Authorization URL for connecting to nova in admin '
diff --git a/neutron/common/constants.py b/neutron/common/constants.py
index 756a9bb8be..59066903b1 100644
--- a/neutron/common/constants.py
+++ b/neutron/common/constants.py
@@ -147,3 +147,13 @@ IPV6_LLA_PREFIX = 'fe80::/64'
# Linux interface max length
DEVICE_NAME_MAX_LEN = 15
+
+# Device names start with "tap"
+TAP_DEVICE_PREFIX = 'tap'
+
+ATTRIBUTES_TO_UPDATE = 'attributes_to_update'
+
+# Maximum value integer can take in MySQL and PostgreSQL
+# In SQLite integer can be stored in 1, 2, 3, 4, 6, or 8 bytes,
+# but here it will be limited by this value for consistency.
+DB_INTEGER_MAX_VALUE = 2 ** 31 - 1
diff --git a/neutron/common/exceptions.py b/neutron/common/exceptions.py
index be62388aa6..1fd83e46ee 100644
--- a/neutron/common/exceptions.py
+++ b/neutron/common/exceptions.py
@@ -335,3 +335,7 @@ class DeviceIDNotOwnedByTenant(Conflict):
class InvalidCIDR(BadRequest):
message = _("Invalid CIDR %(input)s given as IP prefix")
+
+
+class RouterNotCompatibleWithAgent(NeutronException):
+ message = _("Router '%(router_id)s' is not compatible with this agent")
diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py
index c7e82d5bc4..efb6a61615 100644
--- a/neutron/db/db_base_plugin_v2.py
+++ b/neutron/db/db_base_plugin_v2.py
@@ -449,7 +449,14 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
msg = _('IP address %s is not a valid IP for the defined '
'subnet') % fixed['ip_address']
raise n_exc.InvalidInput(error_message=msg)
-
+ if self._check_if_subnet_uses_eui64(subnet):
+ msg = (_("IPv6 address %(address)s can not be directly "
+ "assigned to a port on subnet %(id)s with "
+ "%(mode)s address mode") %
+ {'address': fixed['ip_address'],
+ 'id': subnet_id,
+ 'mode': subnet['ipv6_address_mode']})
+ raise n_exc.InvalidInput(error_message=msg)
fixed_ip_set.append({'subnet_id': subnet_id,
'ip_address': fixed['ip_address']})
else:
@@ -459,7 +466,7 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
raise n_exc.InvalidInput(error_message=msg)
return fixed_ip_set
- def _allocate_fixed_ips(self, context, fixed_ips):
+ def _allocate_fixed_ips(self, context, fixed_ips, mac_address):
"""Allocate IP addresses according to the configured fixed_ips."""
ips = []
for fixed in fixed_ips:
@@ -472,15 +479,24 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
# Only subnet ID is specified => need to generate IP
# from subnet
else:
- subnets = [self._get_subnet(context, fixed['subnet_id'])]
- # IP address allocation
- result = self._generate_ip(context, subnets)
- ips.append({'ip_address': result['ip_address'],
- 'subnet_id': result['subnet_id']})
+ subnet = self._get_subnet(context, fixed['subnet_id'])
+ if (subnet['ip_version'] == 6 and
+ self._check_if_subnet_uses_eui64(subnet)):
+ prefix = subnet['cidr']
+ ip_address = ipv6_utils.get_ipv6_addr_by_EUI64(
+ prefix, mac_address)
+ ips.append({'ip_address': ip_address.format(),
+ 'subnet_id': subnet['id']})
+ else:
+ subnets = [subnet]
+ # IP address allocation
+ result = self._generate_ip(context, subnets)
+ ips.append({'ip_address': result['ip_address'],
+ 'subnet_id': result['subnet_id']})
return ips
def _update_ips_for_port(self, context, network_id, port_id, original_ips,
- new_ips):
+ new_ips, mac_address):
"""Add or remove IPs from the port."""
ips = []
# These ips are still on the port and haven't been removed
@@ -511,7 +527,7 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
if to_add:
LOG.debug(_("Port update. Adding %s"), to_add)
- ips = self._allocate_fixed_ips(context, to_add)
+ ips = self._allocate_fixed_ips(context, to_add, mac_address)
return ips, prev_ips
def _allocate_ips_for_port(self, context, port):
@@ -529,7 +545,9 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
configured_ips = self._test_fixed_ips_for_port(context,
p["network_id"],
p['fixed_ips'])
- ips = self._allocate_fixed_ips(context, configured_ips)
+ ips = self._allocate_fixed_ips(context,
+ configured_ips,
+ p['mac_address'])
else:
filter = {'network_id': [p['network_id']]}
subnets = self.get_subnets(context, filters=filter)
@@ -548,10 +566,9 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
# subnet from the array of subnets that will be passed
# to the _generate_ip() function call, since we just
# generated an IP.
- mac = p['mac_address']
prefix = subnet['cidr']
ip_address = ipv6_utils.get_ipv6_addr_by_EUI64(
- prefix, mac)
+ prefix, p['mac_address'])
if not self._check_unique_ip(
context, p['network_id'],
subnet['id'], ip_address.format()):
@@ -740,24 +757,32 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
raise n_exc.InvalidSharedSetting(network=original.name)
def _validate_ipv6_attributes(self, subnet, cur_subnet):
+ if cur_subnet:
+ self._validate_ipv6_update_dhcp(subnet, cur_subnet)
+ return
ra_mode_set = attributes.is_attr_set(subnet.get('ipv6_ra_mode'))
address_mode_set = attributes.is_attr_set(
subnet.get('ipv6_address_mode'))
- if cur_subnet:
- ra_mode = (subnet['ipv6_ra_mode'] if ra_mode_set
- else cur_subnet['ipv6_ra_mode'])
- addr_mode = (subnet['ipv6_address_mode'] if address_mode_set
- else cur_subnet['ipv6_address_mode'])
- if ra_mode_set or address_mode_set:
- # Check that updated subnet ipv6 attributes do not conflict
- self._validate_ipv6_combination(ra_mode, addr_mode)
- self._validate_ipv6_update_dhcp(subnet, cur_subnet)
- else:
- self._validate_ipv6_dhcp(ra_mode_set, address_mode_set,
- subnet['enable_dhcp'])
- if ra_mode_set and address_mode_set:
- self._validate_ipv6_combination(subnet['ipv6_ra_mode'],
- subnet['ipv6_address_mode'])
+ self._validate_ipv6_dhcp(ra_mode_set, address_mode_set,
+ subnet['enable_dhcp'])
+ if ra_mode_set and address_mode_set:
+ self._validate_ipv6_combination(subnet['ipv6_ra_mode'],
+ subnet['ipv6_address_mode'])
+ if address_mode_set:
+ self._validate_eui64_applicable(subnet)
+
+ def _validate_eui64_applicable(self, subnet):
+ # Per RFC 4862, section 5.5.3, prefix length and interface
+ # id together should be equal to 128. Currently neutron supports
+ # EUI64 interface id only, thus limiting the prefix
+ # length to be 64 only.
+ if self._check_if_subnet_uses_eui64(subnet):
+ if netaddr.IPNetwork(subnet['cidr']).prefixlen != 64:
+ msg = _('Invalid CIDR %s for IPv6 address mode. '
+ 'OpenStack uses the EUI-64 address format, '
+ 'which requires the prefix to be /64.')
+ raise n_exc.InvalidInput(
+ error_message=(msg % subnet['cidr']))
def _validate_ipv6_combination(self, ra_mode, address_mode):
if ra_mode != address_mode:
@@ -1369,8 +1394,9 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2,
changed_ips = True
original = self._make_port_dict(port, process_extensions=False)
added_ips, prev_ips = self._update_ips_for_port(
- context, port["network_id"], id, original["fixed_ips"],
- p['fixed_ips'])
+ context, port["network_id"], id,
+ original["fixed_ips"], p['fixed_ips'],
+ original['mac_address'])
# Update ips if necessary
for ip in added_ips:
diff --git a/neutron/db/firewall/__init__.py b/neutron/db/firewall/__init__.py
index f3d0cdefd3..e69de29bb2 100644
--- a/neutron/db/firewall/__init__.py
+++ b/neutron/db/firewall/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/db/firewall/firewall_db.py b/neutron/db/firewall/firewall_db.py
index 2e7097d551..f00905ee78 100644
--- a/neutron/db/firewall/firewall_db.py
+++ b/neutron/db/firewall/firewall_db.py
@@ -162,6 +162,13 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
'enabled': firewall_rule['enabled']}
return self._fields(res, fields)
+ def _check_firewall_rule_conflict(self, fwr_db, fwp_db):
+ if not fwr_db['shared']:
+ if fwr_db['tenant_id'] != fwp_db['tenant_id']:
+ raise firewall.FirewallRuleConflict(
+ firewall_rule_id=fwr_db['id'],
+ tenant_id=fwr_db['tenant_id'])
+
def _set_rules_for_policy(self, context, firewall_policy_db, fwp):
rule_id_list = fwp['firewall_rules']
fwp_db = firewall_policy_db
@@ -180,8 +187,8 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
# If we find an invalid rule in the list we
# do not perform the update since this breaks
# the integrity of this list.
- raise firewall.FirewallRuleNotFound(firewall_rule_id=
- fwrule_id)
+ raise firewall.FirewallRuleNotFound(
+ firewall_rule_id=fwrule_id)
elif rules_dict[fwrule_id]['firewall_policy_id']:
if (rules_dict[fwrule_id]['firewall_policy_id'] !=
fwp_db['id']):
@@ -196,6 +203,8 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
raise firewall.FirewallRuleSharingConflict(
firewall_rule_id=fwrule_id,
firewall_policy_id=fwp_db['id'])
+ for fwr_db in rules_in_db:
+ self._check_firewall_rule_conflict(fwr_db, fwp_db)
# New list of rules is valid so we will first reset the existing
# list and then add each rule in order.
# Note that the list could be empty in which case we interpret
@@ -264,14 +273,14 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
status = (const.CREATED
if cfg.CONF.router_distributed else const.PENDING_CREATE)
with context.session.begin(subtransactions=True):
- firewall_db = Firewall(id=uuidutils.generate_uuid(),
- tenant_id=tenant_id,
- name=fw['name'],
- description=fw['description'],
- firewall_policy_id=
- fw['firewall_policy_id'],
- admin_state_up=fw['admin_state_up'],
- status=status)
+ firewall_db = Firewall(
+ id=uuidutils.generate_uuid(),
+ tenant_id=tenant_id,
+ name=fw['name'],
+ description=fw['description'],
+ firewall_policy_id=fw['firewall_policy_id'],
+ admin_state_up=fw['admin_state_up'],
+ status=status)
context.session.add(firewall_db)
return self._make_firewall_dict(firewall_db)
@@ -329,6 +338,12 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
fwp = firewall_policy['firewall_policy']
with context.session.begin(subtransactions=True):
fwp_db = self._get_firewall_policy(context, id)
+ # check tenant ids are same for fw and fwp or not
+ if not fwp.get('shared', True) and fwp_db.firewalls:
+ for fw in fwp_db['firewalls']:
+ if fwp_db['tenant_id'] != fw['tenant_id']:
+ raise firewall.FirewallPolicyInUse(
+ firewall_policy_id=id)
# check any existing rules are not shared
if 'shared' in fwp and 'firewall_rules' not in fwp:
self._check_unshared_rules_for_policy(fwp_db, fwp)
@@ -381,28 +396,35 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
dst_port_min, dst_port_max = self._get_min_max_ports_from_range(
fwr['destination_port'])
with context.session.begin(subtransactions=True):
- fwr_db = FirewallRule(id=uuidutils.generate_uuid(),
- tenant_id=tenant_id,
- name=fwr['name'],
- description=fwr['description'],
- shared=fwr['shared'],
- protocol=fwr['protocol'],
- ip_version=fwr['ip_version'],
- source_ip_address=fwr['source_ip_address'],
- destination_ip_address=
- fwr['destination_ip_address'],
- source_port_range_min=src_port_min,
- source_port_range_max=src_port_max,
- destination_port_range_min=dst_port_min,
- destination_port_range_max=dst_port_max,
- action=fwr['action'],
- enabled=fwr['enabled'])
+ fwr_db = FirewallRule(
+ id=uuidutils.generate_uuid(),
+ tenant_id=tenant_id,
+ name=fwr['name'],
+ description=fwr['description'],
+ shared=fwr['shared'],
+ protocol=fwr['protocol'],
+ ip_version=fwr['ip_version'],
+ source_ip_address=fwr['source_ip_address'],
+ destination_ip_address=fwr['destination_ip_address'],
+ source_port_range_min=src_port_min,
+ source_port_range_max=src_port_max,
+ destination_port_range_min=dst_port_min,
+ destination_port_range_max=dst_port_max,
+ action=fwr['action'],
+ enabled=fwr['enabled'])
context.session.add(fwr_db)
return self._make_firewall_rule_dict(fwr_db)
def update_firewall_rule(self, context, id, firewall_rule):
LOG.debug(_("update_firewall_rule() called"))
fwr = firewall_rule['firewall_rule']
+ fwr_db = self._get_firewall_rule(context, id)
+ if fwr_db.firewall_policy_id:
+ fwp_db = self._get_firewall_policy(context,
+ fwr_db.firewall_policy_id)
+ if 'shared' in fwr and not fwr['shared']:
+ if fwr_db['tenant_id'] != fwp_db['tenant_id']:
+ raise firewall.FirewallRuleInUse(firewall_rule_id=id)
if 'source_port' in fwr:
src_port_min, src_port_max = self._get_min_max_ports_from_range(
fwr['source_port'])
@@ -416,7 +438,6 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
fwr['destination_port_range_max'] = dst_port_max
del fwr['destination_port']
with context.session.begin(subtransactions=True):
- fwr_db = self._get_firewall_rule(context, id)
protocol = fwr.get('protocol', fwr_db['protocol'])
if not protocol:
sport = fwr.get('source_port_range_min',
@@ -427,8 +448,6 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
raise firewall.FirewallRuleWithPortWithoutProtocolInvalid()
fwr_db.update(fwr)
if fwr_db.firewall_policy_id:
- fwp_db = self._get_firewall_policy(context,
- fwr_db.firewall_policy_id)
fwp_db.audited = False
return self._make_firewall_rule_dict(fwr_db)
@@ -476,8 +495,10 @@ class Firewall_db_mixin(firewall.FirewallPluginBase, base_db.CommonDbMixin):
insert_before = False
with context.session.begin(subtransactions=True):
fwr_db = self._get_firewall_rule(context, firewall_rule_id)
+ fwp_db = self._get_firewall_policy(context, id)
if fwr_db.firewall_policy_id:
raise firewall.FirewallRuleInUse(firewall_rule_id=fwr_db['id'])
+ self._check_firewall_rule_conflict(fwr_db, fwp_db)
if ref_firewall_rule_id:
# If reference_firewall_rule_id is set, the new rule
# is inserted depending on the value of insert_before.
diff --git a/neutron/db/l3_agentschedulers_db.py b/neutron/db/l3_agentschedulers_db.py
index da82789507..bef3119765 100644
--- a/neutron/db/l3_agentschedulers_db.py
+++ b/neutron/db/l3_agentschedulers_db.py
@@ -26,6 +26,7 @@ from sqlalchemy.orm import joinedload
from sqlalchemy import sql
from neutron.common import constants
+from neutron.common import rpc as n_rpc
from neutron.common import utils as n_utils
from neutron import context as n_ctx
from neutron.db import agents_db
@@ -34,7 +35,7 @@ from neutron.db import l3_attrs_db
from neutron.db import model_base
from neutron.extensions import l3agentscheduler
from neutron import manager
-from neutron.openstack.common.gettextutils import _LI, _LW
+from neutron.openstack.common.gettextutils import _LE, _LI, _LW
from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall
from neutron.openstack.common import timeutils
@@ -122,15 +123,28 @@ class L3AgentSchedulerDbMixin(l3agentscheduler.L3AgentSchedulerPluginBase,
RouterL3AgentBinding.router_id).
filter(sa.or_(l3_attrs_db.RouterExtraAttributes.ha == sql.false(),
l3_attrs_db.RouterExtraAttributes.ha == sql.null())))
-
- for binding in down_bindings:
- LOG.warn(_LW("Rescheduling router %(router)s from agent %(agent)s "
- "because the agent did not report to the server in "
- "the last %(dead_time)s seconds."),
- {'router': binding.router_id,
- 'agent': binding.l3_agent_id,
- 'dead_time': agent_dead_limit})
- self.reschedule_router(context, binding.router_id)
+ try:
+ for binding in down_bindings:
+ LOG.warn(_LW(
+ "Rescheduling router %(router)s from agent %(agent)s "
+ "because the agent did not report to the server in "
+ "the last %(dead_time)s seconds."),
+ {'router': binding.router_id,
+ 'agent': binding.l3_agent_id,
+ 'dead_time': agent_dead_limit})
+ try:
+ self.reschedule_router(context, binding.router_id)
+ except (l3agentscheduler.RouterReschedulingFailed,
+ n_rpc.RemoteError):
+ # Catch individual router rescheduling errors here
+ # so one broken one doesn't stop the iteration.
+ LOG.exception(_LE("Failed to reschedule router %s"),
+ binding.router_id)
+ except db_exc.DBError:
+ # Catch DB errors here so a transient DB connectivity issue
+ # doesn't stop the loopingcall.
+ LOG.exception(_LE("Exception encountered during router "
+ "rescheduling."))
def validate_agent_router_combination(self, context, agent, router):
"""Validate if the router can be correctly assigned to the agent.
diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py
index afc01a33bb..69357afce4 100644
--- a/neutron/db/l3_db.py
+++ b/neutron/db/l3_db.py
@@ -47,6 +47,26 @@ API_TO_DB_COLUMN_MAP = {'port_id': 'fixed_port_id'}
CORE_ROUTER_ATTRS = ('id', 'name', 'tenant_id', 'admin_state_up', 'status')
+class RouterPort(model_base.BASEV2):
+ router_id = sa.Column(
+ sa.String(36),
+ sa.ForeignKey('routers.id', ondelete="CASCADE"),
+ primary_key=True)
+ port_id = sa.Column(
+ sa.String(36),
+ sa.ForeignKey('ports.id', ondelete="CASCADE"),
+ primary_key=True)
+ # The port_type attribute is redundant as the port table already specifies
+ # it in DEVICE_OWNER.However, this redundancy enables more efficient
+ # queries on router ports, and also prevents potential error-prone
+ # conditions which might originate from users altering the DEVICE_OWNER
+ # property of router ports.
+ port_type = sa.Column(sa.String(255))
+ port = orm.relationship(
+ models_v2.Port,
+ backref=orm.backref('routerport', uselist=False, cascade="all,delete"))
+
+
class Router(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
"""Represents a v2 neutron router."""
@@ -55,6 +75,10 @@ class Router(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
admin_state_up = sa.Column(sa.Boolean)
gw_port_id = sa.Column(sa.String(36), sa.ForeignKey('ports.id'))
gw_port = orm.relationship(models_v2.Port, lazy='joined')
+ attached_ports = orm.relationship(
+ RouterPort,
+ backref='router',
+ lazy='dynamic')
class FloatingIP(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
@@ -76,6 +100,7 @@ class FloatingIP(model_base.BASEV2, models_v2.HasId, models_v2.HasTenant):
# aysnchronous backend is unavailable when the floating IP is disassociated
last_known_router_id = sa.Column(sa.String(36))
status = sa.Column(sa.String(16))
+ router = orm.relationship(Router, backref='floating_ips')
class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
@@ -101,7 +126,11 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
def _make_router_dict(self, router, fields=None, process_extensions=True):
res = dict((key, router[key]) for key in CORE_ROUTER_ATTRS)
if router['gw_port_id']:
- ext_gw_info = {'network_id': router.gw_port['network_id']}
+ ext_gw_info = {
+ 'network_id': router.gw_port['network_id'],
+ 'external_fixed_ips': [{'subnet_id': ip["subnet_id"],
+ 'ip_address': ip["ip_address"]}
+ for ip in router.gw_port['fixed_ips']]}
else:
ext_gw_info = None
res.update({
@@ -255,7 +284,13 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
with context.session.begin(subtransactions=True):
router.gw_port = self._core_plugin._get_port(context.elevated(),
gw_port['id'])
+ router_port = RouterPort(
+ router_id=router.id,
+ port_id=gw_port['id'],
+ port_type=DEVICE_OWNER_ROUTER_GW
+ )
context.session.add(router)
+ context.session.add(router_port)
def _validate_gw_info(self, context, gw_port, info):
network_id = info['network_id'] if info else None
@@ -277,11 +312,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
raise l3.RouterExternalGatewayInUseByFloatingIp(
router_id=router_id, net_id=router.gw_port['network_id'])
with context.session.begin(subtransactions=True):
- gw_port_id = router.gw_port['id']
+ gw_port = router.gw_port
router.gw_port = None
context.session.add(router)
+ context.session.expire(gw_port)
+ vpnservice = manager.NeutronManager.get_service_plugins().get(
+ constants.VPN)
+ if vpnservice:
+ vpnservice.check_router_in_use(context, router_id)
self._core_plugin.delete_port(
- admin_ctx, gw_port_id, l3_port_check=False)
+ admin_ctx, gw_port['id'], l3_port_check=False)
def _create_gw_port(self, context, router_id, router, new_network):
new_valid_gw_port_attachment = (
@@ -291,7 +331,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
subnets = self._core_plugin._get_subnets_by_network(context,
new_network)
for subnet in subnets:
- self._check_for_dup_router_subnet(context, router_id,
+ self._check_for_dup_router_subnet(context, router,
new_network, subnet['id'],
subnet['cidr'])
self._create_router_gw_port(context, router, new_network)
@@ -313,11 +353,8 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
admin_ctx, filters={'router_id': [router_id]}):
raise l3.RouterInUse(router_id=router_id)
device_owner = self._get_device_owner(context, router)
- device_filter = {'device_id': [router_id],
- 'device_owner': [device_owner]}
- port_count = self._core_plugin.get_ports_count(
- admin_ctx, filters=device_filter)
- if port_count:
+ if any(rp.port_type == device_owner
+ for rp in router.attached_ports.all()):
raise l3.RouterInUse(router_id=router_id)
return router
@@ -331,18 +368,13 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
if vpnservice:
vpnservice.check_router_in_use(context, id)
+ router_ports = router.attached_ports.all()
+ # Set the router's gw_port to None to avoid a constraint violation.
+ router.gw_port = None
+ for rp in router_ports:
+ self._core_plugin._delete_port(context.elevated(), rp.port.id)
context.session.delete(router)
- # Delete the gw port after the router has been removed to
- # avoid a constraint violation.
- device_filter = {'device_id': [id],
- 'device_owner': [DEVICE_OWNER_ROUTER_GW]}
- ports = self._core_plugin.get_ports(context.elevated(),
- filters=device_filter)
- if ports:
- self._core_plugin._delete_port(context.elevated(),
- ports[0]['id'])
-
def get_router(self, context, id, fields=None):
router = self._get_router(context, id)
return self._make_router_dict(router, fields)
@@ -363,15 +395,13 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
return self._get_collection_count(context, Router,
filters=filters)
- def _check_for_dup_router_subnet(self, context, router_id,
+ def _check_for_dup_router_subnet(self, context, router,
network_id, subnet_id, subnet_cidr):
try:
- rport_qry = context.session.query(models_v2.Port)
- rports = rport_qry.filter_by(device_id=router_id)
# It's possible these ports are on the same network, but
# different subnets.
new_ipnet = netaddr.IPNetwork(subnet_cidr)
- for p in rports:
+ for p in (rp.port for rp in router.attached_ports):
for ip in p['fixed_ips']:
if ip['subnet_id'] == subnet_id:
msg = (_("Router already has a port on subnet %s")
@@ -411,7 +441,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
raise n_exc.BadRequest(resource='router', msg=msg)
return port_id_specified, subnet_id_specified
- def _add_interface_by_port(self, context, router_id, port_id, owner):
+ def _add_interface_by_port(self, context, router, port_id, owner):
with context.session.begin(subtransactions=True):
port = self._core_plugin._get_port(context, port_id)
if port['device_id']:
@@ -424,19 +454,19 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
raise n_exc.BadRequest(resource='router', msg=msg)
subnet_id = fixed_ips[0]['subnet_id']
subnet = self._core_plugin._get_subnet(context, subnet_id)
- self._check_for_dup_router_subnet(context, router_id,
+ self._check_for_dup_router_subnet(context, router,
port['network_id'],
subnet['id'],
subnet['cidr'])
- port.update({'device_id': router_id, 'device_owner': owner})
+ port.update({'device_id': router.id, 'device_owner': owner})
return port
- def _add_interface_by_subnet(self, context, router_id, subnet_id, owner):
+ def _add_interface_by_subnet(self, context, router, subnet_id, owner):
subnet = self._core_plugin._get_subnet(context, subnet_id)
if not subnet['gateway_ip']:
msg = _('Subnet for router interface must have a gateway IP')
raise n_exc.BadRequest(resource='router', msg=msg)
- self._check_for_dup_router_subnet(context, router_id,
+ self._check_for_dup_router_subnet(context, router,
subnet['network_id'],
subnet_id,
subnet['cidr'])
@@ -449,7 +479,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
'fixed_ips': [fixed_ip],
'mac_address': attributes.ATTR_NOT_SPECIFIED,
'admin_state_up': True,
- 'device_id': router_id,
+ 'device_id': router.id,
'device_owner': owner,
'name': ''}})
@@ -464,18 +494,27 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
}
def add_router_interface(self, context, router_id, interface_info):
+ router = self._get_router(context, router_id)
add_by_port, add_by_sub = self._validate_interface_info(interface_info)
device_owner = self._get_device_owner(context, router_id)
if add_by_port:
port = self._add_interface_by_port(
- context, router_id, interface_info['port_id'], device_owner)
+ context, router, interface_info['port_id'], device_owner)
elif add_by_sub:
port = self._add_interface_by_subnet(
- context, router_id, interface_info['subnet_id'], device_owner)
+ context, router, interface_info['subnet_id'], device_owner)
+
+ with context.session.begin(subtransactions=True):
+ router_port = RouterPort(
+ port_id=port['id'],
+ router_id=router.id,
+ port_type=device_owner
+ )
+ context.session.add(router_port)
return self._make_router_interface_info(
- router_id, port['tenant_id'], port['id'],
+ router.id, port['tenant_id'], port['id'],
port['fixed_ips'][0]['subnet_id'])
def _confirm_router_interface_not_in_use(self, context, router_id,
@@ -483,6 +522,10 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
subnet_db = self._core_plugin._get_subnet(context, subnet_id)
subnet_cidr = netaddr.IPNetwork(subnet_db['cidr'])
fip_qry = context.session.query(FloatingIP)
+ vpnservice = manager.NeutronManager.get_service_plugins().get(
+ constants.VPN)
+ if vpnservice:
+ vpnservice.check_subnet_in_use(context, subnet_id)
for fip_db in fip_qry.filter_by(router_id=router_id):
if netaddr.IPAddress(fip_db['fixed_ip_address']) in subnet_cidr:
raise l3.RouterInterfaceInUseByFloatingIP(
@@ -490,9 +533,15 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
def _remove_interface_by_port(self, context, router_id,
port_id, subnet_id, owner):
- port_db = self._core_plugin._get_port(context, port_id)
- if not (port_db['device_owner'] == owner and
- port_db['device_id'] == router_id):
+ qry = context.session.query(RouterPort)
+ qry = qry.filter_by(
+ port_id=port_id,
+ router_id=router_id,
+ port_type=owner
+ )
+ try:
+ port_db = qry.one().port
+ except exc.NoResultFound:
raise l3.RouterInterfaceNotFound(router_id=router_id,
port_id=port_id)
port_subnet_id = port_db['fixed_ips'][0]['subnet_id']
@@ -513,11 +562,12 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
subnet = self._core_plugin._get_subnet(context, subnet_id)
try:
- rport_qry = context.session.query(models_v2.Port)
- ports = rport_qry.filter_by(
- device_id=router_id,
- device_owner=owner,
- network_id=subnet['network_id'])
+ rport_qry = context.session.query(models_v2.Port).join(RouterPort)
+ ports = rport_qry.filter(
+ RouterPort.router_id == router_id,
+ RouterPort.port_type == owner,
+ models_v2.Port.network_id == subnet['network_id']
+ )
for p in ports:
if p['fixed_ips'][0]['subnet_id'] == subnet_id:
@@ -566,10 +616,12 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
return self._fields(res, fields)
def _get_interface_ports_for_network(self, context, network_id):
- router_intf_qry = context.session.query(models_v2.Port)
- return router_intf_qry.filter_by(
- network_id=network_id,
- device_owner=DEVICE_OWNER_ROUTER_INTF)
+ router_intf_qry = context.session.query(RouterPort)
+ router_intf_qry = router_intf_qry.join(models_v2.Port)
+ return router_intf_qry.filter(
+ models_v2.Port.network_id == network_id,
+ RouterPort.port_type == DEVICE_OWNER_ROUTER_INTF
+ )
def _get_router_for_floatingip(self, context, internal_port,
internal_subnet_id,
@@ -584,16 +636,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
router_intf_ports = self._get_interface_ports_for_network(
context, internal_port['network_id'])
- for intf_p in router_intf_ports:
- if intf_p['fixed_ips'][0]['subnet_id'] == internal_subnet_id:
- router_id = intf_p['device_id']
- router_gw_qry = context.session.query(models_v2.Port)
- has_gw_port = router_gw_qry.filter_by(
- network_id=external_network_id,
- device_id=router_id,
- device_owner=DEVICE_OWNER_ROUTER_GW).count()
- if has_gw_port:
- return router_id
+ # This joins on port_id so is not a cross-join
+ routerport_qry = router_intf_ports.join(models_v2.IPAllocation)
+ routerport_qry = routerport_qry.filter(
+ models_v2.IPAllocation.subnet_id == internal_subnet_id
+ )
+
+ router_port = routerport_qry.first()
+
+ if router_port and router_port.router.gw_port:
+ return router_port.router.id
raise l3.ExternalGatewayForFloatingIPNotFound(
subnet_id=internal_subnet_id,
@@ -932,9 +984,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
device_owners = device_owners or [DEVICE_OWNER_ROUTER_INTF]
if not router_ids:
return []
- filters = {'device_id': router_ids,
- 'device_owner': device_owners}
- interfaces = self._core_plugin.get_ports(context, filters)
+ qry = context.session.query(RouterPort)
+ qry = qry.filter(
+ Router.id.in_(router_ids),
+ RouterPort.port_type.in_(device_owners)
+ )
+
+ # TODO(markmcclain): This is suboptimal but was left to reduce
+ # changeset size since it is late in cycle
+ ports = [rp.port.id for rp in qry]
+ interfaces = self._core_plugin.get_ports(context, {'id': ports})
if interfaces:
self._populate_subnet_for_ports(context, interfaces)
return interfaces
@@ -1037,10 +1096,10 @@ class L3RpcNotifierMixin(object):
self._l3_rpc_notifier = value
def notify_router_updated(self, context, router_id,
- operation=None, data=None):
+ operation=None):
if router_id:
self.l3_rpc_notifier.routers_updated(
- context, [router_id], operation, data)
+ context, [router_id], operation)
def notify_routers_updated(self, context, router_ids,
operation=None, data=None):
@@ -1056,13 +1115,9 @@ class L3_NAT_db_mixin(L3_NAT_dbonly_mixin, L3RpcNotifierMixin):
"""Mixin class to add rpc notifier methods to db_base_plugin_v2."""
def update_router(self, context, id, router):
- r = router['router']
- payload = {'gw_exists':
- r.get(EXTERNAL_GW_INFO, attributes.ATTR_NOT_SPECIFIED) !=
- attributes.ATTR_NOT_SPECIFIED}
router_dict = super(L3_NAT_db_mixin, self).update_router(context,
id, router)
- self.notify_router_updated(context, router_dict['id'], None, payload)
+ self.notify_router_updated(context, router_dict['id'], None)
return router_dict
def delete_router(self, context, id):
@@ -1103,7 +1158,7 @@ class L3_NAT_db_mixin(L3_NAT_dbonly_mixin, L3RpcNotifierMixin):
floatingip_dict = super(L3_NAT_db_mixin, self).create_floatingip(
context, floatingip, initial_status)
router_id = floatingip_dict['router_id']
- self.notify_router_updated(context, router_id, 'create_floatingip', {})
+ self.notify_router_updated(context, router_id, 'create_floatingip')
return floatingip_dict
def update_floatingip(self, context, id, floatingip):
@@ -1117,7 +1172,7 @@ class L3_NAT_db_mixin(L3_NAT_dbonly_mixin, L3RpcNotifierMixin):
def delete_floatingip(self, context, id):
router_id = self._delete_floatingip(context, id)
- self.notify_router_updated(context, router_id, 'delete_floatingip', {})
+ self.notify_router_updated(context, router_id, 'delete_floatingip')
def disassociate_floatingips(self, context, port_id, do_notify=True):
"""Disassociate all floating IPs linked to specific port.
diff --git a/neutron/db/l3_dvr_db.py b/neutron/db/l3_dvr_db.py
index b346ef3f20..1b39d5bed7 100644
--- a/neutron/db/l3_dvr_db.py
+++ b/neutron/db/l3_dvr_db.py
@@ -81,13 +81,11 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
self, context, router_id, router_db, data, gw_info):
"""Update the model to support the dvr case of a router."""
if not attributes.is_attr_set(gw_info) and data.get('distributed'):
- admin_ctx = context.elevated()
- filters = {'device_id': [router_id],
- 'device_owner': [l3_const.DEVICE_OWNER_ROUTER_INTF]}
- ports = self._core_plugin.get_ports(admin_ctx, filters=filters)
- for p in ports:
- port_db = self._core_plugin._get_port(admin_ctx, p['id'])
- port_db.update({'device_owner': DEVICE_OWNER_DVR_INTERFACE})
+ old_owner = l3_const.DEVICE_OWNER_ROUTER_INTF
+ new_owner = DEVICE_OWNER_DVR_INTERFACE
+ for rp in router_db.attached_ports.filter_by(port_type=old_owner):
+ rp.port_type = new_owner
+ rp.port.device_owner = new_owner
def _update_router_db(self, context, router_id, data, gw_info):
with context.session.begin(subtransactions=True):
@@ -119,7 +117,7 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
router, new_network)
if router.extra_attributes.distributed and router.gw_port:
snat_p_list = self.create_snat_intf_ports_if_not_exists(
- context.elevated(), router['id'])
+ context.elevated(), router)
if not snat_p_list:
LOG.debug("SNAT interface ports not created: %s", snat_p_list)
@@ -134,12 +132,15 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
self)._get_device_owner(context, router)
def _get_interface_ports_for_network(self, context, network_id):
- router_intf_qry = (context.session.query(models_v2.Port).
- filter_by(network_id=network_id))
- return (router_intf_qry.
- filter(models_v2.Port.device_owner.in_(
- [l3_const.DEVICE_OWNER_ROUTER_INTF,
- DEVICE_OWNER_DVR_INTERFACE])))
+ router_intf_qry = context.session.query(l3_db.RouterPort)
+ router_intf_qry = router_intf_qry.join(models_v2.Port)
+
+ return router_intf_qry.filter(
+ models_v2.Port.network_id == network_id,
+ l3_db.RouterPort.port_type.in_(
+ [l3_const.DEVICE_OWNER_ROUTER_INTF, DEVICE_OWNER_DVR_INTERFACE]
+ )
+ )
def _update_fip_assoc(self, context, fip, floatingip_db, external_port):
previous_router_id = floatingip_db.router_id
@@ -208,14 +209,22 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
if add_by_port:
port = self._add_interface_by_port(
- context, router_id, interface_info['port_id'], device_owner)
+ context, router, interface_info['port_id'], device_owner)
elif add_by_sub:
port = self._add_interface_by_subnet(
- context, router_id, interface_info['subnet_id'], device_owner)
+ context, router, interface_info['subnet_id'], device_owner)
+
+ with context.session.begin(subtransactions=True):
+ router_port = l3_db.RouterPort(
+ port_id=port['id'],
+ router_id=router.id,
+ port_type=device_owner
+ )
+ context.session.add(router_port)
if router.extra_attributes.distributed and router.gw_port:
self.add_csnat_router_interface_port(
- context.elevated(), router_id, port['network_id'],
+ context.elevated(), router, port['network_id'],
port['fixed_ips'][0]['subnet_id'])
router_interface_info = self._make_router_interface_info(
@@ -257,9 +266,16 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
"""Query router interfaces that relate to list of router_ids."""
if not router_ids:
return []
- filters = {'device_id': router_ids,
- 'device_owner': [DEVICE_OWNER_DVR_SNAT]}
- interfaces = self._core_plugin.get_ports(context, filters)
+ qry = context.session.query(l3_db.RouterPort)
+ qry = qry.filter(
+ l3_db.RouterPort.router_id.in_(router_ids),
+ l3_db.RouterPort.port_type == DEVICE_OWNER_DVR_SNAT
+ )
+
+ # TODO(markmcclain): This is suboptimal but was left to reduce
+ # changeset size since it is late in cycle
+ ports = [rp.port.id for rp in qry]
+ interfaces = self._core_plugin.get_ports(context, {'id': ports})
LOG.debug("Return the SNAT ports: %s", interfaces)
if interfaces:
self._populate_subnet_for_ports(context, interfaces)
@@ -314,6 +330,9 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
floating_ip['host'] = self.get_vm_port_hostid(
context, floating_ip['port_id'])
LOG.debug("Floating IP host: %s", floating_ip['host'])
+ # if no VM there won't be an agent assigned
+ if not floating_ip['host']:
+ continue
fip_agent = self._get_agent_by_type_and_host(
context, l3_const.AGENT_TYPE_L3,
floating_ip['host'])
@@ -444,12 +463,19 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
def get_snat_interface_ports_for_router(self, context, router_id):
"""Return all existing snat_router_interface ports."""
- filters = {'device_id': [router_id],
- 'device_owner': [DEVICE_OWNER_DVR_SNAT]}
- return self._core_plugin.get_ports(context, filters)
+ # TODO(markmcclain): This is suboptimal but was left to reduce
+ # changeset size since it is late in cycle
+ qry = context.session.query(l3_db.RouterPort)
+ qry = qry.filter_by(
+ router_id=router_id,
+ port_type=DEVICE_OWNER_DVR_SNAT
+ )
+
+ ports = [rp.port.id for rp in qry]
+ return self._core_plugin.get_ports(context, {'id': ports})
def add_csnat_router_interface_port(
- self, context, router_id, network_id, subnet_id, do_pop=True):
+ self, context, router, network_id, subnet_id, do_pop=True):
"""Add SNAT interface to the specified router and subnet."""
snat_port = self._core_plugin.create_port(
context,
@@ -457,19 +483,27 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
'network_id': network_id,
'mac_address': attributes.ATTR_NOT_SPECIFIED,
'fixed_ips': [{'subnet_id': subnet_id}],
- 'device_id': router_id,
+ 'device_id': router.id,
'device_owner': DEVICE_OWNER_DVR_SNAT,
'admin_state_up': True,
'name': ''}})
if not snat_port:
msg = _("Unable to create the SNAT Interface Port")
raise n_exc.BadRequest(resource='router', msg=msg)
- elif do_pop:
+
+ with context.session.begin(subtransactions=True):
+ router_port = l3_db.RouterPort(
+ port_id=snat_port['id'],
+ router_id=router.id,
+ port_type=DEVICE_OWNER_DVR_SNAT
+ )
+ context.session.add(router_port)
+
+ if do_pop:
return self._populate_subnet_for_ports(context, [snat_port])
return snat_port
- def create_snat_intf_ports_if_not_exists(
- self, context, router_id):
+ def create_snat_intf_ports_if_not_exists(self, context, router):
"""Function to return the snat interface port list.
This function will return the snat interface port list
@@ -477,37 +511,39 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
new ports and then return the list.
"""
port_list = self.get_snat_interface_ports_for_router(
- context, router_id)
+ context, router.id)
if port_list:
self._populate_subnet_for_ports(context, port_list)
return port_list
port_list = []
- filters = {
- 'device_id': [router_id],
- 'device_owner': [DEVICE_OWNER_DVR_INTERFACE]}
- int_ports = self._core_plugin.get_ports(context, filters)
+
+ int_ports = (
+ rp.port for rp in
+ router.attached_ports.filter_by(
+ port_type=DEVICE_OWNER_DVR_INTERFACE
+ )
+ )
LOG.info(_('SNAT interface port list does not exist,'
' so create one: %s'), port_list)
for intf in int_ports:
- if intf.get('fixed_ips'):
+ if intf.fixed_ips:
# Passing the subnet for the port to make sure the IP's
# are assigned on the right subnet if multiple subnet
# exists
snat_port = self.add_csnat_router_interface_port(
- context, router_id, intf['network_id'],
+ context, router, intf['network_id'],
intf['fixed_ips'][0]['subnet_id'], do_pop=False)
port_list.append(snat_port)
if port_list:
self._populate_subnet_for_ports(context, port_list)
return port_list
- def dvr_vmarp_table_update(self, context, port_id, action):
+ def dvr_vmarp_table_update(self, context, port_dict, action):
"""Notify the L3 agent of VM ARP table changes.
Provide the details of the VM ARP to the L3 agent when
a Nova instance gets created or deleted.
"""
- port_dict = self._core_plugin._get_port(context, port_id)
# Check this is a valid VM port
if ("compute:" not in port_dict['device_owner'] or
not port_dict['fixed_ips']):
@@ -536,11 +572,18 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
# Each csnat router interface port is associated
# with a subnet, so we need to pass the subnet id to
# delete the right ports.
- device_filter = {
- 'device_id': [router['id']],
- 'device_owner': [DEVICE_OWNER_DVR_SNAT]}
+
+ # TODO(markmcclain): This is suboptimal but was left to reduce
+ # changeset size since it is late in cycle
+ ports = (
+ rp.port.id for rp in
+ router.attached_ports.filter_by(port_type=DEVICE_OWNER_DVR_SNAT)
+ )
+
c_snat_ports = self._core_plugin.get_ports(
- context, filters=device_filter)
+ context,
+ filters={'id': ports}
+ )
for p in c_snat_ports:
if subnet_id is None:
self._core_plugin.delete_port(context,
diff --git a/neutron/db/l3_dvrscheduler_db.py b/neutron/db/l3_dvrscheduler_db.py
index 2797c73a8c..a8c9dae945 100644
--- a/neutron/db/l3_dvrscheduler_db.py
+++ b/neutron/db/l3_dvrscheduler_db.py
@@ -110,7 +110,7 @@ class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin):
break
LOG.debug('DVR: dvr_update_router_addvm %s ', router_id)
- def get_dvr_routers_by_vmportid(self, context, port_id):
+ def get_dvr_routers_by_portid(self, context, port_id):
"""Gets the dvr routers on vmport subnets."""
router_ids = set()
port_dict = self._core_plugin.get_port(context, port_id)
@@ -153,9 +153,9 @@ class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin):
return True
return False
- def dvr_deletens_if_no_vm(self, context, port_id):
- """Delete the DVR namespace if no VM exists."""
- router_ids = self.get_dvr_routers_by_vmportid(context, port_id)
+ def dvr_deletens_if_no_port(self, context, port_id):
+ """Delete the DVR namespace if no dvr serviced port exists."""
+ router_ids = self.get_dvr_routers_by_portid(context, port_id)
port_host = ml2_db.get_port_binding_host(port_id)
if not router_ids:
LOG.debug('No namespaces available for this DVR port %(port)s '
@@ -165,16 +165,16 @@ class L3_DVRsch_db_mixin(l3agent_sch_db.L3AgentSchedulerDbMixin):
removed_router_info = []
for router_id in router_ids:
subnet_ids = self.get_subnet_ids_on_router(context, router_id)
- vm_exists_on_subnet = False
+ port_exists_on_subnet = False
for subnet in subnet_ids:
if self.check_ports_active_on_host_and_subnet(context,
port_host,
port_id,
subnet):
- vm_exists_on_subnet = True
+ port_exists_on_subnet = True
break
- if vm_exists_on_subnet:
+ if port_exists_on_subnet:
continue
filter_rtr = {'device_id': [router_id],
'device_owner':
diff --git a/neutron/db/l3_gwmode_db.py b/neutron/db/l3_gwmode_db.py
index dce6cafe90..e9f081f6fc 100644
--- a/neutron/db/l3_gwmode_db.py
+++ b/neutron/db/l3_gwmode_db.py
@@ -43,7 +43,13 @@ class L3_NAT_dbonly_mixin(l3_db.L3_NAT_dbonly_mixin):
nw_id = router_db.gw_port['network_id']
router_res[EXTERNAL_GW_INFO] = {
'network_id': nw_id,
- 'enable_snat': router_db.enable_snat}
+ 'enable_snat': router_db.enable_snat,
+ 'external_fixed_ips': [
+ {'subnet_id': ip["subnet_id"],
+ 'ip_address': ip["ip_address"]}
+ for ip in router_db.gw_port['fixed_ips']
+ ]
+ }
def _update_router_gw_info(self, context, router_id, info, router=None):
# Load the router only if necessary
diff --git a/neutron/db/l3_hamode_db.py b/neutron/db/l3_hamode_db.py
index a0ed580850..2aa78bdea9 100644
--- a/neutron/db/l3_hamode_db.py
+++ b/neutron/db/l3_hamode_db.py
@@ -333,18 +333,19 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin):
ha = cfg.CONF.l3_ha
return ha
- def _create_router_db(self, context, router, tenant_id):
- router['ha'] = self._is_ha(router)
+ def create_router(self, context, router):
+ is_ha = self._is_ha(router['router'])
- if router['ha'] and l3_dvr_db.is_distributed_router(router):
+ if is_ha and l3_dvr_db.is_distributed_router(router['router']):
raise l3_ha.DistributedHARouterNotSupported()
- with context.session.begin(subtransactions=True):
- router_db = super(L3_HA_NAT_db_mixin, self)._create_router_db(
- context, router, tenant_id)
+ router['router']['ha'] = is_ha
+ router_dict = super(L3_HA_NAT_db_mixin,
+ self).create_router(context, router)
- if router['ha']:
+ if is_ha:
try:
+ router_db = self._get_router(context, router_dict['id'])
ha_network = self.get_ha_network(context,
router_db.tenant_id)
if not ha_network:
@@ -356,9 +357,9 @@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_NAT_with_dvr_db_mixin):
self._notify_ha_interfaces_updated(context, router_db.id)
except Exception:
with excutils.save_and_reraise_exception():
- self.delete_router(context, router_db.id)
-
- return router_db
+ self.delete_router(context, router_dict['id'])
+ router_dict['ha_vr_id'] = router_db.extra_attributes.ha_vr_id
+ return router_dict
def _update_router_db(self, context, router_id, data, gw_info):
ha = data.pop('ha', None)
diff --git a/neutron/db/loadbalancer/__init__.py b/neutron/db/loadbalancer/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/db/loadbalancer/__init__.py
+++ b/neutron/db/loadbalancer/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/db/metering/__init__.py b/neutron/db/metering/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/db/metering/__init__.py
+++ b/neutron/db/metering/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/db/metering/metering_db.py b/neutron/db/metering/metering_db.py
index 0e414a5f6b..99e448fc3d 100644
--- a/neutron/db/metering/metering_db.py
+++ b/neutron/db/metering/metering_db.py
@@ -158,8 +158,8 @@ class MeteringDbMixin(metering.MeteringPluginBase,
cidrs = [r['remote_ip_prefix'] for r in r_ips]
new_cidr_ipset = netaddr.IPSet([remote_ip_prefix])
if (netaddr.IPSet(cidrs) & new_cidr_ipset):
- raise metering.MeteringLabelRuleOverlaps(remote_ip_prefix=
- remote_ip_prefix)
+ raise metering.MeteringLabelRuleOverlaps(
+ remote_ip_prefix=remote_ip_prefix)
def create_metering_label_rule(self, context, metering_label_rule):
m = metering_label_rule['metering_label_rule']
diff --git a/neutron/db/migration/alembic_migrations/env.py b/neutron/db/migration/alembic_migrations/env.py
index 363667ff81..bd731b96f8 100644
--- a/neutron/db/migration/alembic_migrations/env.py
+++ b/neutron/db/migration/alembic_migrations/env.py
@@ -100,6 +100,7 @@ def run_migrations_online():
context.run_migrations()
finally:
connection.close()
+ engine.dispose()
if context.is_offline_mode():
diff --git a/neutron/db/migration/alembic_migrations/versions/1f71e54a85e7_ml2_net_seg_model.py b/neutron/db/migration/alembic_migrations/versions/1f71e54a85e7_ml2_net_seg_model.py
new file mode 100644
index 0000000000..f72fbf0efa
--- /dev/null
+++ b/neutron/db/migration/alembic_migrations/versions/1f71e54a85e7_ml2_net_seg_model.py
@@ -0,0 +1,40 @@
+# Copyright 2014 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+"""ml2_network_segments models change for multi-segment network.
+
+Revision ID: 1f71e54a85e7
+Revises: 44621190bc02
+Create Date: 2014-10-15 18:30:51.395295
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '1f71e54a85e7'
+down_revision = '44621190bc02'
+
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ op.add_column('ml2_network_segments',
+ sa.Column('segment_index', sa.Integer(), nullable=False,
+ server_default='0'))
+
+
+def downgrade():
+ op.drop_column('ml2_network_segments', 'segment_index')
diff --git a/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py b/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py
index 7deebe0ede..0ba5f58be7 100644
--- a/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py
+++ b/neutron/db/migration/alembic_migrations/versions/31d7f831a591_add_constraint_for_routerid.py
@@ -27,6 +27,7 @@ down_revision = '37f322991f59'
from alembic import op
import sqlalchemy as sa
+from sqlalchemy.engine import reflection
TABLE_NAME = 'routerl3agentbindings'
PK_NAME = 'pk_routerl3agentbindings'
@@ -49,7 +50,7 @@ def upgrade():
# and all the duplicate records which violate the PK
# constraint need to be removed.
context = op.get_context()
- if context.bind.dialect.name == 'postgresql':
+ if context.bind.dialect.name in ('postgresql', 'ibm_db_sa'):
op.execute('DELETE FROM %(table)s WHERE id in ('
'SELECT %(table)s.id FROM %(table)s LEFT OUTER JOIN '
'(SELECT MIN(id) as id, router_id, l3_agent_id '
@@ -65,6 +66,19 @@ def upgrade():
op.drop_column(TABLE_NAME, 'id')
+ # DB2 doesn't support nullable column in primary key
+ if context.bind.dialect.name == 'ibm_db_sa':
+ op.alter_column(
+ table_name=TABLE_NAME,
+ column_name='router_id',
+ nullable=False
+ )
+ op.alter_column(
+ table_name=TABLE_NAME,
+ column_name='l3_agent_id',
+ nullable=False
+ )
+
op.create_primary_key(
name=PK_NAME,
table_name=TABLE_NAME,
@@ -79,16 +93,32 @@ def downgrade():
# Drop the existed foreign key constraints
# In order to perform primary key changes
- op.drop_constraint(
- name=fk_names[dialect]['l3_agent_id'],
- table_name=TABLE_NAME,
- type_='foreignkey'
- )
- op.drop_constraint(
- name=fk_names[dialect]['router_id'],
- table_name=TABLE_NAME,
- type_='foreignkey'
- )
+ db2fks = {}
+ if dialect == 'ibm_db_sa':
+ # NOTE(mriedem): In DB2 the foreign key names are randomly generated
+ # if you didn't originally explicitly name them, so the name is like
+ # SQLxxxxx where the suffix is a random integer. Therefore we go
+ # through and just drop all of the foreign keys and save them so we
+ # can re-create them later after the primary key is dropped.
+ inspector = reflection.Inspector.from_engine(op.get_bind().engine)
+ db2fks = inspector.get_foreign_keys(TABLE_NAME)
+ for fk in db2fks:
+ op.drop_constraint(
+ name=fk.get('name'),
+ table_name=TABLE_NAME,
+ type_='foreignkey'
+ )
+ else:
+ op.drop_constraint(
+ name=fk_names[dialect]['l3_agent_id'],
+ table_name=TABLE_NAME,
+ type_='foreignkey'
+ )
+ op.drop_constraint(
+ name=fk_names[dialect]['router_id'],
+ table_name=TABLE_NAME,
+ type_='foreignkey'
+ )
op.drop_constraint(
name=PK_NAME,
@@ -101,27 +131,46 @@ def downgrade():
sa.Column('id', sa.String(32))
)
- # Restore the foreign key constraints
- op.create_foreign_key(
- name=fk_names[dialect]['router_id'],
- source=TABLE_NAME,
- referent='routers',
- local_cols=['router_id'],
- remote_cols=['id'],
- ondelete='CASCADE'
- )
-
- op.create_foreign_key(
- name=fk_names[dialect]['l3_agent_id'],
- source=TABLE_NAME,
- referent='agents',
- local_cols=['l3_agent_id'],
- remote_cols=['id'],
- ondelete='CASCADE'
- )
+ if dialect == 'ibm_db_sa':
+ # DB2 doesn't support nullable column in primary key
+ op.alter_column(
+ table_name=TABLE_NAME,
+ column_name='id',
+ nullable=False
+ )
op.create_primary_key(
name=PK_NAME,
table_name=TABLE_NAME,
cols=['id']
)
+
+ # Restore the foreign key constraints
+ if dialect == 'ibm_db_sa':
+ for fk in db2fks:
+ op.create_foreign_key(
+ name=fk.get('name'),
+ source=TABLE_NAME,
+ referent=fk.get('referred_table'),
+ local_cols=fk.get('constrained_columns'),
+ remote_cols=fk.get('referred_columns'),
+ ondelete='CASCADE'
+ )
+ else:
+ op.create_foreign_key(
+ name=fk_names[dialect]['router_id'],
+ source=TABLE_NAME,
+ referent='routers',
+ local_cols=['router_id'],
+ remote_cols=['id'],
+ ondelete='CASCADE'
+ )
+
+ op.create_foreign_key(
+ name=fk_names[dialect]['l3_agent_id'],
+ source=TABLE_NAME,
+ referent='agents',
+ local_cols=['l3_agent_id'],
+ remote_cols=['id'],
+ ondelete='CASCADE'
+ )
diff --git a/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py b/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py
index 1dc8456aeb..c4c8cf9db5 100644
--- a/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py
+++ b/neutron/db/migration/alembic_migrations/versions/3927f7f7c456_l3_extension_distributed_mode.py
@@ -29,6 +29,7 @@ import sqlalchemy as sa
def upgrade():
+ context = op.get_context()
op.create_table(
'router_extra_attributes',
sa.Column('router_id', sa.String(length=36), nullable=False),
@@ -38,8 +39,15 @@ def upgrade():
['router_id'], ['routers.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('router_id')
)
- op.execute("INSERT INTO router_extra_attributes SELECT id as router_id, "
- "False as distributed from routers")
+ if context.bind.dialect.name == 'ibm_db_sa':
+ # NOTE(mriedem): DB2 stores booleans as 0 and 1.
+ op.execute("INSERT INTO router_extra_attributes "
+ "SELECT id as router_id, "
+ "0 as distributed from routers")
+ else:
+ op.execute("INSERT INTO router_extra_attributes "
+ "SELECT id as router_id, "
+ "False as distributed from routers")
def downgrade():
diff --git a/neutron/db/migration/alembic_migrations/versions/44621190bc02_add_uniqueconstraint_ipavailability_ranges.py b/neutron/db/migration/alembic_migrations/versions/44621190bc02_add_uniqueconstraint_ipavailability_ranges.py
new file mode 100644
index 0000000000..66b57c12ea
--- /dev/null
+++ b/neutron/db/migration/alembic_migrations/versions/44621190bc02_add_uniqueconstraint_ipavailability_ranges.py
@@ -0,0 +1,61 @@
+# Copyright 2014 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+"""add_uniqueconstraint_ipavailability_ranges
+
+Revision ID: 44621190bc02
+Revises: juno
+Create Date: 2014-09-23 15:14:15.051921
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '44621190bc02'
+down_revision = 'juno'
+
+from alembic import op
+
+
+TABLE_NAME = 'ipavailabilityranges'
+UC_1_NAME = 'uniq_ipavailabilityranges0first_ip0allocation_pool_id'
+UC_2_NAME = 'uniq_ipavailabilityranges0last_ip0allocation_pool_id'
+
+
+def upgrade():
+ op.create_unique_constraint(
+ name=UC_1_NAME,
+ source=TABLE_NAME,
+ local_cols=['first_ip', 'allocation_pool_id']
+ )
+
+ op.create_unique_constraint(
+ name=UC_2_NAME,
+ source=TABLE_NAME,
+ local_cols=['last_ip', 'allocation_pool_id']
+ )
+
+
+def downgrade():
+ op.drop_constraint(
+ name=UC_1_NAME,
+ table_name=TABLE_NAME,
+ type_='unique'
+ )
+
+ op.drop_constraint(
+ name=UC_2_NAME,
+ table_name=TABLE_NAME,
+ type_='unique'
+ )
diff --git a/neutron/db/migration/alembic_migrations/versions/544673ac99ab_add_router_port_table.py b/neutron/db/migration/alembic_migrations/versions/544673ac99ab_add_router_port_table.py
new file mode 100644
index 0000000000..cf3190bec2
--- /dev/null
+++ b/neutron/db/migration/alembic_migrations/versions/544673ac99ab_add_router_port_table.py
@@ -0,0 +1,65 @@
+# Copyright 2014 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+"""add router port relationship
+
+Revision ID: 544673ac99ab
+Revises: 1680e1f0c4dc
+Create Date: 2014-01-14 11:58:13.754747
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '544673ac99ab'
+down_revision = '1680e1f0c4dc'
+
+from alembic import op
+import sqlalchemy as sa
+
+SQL_STATEMENT = (
+ "insert into routerports "
+ "select "
+ "p.device_id as router_id, p.id as port_id, p.device_owner as port_type "
+ "from ports p join routers r on (p.device_id=r.id) "
+ "where "
+ "(r.tenant_id=p.tenant_id AND p.device_owner='network:router_interface') "
+ "OR (p.tenant_id='' AND p.device_owner='network:router_gateway')"
+)
+
+
+def upgrade():
+ op.create_table(
+ 'routerports',
+ sa.Column('router_id', sa.String(length=36), nullable=False),
+ sa.Column('port_id', sa.String(length=36), nullable=False),
+ sa.Column('port_type', sa.String(length=255)),
+ sa.PrimaryKeyConstraint('router_id', 'port_id'),
+ sa.ForeignKeyConstraint(
+ ['router_id'],
+ ['routers.id'],
+ ondelete='CASCADE'
+ ),
+ sa.ForeignKeyConstraint(
+ ['port_id'],
+ ['ports.id'],
+ ondelete='CASCADE'
+ ),
+ )
+
+ op.execute(SQL_STATEMENT)
+
+
+def downgrade():
+ op.drop_table('routerports')
diff --git a/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py b/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py
index 15e6e670d3..5b5846299e 100644
--- a/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py
+++ b/neutron/db/migration/alembic_migrations/versions/884573acbf1c_unify_nsx_router_extra_attributes.py
@@ -38,6 +38,13 @@ def _migrate_data(old_table, new_table):
"FROM %(old_table)s old_t "
"WHERE new_t.router_id = old_t.router_id") %
{'new_table': new_table, 'old_table': old_table})
+ elif engine.name == 'ibm_db_sa':
+ op.execute(("UPDATE %(new_table)s new_t "
+ "SET (distributed, service_router) = "
+ "(SELECT old_t.distributed, old_t.service_router "
+ "FROM %(old_table)s old_t "
+ "WHERE new_t.router_id = old_t.router_id)") %
+ {'new_table': new_table, 'old_table': old_table})
else:
op.execute(("UPDATE %(new_table)s new_t "
"INNER JOIN %(old_table)s as old_t "
diff --git a/neutron/db/migration/alembic_migrations/versions/HEAD b/neutron/db/migration/alembic_migrations/versions/HEAD
index aa8f506d6e..daed716e18 100644
--- a/neutron/db/migration/alembic_migrations/versions/HEAD
+++ b/neutron/db/migration/alembic_migrations/versions/HEAD
@@ -1 +1 @@
-1680e1f0c4dc
+1f71e54a85e7
diff --git a/neutron/db/migration/alembic_migrations/versions/juno_release.py b/neutron/db/migration/alembic_migrations/versions/juno_release.py
new file mode 100644
index 0000000000..a8ce05df63
--- /dev/null
+++ b/neutron/db/migration/alembic_migrations/versions/juno_release.py
@@ -0,0 +1,36 @@
+# Copyright 2014 Yahoo! Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+"""juno
+
+Revision ID: juno
+Revises: 544673ac99ab
+Create Date: 2014-10-09 00:00:00.000000
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = 'juno'
+down_revision = '544673ac99ab'
+
+
+def upgrade():
+ """A no-op migration for marking the Juno release."""
+ pass
+
+
+def downgrade():
+ """A no-op migration for marking the Juno release."""
+ pass
diff --git a/neutron/db/migration/cli.py b/neutron/db/migration/cli.py
index ae47562cd2..ca83ecdf2a 100644
--- a/neutron/db/migration/cli.py
+++ b/neutron/db/migration/cli.py
@@ -159,12 +159,16 @@ command_opt = cfg.SubCommandOpt('command',
CONF.register_cli_opt(command_opt)
-def main():
- config = alembic_config.Config(
- os.path.join(os.path.dirname(__file__), 'alembic.ini')
- )
+def get_alembic_config():
+ config = alembic_config.Config(os.path.join(os.path.dirname(__file__),
+ 'alembic.ini'))
config.set_main_option('script_location',
'neutron.db.migration:alembic_migrations')
+ return config
+
+
+def main():
+ config = get_alembic_config()
# attach the Neutron conf to the Alembic conf
config.neutron_config = CONF
diff --git a/neutron/db/migration/migrate_to_ml2.py b/neutron/db/migration/migrate_to_ml2.py
index 9c854582f1..fc5fa42167 100755
--- a/neutron/db/migration/migrate_to_ml2.py
+++ b/neutron/db/migration/migrate_to_ml2.py
@@ -75,9 +75,10 @@ OPENVSWITCH = 'openvswitch'
# Releases
ICEHOUSE = 'icehouse'
+JUNO = 'juno'
-SUPPORTED_SCHEMA_VERSIONS = [ICEHOUSE]
+SUPPORTED_SCHEMA_VERSIONS = [ICEHOUSE, JUNO]
def check_db_schema_version(engine, metadata):
@@ -115,7 +116,7 @@ def interpret_vlan_id(vlan_id):
return (p_const.TYPE_VLAN, vlan_id)
-class BaseMigrateToMl2_Icehouse(object):
+class BaseMigrateToMl2(object):
def __init__(self, vif_type, driver_type, segment_table_name,
vlan_allocation_table_name, old_tables):
@@ -131,7 +132,8 @@ class BaseMigrateToMl2_Icehouse(object):
metadata = sa.MetaData()
check_db_schema_version(engine, metadata)
- self.define_ml2_tables(metadata)
+ if hasattr(self, 'define_ml2_tables'):
+ self.define_ml2_tables(metadata)
# Autoload the ports table to ensure that foreign keys to it and
# the network table can be created for the new tables.
@@ -144,7 +146,8 @@ class BaseMigrateToMl2_Icehouse(object):
self.migrate_vlan_allocations(engine)
self.migrate_port_bindings(engine, metadata)
- self.drop_old_tables(engine, save_tables)
+ if hasattr(self, 'drop_old_tables'):
+ self.drop_old_tables(engine, save_tables)
def migrate_segment_dict(self, binding):
binding['id'] = uuidutils.generate_uuid()
@@ -210,6 +213,13 @@ class BaseMigrateToMl2_Icehouse(object):
ml2_port_bindings = metadata.tables['ml2_port_bindings']
engine.execute(ml2_port_bindings.insert(), ml2_bindings)
+
+class BaseMigrateToMl2_IcehouseMixin(object):
+ """A mixin to ensure ml2 database schema state for Icehouse.
+
+ This classes the missing tables for Icehouse schema revisions. In Juno,
+ the schema state has been healed, so we do not need to run these.
+ """
def drop_old_tables(self, engine, save_tables=False):
if save_tables:
return
@@ -351,10 +361,10 @@ class BaseMigrateToMl2_Icehouse(object):
)
-class MigrateLinuxBridgeToMl2_Icehouse(BaseMigrateToMl2_Icehouse):
+class MigrateLinuxBridgeToMl2_Juno(BaseMigrateToMl2):
def __init__(self):
- super(MigrateLinuxBridgeToMl2_Icehouse, self).__init__(
+ super(MigrateLinuxBridgeToMl2_Juno, self).__init__(
vif_type=portbindings.VIF_TYPE_BRIDGE,
driver_type=LINUXBRIDGE,
segment_table_name='network_bindings',
@@ -362,7 +372,7 @@ class MigrateLinuxBridgeToMl2_Icehouse(BaseMigrateToMl2_Icehouse):
old_tables=['portbindingports'])
def migrate_segment_dict(self, binding):
- super(MigrateLinuxBridgeToMl2_Icehouse, self).migrate_segment_dict(
+ super(MigrateLinuxBridgeToMl2_Juno, self).migrate_segment_dict(
binding)
vlan_id = binding.pop('vlan_id')
network_type, segmentation_id = interpret_vlan_id(vlan_id)
@@ -370,10 +380,10 @@ class MigrateLinuxBridgeToMl2_Icehouse(BaseMigrateToMl2_Icehouse):
binding['segmentation_id'] = segmentation_id
-class MigrateOpenvswitchToMl2_Icehouse(BaseMigrateToMl2_Icehouse):
+class MigrateOpenvswitchToMl2_Juno(BaseMigrateToMl2):
def __init__(self):
- super(MigrateOpenvswitchToMl2_Icehouse, self).__init__(
+ super(MigrateOpenvswitchToMl2_Juno, self).__init__(
vif_type=portbindings.VIF_TYPE_OVS,
driver_type=OPENVSWITCH,
segment_table_name='ovs_network_bindings',
@@ -415,11 +425,25 @@ class MigrateOpenvswitchToMl2_Icehouse(BaseMigrateToMl2_Icehouse):
raise ValueError(_('Unknown tunnel type: %s') % tunnel_type)
+class MigrateLinuxBridgeToMl2_Icehouse(MigrateLinuxBridgeToMl2_Juno,
+ BaseMigrateToMl2_IcehouseMixin):
+ pass
+
+
+class MigrateOpenvswitchToMl2_Icehouse(MigrateOpenvswitchToMl2_Juno,
+ BaseMigrateToMl2_IcehouseMixin):
+ pass
+
+
migrate_map = {
ICEHOUSE: {
OPENVSWITCH: MigrateOpenvswitchToMl2_Icehouse,
LINUXBRIDGE: MigrateLinuxBridgeToMl2_Icehouse,
},
+ JUNO: {
+ OPENVSWITCH: MigrateOpenvswitchToMl2_Juno,
+ LINUXBRIDGE: MigrateLinuxBridgeToMl2_Juno,
+ },
}
@@ -436,7 +460,7 @@ def main():
OPENVSWITCH)
parser.add_argument('--vxlan-udp-port', default=None, type=int,
help=_('The UDP port to use for VXLAN tunnels.'))
- parser.add_argument('--release', default=ICEHOUSE, choices=[ICEHOUSE])
+ parser.add_argument('--release', default=JUNO, choices=[ICEHOUSE, JUNO])
parser.add_argument('--save-tables', default=False, action='store_true',
help=_("Retain the old plugin's tables"))
#TODO(marun) Provide a verbose option
diff --git a/neutron/db/models_v2.py b/neutron/db/models_v2.py
index 53efc66926..8def401e7d 100644
--- a/neutron/db/models_v2.py
+++ b/neutron/db/models_v2.py
@@ -63,6 +63,13 @@ class IPAvailabilityRange(model_base.BASEV2):
primary_key=True)
first_ip = sa.Column(sa.String(64), nullable=False, primary_key=True)
last_ip = sa.Column(sa.String(64), nullable=False, primary_key=True)
+ __table_args__ = (
+ sa.UniqueConstraint(
+ first_ip, allocation_pool_id,
+ name='uniq_ipavailabilityranges0first_ip0allocation_pool_id'),
+ sa.UniqueConstraint(
+ last_ip, allocation_pool_id,
+ name='uniq_ipavailabilityranges0last_ip0allocation_pool_id'))
def __repr__(self):
return "%s - %s" % (self.first_ip, self.last_ip)
@@ -177,10 +184,12 @@ class Subnet(model_base.BASEV2, HasId, HasTenant):
enable_dhcp = sa.Column(sa.Boolean())
dns_nameservers = orm.relationship(DNSNameServer,
backref='subnet',
- cascade='all, delete, delete-orphan')
+ cascade='all, delete, delete-orphan',
+ lazy='joined')
routes = orm.relationship(SubnetRoute,
backref='subnet',
- cascade='all, delete, delete-orphan')
+ cascade='all, delete, delete-orphan',
+ lazy='joined')
shared = sa.Column(sa.Boolean)
ipv6_ra_mode = sa.Column(sa.Enum(constants.IPV6_SLAAC,
constants.DHCPV6_STATEFUL,
diff --git a/neutron/db/securitygroups_db.py b/neutron/db/securitygroups_db.py
index e10d29e6f3..23b5c80cb1 100644
--- a/neutron/db/securitygroups_db.py
+++ b/neutron/db/securitygroups_db.py
@@ -147,7 +147,12 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
# because all the unit tests do not explicitly set the context on
# GETS. TODO(arosen) context handling can probably be improved here.
if not default_sg and context.tenant_id:
- self._ensure_default_security_group(context, context.tenant_id)
+ tenant_id = filters.get('tenant_id')
+ if tenant_id:
+ tenant_id = tenant_id[0]
+ else:
+ tenant_id = context.tenant_id
+ self._ensure_default_security_group(context, tenant_id)
marker_obj = self._get_marker_obj(context, 'security_group', limit,
marker)
return self._get_collection(context,
@@ -518,9 +523,13 @@ class SecurityGroupDbMixin(ext_sg.SecurityGroupPluginBase):
return
port_sg = p.get(ext_sg.SECURITYGROUPS, [])
+ filters = {'id': port_sg}
+ tenant_id = p.get('tenant_id')
+ if tenant_id:
+ filters['tenant_id'] = [tenant_id]
valid_groups = set(g['id'] for g in
self.get_security_groups(context, fields=['id'],
- filters={'id': port_sg}))
+ filters=filters))
requested_groups = set(port_sg)
port_sg_missing = requested_groups - valid_groups
diff --git a/neutron/db/securitygroups_rpc_base.py b/neutron/db/securitygroups_rpc_base.py
index 8f87a8c804..bcbe32c556 100644
--- a/neutron/db/securitygroups_rpc_base.py
+++ b/neutron/db/securitygroups_rpc_base.py
@@ -19,6 +19,7 @@ from sqlalchemy.orm import exc
from neutron.common import constants as q_const
from neutron.common import ipv6_utils as ipv6
from neutron.common import utils
+from neutron.db import allowedaddresspairs_db as addr_pair
from neutron.db import models_v2
from neutron.db import securitygroups_db as sg_db
from neutron.extensions import securitygroup as ext_sg
@@ -153,8 +154,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
'sg_member_ips': {}}
rules_in_db = self._select_rules_for_ports(context, ports)
remote_security_group_info = {}
- for (binding, rule_in_db) in rules_in_db:
- port_id = binding['port_id']
+ for (port_id, rule_in_db) in rules_in_db:
remote_gid = rule_in_db.get('remote_group_id')
security_group_id = rule_in_db.get('security_group_id')
ethertype = rule_in_db['ethertype']
@@ -206,7 +206,8 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
for sg_id, member_ips in ips.items():
for ip in member_ips:
ethertype = 'IPv%d' % netaddr.IPAddress(ip).version
- if ip not in sg_info['sg_member_ips'][sg_id][ethertype]:
+ if (ethertype in sg_info['sg_member_ips'][sg_id]
+ and ip not in sg_info['sg_member_ips'][sg_id][ethertype]):
sg_info['sg_member_ips'][sg_id][ethertype].append(ip)
return sg_info
@@ -218,7 +219,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
sgr_sgid = sg_db.SecurityGroupRule.security_group_id
- query = context.session.query(sg_db.SecurityGroupPortBinding,
+ query = context.session.query(sg_binding_port,
sg_db.SecurityGroupRule)
query = query.join(sg_db.SecurityGroupRule,
sgr_sgid == sg_binding_sgid)
@@ -230,27 +231,32 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
if not remote_group_ids:
return ips_by_group
for remote_group_id in remote_group_ids:
- ips_by_group[remote_group_id] = []
+ ips_by_group[remote_group_id] = set()
ip_port = models_v2.IPAllocation.port_id
sg_binding_port = sg_db.SecurityGroupPortBinding.port_id
sg_binding_sgid = sg_db.SecurityGroupPortBinding.security_group_id
+ # Join the security group binding table directly to the IP allocation
+ # table instead of via the Port table skip an unnecessary intermediary
query = context.session.query(sg_binding_sgid,
- models_v2.Port,
- models_v2.IPAllocation.ip_address)
+ models_v2.IPAllocation.ip_address,
+ addr_pair.AllowedAddressPair.ip_address)
query = query.join(models_v2.IPAllocation,
ip_port == sg_binding_port)
- query = query.join(models_v2.Port,
- ip_port == models_v2.Port.id)
+ # Outerjoin because address pairs may be null and we still want the
+ # IP for the port.
+ query = query.outerjoin(
+ addr_pair.AllowedAddressPair,
+ sg_binding_port == addr_pair.AllowedAddressPair.port_id)
query = query.filter(sg_binding_sgid.in_(remote_group_ids))
- for security_group_id, port, ip_address in query:
- ips_by_group[security_group_id].append(ip_address)
- # if there are allowed_address_pairs add them
- if getattr(port, 'allowed_address_pairs', None):
- for address_pair in port.allowed_address_pairs:
- ips_by_group[security_group_id].append(
- address_pair['ip_address'])
+ # Each allowed address pair IP record for a port beyond the 1st
+ # will have a duplicate regular IP in the query response since
+ # the relationship is 1-to-many. Dedup with a set
+ for security_group_id, ip_address, allowed_addr_ip in query:
+ ips_by_group[security_group_id].add(ip_address)
+ if allowed_addr_ip:
+ ips_by_group[security_group_id].add(allowed_addr_ip)
return ips_by_group
def _select_remote_group_ids(self, ports):
@@ -268,7 +274,8 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
def _select_dhcp_ips_for_network_ids(self, context, network_ids):
if not network_ids:
return {}
- query = context.session.query(models_v2.Port,
+ query = context.session.query(models_v2.Port.mac_address,
+ models_v2.Port.network_id,
models_v2.IPAllocation.ip_address)
query = query.join(models_v2.IPAllocation)
query = query.filter(models_v2.Port.network_id.in_(network_ids))
@@ -279,14 +286,13 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
for network_id in network_ids:
ips[network_id] = []
- for port, ip in query:
+ for mac_address, network_id, ip in query:
if (netaddr.IPAddress(ip).version == 6
and not netaddr.IPAddress(ip).is_link_local()):
- mac_address = port['mac_address']
ip = str(ipv6.get_ipv6_addr_by_EUI64(q_const.IPV6_LLA_PREFIX,
mac_address))
- if ip not in ips[port['network_id']]:
- ips[port['network_id']].append(ip)
+ if ip not in ips[network_id]:
+ ips[network_id].append(ip)
return ips
@@ -329,7 +335,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
return ips
def _get_lla_gateway_ip_for_subnet(self, context, subnet):
- query = context.session.query(models_v2.Port)
+ query = context.session.query(models_v2.Port.mac_address)
query = query.join(models_v2.IPAllocation)
query = query.filter(
models_v2.IPAllocation.subnet_id == subnet['id'])
@@ -338,12 +344,11 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
query = query.filter(models_v2.Port.device_owner ==
q_const.DEVICE_OWNER_ROUTER_INTF)
try:
- gateway_port = query.one()
+ mac_address = query.one()[0]
except (exc.NoResultFound, exc.MultipleResultsFound):
LOG.warn(_('No valid gateway port on subnet %s is '
'found for IPv6 RA'), subnet['id'])
return
- mac_address = gateway_port['mac_address']
lla_ip = str(ipv6.get_ipv6_addr_by_EUI64(
q_const.IPV6_LLA_PREFIX,
mac_address))
@@ -416,8 +421,7 @@ class SecurityGroupServerRpcMixin(sg_db.SecurityGroupDbMixin):
def security_group_rules_for_ports(self, context, ports):
rules_in_db = self._select_rules_for_ports(context, ports)
- for (binding, rule_in_db) in rules_in_db:
- port_id = binding['port_id']
+ for (port_id, rule_in_db) in rules_in_db:
port = ports[port_id]
direction = rule_in_db['direction']
rule_dict = {
diff --git a/neutron/db/vpn/__init__.py b/neutron/db/vpn/__init__.py
index a15801e6a4..e69de29bb2 100644
--- a/neutron/db/vpn/__init__.py
+++ b/neutron/db/vpn/__init__.py
@@ -1,14 +0,0 @@
-# (c) Copyright 2013 Hewlett-Packard Development Company, L.P.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/db/vpn/vpn_db.py b/neutron/db/vpn/vpn_db.py
index 6ff9b7c965..6783200249 100644
--- a/neutron/db/vpn/vpn_db.py
+++ b/neutron/db/vpn/vpn_db.py
@@ -28,6 +28,7 @@ from neutron.db.vpn import vpn_validator
from neutron.extensions import vpnaas
from neutron import manager
from neutron.openstack.common import excutils
+from neutron.openstack.common.gettextutils import _LW
from neutron.openstack.common import log as logging
from neutron.openstack.common import uuidutils
from neutron.plugins.common import constants
@@ -601,6 +602,16 @@ class VPNPluginDb(vpnaas.VPNPluginBase, base_db.CommonDbMixin):
router_id=router_id,
vpnservice_id=vpnservices[0]['id'])
+ def check_subnet_in_use(self, context, subnet_id):
+ with context.session.begin(subtransactions=True):
+ vpnservices = context.session.query(VPNService).filter_by(
+ subnet_id=subnet_id
+ ).first()
+ if vpnservices:
+ raise vpnaas.SubnetInUseByVPNService(
+ subnet_id=subnet_id,
+ vpnservice_id=vpnservices['id'])
+
class VPNPluginRpcDbMixin():
def _get_agent_hosting_vpn_services(self, context, host):
@@ -646,7 +657,7 @@ class VPNPluginRpcDbMixin():
vpnservice_db = self._get_vpnservice(
context, vpnservice['id'])
except vpnaas.VPNServiceNotFound:
- LOG.warn(_('vpnservice %s in db is already deleted'),
+ LOG.warn(_LW('vpnservice %s in db is already deleted'),
vpnservice['id'])
continue
diff --git a/neutron/debug/__init__.py b/neutron/debug/__init__.py
index 404a825357..e69de29bb2 100644
--- a/neutron/debug/__init__.py
+++ b/neutron/debug/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/extensions/firewall.py b/neutron/extensions/firewall.py
index 89f8b0f0bf..d7cbb1f0a4 100644
--- a/neutron/extensions/firewall.py
+++ b/neutron/extensions/firewall.py
@@ -127,6 +127,19 @@ class FirewallInternalDriverError(qexception.NeutronException):
message = _("%(driver)s: Internal driver error.")
+class FirewallRuleConflict(qexception.Conflict):
+
+ """Firewall rule conflict exception.
+
+ Occurs when admin policy tries to use another tenant's unshared
+ rule.
+ """
+
+ message = _("Operation cannot be performed since Firewall Rule "
+ "%(firewall_rule_id)s is not shared and belongs to "
+ "another tenant %(tenant_id)s")
+
+
fw_valid_protocol_values = [None, constants.TCP, constants.UDP, constants.ICMP]
fw_valid_action_values = [constants.FWAAS_ALLOW, constants.FWAAS_DENY]
@@ -139,15 +152,15 @@ def convert_protocol(value):
if 0 <= val <= 255:
return val
else:
- raise FirewallRuleInvalidProtocol(protocol=value,
- values=
- fw_valid_protocol_values)
+ raise FirewallRuleInvalidProtocol(
+ protocol=value,
+ values=fw_valid_protocol_values)
elif value.lower() in fw_valid_protocol_values:
return value.lower()
else:
- raise FirewallRuleInvalidProtocol(protocol=value,
- values=
- fw_valid_protocol_values)
+ raise FirewallRuleInvalidProtocol(
+ protocol=value,
+ values=fw_valid_protocol_values)
def convert_action_to_case_insensitive(value):
diff --git a/neutron/extensions/l3.py b/neutron/extensions/l3.py
index b02c9337b6..1497d9fb45 100644
--- a/neutron/extensions/l3.py
+++ b/neutron/extensions/l3.py
@@ -100,7 +100,20 @@ RESOURCE_ATTRIBUTE_MAP = {
'is_visible': True},
EXTERNAL_GW_INFO: {'allow_post': True, 'allow_put': True,
'is_visible': True, 'default': None,
- 'enforce_policy': True}
+ 'enforce_policy': True,
+ 'validate': {
+ 'type:dict_or_nodata': {
+ 'network_id': {'type:uuid': None,
+ 'required': True},
+ 'external_fixed_ips': {
+ 'convert_list_to':
+ attr.convert_kvp_list_to_dict,
+ 'type:fixed_ips': None,
+ 'default': None,
+ 'required': False,
+ }
+ }
+ }}
},
'floatingips': {
'id': {'allow_post': False, 'allow_put': False,
@@ -174,6 +187,7 @@ class L3(extensions.ExtensionDescriptor):
"""Returns Ext Resources."""
plural_mappings = resource_helper.build_plural_mappings(
{}, RESOURCE_ATTRIBUTE_MAP)
+ plural_mappings['external_fixed_ips'] = 'external_fixed_ip'
attr.PLURALS.update(plural_mappings)
action_map = {'router': {'add_router_interface': 'PUT',
'remove_router_interface': 'PUT'}}
diff --git a/neutron/extensions/l3_ext_gw_mode.py b/neutron/extensions/l3_ext_gw_mode.py
index 31c943a9c8..ae0ab1d54b 100644
--- a/neutron/extensions/l3_ext_gw_mode.py
+++ b/neutron/extensions/l3_ext_gw_mode.py
@@ -29,7 +29,13 @@ EXTENDED_ATTRIBUTES_2_0 = {
{'type:dict_or_nodata':
{'network_id': {'type:uuid': None, 'required': True},
'enable_snat': {'type:boolean': None, 'required': False,
- 'convert_to': attrs.convert_to_boolean}}
+ 'convert_to': attrs.convert_to_boolean},
+ 'external_fixed_ips': {
+ 'convert_list_to': attrs.convert_kvp_list_to_dict,
+ 'validate': {'type:fixed_ips': None},
+ 'default': None,
+ 'required': False}
+ }
}}}}
diff --git a/neutron/extensions/l3_ext_ha_mode.py b/neutron/extensions/l3_ext_ha_mode.py
index f8487bb5b9..115a8db814 100644
--- a/neutron/extensions/l3_ext_ha_mode.py
+++ b/neutron/extensions/l3_ext_ha_mode.py
@@ -21,7 +21,7 @@ from neutron.common import exceptions
HA_INFO = 'ha'
EXTENDED_ATTRIBUTES_2_0 = {
'routers': {
- HA_INFO: {'allow_post': True, 'allow_put': True,
+ HA_INFO: {'allow_post': True, 'allow_put': False,
'default': attributes.ATTR_NOT_SPECIFIED, 'is_visible': True,
'enforce_policy': True,
'convert_to': attributes.convert_to_boolean_if_not_none}
diff --git a/neutron/extensions/quotasv2.py b/neutron/extensions/quotasv2.py
index 4fa9bf2805..19fa85dbff 100644
--- a/neutron/extensions/quotasv2.py
+++ b/neutron/extensions/quotasv2.py
@@ -13,8 +13,6 @@
# License for the specific language governing permissions and limitations
# under the License.
-import sys
-
from oslo.config import cfg
import webob
@@ -22,6 +20,7 @@ from neutron.api import extensions
from neutron.api.v2 import attributes
from neutron.api.v2 import base
from neutron.api.v2 import resource
+from neutron.common import constants as const
from neutron.common import exceptions as n_exc
from neutron import manager
from neutron.openstack.common import importutils
@@ -55,7 +54,7 @@ class QuotaSetsController(wsgi.Controller):
'allow_post': False,
'allow_put': True,
'convert_to': attributes.convert_to_int,
- 'validate': {'type:range': [-1, sys.maxsize]},
+ 'validate': {'type:range': [-1, const.DB_INTEGER_MAX_VALUE]},
'is_visible': True}
self._update_extended_attributes = False
diff --git a/neutron/extensions/vpnaas.py b/neutron/extensions/vpnaas.py
index a1bf41876b..fc32d2ace1 100644
--- a/neutron/extensions/vpnaas.py
+++ b/neutron/extensions/vpnaas.py
@@ -64,6 +64,10 @@ class RouterInUseByVPNService(qexception.InUse):
message = _("Router %(router_id)s is used by VPNService %(vpnservice_id)s")
+class SubnetInUseByVPNService(qexception.InUse):
+ message = _("Subnet %(subnet_id)s is used by VPNService %(vpnservice_id)s")
+
+
class VPNStateInvalidToUpdate(qexception.BadRequest):
message = _("Invalid state %(state)s of vpnaas resource %(id)s"
" for updating")
diff --git a/neutron/hacking/checks.py b/neutron/hacking/checks.py
index a170a0d4be..ebb99f0d00 100644
--- a/neutron/hacking/checks.py
+++ b/neutron/hacking/checks.py
@@ -79,7 +79,19 @@ def no_author_tags(physical_line):
return pos, "N322: Don't use author tags"
+def check_assert_called_once(logical_line, filename):
+ msg = ("N323: assert_called_once is a no-op. please use "
+ "assert_called_once_with to test with explicit parameters or an "
+ "assertEqual with call_count.")
+
+ if 'neutron/tests/' in filename:
+ pos = logical_line.find('.assert_called_once(')
+ if pos != -1:
+ yield (pos, msg)
+
+
def factory(register):
register(validate_log_translations)
register(use_jsonutils)
register(no_author_tags)
+ register(check_assert_called_once)
diff --git a/neutron/locale/de/LC_MESSAGES/neutron-log-error.po b/neutron/locale/de/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 46193aaf33..0000000000
--- a/neutron/locale/de/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,263 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 20:07+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/neutron/language/"
-"de/)\n"
-"Language: de\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "Ursprüngliche Ausnahme wird gelöscht: %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "Unerwartete Ausnahme %d mal(e) aufgetreten... Neuversuch."
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "Fehler bei %(full_task_name)s: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr ""
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "Nicht behandelte Ausnahme"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/de/LC_MESSAGES/neutron-log-info.po b/neutron/locale/de/LC_MESSAGES/neutron-log-info.po
index b71ec7e200..10219668b7 100644
--- a/neutron/locale/de/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/de/LC_MESSAGES/neutron-log-info.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-08-17 05:19+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: German (http://www.transifex.com/projects/p/neutron/language/"
"de/)\n"
@@ -20,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "Sicherheitsgruppenerweiterung wurde inaktiviert."
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "Vorbereiten von Filtern für Geräte %s"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "Sicherheitsgruppenregel aktualisiert %r"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "Sicherheitsgruppenmitglied aktualisiert %r"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "Provider-Regel aktualisiert"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "Gerätefilter für %r entfernen"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "Firewallregeln aktualisieren"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -55,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet backdoor hört auf %(port)s für Prozess %(pid)d"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "Sperrpfad erzeugt: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "Löschen der Datei %(file)s fehlgeschlagen"
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -66,73 +133,78 @@ msgstr ""
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Überspringe periodische Aufgabe %(task)s weil sie deaktiviert ist"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "%s abgefangen. Vorgang wird beendet"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr ""
"Übergeordneter Prozess wurde unerwartet abgebrochen. Vorgang wird beendet"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr "Untergeordnetes Element %s abgefangen; Vorgang wird beendet"
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Verzweigung zu schnell; im Ruhemodus"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "Untergeordnetes Element %d gestartet"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "Starten von %d Workers"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Untergeordnetes Element %(pid)d durch Signal %(sig)d abgebrochen"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "Untergeordnete %(pid)s mit Status %(code)d beendet"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "%s abgefangen, untergeordnete Elemente werden gestoppt"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr "Warten aufgerufen nach dem der Thread abgebrochen wurde. Bereinige."
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "Warten auf Beenden von %d untergeordneten Elementen"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -142,68 +214,57 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr "Agent nicht synchron mit Plug-in!"
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
-msgstr ""
+msgstr "Agent erfolgreich initialisiert, läuft jetzt... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
msgstr ""
+"Zuweisung von %(vlan_id)s als lokale VLAN-Adresse für net-id=%(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
+msgstr "Zurückfordern von vlan = %(vlan_id)s von net-id = %(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "'port_unbound()' 'net_uuid' %s nicht in 'local_vlan_map'"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
msgstr ""
+"Zuordnung von physischem Netz %(physical_network)s zu Brücke %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -215,7 +276,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "Port %(device)s aktualisiert. Details: %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
@@ -225,17 +286,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "Zusatzeinheit %s entfernt"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "Agententunnel nicht synchron mit Plug-in!"
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/de/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/de/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index 7cc4dd7afd..0000000000
--- a/neutron/locale/de/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/neutron/language/"
-"de/)\n"
-"Language: de\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "PID %d nicht in Liste untergeordneter Elemente"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-error.po b/neutron/locale/en_AU/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 0319ce9f99..0000000000
--- a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,263 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 20:07+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: English (Australia) (http://www.transifex.com/projects/p/"
-"neutron/language/en_AU/)\n"
-"Language: en_AU\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "Original exception being dropped: %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "Unexpected exception occurred %d time(s)... retrying."
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "Error during %(full_task_name)s: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "Exception during rpc cleanup."
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "Unhandled exception"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-info.po b/neutron/locale/en_AU/LC_MESSAGES/neutron-log-info.po
index f7dcf959c8..fd77cc90b5 100644
--- a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/en_AU/LC_MESSAGES/neutron-log-info.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-07-18 20:49+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: English (Australia) (http://www.transifex.com/projects/p/"
"neutron/language/en_AU/)\n"
@@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet backdoor listening on %(port)s for process %(pid)d"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "Created lock path: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr ""
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -64,72 +131,77 @@ msgstr "Skipping periodic task %(task)s because its interval is negative"
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Skipping periodic task %(task)s because it is disabled"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "Caught %s, exiting"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "Parent process has died unexpectedly, exiting"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr ""
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Forking too fast, sleeping"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "Started child %d"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "Starting %d workers"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Child %(pid)d killed by signal %(sig)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "Child %(pid)s exited with status %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "Caught %s, stopping children"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr ""
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "Waiting on %d children to exit"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -139,41 +211,28 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
@@ -228,11 +287,47 @@ msgstr ""
msgid "Agent tunnel out of sync with plugin!"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/en_AU/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index afc6e6ceed..0000000000
--- a/neutron/locale/en_AU/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: English (Australia) (http://www.transifex.com/projects/p/"
-"neutron/language/en_AU/)\n"
-"Language: en_AU\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d not in child list"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-critical.po b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-critical.po
deleted file mode 100644
index f738cbcf0d..0000000000
--- a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-critical.po
+++ /dev/null
@@ -1,20 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-08-01 06:06+0000\n"
-"PO-Revision-Date: 2014-05-30 06:24+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/"
-"neutron/language/en_GB/)\n"
-"Language: en_GB\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
diff --git a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-error.po b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 06b44c7a97..0000000000
--- a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,268 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-# Andi Chandler <andi@gowling.com>, 2014
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-08-12 21:24+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/"
-"neutron/language/en_GB/)\n"
-"Language: en_GB\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr "Policy check error while calling %s!"
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "Original exception being dropped: %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "Unexpected exception occurred %d time(s)... retrying."
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "Error during %(full_task_name)s: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "Exception during rpc cleanup."
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "Unhandled exception"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-info.po b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-info.po
index 00baf831e3..c984317101 100644
--- a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-info.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-08-17 05:19+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/"
"neutron/language/en_GB/)\n"
@@ -20,18 +20,70 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -56,6 +108,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet backdoor listening on %(port)s for process %(pid)d"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "Created lock path: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "Failed to remove file %(file)s"
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -66,72 +133,77 @@ msgstr "Skipping periodic task %(task)s because its interval is negative"
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Skipping periodic task %(task)s because it is disabled"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "Caught %s, exiting"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "Parent process has died unexpectedly, exiting"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr "Child caught %s, exiting"
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Forking too fast, sleeping"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "Started child %d"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "Starting %d workers"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Child %(pid)d killed by signal %(sig)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "Child %(pid)s exited with status %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "Caught %s, stopping children"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr "Wait called after thread killed. Cleaning up."
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "Waiting on %d children to exit"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -141,41 +213,28 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
@@ -230,11 +289,47 @@ msgstr ""
msgid "Agent tunnel out of sync with plugin!"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/en_GB/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index 22ab5a5db3..0000000000
--- a/neutron/locale/en_GB/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,159 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-# Andi Chandler <andi@gowling.com>, 2014
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-07-25 23:10+0000\n"
-"Last-Translator: Andi Chandler <andi@gowling.com>\n"
-"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/"
-"neutron/language/en_GB/)\n"
-"Language: en_GB\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr "Unable to find data type descriptor for attribute %s"
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d not in child list"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/en_US/LC_MESSAGES/neutron.po b/neutron/locale/en_US/LC_MESSAGES/neutron.po
deleted file mode 100644
index de8e8303af..0000000000
--- a/neutron/locale/en_US/LC_MESSAGES/neutron.po
+++ /dev/null
@@ -1,16682 +0,0 @@
-# English (United States) translations for neutron.
-# Copyright (C) 2013 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:10+0000\n"
-"PO-Revision-Date: 2013-01-28 21:54+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: English (United States) "
-"(http://www.transifex.com/projects/p/openstack/language/en_US/)\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-
-#: neutron/auth.py:35
-msgid "X_USER_ID is not found in request"
-msgstr ""
-
-#: neutron/context.py:82
-#, python-format
-msgid "Arguments dropped when creating context: %s"
-msgstr ""
-
-#: neutron/context.py:110
-#, python-format
-msgid "read_deleted can only be one of 'no', 'yes' or 'only', not %r"
-msgstr ""
-
-#: neutron/manager.py:71
-#, python-format
-msgid "dhcp_agents_per_network must be >= 1. '%s' is invalid."
-msgstr ""
-
-#: neutron/manager.py:83
-msgid "Neutron core_plugin not configured!"
-msgstr ""
-
-#: neutron/manager.py:112
-#, python-format
-msgid "Loading core plugin: %s"
-msgstr ""
-
-#: neutron/manager.py:137
-#, python-format
-msgid "Error loading plugin by name, %s"
-msgstr ""
-
-#: neutron/manager.py:138
-#, python-format
-msgid "Error loading plugin by class, %s"
-msgstr ""
-
-#: neutron/manager.py:139
-msgid "Plugin not found."
-msgstr ""
-
-#: neutron/manager.py:144
-msgid "Loading services supported by the core plugin"
-msgstr ""
-
-#: neutron/manager.py:152
-#, python-format
-msgid "Service %s is supported by the core plugin"
-msgstr ""
-
-#: neutron/manager.py:165
-#, python-format
-msgid "Loading service plugins: %s"
-msgstr ""
-
-#: neutron/manager.py:170
-#, python-format
-msgid "Loading Plugin: %s"
-msgstr ""
-
-#: neutron/manager.py:178
-#, python-format
-msgid "Multiple plugins for service %s were configured"
-msgstr ""
-
-#: neutron/manager.py:190
-#, python-format
-msgid "Successfully loaded %(type)s plugin. Description: %(desc)s"
-msgstr ""
-
-#: neutron/policy.py:87
-#, python-format
-msgid "Loading policies from file: %s"
-msgstr ""
-
-#: neutron/policy.py:142
-#, python-format
-msgid ""
-"Attribute type descriptor is not a dict. Unable to generate any sub-attr "
-"policy rule for %s."
-msgstr ""
-
-#: neutron/policy.py:215
-#, python-format
-msgid ""
-"Unable to identify a target field from:%s.match should be in the form "
-"%%(<field_name>)s"
-msgstr ""
-
-#: neutron/policy.py:241
-#, python-format
-msgid "Unable to find ':' as separator in %s."
-msgstr ""
-
-#: neutron/policy.py:245
-#, python-format
-msgid "Unable to find resource name in %s"
-msgstr ""
-
-#: neutron/policy.py:254
-#, python-format
-msgid ""
-"Unable to verify match:%(match)s as the parent resource: %(res)s was not "
-"found"
-msgstr ""
-
-#: neutron/policy.py:312
-#, python-format
-msgid "Unable to find requested field: %(field)s in target: %(target_dict)s"
-msgstr ""
-
-#: neutron/policy.py:370
-#, python-format
-msgid "Failed policy check for '%s'"
-msgstr ""
-
-#: neutron/quota.py:34
-msgid "Resource name(s) that are supported in quota features"
-msgstr ""
-
-#: neutron/quota.py:38
-msgid ""
-"Default number of resource allowed per tenant. A negative value means "
-"unlimited."
-msgstr ""
-
-#: neutron/quota.py:42
-msgid "Number of networks allowed per tenant.A negative value means unlimited."
-msgstr ""
-
-#: neutron/quota.py:46
-msgid "Number of subnets allowed per tenant, A negative value means unlimited."
-msgstr ""
-
-#: neutron/quota.py:50
-msgid "Number of ports allowed per tenant. A negative value means unlimited."
-msgstr ""
-
-#: neutron/quota.py:54
-msgid "Default driver to use for quota checks"
-msgstr ""
-
-#: neutron/quota.py:148 neutron/quota.py:153
-msgid "Access to this resource was denied."
-msgstr ""
-
-#: neutron/quota.py:226
-msgid ""
-"ConfDriver is used as quota_driver because the loaded plugin does not "
-"support 'quotas' table."
-msgstr ""
-
-#: neutron/quota.py:231
-#, python-format
-msgid "Loaded quota_driver: %s."
-msgstr ""
-
-#: neutron/quota.py:240
-#, python-format
-msgid "%s is already registered."
-msgstr ""
-
-#: neutron/service.py:40
-msgid "Seconds between running periodic tasks"
-msgstr ""
-
-#: neutron/service.py:43
-msgid "Number of separate worker processes for service"
-msgstr ""
-
-#: neutron/service.py:46
-msgid "Number of RPC worker processes for service"
-msgstr ""
-
-#: neutron/service.py:49
-msgid ""
-"Range of seconds to randomly delay when starting the periodic task "
-"scheduler to reduce stampeding. (Disable by setting to 0)"
-msgstr ""
-
-#: neutron/service.py:105 neutron/service.py:163
-msgid "Unrecoverable error: please check log for details."
-msgstr ""
-
-#: neutron/service.py:144
-msgid "Active plugin doesn't implement start_rpc_listeners"
-msgstr ""
-
-#: neutron/service.py:146
-#, python-format
-msgid "'rpc_workers = %d' ignored because start_rpc_listeners is not implemented."
-msgstr ""
-
-#: neutron/service.py:170
-msgid "No known API applications configured."
-msgstr ""
-
-#: neutron/service.py:177
-#, python-format
-msgid "Neutron service started, listening on %(host)s:%(port)s"
-msgstr ""
-
-#: neutron/service.py:278
-msgid "Exception occurs when timer stops"
-msgstr ""
-
-#: neutron/service.py:288
-msgid "Exception occurs when waiting for timer"
-msgstr ""
-
-#: neutron/wsgi.py:51
-msgid "Number of backlog requests to configure the socket with"
-msgstr ""
-
-#: neutron/wsgi.py:55
-msgid ""
-"Sets the value of TCP_KEEPIDLE in seconds for each server socket. Not "
-"supported on OS X."
-msgstr ""
-
-#: neutron/wsgi.py:59
-msgid "Number of seconds to keep retrying to listen"
-msgstr ""
-
-#: neutron/wsgi.py:62
-msgid "Max header line to accommodate large tokens"
-msgstr ""
-
-#: neutron/wsgi.py:65
-msgid "Enable SSL on the API server"
-msgstr ""
-
-#: neutron/wsgi.py:67
-msgid "CA certificate file to use to verify connecting clients"
-msgstr ""
-
-#: neutron/wsgi.py:70
-msgid "Certificate file to use when starting the server securely"
-msgstr ""
-
-#: neutron/wsgi.py:73
-msgid "Private key file to use when starting the server securely"
-msgstr ""
-
-#: neutron/wsgi.py:132
-#, python-format
-msgid "Unable to listen on %(host)s:%(port)s"
-msgstr ""
-
-#: neutron/wsgi.py:138
-#, python-format
-msgid "Unable to find ssl_cert_file : %s"
-msgstr ""
-
-#: neutron/wsgi.py:144
-#, python-format
-msgid "Unable to find ssl_key_file : %s"
-msgstr ""
-
-#: neutron/wsgi.py:149
-#, python-format
-msgid "Unable to find ssl_ca_file : %s"
-msgstr ""
-
-#: neutron/wsgi.py:182
-#, python-format
-msgid "Could not bind to %(host)s:%(port)s after trying for %(time)d seconds"
-msgstr ""
-
-#: neutron/wsgi.py:342
-msgid "Missing Content-Type"
-msgstr ""
-
-#: neutron/wsgi.py:531
-#, python-format
-msgid "Data %(data)s type is %(type)s"
-msgstr ""
-
-#: neutron/wsgi.py:614
-msgid "Cannot understand JSON"
-msgstr ""
-
-#: neutron/wsgi.py:627 neutron/wsgi.py:630
-msgid "Inline DTD forbidden"
-msgstr ""
-
-#: neutron/wsgi.py:711
-msgid "Cannot understand XML"
-msgstr ""
-
-#: neutron/wsgi.py:820
-msgid "Unrecognized Content-Type provided in request"
-msgstr ""
-
-#: neutron/wsgi.py:824
-msgid "No Content-Type provided in request"
-msgstr ""
-
-#: neutron/wsgi.py:828
-msgid "Empty body provided in request"
-msgstr ""
-
-#: neutron/wsgi.py:835
-msgid "Unable to deserialize body as provided Content-Type"
-msgstr ""
-
-#: neutron/wsgi.py:931
-msgid "You must implement __call__"
-msgstr ""
-
-#: neutron/wsgi.py:1024 neutron/api/v2/base.py:191 neutron/api/v2/base.py:332
-#: neutron/api/v2/base.py:472 neutron/api/v2/base.py:527
-#: neutron/extensions/l3agentscheduler.py:50
-#: neutron/extensions/l3agentscheduler.py:93
-msgid "The resource could not be found."
-msgstr ""
-
-#: neutron/wsgi.py:1071
-#, python-format
-msgid "%(method)s %(url)s"
-msgstr ""
-
-#: neutron/wsgi.py:1077
-msgid "Unsupported Content-Type"
-msgstr ""
-
-#: neutron/wsgi.py:1078
-#, python-format
-msgid "InvalidContentType: %s"
-msgstr ""
-
-#: neutron/wsgi.py:1082
-msgid "Malformed request body"
-msgstr ""
-
-#: neutron/wsgi.py:1083
-#, python-format
-msgid "MalformedRequestBody: %s"
-msgstr ""
-
-#: neutron/wsgi.py:1090
-#, python-format
-msgid "HTTP exception thrown: %s"
-msgstr ""
-
-#: neutron/wsgi.py:1095
-msgid "Internal error"
-msgstr ""
-
-#: neutron/wsgi.py:1110 neutron/wsgi.py:1212
-#, python-format
-msgid "%(url)s returned with HTTP %(status)d"
-msgstr ""
-
-#: neutron/wsgi.py:1113
-#, python-format
-msgid "%(url)s returned a fault: %(exception)s"
-msgstr ""
-
-#: neutron/wsgi.py:1231
-#, python-format
-msgid "The requested content type %s is invalid."
-msgstr ""
-
-#: neutron/wsgi.py:1290
-msgid "Could not deserialize data"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:51
-msgid "Interval to resync."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:54
-msgid "The driver used to manage the DHCP server."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:56
-msgid "Support Metadata requests on isolated networks."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:58
-msgid ""
-"Allows for serving metadata requests from a dedicated network. Requires "
-"enable_isolated_metadata = True"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:62
-msgid "Number of threads to use during sync process."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:65 neutron/agent/l3_agent.py:496
-#: neutron/agent/metadata/namespace_proxy.py:165
-msgid "Location of Metadata Proxy UNIX domain socket"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:102
-#, python-format
-msgid ""
-"The '%s' DHCP-driver does not support retrieving of a list of existing "
-"networks"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:109 neutron/agent/dhcp_agent.py:600
-msgid "DHCP agent started"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:118
-#, python-format
-msgid "Calling driver for network: %(net)s action: %(action)s"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:134
-#, python-format
-msgid ""
-"Unable to %(action)s dhcp for %(net_id)s: there is a conflict with its "
-"current state; please check that the network and/or its subnet(s) still "
-"exist."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:143 neutron/agent/dhcp_agent.py:202
-#, python-format
-msgid "Network %s has been deleted."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:145
-#, python-format
-msgid "Unable to %(action)s dhcp for %(net_id)s."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:155
-msgid "Synchronizing state"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:167
-#, python-format
-msgid "Unable to sync network state on deleted network %s"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:173
-msgid "Synchronizing state complete"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:177
-msgid "Unable to sync network state."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:190
-#, python-format
-msgid "resync: %(reason)s"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:206
-#, python-format
-msgid "Network %s info call failed."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:219
-#, python-format
-msgid ""
-"Network %s may have been deleted and its resources may have already been "
-"disposed."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:351
-#, python-format
-msgid ""
-"%(port_num)d router ports found on the metadata access network. Only the "
-"port %(port_id)s, for router %(router_id)s will be considered"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:582 neutron/agent/l3_agent.py:1984
-#: neutron/agent/metadata/agent.py:363
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:328
-#: neutron/services/metering/agents/metering_agent.py:272
-msgid ""
-"Neutron server does not support state report. State report for this agent"
-" will be disabled."
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:588 neutron/agent/l3_agent.py:1989
-#: neutron/agent/metadata/agent.py:368
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:110
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:795
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:216
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:182
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:261
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:131
-#: neutron/services/loadbalancer/agent/agent_manager.py:121
-#: neutron/services/metering/agents/metering_agent.py:277
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:595
-#, python-format
-msgid "Agent updated: %(payload)s"
-msgstr ""
-
-#: neutron/agent/dhcp_agent.py:597 neutron/agent/l3_agent.py:1994
-#: neutron/services/metering/agents/metering_agent.py:280
-#, python-format
-msgid "agent_updated by server side %s!"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:214
-msgid "Cannot allocate link local address"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:457
-msgid ""
-"The working mode for the agent. Allowed modes are: 'legacy' - this "
-"preserves the existing behavior where the L3 agent is deployed on a "
-"centralized networking node to provide L3 services like DNAT, and SNAT. "
-"Use this mode if you do not want to adopt DVR. 'dvr' - this mode enables "
-"DVR functionality and must be used for an L3 agent that runs on a compute"
-" host. 'dvr_snat' - this enables centralized SNAT support in conjunction "
-"with DVR. This mode must be used for an L3 agent running on a "
-"centralized node (or in single-host deployments, e.g. devstack)"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:470 neutron/debug/debug_agent.py:41
-msgid "Name of bridge used for external network traffic."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:474
-msgid "TCP Port used by Neutron metadata namespace proxy."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:478
-msgid ""
-"Send this many gratuitous ARPs for HA setup, if less than or equal to 0, "
-"the feature is disabled"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:481
-msgid ""
-"If namespaces is disabled, the l3 agent can only configure a router that "
-"has the matching router ID."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:486
-msgid "Agent should implement routers with no gateway"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:488
-msgid "UUID of external network for routers implemented by the agents."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:491
-msgid "Allow running metadata proxy."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:493
-msgid "Delete namespace after removing a router."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:516
-#, python-format
-msgid "Error importing interface driver '%s'"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:533
-#, python-format
-msgid ""
-"l3-agent cannot check service plugins enabled at the neutron server when "
-"startup due to RPC error. It happens when the server does not support "
-"this RPC API. If the error is UnsupportedVersion you can ignore this "
-"warning. Detail message: %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:564 neutron/agent/linux/dhcp.py:785
-#: neutron/services/metering/drivers/iptables/iptables_driver.py:92
-msgid "An interface driver must be specified"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:569
-msgid "Router id is required if not using namespaces."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:587
-msgid "RuntimeError in obtaining router list for namespace cleanup."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:617
-#, python-format
-msgid "Failed to destroy stale router namespace %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:635 neutron/agent/linux/dhcp.py:235
-#, python-format
-msgid "Failed trying to delete namespace: %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:723
-msgid ""
-"The 'gateway_external_network_id' option must be configured for this "
-"agent as Neutron has more than one external network."
-msgstr ""
-
-#: neutron/agent/l3_agent.py:755
-#, python-format
-msgid "Info for router %s were not found. Skipping router removal"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:830
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:635
-#: neutron/services/firewall/agents/varmour/varmour_router.py:103
-#, python-format
-msgid "Router port %s has no IP address"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:832 neutron/db/l3_db.py:954
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:637
-#: neutron/services/firewall/agents/varmour/varmour_router.py:106
-#, python-format
-msgid "Ignoring multiple IPs on router port %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:893
-#, python-format
-msgid "Deleting stale internal router device: %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:930
-#, python-format
-msgid "Deleting stale external router device: %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1098
-#, python-format
-msgid "Unable to configure IP address for floating IP: %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1178
-#, python-format
-msgid "Failed sending gratuitous ARP: %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1240
-msgid "DVR: no map match_port found!"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1444
-msgid "DVR: error adding redirection logic"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1456
-msgid "DVR: removed snat failed"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1557
-msgid "Missing subnet/agent_gateway_port"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1678
-#, python-format
-msgid "Got router deleted notification for %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1699
-msgid "DVR: Failed updating arp entry"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1726
-#, python-format
-msgid "Got routers updated notification :%s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1736
-#, python-format
-msgid "Got router removed from agent :%r"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1742
-#, python-format
-msgid "Got router added to agent :%r"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1749
-#, python-format
-msgid "The external network bridge '%s' does not exist"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1801
-#, python-format
-msgid "Failed to fetch router information for '%s'"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1840
-#, python-format
-msgid "Starting _sync_routers_task - fullsync:%s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1860
-#, python-format
-msgid "Processing :%r"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1868
-msgid "_sync_routers_task successfully completed"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1870
-msgid "Failed synchronizing routers due to RPC error"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1873
-#: neutron/services/metering/agents/metering_agent.py:61
-msgid "Failed synchronizing routers"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1896
-msgid "L3 agent started"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1915
-#, python-format
-msgid "Added route entry is '%s'"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1923
-#, python-format
-msgid "Removed route entry is '%s'"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1957
-msgid "Report state task started"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:1981
-msgid "Report state task successfully completed"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:35
-msgid "Location to store keepalived/conntrackd config files"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:39
-msgid "VRRP authentication type AH/PASS"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:41
-msgid "VRRP authentication password"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:45
-msgid "The advertisement interval in seconds"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:56
-#, python-format
-msgid "Router %s is not a HA router"
-msgstr ""
-
-#: neutron/agent/netns_cleanup_util.py:59
-msgid "Delete the namespace by removing all devices."
-msgstr ""
-
-#: neutron/agent/netns_cleanup_util.py:116
-#, python-format
-msgid "Unable to find bridge for device: %s"
-msgstr ""
-
-#: neutron/agent/netns_cleanup_util.py:140
-#, python-format
-msgid "Error unable to destroy namespace: %s"
-msgstr ""
-
-#: neutron/agent/ovs_cleanup_util.py:39
-msgid ""
-"True to delete all ports on all the OpenvSwitch bridges. False to delete "
-"ports created by Neutron on integration and external network bridges."
-msgstr ""
-
-#: neutron/agent/ovs_cleanup_util.py:73
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:665
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:299
-#, python-format
-msgid "Delete %s"
-msgstr ""
-
-#: neutron/agent/ovs_cleanup_util.py:103
-#, python-format
-msgid "Cleaning %s"
-msgstr ""
-
-#: neutron/agent/ovs_cleanup_util.py:110
-msgid "OVS cleanup completed successfully"
-msgstr ""
-
-#: neutron/agent/rpc.py:110
-msgid "DVR functionality requires a server upgrade."
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:33
-msgid "Driver for security groups firewall in the L2 agent"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:37
-msgid ""
-"Controls whether the neutron security group API is enabled in the server."
-" It should be false when using no security groups or using the nova "
-"security group API."
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:44
-msgid "Use ipset to speed-up the iptables based security groups."
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:64
-#: neutron/agent/securitygroups_rpc.py:156
-msgid "Driver configuration doesn't match with enable_security_group"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:77
-msgid "Disabled security-group extension."
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:79
-msgid "Disabled allowed-address-pairs extension."
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:87
-#, python-format
-msgid "Get security group rules for devices via rpc %r"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:111
-msgid ""
-"Security group agent binding currently not set. This should be set by the"
-" end of the init process."
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:122
-#, python-format
-msgid "Security group rule updated on remote: %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:134
-#, python-format
-msgid "Security group member updated on remote: %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:141
-#: neutron/agent/securitygroups_rpc.py:252
-msgid "Provider rule updated"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:154
-#, python-format
-msgid "Init firewall settings (driver=%s)"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:193
-#, python-format
-msgid "Preparing filters for devices %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:223
-#, python-format
-msgid "Security group rule updated %r"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:230
-#, python-format
-msgid "Security group member updated %r"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:244
-#, python-format
-msgid ""
-"Adding %s devices to the list of devices for which firewall needs to be "
-"refreshed"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:264
-#, python-format
-msgid "Remove device filter for %r"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:273
-msgid "Refresh firewall rules"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:277
-msgid "No ports here to refresh firewall"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:291
-#, python-format
-msgid "Update port filter for %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:314
-#, python-format
-msgid "Preparing device filters for %d new devices"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:327
-msgid "Refreshing firewall for all filtered devices"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:335
-#, python-format
-msgid "Refreshing firewall for %d devices"
-msgstr ""
-
-#: neutron/agent/common/config.py:29
-msgid "Root helper application."
-msgstr ""
-
-#: neutron/agent/common/config.py:34
-msgid ""
-"Seconds between nodes reporting state to server; should be less than "
-"agent_down_time, best if it is half or less than agent_down_time."
-msgstr ""
-
-#: neutron/agent/common/config.py:41
-msgid "The driver used to manage the virtual interface."
-msgstr ""
-
-#: neutron/agent/common/config.py:46
-msgid "Allow overlapping IP."
-msgstr ""
-
-#: neutron/agent/common/config.py:102
-msgid ""
-"DEFAULT.root_helper is deprecated! Please move root_helper configuration "
-"to [AGENT] section."
-msgstr ""
-
-#: neutron/agent/common/config.py:113
-msgid "Top-level directory for maintaining dhcp state"
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:66
-msgid "respawn_interval must be >= 0 if provided."
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:80
-msgid "Process is already started"
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:82
-#, python-format
-msgid "Launching async process [%s]."
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:88
-#, python-format
-msgid "Halting async process [%s]."
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:91
-msgid "Process is not running."
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:163
-#, python-format
-msgid "An error occurred while killing [%s]."
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:170
-#, python-format
-msgid "Halting async process [%s] in response to an error."
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:176
-#, python-format
-msgid "Respawning async process [%s]."
-msgstr ""
-
-#: neutron/agent/linux/async_process.py:185
-#, python-format
-msgid "An error occurred while communicating with async process [%s]."
-msgstr ""
-
-#: neutron/agent/linux/daemon.py:37
-#, python-format
-msgid "Error while handling pidfile: %s"
-msgstr ""
-
-#: neutron/agent/linux/daemon.py:45
-msgid "Unable to unlock pid file"
-msgstr ""
-
-#: neutron/agent/linux/daemon.py:94
-msgid "Fork failed"
-msgstr ""
-
-#: neutron/agent/linux/daemon.py:136
-#, python-format
-msgid "Pidfile %s already exist. Daemon already running?"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:43
-msgid "Location to store DHCP server config files"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:46 neutron/plugins/vmware/dhcp_meta/nsx.py:44
-msgid "Domain to use for building the hostnames"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:49
-msgid "Override the default dnsmasq settings with this file"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:51
-msgid "Comma-separated list of the DNS servers which will be used as forwarders."
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:55
-msgid "Delete namespace after removing a dhcp server."
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:59
-msgid "Limit number of leases to prevent a denial-of-service."
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:217
-#, python-format
-msgid ""
-"DHCP for %(net_id)s is stale, pid %(pid)d does not exist, performing "
-"cleanup"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:224
-#, python-format
-msgid "No DHCP started for %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:256 neutron/agent/linux/utils.py:152
-#, python-format
-msgid "Error while reading %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:263 neutron/agent/linux/utils.py:159
-#, python-format
-msgid "Unable to convert value in %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:265 neutron/agent/linux/utils.py:161
-#, python-format
-msgid "Unable to access %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:326
-#, python-format
-msgid ""
-"FAILED VERSION REQUIREMENT FOR DNSMASQ. DHCP AGENT MAY NOT RUN CORRECTLY!"
-" Please ensure that its version is %s or above!"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:332
-#, python-format
-msgid ""
-"Unable to determine dnsmasq version. Please ensure that its version is %s"
-" or above!"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:434
-#, python-format
-msgid "Killing dhcpmasq for network since all subnets have turned off DHCP: %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:446
-#, python-format
-msgid "Pid %d is stale, relaunching dnsmasq"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:447
-#, python-format
-msgid "Reloading allocations for network: %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:498
-#, python-format
-msgid "Building host file: %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:507
-#, python-format
-msgid "Adding %(mac)s : %(name)s : %(ip)s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:520
-#, python-format
-msgid "Done building host file %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:792
-#, python-format
-msgid "Error importing interface driver '%(driver)s': %(inner)s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:832
-#, python-format
-msgid "Setting gateway for dhcp netns on net %(n)s to %(ip)s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:842
-#, python-format
-msgid "Removing gateway for dhcp netns on net %s"
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:886
-#, python-format
-msgid ""
-"DHCP port %(device_id)s on network %(network_id)s does not yet exist. "
-"Checking for a reserved port."
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:900
-#, python-format
-msgid "DHCP port %(device_id)s on network %(network_id)s does not yet exist."
-msgstr ""
-
-#: neutron/agent/linux/dhcp.py:935 neutron/debug/debug_agent.py:67
-#, python-format
-msgid "Reusing existing device: %s."
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:33
-msgid "Location to store child pid files"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:35
-msgid "Periodically check child processes"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:38
-msgid "Action to be executed when a child process dies"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:40
-msgid "Interval between checks of child process liveness (seconds)"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:37
-msgid "Name of Open vSwitch bridge to use"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:40
-msgid "Uses veth for an interface or not"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:42
-msgid "MTU setting for device."
-msgstr ""
-
-#: neutron/agent/linux/interface.py:44
-msgid "Mapping between flavor and LinuxInterfaceDriver"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:46
-msgid "Admin username"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:48 neutron/agent/metadata/agent.py:54
-#: neutron/plugins/metaplugin/common/config.py:65
-msgid "Admin password"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:51 neutron/agent/metadata/agent.py:57
-#: neutron/plugins/metaplugin/common/config.py:68
-msgid "Admin tenant name"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:53 neutron/agent/metadata/agent.py:59
-#: neutron/plugins/metaplugin/common/config.py:70
-msgid "Authentication URL"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:55 neutron/agent/metadata/agent.py:61
-#: neutron/common/config.py:47 neutron/plugins/metaplugin/common/config.py:72
-msgid "The type of authentication to use"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:57 neutron/agent/metadata/agent.py:63
-#: neutron/plugins/metaplugin/common/config.py:74
-msgid "Authentication region"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:214 neutron/agent/linux/interface.py:268
-#: neutron/agent/linux/interface.py:330 neutron/agent/linux/interface.py:379
-#, python-format
-msgid "Device %s already exists"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:232 neutron/agent/linux/interface.py:279
-#: neutron/agent/linux/interface.py:342 neutron/agent/linux/interface.py:386
-#, python-format
-msgid "Unplugged interface '%s'"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:234 neutron/agent/linux/interface.py:278
-#: neutron/agent/linux/interface.py:344 neutron/agent/linux/interface.py:388
-#, python-format
-msgid "Failed unplugging interface '%s'"
-msgstr ""
-
-#: neutron/agent/linux/interface.py:446
-#, python-format
-msgid "Driver location: %s"
-msgstr ""
-
-#: neutron/agent/linux/ip_lib.py:26
-msgid "Force ip_lib calls to use the root helper"
-msgstr ""
-
-#: neutron/agent/linux/iptables_firewall.py:85
-#, python-format
-msgid "Preparing device (%s) filter"
-msgstr ""
-
-#: neutron/agent/linux/iptables_firewall.py:93
-#, python-format
-msgid "Updating device (%s) filter"
-msgstr ""
-
-#: neutron/agent/linux/iptables_firewall.py:95
-#, python-format
-msgid "Attempted to update port filter which is not filtered %s"
-msgstr ""
-
-#: neutron/agent/linux/iptables_firewall.py:104
-#, python-format
-msgid "Removing device (%s) filter"
-msgstr ""
-
-#: neutron/agent/linux/iptables_firewall.py:106
-#, python-format
-msgid "Attempted to remove port filter which is not filtered %r"
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:157
-#, python-format
-msgid "Attempted to remove chain %s which does not exist"
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:199
-#, python-format
-msgid "Unknown chain: %r"
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:234
-#, python-format
-msgid ""
-"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r "
-"%(top)r"
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:389
-#, python-format
-msgid "Got semaphore / lock \"%s\""
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:392
-#, python-format
-msgid "Semaphore / lock released \"%s\""
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:443
-#: neutron/tests/unit/test_iptables_manager.py:753
-#: neutron/tests/unit/test_iptables_manager.py:787
-#, python-format
-msgid ""
-"IPTablesManager.apply failed to apply the following set of iptables "
-"rules:\n"
-"%s"
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:446
-msgid "IPTablesManager.apply completed with success"
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:456
-#, python-format
-msgid "Unable to find table %s"
-msgstr ""
-
-#: neutron/agent/linux/iptables_manager.py:660
-#, python-format
-msgid "Attempted to get traffic counters of chain %s which does not exist"
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:36
-#, python-format
-msgid "Invalid instance state: %%(state)s, valid states are: %(valid_states)s"
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:42
-#, python-format
-msgid ""
-"Invalid notify state: %%(state)s, valid states are: "
-"%(valid_notify_states)s"
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:48
-#, python-format
-msgid ""
-"Invalid authentication type: %%(auth_type)s, valid types are: "
-"%(valid_auth_types)s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:38
-msgid "Timeout in seconds for ovs-vsctl commands"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:72 neutron/agent/linux/ovs_lib.py:170
-#: neutron/agent/linux/ovs_lib.py:290
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:55
-#, python-format
-msgid "Unable to execute %(cmd)s. Exception: %(exception)s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:241
-msgid ""
-"Unable to create VXLAN tunnel port. Please ensure that an openvswitch "
-"version that supports VXLAN is installed."
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:338
-#, python-format
-msgid "Found not yet ready openvswitch port: %s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:353
-#, python-format
-msgid "Found failed openvswitch port: %s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:408
-#, python-format
-msgid "Port: %(port_name)s is on %(switch)s, not on %(br_name)s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:416
-#, python-format
-msgid "ofport: %(ofport)s for VIF: %(vif)s is not a positive integer"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:426
-#, python-format
-msgid "Unable to parse interface details. Exception: %s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:444
-#, python-format
-msgid "Unable to determine mac address for %s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:522
-#, python-format
-msgid "OVS flows could not be applied on bridge %s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:532
-#, python-format
-msgid "Interface %s not found."
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:543
-#, python-format
-msgid "Unable to retrieve bridges. Exception: %s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:552
-#, python-format
-msgid "Bridge %s not found."
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:568
-msgid "Cannot match priority on flow deletion or modification"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:573
-msgid "Must specify one or more actions on flow addition or modification"
-msgstr ""
-
-#: neutron/agent/linux/ovsdb_monitor.py:44
-#, python-format
-msgid "Output received from ovsdb monitor: %s"
-msgstr ""
-
-#: neutron/agent/linux/ovsdb_monitor.py:50
-#, python-format
-msgid "Error received from ovsdb monitor: %s"
-msgstr ""
-
-#: neutron/agent/linux/ra.py:31
-msgid "Location to store IPv6 RA config files"
-msgstr ""
-
-#: neutron/agent/linux/utils.py:48
-#, python-format
-msgid "Running command: %s"
-msgstr ""
-
-#: neutron/agent/linux/utils.py:71
-#, python-format
-msgid ""
-"\n"
-"Command: %(cmd)s\n"
-"Exit code: %(code)s\n"
-"Stdout: %(stdout)r\n"
-"Stderr: %(stderr)r"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:52
-#: neutron/plugins/metaplugin/common/config.py:63
-msgid "Admin user"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:66
-msgid "Turn off verification of the certificate for ssl"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:69
-msgid "Certificate Authority public key (CA cert) file for ssl"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:73
-msgid "Network service endpoint type to pull from the keystone catalog"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:76
-msgid "IP address used by Nova metadata server."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:79
-msgid "TCP Port used by Nova metadata server."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:82
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:63
-msgid "Shared secret to sign instance-id request"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:87
-msgid "Protocol to access nova metadata, http or https"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:89
-msgid "Allow to perform insecure SSL (https) requests to nova metadata"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:93
-msgid "Client certificate for nova metadata api server."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:96
-msgid "Private key of client certificate."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:126
-#: neutron/agent/metadata/namespace_proxy.py:68
-#, python-format
-msgid "Request: %s"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:135
-#: neutron/agent/metadata/namespace_proxy.py:76
-msgid "Unexpected error."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:136
-#: neutron/agent/metadata/namespace_proxy.py:77
-msgid "An unknown error has occurred. Please try your request again."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:182
-msgid ""
-"Either one of parameter network_id or router_id must be passed to "
-"_get_ports method."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:231
-msgid ""
-"The remote metadata server responded with Forbidden. This response "
-"usually occurs when shared secrets do not match."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:242
-#: neutron/agent/metadata/namespace_proxy.py:120
-msgid "Remote metadata server experienced an internal server error."
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:248
-#: neutron/agent/metadata/namespace_proxy.py:126
-#, python-format
-msgid "Unexpected response code: %s"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:308
-msgid "Location for Metadata Proxy UNIX domain socket"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:311
-msgid "Number of separate worker processes for metadata server"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:315
-msgid "Number of backlog requests to configure the metadata server socket with"
-msgstr ""
-
-#: neutron/agent/metadata/namespace_proxy.py:63
-msgid "network_id and router_id are None. One must be provided."
-msgstr ""
-
-#: neutron/agent/metadata/namespace_proxy.py:149
-msgid "Network that will have instance metadata proxied."
-msgstr ""
-
-#: neutron/agent/metadata/namespace_proxy.py:152
-msgid "Router that will have connected instances' metadata proxied."
-msgstr ""
-
-#: neutron/agent/metadata/namespace_proxy.py:155
-#: neutron/tests/functional/agent/linux/simple_daemon.py:42
-msgid "Location of pid file of this process."
-msgstr ""
-
-#: neutron/agent/metadata/namespace_proxy.py:158
-msgid "Run as daemon."
-msgstr ""
-
-#: neutron/agent/metadata/namespace_proxy.py:161
-msgid "TCP Port to listen for metadata server requests."
-msgstr ""
-
-#: neutron/api/api_common.py:101
-#, python-format
-msgid ""
-"Invalid value for pagination_max_limit: %s. It should be an integer "
-"greater to 0"
-msgstr ""
-
-#: neutron/api/api_common.py:115
-#, python-format
-msgid "Limit must be an integer 0 or greater and not '%d'"
-msgstr ""
-
-#: neutron/api/api_common.py:132
-msgid "The number of sort_keys and sort_dirs must be same"
-msgstr ""
-
-#: neutron/api/api_common.py:137
-#, python-format
-msgid "%s is invalid attribute for sort_keys"
-msgstr ""
-
-#: neutron/api/api_common.py:141
-#, python-format
-msgid ""
-"%(invalid_dirs)s is invalid value for sort_dirs, valid value is '%(asc)s'"
-" and '%(desc)s'"
-msgstr ""
-
-#: neutron/api/api_common.py:315 neutron/api/v2/base.py:597
-#, python-format
-msgid "Unable to find '%s' in request body"
-msgstr ""
-
-#: neutron/api/api_common.py:322
-#, python-format
-msgid "Failed to parse request. Parameter '%s' not specified"
-msgstr ""
-
-#: neutron/api/extensions.py:253
-#, python-format
-msgid "Extension with alias %s does not exist"
-msgstr ""
-
-#: neutron/api/extensions.py:257 neutron/api/extensions.py:261
-msgid "Resource not found."
-msgstr ""
-
-#: neutron/api/extensions.py:283
-#, python-format
-msgid "Extended resource: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:305
-#, python-format
-msgid "Extended action: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:313
-#, python-format
-msgid "Extended request: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:403
-msgid "Initializing extension manager."
-msgstr ""
-
-#: neutron/api/extensions.py:486
-#, python-format
-msgid "Error fetching extended attributes for extension '%s'"
-msgstr ""
-
-#: neutron/api/extensions.py:492
-#, python-format
-msgid ""
-"Extension '%s' provides no backward compatibility map for extended "
-"attributes"
-msgstr ""
-
-#: neutron/api/extensions.py:502
-#, python-format
-msgid ""
-"It was impossible to process the following extensions: %s because of "
-"missing requirements."
-msgstr ""
-
-#: neutron/api/extensions.py:513
-#, python-format
-msgid "Ext name: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:514
-#, python-format
-msgid "Ext alias: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:515
-#, python-format
-msgid "Ext description: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:516
-#, python-format
-msgid "Ext namespace: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:517
-#, python-format
-msgid "Ext updated: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:519
-#, python-format
-msgid "Exception loading extension: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:537
-#, python-format
-msgid "Extension path '%s' doesn't exist!"
-msgstr ""
-
-#: neutron/api/extensions.py:545
-#, python-format
-msgid "Loading extension file: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:553
-#, python-format
-msgid "Did not find expected name \"%(ext_name)s\" in %(file)s"
-msgstr ""
-
-#: neutron/api/extensions.py:561
-#, python-format
-msgid "Extension file %(f)s wasn't loaded due to %(exception)s"
-msgstr ""
-
-#: neutron/api/extensions.py:570
-#, python-format
-msgid "Loaded extension: %s"
-msgstr ""
-
-#: neutron/api/extensions.py:601
-#, python-format
-msgid "Extension %s not supported by any of loaded plugins"
-msgstr ""
-
-#: neutron/api/extensions.py:612
-#, python-format
-msgid "Loaded plugins do not implement extension %s interface"
-msgstr ""
-
-#: neutron/api/versions.py:45
-msgid "Unknown API version specified"
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/dhcp_rpc_agent_api.py:65
-#, python-format
-msgid ""
-"Unable to schedule network %s: no agents available; will retry on "
-"subsequent port creation events."
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/dhcp_rpc_agent_api.py:78
-#, python-format
-msgid ""
-"Only %(active)d of %(total)d DHCP agents associated with network "
-"'%(net_id)s' are marked as active, so notifications may be sent to "
-"inactive agents."
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/dhcp_rpc_agent_api.py:90
-#, python-format
-msgid ""
-"Will not send event %(method)s for network %(net_id)s: no agent "
-"available. Payload: %(payload)s"
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:38
-#, python-format
-msgid "Nofity agent at %(host)s the message %(method)s"
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:57
-#, python-format
-msgid "Notify agent at %(topic)s.%(host)s the message %(method)s"
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:99
-#, python-format
-msgid ""
-"No plugin for L3 routing registered. Cannot notify agents with the "
-"message %s"
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:117
-#, python-format
-msgid ""
-"Fanout notify agent at %(topic)s the message %(method)s on router "
-"%(router_id)s"
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:49
-#, python-format
-msgid "Notify metering agent at %(topic)s.%(host)s the message %(method)s"
-msgstr ""
-
-#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:64
-#, python-format
-msgid ""
-"Fanout notify metering agent at %(topic)s the message %(method)s on "
-"router %(router_id)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:65
-msgid "Unrecognized action"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:82
-#, python-format
-msgid ""
-"Action %(action)s for network %(net_id)s could not complete successfully:"
-" %(reason)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:92
-#, python-format
-msgid "get_active_networks requested from %s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:99
-#, python-format
-msgid "get_active_networks_info from %s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:119
-#, python-format
-msgid "Network %(network_id)s requested from %(host)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:126
-#: neutron/api/rpc/handlers/dhcp_rpc.py:190
-#, python-format
-msgid "Network %s could not be found, it might have been deleted concurrently."
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:148
-#, python-format
-msgid "Port %(device_id)s for %(network_id)s requested from %(host)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:182
-#, python-format
-msgid ""
-"DHCP port %(device_id)s on network %(network_id)s does not exist on "
-"%(host)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:222
-#, python-format
-msgid "DHCP port deletion for %(network_id)s request from %(host)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:235
-#, python-format
-msgid "DHCP port remove fixed_ip for %(subnet_id)s request from %(host)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:259
-#, python-format
-msgid "Updating lease expiration is now deprecated. Issued from host %s."
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:270
-#, python-format
-msgid "Create dhcp port %(port)s from %(host)s."
-msgstr ""
-
-#: neutron/api/rpc/handlers/dhcp_rpc.py:287
-#, python-format
-msgid "Update dhcp port %(port)s from %(host)s."
-msgstr ""
-
-#: neutron/api/rpc/handlers/dvr_rpc.py:128
-msgid "DVR agent binding currently not set."
-msgstr ""
-
-#: neutron/api/rpc/handlers/l3_rpc.py:70
-msgid ""
-"No plugin for L3 routing registered! Will reply to l3 agent with empty "
-"router dictionary."
-msgstr ""
-
-#: neutron/api/rpc/handlers/l3_rpc.py:84
-#, python-format
-msgid ""
-"Routers returned to l3 agent:\n"
-" %s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/l3_rpc.py:90
-#, python-format
-msgid "Checking router: %(id)s for host: %(host)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/l3_rpc.py:150
-#, python-format
-msgid "External network ID returned to l3 agent: %s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/l3_rpc.py:162
-#, python-format
-msgid "New status for floating IP %(floatingip_id)s: %(status)s"
-msgstr ""
-
-#: neutron/api/rpc/handlers/l3_rpc.py:170
-#, python-format
-msgid "Floating IP: %s no longer present."
-msgstr ""
-
-#: neutron/api/v2/attributes.py:44
-#, python-format
-msgid ""
-"Invalid input. '%(target_dict)s' must be a dictionary with keys: "
-"%(expected_keys)s"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:55
-#, python-format
-msgid ""
-"Validation of dictionary's keys failed.Expected keys: %(expected_keys)s "
-"Provided keys: %(provided_keys)s"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:69
-#, python-format
-msgid "'%(data)s' is not in %(valid_values)s"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:85
-#, python-format
-msgid "'%s' Blank strings are not permitted"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:95
-#, python-format
-msgid "'%s' is not a valid string"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:100
-#, python-format
-msgid "'%(data)s' exceeds maximum length of %(max_len)s"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:110
-#, python-format
-msgid "'%s' is not a valid boolean value"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:129 neutron/api/v2/attributes.py:454
-#, python-format
-msgid "'%s' is not an integer"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:133
-#, python-format
-msgid "'%(data)s' is too small - must be at least '%(limit)d'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:138
-#, python-format
-msgid "'%(data)s' is too large - must be no larger than '%(limit)d'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:147
-#, python-format
-msgid "'%s' contains whitespace"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:164
-#, python-format
-msgid "'%s' is not a valid MAC address"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:179
-#, python-format
-msgid "'%s' is not a valid IP address"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:190
-#, python-format
-msgid "Invalid data format for IP pool: '%s'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:209 neutron/api/v2/attributes.py:216
-#, python-format
-msgid "Invalid data format for fixed IP: '%s'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:224
-#, python-format
-msgid "Duplicate IP address '%s'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:240
-#, python-format
-msgid "Invalid data format for nameserver: '%s'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:251
-#, python-format
-msgid "'%s' is not a valid nameserver"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:255
-#, python-format
-msgid "Duplicate nameserver '%s'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:263
-#, python-format
-msgid "Invalid data format for hostroute: '%s'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:283
-#, python-format
-msgid "Duplicate hostroute '%s'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:300 neutron/tests/unit/test_attributes.py:460
-#: neutron/tests/unit/test_attributes.py:474
-#: neutron/tests/unit/test_attributes.py:482
-#, python-format
-msgid "'%(data)s' isn't a recognized IP subnet cidr, '%(cidr)s' is recommended"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:306
-#, python-format
-msgid "'%s' is not a valid IP subnet"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:314 neutron/api/v2/attributes.py:367
-#, python-format
-msgid "'%s' is not a list"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:319 neutron/api/v2/attributes.py:378
-#, python-format
-msgid "Duplicate items in the list: '%s'"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:342
-#, python-format
-msgid "'%s' is not a valid input"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:355
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:534
-#, python-format
-msgid "'%s' is not a valid UUID"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:398
-#, python-format
-msgid "Validator '%s' does not exist."
-msgstr ""
-
-#: neutron/api/v2/attributes.py:408
-#, python-format
-msgid "'%s' is not a dictionary"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:459
-#, python-format
-msgid "'%s' should be non-negative"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:478
-#, python-format
-msgid "'%s' cannot be converted to boolean"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:491
-#: neutron/plugins/nec/extensions/packetfilter.py:75
-#, python-format
-msgid "'%s' is not a integer"
-msgstr ""
-
-#: neutron/api/v2/attributes.py:504
-#, python-format
-msgid "'%s' is not of the form <key>=[value]"
-msgstr ""
-
-#: neutron/api/v2/base.py:87
-msgid "Native pagination depend on native sorting"
-msgstr ""
-
-#: neutron/api/v2/base.py:90
-msgid "Allow sorting is enabled because native pagination requires native sorting"
-msgstr ""
-
-#: neutron/api/v2/base.py:361
-#, python-format
-msgid "Unable to undo add for %(resource)s %(id)s"
-msgstr ""
-
-#: neutron/api/v2/base.py:493
-#, python-format
-msgid "Invalid format: %s"
-msgstr ""
-
-#: neutron/api/v2/base.py:550
-msgid ""
-"Specifying 'tenant_id' other than authenticated tenant in request "
-"requires admin privileges"
-msgstr ""
-
-#: neutron/api/v2/base.py:558
-msgid "Running without keystone AuthN requires that tenant_id is specified"
-msgstr ""
-
-#: neutron/api/v2/base.py:576
-msgid "Resource body required"
-msgstr ""
-
-#: neutron/api/v2/base.py:578
-#, python-format
-msgid "Request body: %(body)s"
-msgstr ""
-
-#: neutron/api/v2/base.py:588
-msgid "Bulk operation not supported"
-msgstr ""
-
-#: neutron/api/v2/base.py:592
-msgid "Resources required"
-msgstr ""
-
-#: neutron/api/v2/base.py:608
-#, python-format
-msgid "Failed to parse request. Required attribute '%s' not specified"
-msgstr ""
-
-#: neutron/api/v2/base.py:615
-#, python-format
-msgid "Attribute '%s' not allowed in POST"
-msgstr ""
-
-#: neutron/api/v2/base.py:620
-#, python-format
-msgid "Cannot update read-only attribute %s"
-msgstr ""
-
-#: neutron/api/v2/base.py:638
-#, python-format
-msgid "Invalid input for %(attr)s. Reason: %(reason)s."
-msgstr ""
-
-#: neutron/api/v2/base.py:647 neutron/extensions/allowedaddresspairs.py:75
-#: neutron/extensions/multiprovidernet.py:45
-#, python-format
-msgid "Unrecognized attribute(s) '%s'"
-msgstr ""
-
-#: neutron/api/v2/base.py:666
-#, python-format
-msgid "Tenant %(tenant_id)s not allowed to create %(resource)s on this network"
-msgstr ""
-
-#: neutron/api/v2/resource.py:97
-#, python-format
-msgid "%(action)s failed (client error): %(exc)s"
-msgstr ""
-
-#: neutron/api/v2/resource.py:100 neutron/api/v2/resource.py:108
-#: neutron/api/v2/resource.py:128
-#, python-format
-msgid "%s failed"
-msgstr ""
-
-#: neutron/api/v2/resource.py:130
-#: neutron/tests/unit/test_api_v2_resource.py:299
-msgid "Request Failed: internal server error while processing your request."
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:39
-msgid ""
-"Check for Open vSwitch VXLAN support failed. Please ensure that the "
-"version of openvswitch being used has VXLAN support."
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:48
-msgid ""
-"Check for Open vSwitch patch port support failed. Please ensure that the "
-"version of openvswitch being used has patch port support or disable "
-"features requiring patch ports (gre/vxlan, etc.)."
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:68
-msgid ""
-"Check for Open vSwitch ARP responder support failed. Please ensure that "
-"the version of openvswitch being used has ARP flows support."
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:77
-msgid "Check for vxlan support"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:79
-msgid "Check for patch port support"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:81
-msgid "Check for nova notification support"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:83
-msgid "Check for ARP responder support"
-msgstr ""
-
-#: neutron/cmd/sanity/checks.py:72
-#, python-format
-msgid "Unexpected exception while checking supported feature via command: %s"
-msgstr ""
-
-#: neutron/common/config.py:37
-msgid "The host IP to bind to"
-msgstr ""
-
-#: neutron/common/config.py:39
-msgid "The port to bind to"
-msgstr ""
-
-#: neutron/common/config.py:41
-msgid "The API paste config file to use"
-msgstr ""
-
-#: neutron/common/config.py:43
-msgid "The path for API extensions"
-msgstr ""
-
-#: neutron/common/config.py:45
-msgid "The policy file to use"
-msgstr ""
-
-#: neutron/common/config.py:49
-msgid "The core plugin Neutron will use"
-msgstr ""
-
-#: neutron/common/config.py:51 neutron/db/migration/cli.py:35
-msgid "The service plugins Neutron will use"
-msgstr ""
-
-#: neutron/common/config.py:53
-msgid "The base MAC address Neutron will use for VIFs"
-msgstr ""
-
-#: neutron/common/config.py:55
-msgid "How many times Neutron will retry MAC generation"
-msgstr ""
-
-#: neutron/common/config.py:57
-msgid "Allow the usage of the bulk API"
-msgstr ""
-
-#: neutron/common/config.py:59
-msgid "Allow the usage of the pagination"
-msgstr ""
-
-#: neutron/common/config.py:61
-msgid "Allow the usage of the sorting"
-msgstr ""
-
-#: neutron/common/config.py:63
-msgid ""
-"The maximum number of items returned in a single response, value was "
-"'infinite' or negative integer means no limit"
-msgstr ""
-
-#: neutron/common/config.py:67
-msgid "Maximum number of DNS nameservers"
-msgstr ""
-
-#: neutron/common/config.py:69
-msgid "Maximum number of host routes per subnet"
-msgstr ""
-
-#: neutron/common/config.py:71
-msgid "Maximum number of fixed ips per port"
-msgstr ""
-
-#: neutron/common/config.py:74
-msgid ""
-"DHCP lease duration (in seconds). Use -1 to tell dnsmasq to use infinite "
-"lease times."
-msgstr ""
-
-#: neutron/common/config.py:77
-msgid "Allow sending resource operation notification to DHCP agent"
-msgstr ""
-
-#: neutron/common/config.py:80
-msgid "Allow overlapping IP support in Neutron"
-msgstr ""
-
-#: neutron/common/config.py:82
-msgid "The hostname Neutron is running on"
-msgstr ""
-
-#: neutron/common/config.py:84
-msgid ""
-"Ensure that configured gateway is on subnet. For IPv6, validate only if "
-"gateway is not a link local address. Deprecated, to be removed during the"
-" K release, at which point the check will be mandatory."
-msgstr ""
-
-#: neutron/common/config.py:90
-msgid "Send notification to nova when port status changes"
-msgstr ""
-
-#: neutron/common/config.py:92
-msgid ""
-"Send notification to nova when port data (fixed_ips/floatingip) changes "
-"so nova can update its cache."
-msgstr ""
-
-#: neutron/common/config.py:96
-msgid "URL for connection to nova"
-msgstr ""
-
-#: neutron/common/config.py:98
-msgid "Username for connecting to nova in admin context"
-msgstr ""
-
-#: neutron/common/config.py:100
-msgid "Password for connection to nova in admin context"
-msgstr ""
-
-#: neutron/common/config.py:103
-msgid "The uuid of the admin nova tenant"
-msgstr ""
-
-#: neutron/common/config.py:106
-msgid "Authorization URL for connecting to nova in admin context"
-msgstr ""
-
-#: neutron/common/config.py:109
-msgid "CA file for novaclient to verify server certificates"
-msgstr ""
-
-#: neutron/common/config.py:111
-msgid "If True, ignore any SSL validation issues"
-msgstr ""
-
-#: neutron/common/config.py:113
-msgid ""
-"Name of nova region to use. Useful if keystone manages more than one "
-"region."
-msgstr ""
-
-#: neutron/common/config.py:116
-msgid ""
-"Number of seconds between sending events to nova if there are any events "
-"to send."
-msgstr ""
-
-#: neutron/common/config.py:123
-msgid ""
-"Where to store Neutron state files. This directory must be writable by "
-"the agent."
-msgstr ""
-
-#: neutron/common/config.py:156
-#, python-format
-msgid "Base MAC: %s"
-msgstr ""
-
-#: neutron/common/config.py:164
-msgid "Logging enabled!"
-msgstr ""
-
-#: neutron/common/config.py:180
-#, python-format
-msgid "Config paste file: %s"
-msgstr ""
-
-#: neutron/common/config.py:185
-#, python-format
-msgid "Unable to load %(app_name)s from configuration file %(config_path)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:30
-#: neutron/plugins/vmware/api_client/exception.py:27
-msgid "An unknown exception occurred."
-msgstr ""
-
-#: neutron/common/exceptions.py:51
-#, python-format
-msgid "Bad %(resource)s request: %(msg)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:63
-msgid "Not authorized."
-msgstr ""
-
-#: neutron/common/exceptions.py:67
-msgid "The service is unavailable"
-msgstr ""
-
-#: neutron/common/exceptions.py:71
-#, python-format
-msgid "User does not have admin privileges: %(reason)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:75
-#, python-format
-msgid "Policy doesn't allow %(action)s to be performed."
-msgstr ""
-
-#: neutron/common/exceptions.py:79
-#, python-format
-msgid "Network %(net_id)s could not be found"
-msgstr ""
-
-#: neutron/common/exceptions.py:83
-#, python-format
-msgid "Subnet %(subnet_id)s could not be found"
-msgstr ""
-
-#: neutron/common/exceptions.py:87
-#, python-format
-msgid "Port %(port_id)s could not be found"
-msgstr ""
-
-#: neutron/common/exceptions.py:91
-#, python-format
-msgid "Port %(port_id)s could not be found on network %(net_id)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:96
-msgid "Policy configuration policy.json could not be found"
-msgstr ""
-
-#: neutron/common/exceptions.py:100
-#, python-format
-msgid "Failed to init policy %(policy)s because %(reason)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:104
-#, python-format
-msgid "Failed to check policy %(policy)s because %(reason)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:108
-#, python-format
-msgid "Unsupported port state: %(port_state)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:112
-msgid "The resource is inuse"
-msgstr ""
-
-#: neutron/common/exceptions.py:116
-#, python-format
-msgid ""
-"Unable to complete operation on network %(net_id)s. There are one or more"
-" ports still in use on the network."
-msgstr ""
-
-#: neutron/common/exceptions.py:121
-#, python-format
-msgid ""
-"Unable to complete operation on subnet %(subnet_id)s. One or more ports "
-"have an IP allocation from this subnet."
-msgstr ""
-
-#: neutron/common/exceptions.py:126
-#, python-format
-msgid ""
-"Unable to complete operation on port %(port_id)s for network %(net_id)s. "
-"Port already has an attacheddevice %(device_id)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:132
-#, python-format
-msgid ""
-"Unable to complete operation for network %(net_id)s. The mac address "
-"%(mac)s is in use."
-msgstr ""
-
-#: neutron/common/exceptions.py:138
-#, python-format
-msgid ""
-"Unable to complete operation for %(subnet_id)s. The number of host routes"
-" exceeds the limit %(quota)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:144
-#, python-format
-msgid ""
-"Unable to complete operation for %(subnet_id)s. The number of DNS "
-"nameservers exceeds the limit %(quota)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:149
-#, python-format
-msgid ""
-"Unable to complete operation for network %(net_id)s. The IP address "
-"%(ip_address)s is in use."
-msgstr ""
-
-#: neutron/common/exceptions.py:154
-#, python-format
-msgid ""
-"Unable to create the network. The VLAN %(vlan_id)s on physical network "
-"%(physical_network)s is in use."
-msgstr ""
-
-#: neutron/common/exceptions.py:160
-#, python-format
-msgid ""
-"Unable to create the flat network. Physical network %(physical_network)s "
-"is in use."
-msgstr ""
-
-#: neutron/common/exceptions.py:165
-#, python-format
-msgid "Unable to create the network. The tunnel ID %(tunnel_id)s is in use."
-msgstr ""
-
-#: neutron/common/exceptions.py:170
-msgid "Tenant network creation is not enabled."
-msgstr ""
-
-#: neutron/common/exceptions.py:178
-msgid ""
-"Unable to create the network. No tenant network is available for "
-"allocation."
-msgstr ""
-
-#: neutron/common/exceptions.py:183
-msgid ""
-"Unable to create the network. No available network found in maximum "
-"allowed attempts."
-msgstr ""
-
-#: neutron/common/exceptions.py:188
-#, python-format
-msgid ""
-"Subnet on port %(port_id)s does not match the requested subnet "
-"%(subnet_id)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:193
-#, python-format
-msgid "Malformed request body: %(reason)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:203
-#, python-format
-msgid "Invalid input for operation: %(error_message)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:207
-#, python-format
-msgid "The allocation pool %(pool)s is not valid."
-msgstr ""
-
-#: neutron/common/exceptions.py:211
-#, python-format
-msgid ""
-"Found overlapping allocation pools:%(pool_1)s %(pool_2)s for subnet "
-"%(subnet_cidr)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:216
-#, python-format
-msgid "The allocation pool %(pool)s spans beyond the subnet cidr %(subnet_cidr)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:221
-#, python-format
-msgid "Unable to generate unique mac on network %(net_id)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:225
-#, python-format
-msgid "No more IP addresses available on network %(net_id)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:229
-#, python-format
-msgid "Bridge %(bridge)s does not exist."
-msgstr ""
-
-#: neutron/common/exceptions.py:233
-#, python-format
-msgid "Creation failed. %(dev_name)s already exists."
-msgstr ""
-
-#: neutron/common/exceptions.py:237
-msgid "Sudo privilege is required to run this command."
-msgstr ""
-
-#: neutron/common/exceptions.py:241
-#, python-format
-msgid "Unknown quota resources %(unknown)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:245
-#, python-format
-msgid "Quota exceeded for resources: %(overs)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:249
-msgid "Tenant-id was missing from Quota request"
-msgstr ""
-
-#: neutron/common/exceptions.py:253
-#, python-format
-msgid ""
-"Change would make usage less than 0 for the following resources: "
-"%(unders)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:258
-#, python-format
-msgid ""
-"Unable to reconfigure sharing settings for network %(network)s. Multiple "
-"tenants are using it"
-msgstr ""
-
-#: neutron/common/exceptions.py:263
-#, python-format
-msgid "Invalid extension environment: %(reason)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:267
-#, python-format
-msgid "Extensions not found: %(extensions)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:271
-#, python-format
-msgid "Invalid content type %(content_type)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:275
-#, python-format
-msgid "Unable to find any IP address on external network %(net_id)s."
-msgstr ""
-
-#: neutron/common/exceptions.py:280
-msgid "More than one external network exists"
-msgstr ""
-
-#: neutron/common/exceptions.py:284
-#, python-format
-msgid "An invalid value was provided for %(opt_name)s: %(opt_value)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:289
-#, python-format
-msgid "Gateway ip %(ip_address)s conflicts with allocation pool %(pool)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:294
-#, python-format
-msgid ""
-"Current gateway ip %(ip_address)s already in use by port %(port_id)s. "
-"Unable to update."
-msgstr ""
-
-#: neutron/common/exceptions.py:299
-#, python-format
-msgid "Invalid network VLAN range: '%(vlan_range)s' - '%(error)s'"
-msgstr ""
-
-#: neutron/common/exceptions.py:309
-#, python-format
-msgid "Invalid network VXLAN port range: '%(vxlan_range)s'"
-msgstr ""
-
-#: neutron/common/exceptions.py:313
-msgid "VXLAN Network unsupported."
-msgstr ""
-
-#: neutron/common/exceptions.py:317
-#, python-format
-msgid "Found duplicate extension: %(alias)s"
-msgstr ""
-
-#: neutron/common/exceptions.py:321
-#, python-format
-msgid ""
-"The following device_id %(device_id)s is not owned by your tenant or "
-"matches another tenants router."
-msgstr ""
-
-#: neutron/common/exceptions.py:326
-#, python-format
-msgid "Invalid CIDR %(input)s given as IP prefix"
-msgstr ""
-
-#: neutron/common/ipv6_utils.py:35
-msgid "Unable to generate IP address by EUI64 for IPv4 prefix"
-msgstr ""
-
-#: neutron/common/ipv6_utils.py:42
-#, python-format
-msgid ""
-"Bad prefix or mac format for generating IPv6 address by EUI-64: "
-"%(prefix)s, %(mac)s:"
-msgstr ""
-
-#: neutron/common/ipv6_utils.py:46
-#, python-format
-msgid "Bad prefix type for generate IPv6 address by EUI-64: %s"
-msgstr ""
-
-#: neutron/common/utils.py:69
-#, python-format
-msgid ""
-"Method %(func_name)s cannot be cached due to unhashable parameters: args:"
-" %(args)s, kwargs: %(kwargs)s"
-msgstr ""
-
-#: neutron/common/utils.py:92
-#, python-format
-msgid ""
-"Instance of class %(module)s.%(class)s doesn't contain attribute _cache "
-"therefore results cannot be cached for %(func_name)s."
-msgstr ""
-
-#: neutron/common/utils.py:118 neutron/openstack/common/fileutils.py:63
-#, python-format
-msgid "Reloading cached file %s"
-msgstr ""
-
-#: neutron/common/utils.py:201
-#: neutron/plugins/sriovnicagent/common/config.py:36
-#, python-format
-msgid "Invalid mapping: '%s'"
-msgstr ""
-
-#: neutron/common/utils.py:204
-#: neutron/plugins/sriovnicagent/common/config.py:39
-#, python-format
-msgid "Missing key in mapping: '%s'"
-msgstr ""
-
-#: neutron/common/utils.py:207
-#, python-format
-msgid "Missing value in mapping: '%s'"
-msgstr ""
-
-#: neutron/common/utils.py:209
-#, python-format
-msgid "Key %(key)s in mapping: '%(mapping)s' not unique"
-msgstr ""
-
-#: neutron/common/utils.py:212
-#, python-format
-msgid "Value %(value)s in mapping: '%(mapping)s' not unique"
-msgstr ""
-
-#: neutron/db/agents_db.py:37
-msgid ""
-"Seconds to regard the agent is down; should be at least twice "
-"report_interval, to be sure the agent is down for good."
-msgstr ""
-
-#: neutron/db/agents_db.py:98
-#, python-format
-msgid "%(agent_type)s agent %(agent_id)s is not active"
-msgstr ""
-
-#: neutron/db/agents_db.py:111
-#, python-format
-msgid "Configuration for agent %(agent_type)s on host %(host)s is invalid."
-msgstr ""
-
-#: neutron/db/agents_db.py:232
-msgid "Message with invalid timestamp received"
-msgstr ""
-
-#: neutron/db/agentschedulers_db.py:37
-msgid "Driver to use for scheduling network to DHCP agent"
-msgstr ""
-
-#: neutron/db/agentschedulers_db.py:39
-msgid "Allow auto scheduling networks to DHCP agent."
-msgstr ""
-
-#: neutron/db/agentschedulers_db.py:41
-msgid "Number of DHCP agents scheduled to host a network."
-msgstr ""
-
-#: neutron/db/common_db_mixin.py:117
-msgid "Cannot create resource for another tenant"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:141
-#, python-format
-msgid "Generated mac for network %(network_id)s is %(mac_address)s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:147
-#, python-format
-msgid "Generated mac %(mac_address)s exists. Remaining attempts %(max_retries)s."
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:151
-#, python-format
-msgid "Unable to generate mac address after %s attempts"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:169
-#, python-format
-msgid "Delete allocated IP %(ip_address)s (%(network_id)s/%(subnet_id)s)"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:224
-#, python-format
-msgid "All IPs from subnet %(subnet_id)s (%(cidr)s) allocated"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:229
-#, python-format
-msgid "Allocated IP - %(ip_address)s from %(first_ip)s to %(last_ip)s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:236
-msgid "No more free IP's in slice. Deleting allocation pool."
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:255
-#, python-format
-msgid "Rebuilding availability ranges for subnet %s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:398
-msgid "IP allocation requires subnet_id or ip_address"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:410
-#, python-format
-msgid "IP address %s is not a valid IP for the defined networks subnets"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:416
-#, python-format
-msgid ""
-"Failed to create port on network %(network_id)s, because fixed_ips "
-"included invalid subnet %(subnet_id)s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:436
-#, python-format
-msgid "IP address %s is not a valid IP for the defined subnet"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:445 neutron/db/db_base_plugin_v2.py:478
-#: neutron/plugins/opencontrail/contrail_plugin.py:388
-msgid "Exceeded maximim amount of fixed ips per port"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:493
-#, python-format
-msgid "Port update. Hold %s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:500
-#, python-format
-msgid "Port update. Adding %s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:574
-msgid "0 is not allowed as CIDR prefix length"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:584
-#, python-format
-msgid ""
-"Requested subnet with cidr: %(cidr)s for network: %(network_id)s overlaps"
-" with another subnet"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:589
-#, python-format
-msgid ""
-"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet "
-"%(subnet_id)s (CIDR: %(cidr)s)"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:609
-msgid "Performing IP validity checks on allocation pools"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:616
-#, python-format
-msgid "Found invalid IP address in pool: %(start)s - %(end)s:"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:623
-msgid "Specified IP addresses do not match the subnet IP version"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:627
-#, python-format
-msgid "Start IP (%(start)s) is greater than end IP (%(end)s)"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:632
-#, python-format
-msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:645
-msgid "Checking for overlaps among allocation pools and gateway ip"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:656
-#, python-format
-msgid "Found overlapping ranges: %(l_range)s and %(r_range)s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:669 neutron/db/db_base_plugin_v2.py:673
-#, python-format
-msgid "Invalid route: %s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:751
-#, python-format
-msgid ""
-"ipv6_ra_mode set to '%(ra_mode)s' with ipv6_address_mode set to "
-"'%(addr_mode)s' is not valid. If both attributes are set, they must be "
-"the same value"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:759
-msgid ""
-"ipv6_ra_mode or ipv6_address_mode cannot be set when enable_dhcp is set "
-"to False."
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:765
-msgid "Cannot disable enable_dhcp with ipv6 attributes set"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:857
-#, python-format
-msgid "An exception occurred while creating the %(resource)s:%(item)s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:954
-#, python-format
-msgid "%(name)s '%(addr)s' does not match the ip_version '%(ip_version)s'"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:978
-msgid "Gateway is not valid on subnet"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:998 neutron/db/db_base_plugin_v2.py:1012
-#: neutron/plugins/opencontrail/contrail_plugin.py:312
-msgid "new subnet"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:1005
-#, python-format
-msgid "Error parsing dns address %s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:1021
-msgid "ipv6_ra_mode is not valid when ip_version is 4"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:1025
-msgid "ipv6_address_mode is not valid when ip_version is 4"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:1395
-#, python-format
-msgid ""
-"Ignoring PortNotFound when deleting port '%s'. The port has already been "
-"deleted."
-msgstr ""
-
-#: neutron/db/dvr_mac_db.py:36
-msgid "The base mac address used for unique DVR instances by Neutron"
-msgstr ""
-
-#: neutron/db/dvr_mac_db.py:96
-#, python-format
-msgid "MAC generation error after %s attempts"
-msgstr ""
-
-#: neutron/db/dvr_mac_db.py:168
-#, python-format
-msgid "Could not retrieve gateway port for subnet %s"
-msgstr ""
-
-#: neutron/db/extraroute_db.py:36
-msgid "Maximum number of routes"
-msgstr ""
-
-#: neutron/db/extraroute_db.py:91
-msgid "the nexthop is not connected with router"
-msgstr ""
-
-#: neutron/db/extraroute_db.py:96
-msgid "the nexthop is used by router"
-msgstr ""
-
-#: neutron/db/extraroute_db.py:125
-#, python-format
-msgid "Added routes are %s"
-msgstr ""
-
-#: neutron/db/extraroute_db.py:133
-#, python-format
-msgid "Removed routes are %s"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:48
-msgid "Driver to use for scheduling router to a default L3 agent"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:51
-msgid "Allow auto scheduling of routers to L3 agent."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:53
-msgid ""
-"Automatically reschedule routers from offline L3 agents to online L3 "
-"agents."
-msgstr ""
-
-#: neutron/db/l3_db.py:230
-#, python-format
-msgid "No eligible l3 agent associated with external network %s found"
-msgstr ""
-
-#: neutron/db/l3_db.py:251
-#, python-format
-msgid "No IPs available for external network %s"
-msgstr ""
-
-#: neutron/db/l3_db.py:265
-#, python-format
-msgid "Network %s is not an external network"
-msgstr ""
-
-#: neutron/db/l3_db.py:377
-#, python-format
-msgid "Router already has a port on subnet %s"
-msgstr ""
-
-#: neutron/db/l3_db.py:391
-#, python-format
-msgid ""
-"Cidr %(subnet_cidr)s of subnet %(subnet_id)s overlaps with cidr %(cidr)s "
-"of subnet %(sub_id)s"
-msgstr ""
-
-#: neutron/db/l3_db.py:407 neutron/db/l3_db.py:534 neutron/db/l3_dvr_db.py:210
-#: neutron/plugins/bigswitch/l3_router_plugin.py:170
-#: neutron/plugins/bigswitch/l3_router_plugin.py:179
-#: neutron/plugins/opencontrail/contrail_plugin.py:499
-msgid "Either subnet_id or port_id must be specified"
-msgstr ""
-
-#: neutron/db/l3_db.py:410 neutron/plugins/opencontrail/contrail_plugin.py:509
-msgid "Cannot specify both subnet-id and port-id"
-msgstr ""
-
-#: neutron/db/l3_db.py:423
-msgid "Router port must have exactly one fixed IP"
-msgstr ""
-
-#: neutron/db/l3_db.py:437
-msgid "Subnet for router interface must have a gateway IP"
-msgstr ""
-
-#: neutron/db/l3_db.py:580 neutron/plugins/nec/nec_router.py:197
-#, python-format
-msgid "Cannot add floating IP to port on subnet %s which has no gateway_ip"
-msgstr ""
-
-#: neutron/db/l3_db.py:616
-#, python-format
-msgid ""
-"Port %(port_id)s is associated with a different tenant than Floating IP "
-"%(floatingip_id)s and therefore cannot be bound."
-msgstr ""
-
-#: neutron/db/l3_db.py:620
-#, python-format
-msgid ""
-"Cannot create floating IP and bind it to Port %s, since that port is "
-"owned by a different tenant."
-msgstr ""
-
-#: neutron/db/l3_db.py:632
-#, python-format
-msgid "Port %(id)s does not have fixed ip %(address)s"
-msgstr ""
-
-#: neutron/db/l3_db.py:639
-#, python-format
-msgid "Cannot add floating IP to port %s that hasno fixed IP addresses"
-msgstr ""
-
-#: neutron/db/l3_db.py:643
-#, python-format
-msgid ""
-"Port %s has multiple fixed IPs. Must provide a specific IP when "
-"assigning a floating IP"
-msgstr ""
-
-#: neutron/db/l3_db.py:673 neutron/plugins/vmware/plugins/base.py:1804
-msgid "fixed_ip_address cannot be specified without a port_id"
-msgstr ""
-
-#: neutron/db/l3_db.py:713
-#, python-format
-msgid "Network %s is not a valid external network"
-msgstr ""
-
-#: neutron/db/l3_db.py:846
-#, python-format
-msgid ""
-"Port %(port_id)s has owner %(port_owner)s, but no IP address, so it can "
-"be deleted"
-msgstr ""
-
-#: neutron/db/l3_db.py:960
-#, python-format
-msgid "Skipping port %s as no IP is configure on it"
-msgstr ""
-
-#: neutron/db/l3_dvr_db.py:42
-msgid ""
-"System-wide flag to determine the type of router that tenants can create."
-" Only admin can override."
-msgstr ""
-
-#: neutron/db/l3_dvr_db.py:76
-#, python-format
-msgid "Centralizing distributed router %s is not supported"
-msgstr ""
-
-#: neutron/db/l3_dvr_db.py:404
-#, python-format
-msgid "Agent Gateway port does not exist, so create one: %s"
-msgstr ""
-
-#: neutron/db/l3_dvr_db.py:419
-msgid "Unable to create the Agent Gateway Port"
-msgstr ""
-
-#: neutron/db/l3_dvr_db.py:445
-msgid "Unable to create the SNAT Interface Port"
-msgstr ""
-
-#: neutron/db/l3_dvr_db.py:469
-#, python-format
-msgid "SNAT interface port list does not exist, so create one: %s"
-msgstr ""
-
-#: neutron/db/l3_dvrscheduler_db.py:307
-msgid "No active L3 agents found for SNAT"
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:42
-msgid "Enable HA mode for virtual routers."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:45
-msgid "Maximum number of agents on which a router will be scheduled."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:49
-msgid "Minimum number of agents on which a router will be scheduled."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:53
-msgid "Subnet used for the l3 HA admin network."
-msgstr ""
-
-#: neutron/db/routedserviceinsertion_db.py:36
-#, python-format
-msgid "Resource type '%(resource_type)s' is longer than %(maxlen)d characters"
-msgstr ""
-
-#: neutron/db/securitygroups_rpc_base.py:58
-#, python-format
-msgid "%s must implement get_port_from_device."
-msgstr ""
-
-#: neutron/db/securitygroups_rpc_base.py:338
-#, python-format
-msgid "No valid gateway port on subnet %s is found for IPv6 RA"
-msgstr ""
-
-#: neutron/db/sqlalchemyutils.py:73
-#, python-format
-msgid "%s is invalid attribute for sort_key"
-msgstr ""
-
-#: neutron/db/sqlalchemyutils.py:76
-#, python-format
-msgid ""
-"The attribute '%(attr)s' is reference to other resource, can't used by "
-"sort '%(resource)s'"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:241
-#: neutron/plugins/vmware/plugins/service.py:907
-#: neutron/services/firewall/fwaas_plugin.py:218
-msgid "create_firewall() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:262
-#: neutron/plugins/vmware/plugins/service.py:941
-#: neutron/services/firewall/fwaas_plugin.py:232
-msgid "update_firewall() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:271
-#: neutron/plugins/vmware/plugins/service.py:967
-#: neutron/services/firewall/fwaas_plugin.py:247
-msgid "delete_firewall() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:280
-msgid "get_firewall() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:285
-msgid "get_firewalls() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:291
-msgid "get_firewalls_count() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:296
-msgid "create_firewall_policy() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:312
-#: neutron/plugins/vmware/plugins/service.py:1029
-#: neutron/services/firewall/fwaas_plugin.py:256
-msgid "update_firewall_policy() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:326
-msgid "delete_firewall_policy() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:338
-msgid "get_firewall_policy() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:343
-msgid "get_firewall_policies() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:349
-msgid "get_firewall_policies_count() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:354
-msgid "create_firewall_rule() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:386
-#: neutron/plugins/vmware/plugins/service.py:1003
-#: neutron/services/firewall/fwaas_plugin.py:264
-msgid "update_firewall_rule() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:418
-msgid "delete_firewall_rule() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:426
-msgid "get_firewall_rule() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:431
-msgid "get_firewall_rules() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:437
-msgid "get_firewall_rules_count() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:446
-#: neutron/plugins/vmware/plugins/service.py:1056
-#: neutron/services/firewall/fwaas_plugin.py:274
-msgid "insert_rule() called"
-msgstr ""
-
-#: neutron/db/firewall/firewall_db.py:490
-#: neutron/plugins/vmware/plugins/service.py:1085
-#: neutron/services/firewall/fwaas_plugin.py:282
-msgid "remove_rule() called"
-msgstr ""
-
-#: neutron/db/loadbalancer/loadbalancer_db.py:68
-#, python-format
-msgid "The %(key)s field can not have negative value. Current value is %(value)d."
-msgstr ""
-
-#: neutron/db/loadbalancer/loadbalancer_db.py:275
-msgid "'cookie_name' should be specified for this type of session persistence."
-msgstr ""
-
-#: neutron/db/loadbalancer/loadbalancer_db.py:279
-msgid "'cookie_name' is not allowed for this type of session persistence"
-msgstr ""
-
-#: neutron/db/metering/metering_rpc.py:46
-#, python-format
-msgid "Unable to find agent %s."
-msgstr ""
-
-#: neutron/db/migration/__init__.py:44
-#, python-format
-msgid "%s cannot be called while in offline mode"
-msgstr ""
-
-#: neutron/db/migration/cli.py:32
-msgid "Neutron plugin provider module"
-msgstr ""
-
-#: neutron/db/migration/cli.py:41
-msgid "Neutron quota driver class"
-msgstr ""
-
-#: neutron/db/migration/cli.py:49
-msgid "URL to database"
-msgstr ""
-
-#: neutron/db/migration/cli.py:52
-msgid "Database engine"
-msgstr ""
-
-#: neutron/db/migration/cli.py:75
-msgid "You must provide a revision or relative delta"
-msgstr ""
-
-#: neutron/db/migration/cli.py:105 neutron/db/migration/cli.py:118
-msgid "Timeline branches unable to generate timeline"
-msgstr ""
-
-#: neutron/db/migration/cli.py:112
-msgid "HEAD file does not match migration timeline head"
-msgstr ""
-
-#: neutron/db/migration/cli.py:158
-msgid "Available commands"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:89
-msgid "Missing version in alembic_versions table"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:91
-#, python-format
-msgid "Multiple versions in alembic_versions table: %s"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:95
-#, python-format
-msgid ""
-"Unsupported database schema %(current)s. Please migrate your database to "
-"one of following versions: %(supported)s"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:415
-#, python-format
-msgid "Unknown tunnel type: %s"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:429
-msgid "The plugin type whose database will be migrated"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:432
-msgid "The connection url for the target db"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:435
-#, python-format
-msgid "The %s tunnel type to migrate from"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:438
-#: neutron/plugins/openvswitch/common/config.py:80
-msgid "The UDP port to use for VXLAN tunnels."
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:441
-msgid "Retain the old plugin's tables"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:447
-#, python-format
-msgid ""
-"Tunnel args (tunnel-type and vxlan-udp-port) are not valid for the %s "
-"plugin"
-msgstr ""
-
-#: neutron/db/migration/migrate_to_ml2.py:454
-#, python-format
-msgid ""
-"Support for migrating %(plugin)s for release %(release)s is not yet "
-"implemented"
-msgstr ""
-
-#: neutron/db/migration/alembic_migrations/heal_script.py:228
-#, python-format
-msgid "Detected removed foreign key %(fk)r on table %(table)r"
-msgstr ""
-
-#: neutron/db/migration/alembic_migrations/heal_script.py:232
-#, python-format
-msgid "Detected added foreign key for column %(fk)r on table %(table)r"
-msgstr ""
-
-#: neutron/db/migration/alembic_migrations/heal_script.py:253
-#, python-format
-msgid "Table %(old_t)r was renamed to %(new_t)r"
-msgstr ""
-
-#: neutron/db/vpn/vpn_db.py:651
-#, python-format
-msgid "vpnservice %s in db is already deleted"
-msgstr ""
-
-#: neutron/debug/commands.py:33
-msgid "Unimplemented commands"
-msgstr ""
-
-#: neutron/debug/commands.py:45
-msgid "ID of network to probe"
-msgstr ""
-
-#: neutron/debug/commands.py:49
-msgid "Owner type of the device: network/compute"
-msgstr ""
-
-#: neutron/debug/commands.py:57
-#, python-format
-msgid "Probe created : %s "
-msgstr ""
-
-#: neutron/debug/commands.py:69
-msgid "ID of probe port to delete"
-msgstr ""
-
-#: neutron/debug/commands.py:76
-#, python-format
-msgid "Probe %s deleted"
-msgstr ""
-
-#: neutron/debug/commands.py:119
-msgid "ID of probe port to execute command"
-msgstr ""
-
-#: neutron/debug/commands.py:124
-msgid "Command to execute"
-msgstr ""
-
-#: neutron/debug/commands.py:144
-msgid "Ping timeout"
-msgstr ""
-
-#: neutron/debug/commands.py:148
-msgid "ID of network"
-msgstr ""
-
-#: neutron/debug/debug_agent.py:122
-#, python-format
-msgid "Failed to delete namespace %s"
-msgstr ""
-
-#: neutron/debug/shell.py:61
-msgid "Config file for interface driver (You may also use l3_agent.ini)"
-msgstr ""
-
-#: neutron/debug/shell.py:69
-msgid ""
-"You must provide a config file for bridge - either --config-file or "
-"env[NEUTRON_TEST_CONFIG_FILE]"
-msgstr ""
-
-#: neutron/extensions/agent.py:61
-#, python-format
-msgid "Agent %(id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/agent.py:65
-#, python-format
-msgid "Agent with agent_type=%(agent_type)s and host=%(host)s could not be found"
-msgstr ""
-
-#: neutron/extensions/agent.py:70
-#, python-format
-msgid "Multiple agents with agent_type=%(agent_type)s and host=%(host)s found"
-msgstr ""
-
-#: neutron/extensions/allowedaddresspairs.py:24
-msgid "Maximum number of allowed address pairs"
-msgstr ""
-
-#: neutron/extensions/allowedaddresspairs.py:31
-msgid "AllowedAddressPair must contain ip_address"
-msgstr ""
-
-#: neutron/extensions/allowedaddresspairs.py:35
-msgid ""
-"Port Security must be enabled in order to have allowed address pairs on a"
-" port."
-msgstr ""
-
-#: neutron/extensions/allowedaddresspairs.py:40
-#, python-format
-msgid ""
-"Request contains duplicate address pair: mac_address %(mac_address)s "
-"ip_address %(ip_address)s."
-msgstr ""
-
-#: neutron/extensions/allowedaddresspairs.py:45
-#, python-format
-msgid "The number of allowed address pair exceeds the maximum %(quota)s."
-msgstr ""
-
-#: neutron/extensions/dhcpagentscheduler.py:127
-#, python-format
-msgid "Agent %(id)s is not a valid DHCP Agent or has been disabled"
-msgstr ""
-
-#: neutron/extensions/dhcpagentscheduler.py:131
-#, python-format
-msgid ""
-"The network %(network_id)s has been already hosted by the DHCP Agent "
-"%(agent_id)s."
-msgstr ""
-
-#: neutron/extensions/dhcpagentscheduler.py:136
-#, python-format
-msgid "The network %(network_id)s is not hosted by the DHCP agent %(agent_id)s."
-msgstr ""
-
-#: neutron/extensions/dvr.py:37
-#, python-format
-msgid "Distributed Virtual Router Mac Address for host %(host)s does not exist."
-msgstr ""
-
-#: neutron/extensions/dvr.py:42
-#, python-format
-msgid "Unable to generate unique DVR mac for host %(host)s."
-msgstr ""
-
-#: neutron/extensions/external_net.py:23
-#, python-format
-msgid ""
-"External network %(net_id)s cannot be updated to be made non-external, "
-"since it has existing gateway ports"
-msgstr ""
-
-#: neutron/extensions/external_net.py:51
-msgid "Adds external network attribute to network resource."
-msgstr ""
-
-#: neutron/extensions/extra_dhcp_opt.py:25
-#, python-format
-msgid "ExtraDhcpOpt %(id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/extra_dhcp_opt.py:29
-#, python-format
-msgid "Invalid data format for extra-dhcp-opt: %(data)s"
-msgstr ""
-
-#: neutron/extensions/extraroute.py:23
-#, python-format
-msgid "Invalid format for routes: %(routes)s, %(reason)s"
-msgstr ""
-
-#: neutron/extensions/extraroute.py:27
-#, python-format
-msgid ""
-"Router interface for subnet %(subnet_id)s on router %(router_id)s cannot "
-"be deleted, as it is required by one or more routes."
-msgstr ""
-
-#: neutron/extensions/extraroute.py:33
-#, python-format
-msgid ""
-"Unable to complete operation for %(router_id)s. The number of routes "
-"exceeds the maximum %(quota)s."
-msgstr ""
-
-#: neutron/extensions/firewall.py:37
-#, python-format
-msgid "Firewall %(firewall_id)s could not be found."
-msgstr ""
-
-#: neutron/extensions/firewall.py:41
-#, python-format
-msgid "Firewall %(firewall_id)s is still active."
-msgstr ""
-
-#: neutron/extensions/firewall.py:45
-#, python-format
-msgid ""
-"Operation cannot be performed since associated Firewall %(firewall_id)s "
-"is in %(pending_state)s."
-msgstr ""
-
-#: neutron/extensions/firewall.py:50
-#, python-format
-msgid "Firewall Policy %(firewall_policy_id)s could not be found."
-msgstr ""
-
-#: neutron/extensions/firewall.py:54
-#, python-format
-msgid "Firewall Policy %(firewall_policy_id)s is being used."
-msgstr ""
-
-#: neutron/extensions/firewall.py:58
-#, python-format
-msgid "Firewall Rule %(firewall_rule_id)s could not be found."
-msgstr ""
-
-#: neutron/extensions/firewall.py:62
-#, python-format
-msgid "Firewall Rule %(firewall_rule_id)s is being used."
-msgstr ""
-
-#: neutron/extensions/firewall.py:66
-#, python-format
-msgid ""
-"Firewall Rule %(firewall_rule_id)s is not associated with Firewall "
-"Policy %(firewall_policy_id)s."
-msgstr ""
-
-#: neutron/extensions/firewall.py:71
-#, python-format
-msgid ""
-"Firewall Rule protocol %(protocol)s is not supported. Only protocol "
-"values %(values)s and their integer representation (0 to 255) are "
-"supported."
-msgstr ""
-
-#: neutron/extensions/firewall.py:77
-#, python-format
-msgid ""
-"Firewall rule action %(action)s is not supported. Only action values "
-"%(values)s are supported."
-msgstr ""
-
-#: neutron/extensions/firewall.py:82
-#, python-format
-msgid "%(param)s are not allowed when protocol is set to ICMP."
-msgstr ""
-
-#: neutron/extensions/firewall.py:87
-msgid "Source/destination port requires a protocol"
-msgstr ""
-
-#: neutron/extensions/firewall.py:91
-#, python-format
-msgid "Invalid value for port %(port)s."
-msgstr ""
-
-#: neutron/extensions/firewall.py:95
-msgid "Missing rule info argument for insert/remove rule operation."
-msgstr ""
-
-#: neutron/extensions/firewall.py:105
-#, python-format
-msgid "%(driver)s: Internal driver error."
-msgstr ""
-
-#: neutron/extensions/firewall.py:154
-#, python-format
-msgid "Port '%s' is not a valid number"
-msgstr ""
-
-#: neutron/extensions/firewall.py:158
-#, python-format
-msgid "Invalid port '%s'"
-msgstr ""
-
-#: neutron/extensions/firewall.py:172
-#, python-format
-msgid "%(msg_ip)s and %(msg_subnet)s"
-msgstr ""
-
-#: neutron/extensions/firewall.py:293
-msgid "Number of firewalls allowed per tenant. A negative value means unlimited."
-msgstr ""
-
-#: neutron/extensions/firewall.py:297
-msgid ""
-"Number of firewall policies allowed per tenant. A negative value means "
-"unlimited."
-msgstr ""
-
-#: neutron/extensions/firewall.py:301
-msgid ""
-"Number of firewall rules allowed per tenant. A negative value means "
-"unlimited."
-msgstr ""
-
-#: neutron/extensions/l3.py:29
-#, python-format
-msgid "Router %(router_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/l3.py:33
-#, python-format
-msgid "Router %(router_id)s still has ports"
-msgstr ""
-
-#: neutron/extensions/l3.py:37
-#, python-format
-msgid "Router %(router_id)s does not have an interface with id %(port_id)s"
-msgstr ""
-
-#: neutron/extensions/l3.py:42
-#, python-format
-msgid "Router %(router_id)s has no interface on subnet %(subnet_id)s"
-msgstr ""
-
-#: neutron/extensions/l3.py:47
-#, python-format
-msgid ""
-"Router interface for subnet %(subnet_id)s on router %(router_id)s cannot "
-"be deleted, as it is required by one or more floating IPs."
-msgstr ""
-
-#: neutron/extensions/l3.py:53
-#, python-format
-msgid "Floating IP %(floatingip_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/l3.py:57
-#, python-format
-msgid ""
-"External network %(external_network_id)s is not reachable from subnet "
-"%(subnet_id)s. Therefore, cannot associate Port %(port_id)s with a "
-"Floating IP."
-msgstr ""
-
-#: neutron/extensions/l3.py:63
-#, python-format
-msgid ""
-"Cannot associate floating IP %(floating_ip_address)s (%(fip_id)s) with "
-"port %(port_id)s using fixed IP %(fixed_ip)s, as that fixed IP already "
-"has a floating IP on external network %(net_id)s."
-msgstr ""
-
-#: neutron/extensions/l3.py:70
-#, python-format
-msgid ""
-"Port %(port_id)s has owner %(device_owner)s and therefore cannot be "
-"deleted directly via the port API."
-msgstr ""
-
-#: neutron/extensions/l3.py:75
-#, python-format
-msgid ""
-"Gateway cannot be updated for router %(router_id)s, since a gateway to "
-"external network %(net_id)s is required by one or more floating IPs."
-msgstr ""
-
-#: neutron/extensions/l3.py:138
-msgid "Number of routers allowed per tenant. A negative value means unlimited."
-msgstr ""
-
-#: neutron/extensions/l3.py:142
-msgid ""
-"Number of floating IPs allowed per tenant. A negative value means "
-"unlimited."
-msgstr ""
-
-#: neutron/extensions/l3_ext_ha_mode.py:33
-msgid "Currenly distributed HA routers are not supported."
-msgstr ""
-
-#: neutron/extensions/l3_ext_ha_mode.py:38
-#, python-format
-msgid ""
-"Failed to allocate a VRID in the network %(network_id)s for the router "
-"%(router_id)s after %(max_tries)s tries."
-msgstr ""
-
-#: neutron/extensions/l3_ext_ha_mode.py:43
-#, python-format
-msgid ""
-"No more Virtual Router Identifier (VRID) available when creating router "
-"%(router_id)s. The limit of number of HA Routers per tenant is 254."
-msgstr ""
-
-#: neutron/extensions/l3_ext_ha_mode.py:49
-#, python-format
-msgid ""
-"The HA Network CIDR specified in the configuration file isn't valid; "
-"%(cidr)s."
-msgstr ""
-
-#: neutron/extensions/l3_ext_ha_mode.py:54
-#, python-format
-msgid ""
-"Not enough l3 agents available to ensure HA. Minimum required "
-"%(min_agents)s, available %(num_agents)s."
-msgstr ""
-
-#: neutron/extensions/l3_ext_ha_mode.py:59
-#, python-format
-msgid ""
-"min_l3_agents_per_router config parameter is not valid. It has to be "
-"equal to or more than %s for HA."
-msgstr ""
-
-#: neutron/extensions/l3agentscheduler.py:48
-#: neutron/extensions/l3agentscheduler.py:91
-msgid "No plugin for L3 routing registered to handle router scheduling"
-msgstr ""
-
-#: neutron/extensions/l3agentscheduler.py:157
-#, python-format
-msgid "Agent %(id)s is not a L3 Agent or has been disabled"
-msgstr ""
-
-#: neutron/extensions/l3agentscheduler.py:161
-#, python-format
-msgid ""
-"The router %(router_id)s has been already hosted by the L3 Agent "
-"%(agent_id)s."
-msgstr ""
-
-#: neutron/extensions/l3agentscheduler.py:166
-#, python-format
-msgid "Failed scheduling router %(router_id)s to the L3 Agent %(agent_id)s."
-msgstr ""
-
-#: neutron/extensions/l3agentscheduler.py:171
-#, python-format
-msgid "Failed rescheduling router %(router_id)s: no eligible l3 agent found."
-msgstr ""
-
-#: neutron/extensions/l3agentscheduler.py:176
-#, python-format
-msgid "The router %(router_id)s is not hosted by L3 agent %(agent_id)s."
-msgstr ""
-
-#: neutron/extensions/l3agentscheduler.py:181
-#, python-format
-msgid ""
-"Cannot host %(router_type)s router %(router_id)s on %(agent_mode)s L3 "
-"agent %(agent_id)s."
-msgstr ""
-
-#: neutron/extensions/lbaas_agentscheduler.py:116
-#, python-format
-msgid "No eligible loadbalancer agent found for pool %(pool_id)s."
-msgstr ""
-
-#: neutron/extensions/lbaas_agentscheduler.py:121
-#, python-format
-msgid "No active loadbalancer agent found for pool %(pool_id)s."
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:33
-msgid "Delay must be greater than or equal to timeout"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:37
-#, python-format
-msgid "No eligible backend for pool %(pool_id)s"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:41
-#, python-format
-msgid "Vip %(vip_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:45
-#, python-format
-msgid "Another Vip already exists for pool %(pool_id)s"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:49
-#, python-format
-msgid "Pool %(pool_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:53
-#, python-format
-msgid "Member %(member_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:57
-#, python-format
-msgid "Health_monitor %(monitor_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:61
-#, python-format
-msgid "Monitor %(monitor_id)s is not associated with Pool %(pool_id)s"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:66
-#, python-format
-msgid "health_monitor %(monitor_id)s is already associated with pool %(pool_id)s"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:71
-#, python-format
-msgid "Invalid state %(state)s of Loadbalancer resource %(id)s"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:75
-#, python-format
-msgid "Pool %(pool_id)s is still in use"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:79
-#, python-format
-msgid "Health monitor %(monitor_id)s still has associations with pools"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:84
-#, python-format
-msgid "Statistics of Pool %(pool_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:88
-#, python-format
-msgid "Protocol %(vip_proto)s does not match pool protocol %(pool_proto)s"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:93
-#, python-format
-msgid ""
-"Member with address %(address)s and port %(port)s already present in pool"
-" %(pool)s"
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:309
-msgid "Number of vips allowed per tenant. A negative value means unlimited."
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:313
-msgid "Number of pools allowed per tenant. A negative value means unlimited."
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:317
-msgid ""
-"Number of pool members allowed per tenant. A negative value means "
-"unlimited."
-msgstr ""
-
-#: neutron/extensions/loadbalancer.py:321
-msgid ""
-"Number of health monitors allowed per tenant. A negative value means "
-"unlimited."
-msgstr ""
-
-#: neutron/extensions/metering.py:33
-#, python-format
-msgid "Metering label %(label_id)s does not exist"
-msgstr ""
-
-#: neutron/extensions/metering.py:37
-msgid "Duplicate Metering Rule in POST."
-msgstr ""
-
-#: neutron/extensions/metering.py:41
-#, python-format
-msgid "Metering label rule %(rule_id)s does not exist"
-msgstr ""
-
-#: neutron/extensions/metering.py:45
-#, python-format
-msgid ""
-"Metering label rule with remote_ip_prefix %(remote_ip_prefix)s overlaps "
-"another"
-msgstr ""
-
-#: neutron/extensions/multiprovidernet.py:27
-msgid "Segments and provider values cannot both be set."
-msgstr ""
-
-#: neutron/extensions/multiprovidernet.py:31
-msgid "Duplicate segment entry in request."
-msgstr ""
-
-#: neutron/extensions/portsecurity.py:20
-msgid ""
-"Port has security group associated. Cannot disable port security or ip "
-"address until security group is removed"
-msgstr ""
-
-#: neutron/extensions/portsecurity.py:25
-msgid ""
-"Port security must be enabled and port must have an IP address in order "
-"to use security groups."
-msgstr ""
-
-#: neutron/extensions/portsecurity.py:30
-msgid "Port does not have port security binding."
-msgstr ""
-
-#: neutron/extensions/providernet.py:54
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:272
-msgid "Plugin does not support updating provider attributes"
-msgstr ""
-
-#: neutron/extensions/quotasv2.py:67
-msgid "POST requests are not supported on this resource."
-msgstr ""
-
-#: neutron/extensions/quotasv2.py:86
-msgid "Only admin is authorized to access quotas for another tenant"
-msgstr ""
-
-#: neutron/extensions/quotasv2.py:91
-msgid "Only admin can view or configure quota"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:34
-msgid "For TCP/UDP protocols, port_range_min must be <= port_range_max"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:39
-#, python-format
-msgid "Invalid value for port %(port)s"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:43
-#, python-format
-msgid ""
-"Invalid value for ICMP %(field)s (%(attr)s) %(value)s. It must be 0 to "
-"255."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:48
-#, python-format
-msgid ""
-"ICMP code (port-range-max) %(value)s is provided but ICMP type (port-"
-"range-min) is missing."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:53
-#, python-format
-msgid "Security Group %(id)s in use."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:57
-msgid "Removing default security group not allowed."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:61
-msgid "Updating default security group not allowed."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:65
-msgid "Default security group already exists."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:69
-#, python-format
-msgid ""
-"Security group rule protocol %(protocol)s not supported. Only protocol "
-"values %(values)s and their integer representation (0 to 255) are "
-"supported."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:75
-msgid "Multiple tenant_ids in bulk security group rule create not allowed"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:80
-msgid "Only remote_ip_prefix or remote_group_id may be provided."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:85
-msgid "Must also specifiy protocol if port range is given."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:89
-msgid "Only allowed to update rules for one security profile at a time"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:94
-#, python-format
-msgid "Security group %(id)s does not exist"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:98
-#, python-format
-msgid "Security group rule %(id)s does not exist"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:102
-msgid "Duplicate Security Group Rule in POST."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:106
-#, python-format
-msgid "Security group rule already exists. Rule id is %(id)s."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:110
-#, python-format
-msgid "Conflicting value ethertype %(ethertype)s for CIDR %(cidr)s"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:158
-#, python-format
-msgid "'%s' is not an integer or uuid"
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:247
-msgid ""
-"Number of security groups allowed per tenant. A negative value means "
-"unlimited."
-msgstr ""
-
-#: neutron/extensions/securitygroup.py:251
-msgid ""
-"Number of security rules allowed per tenant. A negative value means "
-"unlimited."
-msgstr ""
-
-#: neutron/extensions/servicetype.py:52
-msgid "Neutron Service Type Management"
-msgstr ""
-
-#: neutron/extensions/servicetype.py:60
-msgid "API for retrieving service providers for Neutron advanced services"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:31
-#, python-format
-msgid "VPNService %(vpnservice_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:35
-#, python-format
-msgid "ipsec_site_connection %(ipsec_site_conn_id)s not found"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:39
-#, python-format
-msgid "ipsec_site_connection %(attr)s is equal to or less than dpd_interval"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:44
-#, python-format
-msgid "ipsec_site_connection MTU %(mtu)d is too small for ipv%(version)s"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:49
-#, python-format
-msgid "IKEPolicy %(ikepolicy_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:53
-#, python-format
-msgid "IPsecPolicy %(ipsecpolicy_id)s could not be found"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:57
-#, python-format
-msgid ""
-"IKEPolicy %(ikepolicy_id)s is in use by existing IPsecSiteConnection and "
-"can't be updated or deleted"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:62
-#, python-format
-msgid "VPNService %(vpnservice_id)s is still in use"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:66
-#, python-format
-msgid "Router %(router_id)s is used by VPNService %(vpnservice_id)s"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:70
-#, python-format
-msgid "Invalid state %(state)s of vpnaas resource %(id)s for updating"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:75
-#, python-format
-msgid ""
-"IPsecPolicy %(ipsecpolicy_id)s is in use by existing IPsecSiteConnection "
-"and can't be updated or deleted"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:80
-#, python-format
-msgid "Can not load driver :%(device_driver)s"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:84
-#, python-format
-msgid "Subnet %(subnet_id)s is not connected to Router %(router_id)s"
-msgstr ""
-
-#: neutron/extensions/vpnaas.py:89
-#, python-format
-msgid "Router %(router_id)s has no external network gateway set"
-msgstr ""
-
-#: neutron/notifiers/nova.py:165
-msgid "device_id is not set on port yet."
-msgstr ""
-
-#: neutron/notifiers/nova.py:169
-msgid "Port ID not set! Nova will not be notified of port status change."
-msgstr ""
-
-#: neutron/notifiers/nova.py:194
-#, python-format
-msgid ""
-"Ignoring state change previous_port_status: %(pre_status)s "
-"current_port_status: %(cur_status)s port_id %(id)s"
-msgstr ""
-
-#: neutron/notifiers/nova.py:220
-#, python-format
-msgid "Sending events: %s"
-msgstr ""
-
-#: neutron/notifiers/nova.py:225
-#, python-format
-msgid "Nova returned NotFound for event: %s"
-msgstr ""
-
-#: neutron/notifiers/nova.py:228
-#, python-format
-msgid "Failed to notify nova on events: %s"
-msgstr ""
-
-#: neutron/notifiers/nova.py:232 neutron/notifiers/nova.py:248
-#, python-format
-msgid "Error response returned from nova: %s"
-msgstr ""
-
-#: neutron/notifiers/nova.py:243
-#, python-format
-msgid "Nova event: %s returned with failed status"
-msgstr ""
-
-#: neutron/notifiers/nova.py:246
-#, python-format
-msgid "Nova event response: %s"
-msgstr ""
-
-#: neutron/openstack/common/eventlet_backdoor.py:140
-#, python-format
-msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
-msgstr ""
-
-#: neutron/openstack/common/gettextutils.py:320
-msgid "Message objects do not support addition."
-msgstr ""
-
-#: neutron/openstack/common/gettextutils.py:330
-msgid ""
-"Message objects do not support str() because they may contain non-ascii "
-"characters. Please use unicode() or translate() instead."
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:103
-#, python-format
-msgid "Could not release the acquired lock `%s`"
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:168
-#, python-format
-msgid "Got semaphore \"%(lock)s\""
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:177
-#, python-format
-msgid "Attempting to grab file lock \"%(lock)s\""
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:187
-#, python-format
-msgid "Created lock path: %s"
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:205
-#, python-format
-msgid "Got file lock \"%(lock)s\" at %(path)s"
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:209
-#, python-format
-msgid "Released file lock \"%(lock)s\" at %(path)s"
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:247
-#, python-format
-msgid "Got semaphore / lock \"%(function)s\""
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:251
-#, python-format
-msgid "Semaphore / lock released \"%(function)s\""
-msgstr ""
-
-#: neutron/openstack/common/log.py:327
-#, python-format
-msgid "Deprecated: %s"
-msgstr ""
-
-#: neutron/openstack/common/log.py:436
-#, python-format
-msgid "Error loading logging config %(log_config)s: %(err_msg)s"
-msgstr ""
-
-#: neutron/openstack/common/log.py:486
-#, python-format
-msgid "syslog facility must be one of: %s"
-msgstr ""
-
-#: neutron/openstack/common/log.py:729
-#, python-format
-msgid "Fatal call to deprecated config: %(msg)s"
-msgstr ""
-
-#: neutron/openstack/common/loopingcall.py:82
-#, python-format
-msgid "task run outlasted interval by %s sec"
-msgstr ""
-
-#: neutron/openstack/common/loopingcall.py:89
-msgid "in fixed duration looping call"
-msgstr ""
-
-#: neutron/openstack/common/loopingcall.py:129
-#, python-format
-msgid "Dynamic looping call sleeping for %.02f seconds"
-msgstr ""
-
-#: neutron/openstack/common/loopingcall.py:136
-msgid "in dynamic looping call"
-msgstr ""
-
-#: neutron/openstack/common/periodic_task.py:40
-#, python-format
-msgid "Unexpected argument for periodic task creation: %(arg)s."
-msgstr ""
-
-#: neutron/openstack/common/policy.py:395
-#, python-format
-msgid "Failed to understand rule %(rule)s"
-msgstr ""
-
-#: neutron/openstack/common/policy.py:405
-#, python-format
-msgid "No handler for matches of kind %s"
-msgstr ""
-
-#: neutron/openstack/common/policy.py:680
-#, python-format
-msgid "Failed to understand rule %(rule)r"
-msgstr ""
-
-#: neutron/openstack/common/processutils.py:130
-#, python-format
-msgid "Got unknown keyword args to utils.execute: %r"
-msgstr ""
-
-#: neutron/openstack/common/processutils.py:145
-#, python-format
-msgid "Running cmd (subprocess): %s"
-msgstr ""
-
-#: neutron/openstack/common/processutils.py:169
-#: neutron/openstack/common/processutils.py:241
-#, python-format
-msgid "Result was %s"
-msgstr ""
-
-#: neutron/openstack/common/processutils.py:181
-#, python-format
-msgid "%r failed. Retrying."
-msgstr ""
-
-#: neutron/openstack/common/processutils.py:220
-#, python-format
-msgid "Running cmd (SSH): %s"
-msgstr ""
-
-#: neutron/openstack/common/processutils.py:222
-msgid "Environment not supported over SSH"
-msgstr ""
-
-#: neutron/openstack/common/processutils.py:226
-msgid "process_input not supported over SSH"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:50
-#, python-format
-msgid "Unable to find cert_file : %s"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:53
-#, python-format
-msgid "Unable to find ca_file : %s"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:56
-#, python-format
-msgid "Unable to find key_file : %s"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:59
-msgid ""
-"When running server in SSL mode, you must specify both a cert_file and "
-"key_file option value in your configuration file"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:98
-#, python-format
-msgid "Invalid SSL version : %s"
-msgstr ""
-
-#: neutron/openstack/common/strutils.py:92
-#, python-format
-msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s"
-msgstr ""
-
-#: neutron/openstack/common/strutils.py:197
-#, python-format
-msgid "Invalid unit system: \"%s\""
-msgstr ""
-
-#: neutron/openstack/common/strutils.py:206
-#, python-format
-msgid "Invalid string format: %s"
-msgstr ""
-
-#: neutron/openstack/common/versionutils.py:69
-#, python-format
-msgid ""
-"%(what)s is deprecated as of %(as_of)s in favor of %(in_favor_of)s and "
-"may be removed in %(remove_in)s."
-msgstr ""
-
-#: neutron/openstack/common/versionutils.py:73
-#, python-format
-msgid ""
-"%(what)s is deprecated as of %(as_of)s and may be removed in "
-"%(remove_in)s. It will not be superseded."
-msgstr ""
-
-#: neutron/openstack/common/middleware/catch_errors.py:40
-#, python-format
-msgid "An error occurred during processing the request: %s"
-msgstr ""
-
-#: neutron/openstack/common/middleware/sizelimit.py:55
-#: neutron/openstack/common/middleware/sizelimit.py:64
-#: neutron/openstack/common/middleware/sizelimit.py:75
-msgid "Request is too large."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:32
-msgid ""
-"A comma separated list of Big Switch or Floodlight servers and port "
-"numbers. The plugin proxies the requests to the Big Switch/Floodlight "
-"server, which performs the networking configuration. Only oneserver is "
-"needed per deployment, but you may wish todeploy multiple servers to "
-"support failover."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:39
-msgid ""
-"The username and password for authenticating against the Big Switch or "
-"Floodlight controller."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:42
-msgid ""
-"If True, Use SSL when connecting to the Big Switch or Floodlight "
-"controller."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:45
-msgid ""
-"Trust and store the first certificate received for each controller "
-"address and use it to validate future connections to that address."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:49
-msgid "Disables SSL certificate validation for controllers"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:51
-msgid "Re-use HTTP/HTTPS connections to the controller."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:54
-msgid "Directory containing ca_certs and host_certs certificate directories."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:57
-msgid "Sync data on connect"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:59
-msgid ""
-"If neutron fails to create a resource because the backend controller "
-"doesn't know of a dependency, the plugin automatically triggers a full "
-"data synchronization to the controller."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:64
-msgid ""
-"Time between verifications that the backend controller database is "
-"consistent with Neutron. (0 to disable)"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:67
-msgid ""
-"Maximum number of seconds to wait for proxy request to connect and "
-"complete."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:70
-msgid ""
-"Maximum number of threads to spawn to handle large volumes of port "
-"creations."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:74
-msgid "User defined identifier for this Neutron deployment"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:76
-msgid ""
-"Flag to decide if a route to the metadata server should be injected into "
-"the VM"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:81
-msgid ""
-"The default router rules installed in new tenant routers. Repeat the "
-"config option for each rule. Format is "
-"<tenant>:<source>:<destination>:<action> Use an * to specify default for "
-"all tenants."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:86
-msgid "Maximum number of router rules"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:90
-msgid "Virtual interface type to configure on Nova compute nodes"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:97
-#, python-format
-msgid "Nova compute nodes to manually set VIF type to %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:104
-msgid "List of allowed vif_type values."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:108
-msgid ""
-"Name of integration bridge on compute nodes used for security group "
-"insertion."
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:111
-msgid "Seconds between agent checks for port changes"
-msgstr ""
-
-#: neutron/plugins/bigswitch/config.py:113
-msgid "Virtual switch type."
-msgstr ""
-
-#: neutron/plugins/bigswitch/l3_router_plugin.py:58
-msgid "L3 Router Service Plugin for Big Switch fabric"
-msgstr ""
-
-#: neutron/plugins/bigswitch/l3_router_plugin.py:212
-#, python-format
-msgid "NeutronRestProxyV2: Unable to create remote floating IP: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/l3_router_plugin.py:281
-msgid "NeutronRestProxyV2: too many external networks"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:93
-msgid "Syntax error in server config file, aborting plugin"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:127 neutron/plugins/ml2/db.py:212
-#, python-format
-msgid "get_port_and_sgs() called for port_id %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:237
-#, python-format
-msgid "Unable to update remote topology: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:322
-#, python-format
-msgid ""
-"Setting admin_state_up=False is not supported in this plugin version. "
-"Ignoring setting for resource: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:328
-#, python-format
-msgid ""
-"Operational status is internally set by the plugin. Ignoring setting "
-"status=%s."
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:353
-#, python-format
-msgid "Unrecognized vif_type in configuration [%s]. Defaulting to ovs."
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:399
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:106
-msgid "Iconsistency with backend controller triggering full synchronization."
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:416
-#, python-format
-msgid "NeutronRestProxyV2: Unable to create port: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:475
-#, python-format
-msgid "NeutronRestProxy: Starting plugin. Version=%s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:502
-msgid "NeutronRestProxyV2: initialization done"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:546
-msgid "NeutronRestProxyV2: create_network() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:589
-msgid "NeutronRestProxyV2.update_network() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:617
-msgid "NeutronRestProxyV2: delete_network() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:655
-msgid "NeutronRestProxyV2: create_port() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:747
-msgid "NeutronRestProxyV2: update_port() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:807
-msgid "NeutronRestProxyV2: delete_port() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:830
-msgid "NeutronRestProxyV2: create_subnet() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:847
-msgid "NeutronRestProxyV2: update_subnet() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:866
-msgid "NeutronRestProxyV2: delete_subnet() called"
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:890
-msgid "Adding host route: "
-msgstr ""
-
-#: neutron/plugins/bigswitch/plugin.py:891
-#, python-format
-msgid "Destination:%(dst)s nexthop:%(next)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/routerrule_db.py:75
-msgid "No rules in router"
-msgstr ""
-
-#: neutron/plugins/bigswitch/routerrule_db.py:89
-#, python-format
-msgid "Updating router rules to %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:82
-#, python-format
-msgid "Error in REST call to remote network controller: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:121
-msgid "Couldn't retrieve capabilities. Newer API calls won't be supported."
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:123
-#, python-format
-msgid "The following capabilities were received for %(server)s: %(cap)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:152
-#, python-format
-msgid "ServerProxy: server=%(server)s, port=%(port)d, ssl=%(ssl)r"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:155
-#, python-format
-msgid ""
-"ServerProxy: resource=%(resource)s, data=%(data)r, headers=%(headers)r, "
-"action=%(action)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:176
-msgid "ServerProxy: Could not establish HTTPS connection"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:184
-msgid "ServerProxy: Could not establish HTTP connection"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:220
-#, python-format
-msgid "ServerProxy: %(action)s failure, %(e)r"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:223
-#, python-format
-msgid ""
-"ServerProxy: status=%(status)d, reason=%(reason)r, ret=%(ret)s, "
-"data=%(data)r"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:244
-msgid "ServerPool: initializing"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:267
-msgid "Servers not defined. Aborting server manager."
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:274
-#, python-format
-msgid "Servers must be defined as <ip>:<port>. Configuration was %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:283
-msgid "ServerPool: initialization done"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:333
-#, python-format
-msgid "ssl_cert_directory [%s] does not exist. Create it or disable ssl."
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:350
-#, python-format
-msgid "No certificates were found to verify controller %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:392
-#, python-format
-msgid ""
-"Could not retrieve initial certificate from controller %(server)s. Error "
-"details: %(error)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:397
-#, python-format
-msgid "Storing to certificate for host %(server)s at %(path)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:444
-msgid "Server requires synchronization, but no topology function was defined."
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:461
-#, python-format
-msgid ""
-"ServerProxy: %(action)s failure for servers: %(server)r Response: "
-"%(response)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:467
-#, python-format
-msgid ""
-"ServerProxy: Error details: status=%(status)d, reason=%(reason)r, "
-"ret=%(ret)s, data=%(data)r"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:474
-#, python-format
-msgid "ServerProxy: %(action)s failure for all servers: %(server)r"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:497
-#, python-format
-msgid ""
-"NeutronRestProxyV2: Received and ignored error code %(code)s on "
-"%(action)s action to resource %(resource)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:507
-#, python-format
-msgid "Unable to create remote router: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:513
-#, python-format
-msgid "Unable to update remote router: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:518
-#, python-format
-msgid "Unable to delete remote router: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:524
-#, python-format
-msgid "Unable to add router interface: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:529
-#, python-format
-msgid "Unable to delete remote intf: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:535
-#, python-format
-msgid "Unable to create remote network: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:541
-#: neutron/plugins/bigswitch/servermanager.py:546
-#, python-format
-msgid "Unable to update remote network: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:555
-#, python-format
-msgid "No device MAC attached to port %s. Skipping notification to controller."
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:560
-#, python-format
-msgid "Unable to create remote port: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:565
-#, python-format
-msgid "Unable to delete remote port: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:575
-#, python-format
-msgid "Unable to create floating IP: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:580
-#, python-format
-msgid "Unable to update floating IP: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:585
-#, python-format
-msgid "Unable to delete floating IP: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:590
-#, python-format
-msgid "Unable to retrieve switch: %s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:595
-msgid "Backend server(s) do not support automated consitency checks."
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:599
-#, python-format
-msgid "Consistency watchdog disabled by polling interval setting of %s."
-msgstr ""
-
-#: neutron/plugins/bigswitch/servermanager.py:611
-msgid "Encountered an error checking controller health."
-msgstr ""
-
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:116
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:234
-msgid "Port update received"
-msgstr ""
-
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:120
-#, python-format
-msgid "Port %s is not present on this host."
-msgstr ""
-
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:123
-#, python-format
-msgid "Port %s found. Refreshing firewall."
-msgstr ""
-
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:151
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:267
-msgid "Agent loop has new device"
-msgstr ""
-
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:155
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:225
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:159
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:271
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:161
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:225
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1458
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:277
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:285
-#, python-format
-msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!"
-msgstr ""
-
-#: neutron/plugins/bigswitch/db/consistency_db.py:69
-#, python-format
-msgid "Consistency hash for group %(hash_id)s updated to %(hash)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/db/porttracker_db.py:39
-msgid "No host_id in port request to track port location."
-msgstr ""
-
-#: neutron/plugins/bigswitch/db/porttracker_db.py:42
-#, python-format
-msgid "Received an empty port ID for host_id '%s'"
-msgstr ""
-
-#: neutron/plugins/bigswitch/db/porttracker_db.py:45
-#, python-format
-msgid "Received an empty host_id for port '%s'"
-msgstr ""
-
-#: neutron/plugins/bigswitch/db/porttracker_db.py:47
-#, python-format
-msgid "Logging port %(port)s on host_id %(host)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/extensions/routerrule.py:28
-#, python-format
-msgid "Invalid format for router rules: %(rule)s, %(reason)s"
-msgstr ""
-
-#: neutron/plugins/bigswitch/extensions/routerrule.py:32
-#, python-format
-msgid ""
-"Unable to complete rules update for %(router_id)s. The number of rules "
-"exceeds the maximum %(quota)s."
-msgstr ""
-
-#: neutron/plugins/bigswitch/extensions/routerrule.py:49
-#, python-format
-msgid "Invalid data format for router rule: '%s'"
-msgstr ""
-
-#: neutron/plugins/bigswitch/extensions/routerrule.py:81
-#, python-format
-msgid "Duplicate nexthop in rule '%s'"
-msgstr ""
-
-#: neutron/plugins/bigswitch/extensions/routerrule.py:89
-#, python-format
-msgid "Action must be either permit or deny. '%s' was provided"
-msgstr ""
-
-#: neutron/plugins/bigswitch/extensions/routerrule.py:101
-#, python-format
-msgid "Duplicate router rules (src,dst) found '%s'"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:64
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:34
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:36
-msgid "The address of the host to SSH to"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:66
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:36
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:38
-msgid "The SSH username to use"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:68
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:38
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:40
-msgid "The SSH password to use"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:70
-msgid "Currently unused"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:74
-msgid "The network interface to use when creatinga port"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:96
-#: neutron/plugins/hyperv/rpc_callbacks.py:42
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:71
-#: neutron/plugins/mlnx/rpc_callbacks.py:37
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:80
-#, python-format
-msgid "Device %(device)s details requested from %(agent_id)s"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:110
-#: neutron/plugins/brocade/NeutronPlugin.py:137
-#: neutron/plugins/hyperv/rpc_callbacks.py:58
-#: neutron/plugins/hyperv/rpc_callbacks.py:87
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:95
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:132
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:155
-#: neutron/plugins/mlnx/rpc_callbacks.py:60
-#: neutron/plugins/mlnx/rpc_callbacks.py:90
-#: neutron/plugins/mlnx/rpc_callbacks.py:106
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:98
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:135
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:158
-#, python-format
-msgid "%s can not be found in database"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:303
-#: neutron/plugins/brocade/NeutronPlugin.py:347
-#: neutron/plugins/brocade/NeutronPlugin.py:400
-#: neutron/plugins/brocade/NeutronPlugin.py:430
-msgid "Brocade NOS driver error"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:304
-#, python-format
-msgid "Returning the allocated vlan (%d) to the pool"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:307
-#: neutron/plugins/brocade/NeutronPlugin.py:348
-#: neutron/plugins/brocade/NeutronPlugin.py:401
-#: neutron/plugins/brocade/NeutronPlugin.py:432
-msgid "Brocade plugin raised exception, check logs"
-msgstr ""
-
-#: neutron/plugins/brocade/NeutronPlugin.py:313
-#, python-format
-msgid "Allocated vlan (%d) from the pool"
-msgstr ""
-
-#: neutron/plugins/brocade/nos/nosdriver.py:69
-#, python-format
-msgid "Connect failed to switch: %s"
-msgstr ""
-
-#: neutron/plugins/brocade/nos/nosdriver.py:71
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:90
-#, python-format
-msgid "Connect success to host %(host)s:%(ssh_port)d"
-msgstr ""
-
-#: neutron/plugins/brocade/nos/nosdriver.py:96
-#: neutron/plugins/brocade/nos/nosdriver.py:110
-#: neutron/plugins/brocade/nos/nosdriver.py:123
-#: neutron/plugins/brocade/nos/nosdriver.py:136
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:331
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:342
-#, python-format
-msgid "NETCONF error: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:89
-msgid "Plugin initialization complete"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:117
-#, python-format
-msgid "'%(model)s' object has no attribute '%(name)s'"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:134
-#: neutron/plugins/cisco/db/network_db_v2.py:32
-msgid "get_all_qoss() called"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:140
-msgid "get_qos_details() called"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:145
-msgid "create_qos() called"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:151
-msgid "delete_qos() called"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:156
-msgid "rename_qos() called"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:161
-msgid "get_all_credentials() called"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:167
-msgid "get_credential_details() called"
-msgstr ""
-
-#: neutron/plugins/cisco/network_plugin.py:172
-msgid "rename_credential() called"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:108
-msgid ""
-"Interval when the process_services() loop executes in seconds. This is "
-"when the config agent lets each service helper to process its neutron "
-"resources."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:115
-msgid "Path of the routing service helper class."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:137
-#, python-format
-msgid ""
-"Error in loading routing service helper. Class specified is %(class)s. "
-"Reason:%(reason)s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:148
-msgid "Cisco cfg agent started"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:208
-msgid "No routing service helper loaded"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:237
-#, python-format
-msgid ""
-"Invalid payload format for received RPC message "
-"`hosting_devices_removed`. Error is %{error}s. Payload is %(payload)s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:281
-msgid "[Agent registration] Agent successfully registered"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:285
-#, python-format
-msgid ""
-"[Agent registration] Neutron server said that device manager was not "
-"ready. Retrying in %0.2f seconds "
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:290
-msgid ""
-"[Agent registration] Neutron server said that no device manager was "
-"found. Cannot continue. Exiting!"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:294
-#, python-format
-msgid "[Agent registration] %d unsuccessful registration attempts. Exiting!"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:333
-msgid "Failed sending agent report!"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:28
-msgid ""
-"Critical device parameter missing. Failed initializing CSR1kv routing "
-"driver."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:34
-#, python-format
-msgid ""
-"Failed connecting to CSR1kv. Reason: %(reason)s. Connection params are "
-"User:%(user)s, Host:%(host)s, Port:%(port)s, Device timeout:%(timeout)s."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:41
-#, python-format
-msgid "Error executing snippet:%(snippet)s. ErrorType:%(type)s ErrorTag:%(tag)s."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:47
-#, python-format
-msgid ""
-"Data in attribute: %(attribute)s does not correspond to expected value. "
-"Value received is %(value)s. "
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:52
-#, python-format
-msgid "Driver %(driver)s does not exist."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:56
-#, python-format
-msgid "Driver not found for resource id:%(id)s."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:60
-#, python-format
-msgid "Driver cannot be set for missing parameter:%(p)s."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_status.py:30
-msgid "Time in seconds for connecting to a hosting device"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_status.py:32
-msgid ""
-"The time in seconds until a backlogged hosting device is presumed dead. "
-"This value should be set up high enough to recover from a period of "
-"connectivity loss or high load when the device may not be responding."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_status.py:59
-#, python-format
-msgid "Cannot ping ip address: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_status.py:143
-#, python-format
-msgid ""
-"Hosting device: %(hd_id)s @ %(ip)s hasn't passed minimum boot time. "
-"Skipping it. "
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_status.py:147
-#, python-format
-msgid "Checking hosting device: %(hd_id)s @ %(ip)s for reachability."
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_status.py:154
-#, python-format
-msgid "Hosting device: %(hd_id)s @ %(ip)s is now reachable. Adding it to response"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_status.py:158
-#, python-format
-msgid "Hosting device: %(hd_id)s @ %(ip)s still not reachable "
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/driver_mgr.py:80
-#, python-format
-msgid ""
-"Error loading cfg agent driver %(driver)s for hosting device template "
-"%(t_name)s(%(t_id)s)"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:64
-#, python-format
-msgid "Missing device parameter:%s. Aborting CSR1kvRoutingDriver initialization"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:230
-#, python-format
-msgid "Unknown route command %s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:322
-#, python-format
-msgid "Interfaces:%s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:337
-#, python-format
-msgid "IP Address:%s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:339
-#, python-format
-msgid "Cannot find interface: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:374
-#, python-format
-msgid "Enabled interface %s "
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:393
-#, python-format
-msgid "VRFs:%s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:438
-#, python-format
-msgid "Mismatch in ACL configuration for %s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:467
-#, python-format
-msgid "VRF %s successfully created"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:469
-#, python-format
-msgid "Failed creating VRF %s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:477
-#, python-format
-msgid "VRF %s removed"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:479
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:483
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:496
-#, python-format
-msgid "VRF %s not present"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:681
-#, python-format
-msgid "%s successfully executed"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:229
-msgid "Failed processing routers"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:290
-msgid "RPC Error in fetching routers from plugin"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:377
-#, python-format
-msgid "Router: %(id)s is on an unreachable hosting device. "
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:386
-#, python-format
-msgid "Key Error, missing key: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:390
-#, python-format
-msgid "Driver Exception on router:%(id)s. Error is %(e)s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:401
-#, python-format
-msgid "Exception in processing routers on device:%s"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:544
-#, python-format
-msgid "Info for router %s was not found. Skipping router removal"
-msgstr ""
-
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:559
-#, python-format
-msgid ""
-"Router remove for router_id: %s was incomplete. Adding the router to "
-"removed_routers list"
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:25
-#, python-format
-msgid "Segmentation ID for network %(net_id)s is not found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:30
-msgid ""
-"Unable to complete operation. No more dynamic NICs are available in the "
-"system."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:36
-#, python-format
-msgid ""
-"NetworkVlanBinding for %(vlan_id)s and network %(network_id)s already "
-"exists."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:42
-#, python-format
-msgid "Vlan ID %(vlan_id)s not found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:47
-msgid ""
-"Unable to complete operation. VLAN ID exists outside of the configured "
-"network segment range."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:53
-msgid "No Vlan ID available."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:58
-#, python-format
-msgid "QoS level %(qos_id)s could not be found for tenant %(tenant_id)s."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:64
-#, python-format
-msgid "QoS level with name %(qos_name)s already exists for tenant %(tenant_id)s."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:70
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:23
-#, python-format
-msgid "Credential %(credential_id)s could not be found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:75
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:28
-#, python-format
-msgid "Credential %(credential_name)s could not be found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:80
-#, python-format
-msgid "Credential %(credential_name)s already exists."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:85
-#, python-format
-msgid "Provider network %s already exists"
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:90
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:39
-#, python-format
-msgid "Connection to %(host)s is not configured."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:95
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:44
-#, python-format
-msgid "Unable to connect to Nexus %(nexus_host)s. Reason: %(exc)s."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:100
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:49
-#, python-format
-msgid "Failed to configure Nexus: %(config)s. Reason: %(exc)s."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:105
-#, python-format
-msgid "Nexus Port Binding (%(filters)s) is not present."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:114
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:69
-msgid "No usable Nexus switch found to create SVI interface."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:119
-#, python-format
-msgid "PortVnic Binding %(port_id)s already exists."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:124
-#, python-format
-msgid "PortVnic Binding %(port_id)s is not present."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:129
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:74
-msgid "No subnet_id specified for router gateway."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:134
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:79
-#, python-format
-msgid "Subnet %(subnet_id)s has an interface on %(router_id)s."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:139
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:84
-msgid "Nexus hardware router gateway only uses Subnet Ids."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:143
-#, python-format
-msgid ""
-"Unable to unplug the attachment %(att_id)s from port %(port_id)s for "
-"network %(net_id)s. The attachment %(att_id)s does not exist."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:150
-#, python-format
-msgid "Policy Profile %(profile_id)s already exists."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:156
-#, python-format
-msgid "Policy Profile %(profile_id)s could not be found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:161
-#, python-format
-msgid "Network Profile %(profile_id)s already exists."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:167
-#, python-format
-msgid "Network Profile %(profile)s could not be found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:172
-#, python-format
-msgid ""
-"One or more network segments belonging to network profile %(profile)s is "
-"in use."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:178
-#, python-format
-msgid ""
-"No more segments available in network segment pool "
-"%(network_profile_name)s."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:184
-#, python-format
-msgid "VM Network %(name)s could not be found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:189
-#, python-format
-msgid "Unable to create the network. The VXLAN ID %(vxlan_id)s is in use."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:195
-#, python-format
-msgid "Vxlan ID %(vxlan_id)s not found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:200
-msgid ""
-"Unable to complete operation. VXLAN ID exists outside of the configured "
-"network segment range."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:206
-#, python-format
-msgid "Connection to VSM failed: %(reason)s."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:211
-#, python-format
-msgid "Internal VSM Error: %(reason)s."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:216
-#, python-format
-msgid "Network Binding for network %(network_id)s could not be found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:222
-#, python-format
-msgid "Port Binding for port %(port_id)s could not be found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:228
-#, python-format
-msgid "Profile-Tenant binding for profile %(profile_id)s could not be found."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_exceptions.py:234
-msgid "No service cluster found to perform multi-segment bridging."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:72
-msgid "Port not Found"
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:73
-msgid "Unable to find a port with the specified identifier."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:87
-msgid "Credential Not Found"
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:88
-msgid "Unable to find a Credential with the specified identifier."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:103
-msgid "QoS Not Found"
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:104
-msgid "Unable to find a QoS with the specified identifier."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:119
-msgid "Nova tenant Not Found"
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:120
-msgid "Unable to find a Novatenant with the specified identifier."
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:135
-msgid "Requested State Invalid"
-msgstr ""
-
-#: neutron/plugins/cisco/common/cisco_faults.py:136
-msgid "Unable to update port state with specified value."
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:22
-#: neutron/plugins/ml2/drivers/cisco/nexus/config.py:21
-msgid "VLAN Name prefix"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:24
-msgid "VLAN Name prefix for provider vlans"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:26
-msgid "Provider VLANs are automatically created as needed on the Nexus switch"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:29
-msgid ""
-"Provider VLANs are automatically trunked as needed on the ports of the "
-"Nexus switch"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:32
-msgid "Enable L3 support on the Nexus switches"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:34
-#: neutron/plugins/ml2/drivers/cisco/nexus/config.py:23
-msgid "Distribute SVI interfaces over all switches"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:38
-msgid "Model Class"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:43
-msgid "N1K Integration Bridge"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:45
-msgid "N1K Enable Tunneling"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:47
-msgid "N1K Tunnel Bridge"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:49
-msgid "N1K Local IP"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:51
-msgid "N1K Tenant Network Type"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:53
-msgid "N1K Bridge Mappings"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:55
-msgid "N1K VXLAN ID Ranges"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:57
-msgid "N1K Network VLAN Ranges"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:59
-msgid "N1K default network profile"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:61
-msgid "N1K default policy profile"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:63
-msgid "N1K policy profile for network node"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:65
-msgid "N1K Policy profile polling duration in seconds"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:67
-msgid "Restrict the visibility of policy profiles to the tenants"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:70
-msgid "Number of threads to use to make HTTP requests"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:72
-msgid "N1K http timeout duration in seconds"
-msgstr ""
-
-#: neutron/plugins/cisco/common/config.py:123
-#: neutron/plugins/ml2/drivers/cisco/nexus/config.py:58
-msgid "Some config files were not parsed properly"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:330
-#, python-format
-msgid "seg_min %(seg_min)s, seg_max %(seg_max)s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:561
-#, python-format
-msgid "Reserving specific vlan %(vlan)s on physical network %(network)s from pool"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:586
-#, python-format
-msgid "vlan_id %(vlan)s on physical network %(network)s not found"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:600
-#, python-format
-msgid "Unreasonable vxlan ID range %(vxlan_min)s - %(vxlan_max)s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:642
-#, python-format
-msgid "Reserving specific vxlan %s from pool"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:663
-#, python-format
-msgid "vxlan_id %s not found"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:772
-msgid "create_network_profile()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:794
-msgid "delete_network_profile()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:808
-msgid "update_network_profile()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:817
-msgid "get_network_profile()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:842
-msgid "create_policy_profile()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:853
-msgid "delete_policy_profile()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:862
-msgid "update_policy_profile()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:871
-msgid "get_policy_profile()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:890
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:944
-msgid "Invalid profile type"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:908
-msgid "_profile_binding_exists()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:917
-msgid "get_profile_binding()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:927
-msgid "delete_profile_binding()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:934
-#, python-format
-msgid ""
-"Profile-Tenant binding missing for profile ID %(profile_id)s and tenant "
-"ID %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:965
-msgid "_get_profile_bindings()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1121
-msgid "segment_range not required for TRUNK"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1127
-msgid "multicast_ip_range not required"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1254
-msgid "Invalid segment range. example range: 500-550"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1267
-msgid "Invalid multicast ip address range. example range: 224.1.1.1-224.1.1.10"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1274
-#, python-format
-msgid "%s is not a valid multicast ip address"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1278
-#, python-format
-msgid "%s is reserved multicast ip address"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1282
-#, python-format
-msgid "%s is not a valid ip address"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1286
-#, python-format
-msgid ""
-"Invalid multicast IP range '%(min_ip)s-%(max_ip)s': Range should be from "
-"low address to high address"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1299
-msgid "Arguments segment_type missing for network profile"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1308
-msgid "segment_type should either be vlan, overlay, multi-segment or trunk"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1314
-msgid "Argument physical_network missing for network profile"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1320
-msgid "segment_range not required for trunk"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1326
-msgid "Argument sub_type missing for network profile"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1333
-msgid "Argument segment_range missing for network profile"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1344
-msgid "Argument multicast_ip_range missing for VXLAN multicast network profile"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1372
-#, python-format
-msgid "Segment range is invalid, select from %(min)s-%(nmin)s, %(nmax)s-%(max)s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1390
-#, python-format
-msgid "segment range is invalid. Valid range is : %(min)s-%(max)s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1404
-#, python-format
-msgid "NetworkProfile name %s already exists"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1421
-msgid "Segment range overlaps with another profile"
-msgstr ""
-
-#: neutron/plugins/cisco/db/network_db_v2.py:40
-msgid "get_qos() called"
-msgstr ""
-
-#: neutron/plugins/cisco/db/network_db_v2.py:53
-msgid "add_qos() called"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:44
-msgid "Name of the L3 admin tenant."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:46
-msgid ""
-"Name of management network for device configuration. Default value is "
-"osn_mgmt_nw"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:49
-msgid ""
-"Default security group applied on management port. Default value is "
-"mgmt_sec_grp."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:52
-msgid "Seconds of no status update until a cfg agent is considered down."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:55
-msgid "Ensure that Nova is running before attempting to create any VM."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:61
-msgid "Name of Glance image for CSR1kv."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:63
-msgid "UUID of Nova flavor for CSR1kv."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:67
-msgid "Plugging driver for CSR1kv."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:71
-msgid "Hosting device driver for CSR1kv."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:75
-msgid "Config agent driver for CSR1kv."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:77
-msgid "Booting time in seconds before a CSR1kv becomes operational."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:80
-msgid "Username to use for CSR1kv configurations."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:82
-msgid "Password to use for CSR1kv configurations."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:124
-#, python-format
-msgid "No tenant with a name or ID of %s exists."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:127
-#, python-format
-msgid "Multiple tenants matches found for %s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:146
-msgid "The virtual management network has no subnet. Please assign one."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:150
-#, python-format
-msgid "The virtual management network has %d subnets. The first one will be used."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:156
-msgid ""
-"The virtual management network does not have unique name. Please ensure "
-"that it is."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:160
-msgid "There is no virtual management network. Please create one."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:182
-msgid ""
-"The security group for the virtual management network does not have "
-"unique name. Please ensure that it is."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:187
-msgid ""
-"There is no security group for the virtual management network. Please "
-"create one."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:201
-msgid "Error loading hosting device driver"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:214
-msgid "Error loading plugging driver"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:330
-#, python-format
-msgid "Cisco cfg agent %s is not alive"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:367
-msgid ""
-"Not all Nova services are up and running. Skipping this CSR1kv vm create "
-"request."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:404
-msgid "Created a CSR1kv hosting device VM"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:422
-#, python-format
-msgid "Failed to delete hosting device %s service VM. Will un-register it anyway."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:463
-msgid "There are no active Cisco cfg agents"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:45
-msgid ""
-"Time in seconds between renewed scheduling attempts of non-scheduled "
-"routers."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:53
-msgid "Router could not be created due to internal error."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:57
-msgid "Internal error during router processing."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:61
-#, python-format
-msgid "Could not get binding information for router %(router_id)s."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:316
-#, python-format
-msgid "Attempting to schedule router %s."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:328
-#, python-format
-msgid "Successfully scheduled router %(r_id)s to hosting device %(d_id)s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:335
-#, python-format
-msgid "Un-schedule router %s."
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:348
-#, python-format
-msgid "Backlogging router %s for renewed scheduling attempt later"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:355
-#, python-format
-msgid "Router %s removed from backlog"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:365
-msgid "Processing router (scheduling) backlog"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:385
-msgid "Synchronizing router (scheduling) backlog"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:408
-#, python-format
-msgid "DB inconsistency: No type and hosting info associated with router %s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:413
-#, python-format
-msgid "DB inconsistency: Multiple type and hosting info associated with router %s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:436
-#, python-format
-msgid "DB inconsistency: No hosting info associated with router %s"
-msgstr ""
-
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:513
-#, python-format
-msgid "Failed to allocate hosting port for port %s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/service_vm_lib.py:34
-msgid "Path to templates for hosting devices."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/service_vm_lib.py:37
-msgid "Path to config drive files for service VM instances."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/service_vm_lib.py:71
-#, python-format
-msgid "Failure determining running Nova services: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/service_vm_lib.py:88
-#, python-format
-msgid "Failed to get status of service VM instance %(id)s, due to %(err)s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/service_vm_lib.py:104
-#, python-format
-msgid "Failure finding needed Nova resource: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/service_vm_lib.py:126
-#, python-format
-msgid "Failed to create service VM instance: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/service_vm_lib.py:142
-#, python-format
-msgid "Failed to delete service VM instance %(id)s, due to %(err)s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:34
-msgid "CSR1kv configdrive template file."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:68
-#, python-format
-msgid "Failed to create config file: %s. Trying toclean up."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:42
-msgid "Name of N1kv port profile for management ports."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:44
-msgid ""
-"Name of N1kv port profile for T1 ports (i.e., ports carrying traffic from"
-" VXLAN segmented networks)."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:47
-msgid ""
-"Name of N1kv port profile for T2 ports (i.e., ports carrying traffic from"
-" VLAN segmented networks)."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:50
-msgid ""
-"Name of N1kv network profile for T1 networks (i.e., trunk networks for "
-"VXLAN segmented traffic)."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:53
-msgid ""
-"Name of N1kv network profile for T2 networks (i.e., trunk networks for "
-"VLAN segmented traffic)."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:109
-#, python-format
-msgid ""
-"The %(resource)s %(name)s does not have unique name. Please refer to "
-"admin guide and create one."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:114
-#, python-format
-msgid ""
-"There is no %(resource)s %(name)s. Please refer to admin guide and create"
-" one."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:214
-#, python-format
-msgid "Error %s when creating service VM resources. Cleaning up."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:285
-#, python-format
-msgid "Aborting resource deletion after %d unsuccessful attempts"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:291
-#, python-format
-msgid "Resource deletion attempt %d starting"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:310
-msgid "Resource deletion succeeded"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:321
-#, python-format
-msgid "Failed to delete %(resource_name) %(net_id)s for service vm due to %(err)s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:413
-#, python-format
-msgid "Updating trunk: %(action)s VLAN %(tag)d for network_id %(id)s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:453
-#, python-format
-msgid "Hosting port DB inconsistency for hosting device %s"
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:460
-#, python-format
-msgid ""
-"Attempt %(attempt)d to find trunk ports for hosting device %(hd_id)s "
-"failed. Trying again in %(time)d seconds."
-msgstr ""
-
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:506
-#, python-format
-msgid "Port trunk pair DB inconsistency for port %s"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:79
-#, python-format
-msgid "%(module)s.%(name)s init done"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:120
-#, python-format
-msgid "No %s Plugin loaded"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:121
-#, python-format
-msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:145
-msgid "create_network() called"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:158
-#, python-format
-msgid "Provider network added to DB: %(network_id)s, %(vlan_id)s"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:169
-msgid "update_network() called"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:193
-#, python-format
-msgid "Provider network removed from DB: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:235
-msgid "create_port() called"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:261
-msgid "update_port() called"
-msgstr ""
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:273
-msgid "delete_port() called"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:226
-msgid "Logical network"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:251
-msgid "network_segment_pool"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:298
-msgid "Invalid input for CIDR"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:440
-#, python-format
-msgid "req: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:450
-#, python-format
-msgid "status_code %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:458
-#, python-format
-msgid "VSM: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:129
-msgid "_setup_vsm"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:148
-msgid "_populate_policy_profiles"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:175
-msgid "No policy profile populated from VSM"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:212
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:342
-#: neutron/plugins/mlnx/mlnx_plugin.py:226 neutron/plugins/nuage/plugin.py:413
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:414
-msgid "provider:network_type required"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:216
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:230
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:352
-#: neutron/plugins/mlnx/mlnx_plugin.py:256 neutron/plugins/nuage/plugin.py:423
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:424
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:443
-msgid "provider:segmentation_id required"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:219
-msgid "provider:segmentation_id out of range (1 through 4094)"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:224
-msgid "provider:physical_network specified for Overlay network"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:233
-msgid "provider:segmentation_id out of range (5000+)"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:237
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:374
-#: neutron/plugins/mlnx/mlnx_plugin.py:242
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:459
-#, python-format
-msgid "provider:network_type %s not supported"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:248
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:380
-#: neutron/plugins/mlnx/mlnx_plugin.py:282
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:465
-#, python-format
-msgid "Unknown provider:physical_network %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:252
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:386
-#: neutron/plugins/mlnx/mlnx_plugin.py:288 neutron/plugins/nuage/plugin.py:420
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:471
-msgid "provider:physical_network required"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:430
-#, python-format
-msgid "_populate_member_segments %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:469
-msgid "Invalid pairing supplied"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:474
-#, python-format
-msgid "Invalid UUID supplied in %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:475
-msgid "Invalid UUID supplied"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:504
-#, python-format
-msgid "Cannot add a trunk segment '%s' as a member of another trunk segment"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:509
-#, python-format
-msgid "Cannot add vlan segment '%s' as a member of a vxlan trunk segment"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:515
-#, python-format
-msgid "Network UUID '%s' belongs to a different physical network"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:520
-#, python-format
-msgid "Cannot add vxlan segment '%s' as a member of a vlan trunk segment"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:525
-#, python-format
-msgid "Vlan tag '%s' is out of range"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:528
-#, python-format
-msgid "Vlan tag '%s' is not an integer value"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:533
-#, python-format
-msgid "%s is not a valid uuid"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:580
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:583
-msgid "n1kv:profile_id does not exist"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:595
-msgid "_send_create_logical_network"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:618
-#, python-format
-msgid "_send_create_network_profile_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:628
-#, python-format
-msgid "_send_update_network_profile_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:638
-#, python-format
-msgid "_send_delete_network_profile_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:653
-#, python-format
-msgid "_send_create_network_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:685
-#, python-format
-msgid "_send_update_network_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:707
-#, python-format
-msgid "add_segments=%s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:708
-#, python-format
-msgid "del_segments=%s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:732
-#, python-format
-msgid "_send_delete_network_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:772
-#, python-format
-msgid "_send_create_subnet_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:782
-#, python-format
-msgid "_send_update_subnet_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:793
-#, python-format
-msgid "_send_delete_subnet_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:819
-#, python-format
-msgid "_send_create_port_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:836
-#, python-format
-msgid "_send_update_port_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:852
-#, python-format
-msgid "_send_delete_port_request: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:883
-#, python-format
-msgid "Create network: profile_id=%s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:891
-#, python-format
-msgid ""
-"Physical_network %(phy_net)s, seg_type %(net_type)s, seg_id %(seg_id)s, "
-"multicast_ip %(multicast_ip)s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:903
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:913
-#, python-format
-msgid "Seg list %s "
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:954
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:255
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:198
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:226
-#: neutron/plugins/mlnx/mlnx_plugin.py:369
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:519
-#, python-format
-msgid "Created network: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1012
-#, python-format
-msgid "Updated network: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1026
-#, python-format
-msgid "Cannot delete network '%s', delete the associated subnet first"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1030
-#, python-format
-msgid "Cannot delete network '%s' that is member of a trunk segment"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1034
-#, python-format
-msgid "Cannot delete network '%s' that is a member of a multi-segment network"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1062
-#, python-format
-msgid "Get network: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1084
-msgid "Get networks"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1135
-#, python-format
-msgid "Create port: profile_id=%s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1182
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:305
-#, python-format
-msgid "Created port: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1193
-#, python-format
-msgid "Update port: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1256
-#, python-format
-msgid "Get port: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1276
-msgid "Get ports"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1292
-msgid "Create subnet"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1302
-#, python-format
-msgid "Created subnet: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1317
-msgid "Update subnet"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1332
-#, python-format
-msgid "Delete subnet: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1347
-#, python-format
-msgid "Get subnet: %s"
-msgstr ""
-
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1367
-msgid "Get subnets"
-msgstr ""
-
-#: neutron/plugins/common/utils.py:30
-#, python-format
-msgid "%s is not a valid VLAN tag"
-msgstr ""
-
-#: neutron/plugins/common/utils.py:34
-msgid "End of VLAN range is less than start of VLAN range"
-msgstr ""
-
-#: neutron/plugins/embrane/base_plugin.py:107
-#: neutron/plugins/embrane/agent/dispatcher.py:132
-#: neutron/services/loadbalancer/drivers/embrane/poller.py:56
-#: neutron/services/loadbalancer/drivers/embrane/agent/dispatcher.py:108
-msgid "Unhandled exception occurred"
-msgstr ""
-
-#: neutron/plugins/embrane/base_plugin.py:172
-#: neutron/plugins/embrane/base_plugin.py:191
-#, python-format
-msgid "The following routers have not physical match: %s"
-msgstr ""
-
-#: neutron/plugins/embrane/base_plugin.py:177
-#, python-format
-msgid "Requested router: %s"
-msgstr ""
-
-#: neutron/plugins/embrane/base_plugin.py:229
-#, python-format
-msgid "Deleting router=%s"
-msgstr ""
-
-#: neutron/plugins/embrane/agent/operations/router_operations.py:97
-#, python-format
-msgid "The router %s had no physical representation,likely already deleted"
-msgstr ""
-
-#: neutron/plugins/embrane/agent/operations/router_operations.py:126
-#, python-format
-msgid "Interface %s not found in the heleos back-end,likely already deleted"
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:23
-#: neutron/services/loadbalancer/drivers/embrane/config.py:25
-msgid "ESM management root address"
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:25
-#: neutron/services/loadbalancer/drivers/embrane/config.py:27
-msgid "ESM admin username."
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:28
-#: neutron/services/loadbalancer/drivers/embrane/config.py:30
-msgid "ESM admin password."
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:30
-msgid "Router image id (Embrane FW/VPN)"
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:32
-msgid "In band Security Zone id"
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:34
-msgid "Out of band Security Zone id"
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:36
-msgid "Management Security Zone id"
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:38
-msgid "Dummy user traffic Security Zone id"
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:40
-#: neutron/services/loadbalancer/drivers/embrane/config.py:42
-msgid "Shared resource pool id"
-msgstr ""
-
-#: neutron/plugins/embrane/common/config.py:42
-#: neutron/services/loadbalancer/drivers/embrane/config.py:49
-msgid "Define if the requests have run asynchronously or not"
-msgstr ""
-
-#: neutron/plugins/embrane/common/constants.py:49
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:50
-#, python-format
-msgid "Dva is pending for the following reason: %s"
-msgstr ""
-
-#: neutron/plugins/embrane/common/constants.py:50
-msgid ""
-"Dva can't be found to execute the operation, probably was cancelled "
-"through the heleos UI"
-msgstr ""
-
-#: neutron/plugins/embrane/common/constants.py:52
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:53
-#, python-format
-msgid "Dva seems to be broken for reason %s"
-msgstr ""
-
-#: neutron/plugins/embrane/common/constants.py:53
-#, python-format
-msgid "Dva interface seems to be broken for reason %s"
-msgstr ""
-
-#: neutron/plugins/embrane/common/constants.py:55
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:54
-#, python-format
-msgid "Dva creation failed reason %s"
-msgstr ""
-
-#: neutron/plugins/embrane/common/constants.py:56
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:55
-#, python-format
-msgid "Dva creation is in pending state for reason %s"
-msgstr ""
-
-#: neutron/plugins/embrane/common/constants.py:58
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:57
-#, python-format
-msgid "Dva configuration failed for reason %s"
-msgstr ""
-
-#: neutron/plugins/embrane/common/constants.py:59
-#, python-format
-msgid ""
-"Failed to delete the backend router for reason %s. Please remove it "
-"manually through the heleos UI"
-msgstr ""
-
-#: neutron/plugins/embrane/common/exceptions.py:22
-#, python-format
-msgid "An unexpected error occurred:%(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/embrane/common/exceptions.py:26
-#, python-format
-msgid "%(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/embrane/common/utils.py:45
-msgid "No ip allocation set"
-msgstr ""
-
-#: neutron/plugins/embrane/l2base/support_exceptions.py:22
-#, python-format
-msgid "Cannot retrieve utif info for the following reason: %(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/embrane/l2base/ml2/ml2_support.py:46
-#, python-format
-msgid ""
-"Network type %s not supported. Please be sure that tenant_network_type is"
-" vlan"
-msgstr ""
-
-#: neutron/plugins/hyperv/db.py:38
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:113
-#: neutron/plugins/openvswitch/ovs_db_v2.py:131
-#, python-format
-msgid ""
-"Reserving vlan %(vlan_id)s on physical network %(physical_network)s from "
-"pool"
-msgstr ""
-
-#: neutron/plugins/hyperv/db.py:53
-#, python-format
-msgid "Reserving flat physical network %(physical_network)s from pool"
-msgstr ""
-
-#: neutron/plugins/hyperv/db.py:76
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:136
-#: neutron/plugins/openvswitch/ovs_db_v2.py:155
-#, python-format
-msgid ""
-"Reserving specific vlan %(vlan_id)s on physical network "
-"%(physical_network)s from pool"
-msgstr ""
-
-#: neutron/plugins/hyperv/db.py:133
-#, python-format
-msgid "Releasing vlan %(vlan_id)s on physical network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/db.py:138
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:177
-#: neutron/plugins/openvswitch/ovs_db_v2.py:196
-#, python-format
-msgid "vlan_id %(vlan_id)s on physical network %(physical_network)s not found"
-msgstr ""
-
-#: neutron/plugins/hyperv/db.py:163 neutron/plugins/hyperv/db.py:176
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:64
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:83
-#: neutron/plugins/ml2/drivers/type_vlan.py:130
-#: neutron/plugins/ml2/drivers/type_vlan.py:151
-#: neutron/plugins/openvswitch/ovs_db_v2.py:87
-#: neutron/plugins/openvswitch/ovs_db_v2.py:105
-#, python-format
-msgid ""
-"Removing vlan %(vlan_id)s on physical network %(physical_network)s from "
-"pool"
-msgstr ""
-
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:46
-msgid "Network type for tenant networks (local, flat, vlan or none)"
-msgstr ""
-
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:50
-#: neutron/plugins/linuxbridge/common/config.py:33
-#: neutron/plugins/mlnx/common/config.py:30
-msgid "List of <physical_network>:<vlan_min>:<vlan_max> or <physical_network>"
-msgstr ""
-
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:78
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:100
-#, python-format
-msgid "segmentation_id specified for %s network"
-msgstr ""
-
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:85
-#, python-format
-msgid "physical_network specified for %s network"
-msgstr ""
-
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:127
-msgid "physical_network not provided"
-msgstr ""
-
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:179
-#, python-format
-msgid "Invalid tenant_network_type: %s. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:204
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:303
-#: neutron/plugins/ml2/drivers/type_vlan.py:96
-#: neutron/plugins/mlnx/mlnx_plugin.py:187
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:366
-#, python-format
-msgid "Network VLAN ranges: %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:229
-#, python-format
-msgid "Network type %s not supported"
-msgstr ""
-
-#: neutron/plugins/hyperv/rpc_callbacks.py:76
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:114
-#: neutron/plugins/mlnx/rpc_callbacks.py:77
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:117
-#, python-format
-msgid "Device %(device)s no longer exists on %(agent_id)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:50
-msgid ""
-"List of <physical_network>:<vswitch> where the physical networks can be "
-"expressed with wildcards, e.g.: .\"*:external\""
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:56
-msgid "Private vswitch name used for local networks"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:58
-#: neutron/plugins/linuxbridge/common/config.py:64
-#: neutron/plugins/mlnx/common/config.py:67
-#: neutron/plugins/nec/common/config.py:29
-#: neutron/plugins/oneconvergence/lib/config.py:47
-#: neutron/plugins/openvswitch/common/config.py:66
-#: neutron/plugins/ryu/common/config.py:43
-#: neutron/plugins/sriovnicagent/common/config.py:58
-msgid ""
-"The number of seconds the agent will wait between polling for local "
-"device changes."
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:62
-msgid ""
-"Enables metrics collections for switch ports by using Hyper-V's metric "
-"APIs. Collected data can by retrieved by other apps and services, e.g.: "
-"Ceilometer. Requires Hyper-V / Windows Server 2012 and above"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:69
-msgid ""
-"Specifies the maximum number of retries to enable Hyper-V's port metrics "
-"collection. The agent will try to enable the feature once every "
-"polling_interval period for at most metrics_max_retries or until it "
-"succeedes."
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:151
-#, python-format
-msgid "Failed reporting state! %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:186
-#, python-format
-msgid "Invalid physical network mapping: %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:207
-#, python-format
-msgid "network_delete received. Deleting network %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:213
-#, python-format
-msgid "Network %s not defined on agent."
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:216
-msgid "port_delete received"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:221
-msgid "port_update received"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:243
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:130
-#, python-format
-msgid "Provisioning network %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:256
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for network "
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:268
-#, python-format
-msgid "Reclaiming local network %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:276
-#, python-format
-msgid "Binding port %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:289
-#, python-format
-msgid "Binding VLAN ID %(segmentation_id)s to switch port %(port_id)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:302
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:115
-#, python-format
-msgid "Unsupported network type %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:311
-#, python-format
-msgid "Network %s is not avalailable on this agent"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:315
-#, python-format
-msgid "Unbinding port %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:328
-#, python-format
-msgid "Port metrics enabled for port: %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:332
-#, python-format
-msgid "Port metrics raw enabling for port: %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:357
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:294
-#, python-format
-msgid "No port %s defined on agent."
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:374
-#, python-format
-msgid "Adding port %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:377
-#, python-format
-msgid "Port %(device)s updated. Details: %(device_details)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:403
-#, python-format
-msgid "Removing port %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:411
-#, python-format
-msgid "Removing port failed for device %(device)s: %(e)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:436
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:995
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1350
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:254
-msgid "Agent out of sync with plugin!"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:444
-msgid "Agent loop has new devices!"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:451
-#, python-format
-msgid "Error in agent event loop: %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:459
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:393
-#, python-format
-msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:472
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:268
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1036
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1542
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:350
-msgid "Agent initialized successfully, now running... "
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:62
-#, python-format
-msgid "Hyper-V Exception: %(hyperv_exeption)s while adding rule: %(rule)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:72
-#, python-format
-msgid "Hyper-V Exception: %(hyperv_exeption)s while removing rule: %(rule)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:92
-msgid "Aplying port filter."
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:95
-msgid "Updating port rules."
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:108
-#, python-format
-msgid "Creating %(new)s new rules, removing %(old)s old rules."
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:119
-msgid "Removing port filter"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:36
-#, python-format
-msgid "HyperVException: %(msg)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:81
-#, python-format
-msgid "Vnic not found: %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:116
-#, python-format
-msgid "Job failed with error %d"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:135
-#, python-format
-msgid ""
-"WMI job failed with status %(job_state)d. Error details: %(err_sum_desc)s"
-" - %(err_desc)s - Error code: %(err_code)d"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:144
-#, python-format
-msgid "WMI job failed with status %(job_state)d. Error details: %(error)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:148
-#, python-format
-msgid "WMI job failed with status %d. No error description available"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:153
-#, python-format
-msgid "WMI job succeeded: %(desc)s, Elapsed=%(elap)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:167
-#, python-format
-msgid "Failed creating port for %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:190
-#, python-format
-msgid ""
-"Failed to disconnect port %(switch_port_name)s from switch "
-"%(vswitch_name)s with error %(ret_val)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:201
-#, python-format
-msgid ""
-"Failed to delete port %(switch_port_name)s from switch %(vswitch_name)s "
-"with error %(ret_val)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:208
-#: neutron/plugins/hyperv/agent/utilsv2.py:135
-#, python-format
-msgid "VSwitch not found: %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utils.py:249
-#: neutron/plugins/hyperv/agent/utils.py:253
-msgid "Metrics collection is not supported on this version of Hyper-V"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utilsfactory.py:32
-msgid "Force V1 WMI utility classes"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utilsfactory.py:61
-msgid ""
-"V1 virtualization namespace no longer supported on Windows Server / "
-"Hyper-V Server 2012 R2 or above."
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utilsfactory.py:68
-#, python-format
-msgid "Loading class: %(module_name)s.%(class_name)s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utilsv2.py:158
-#: neutron/plugins/hyperv/agent/utilsv2.py:318
-#, python-format
-msgid "Port Allocation not found: %s"
-msgstr ""
-
-#: neutron/plugins/hyperv/agent/utilsv2.py:268
-#, python-format
-msgid "Cannot get VM summary data for: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:77
-#, python-format
-msgid "The IP addr of available SDN-VE controllers: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:80
-#, python-format
-msgid "The SDN-VE controller IP address: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:97
-#, python-format
-msgid "unable to serialize object type: '%s'"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:164
-#, python-format
-msgid ""
-"Sending request to SDN-VE. url: %(myurl)s method: %(method)s body: "
-"%(body)s header: %(header)s "
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:177
-#, python-format
-msgid "Error: Could not reach server: %(url)s Exception: %(excp)s."
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:184
-#, python-format
-msgid "Error message: %(reply)s -- Status: %(status)s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:187
-#, python-format
-msgid "Received response status: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:194
-#, python-format
-msgid "Deserialized body: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:236
-msgid "Bad resource for forming a list request"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:246
-msgid "Bad resource for forming a show request"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:256
-msgid "Bad resource for forming a create request"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:268
-msgid "Bad resource for forming a update request"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:279
-msgid "Bad resource for forming a delete request"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:307
-#, python-format
-msgid "Non matching tenant and network types: %(ttype)s %(ntype)s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api.py:369
-#, python-format
-msgid "Did not find tenant: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:32
-msgid "Fake SDNVE controller initialized"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:35
-msgid "Fake SDNVE controller: list"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:39
-msgid "Fake SDNVE controller: show"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:43
-msgid "Fake SDNVE controller: create"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:47
-msgid "Fake SDNVE controller: update"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:51
-msgid "Fake SDNVE controller: delete"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:55
-msgid "Fake SDNVE controller: get tenant by id"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:59
-msgid "Fake SDNVE controller: check and create tenant"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_api_fake.py:63
-msgid "Fake SDNVE controller: get controller"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:152
-msgid "Set a new controller if needed."
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:158
-#, python-format
-msgid "Set the controller to a new controller: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:166
-#, python-format
-msgid "Original SDN-VE HTTP request: %(orig)s; New request: %(new)s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:176
-#, python-format
-msgid "Create network in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:185
-msgid "Create net failed: no SDN-VE tenant."
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:196
-#, python-format
-msgid "Create net failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:203
-#, python-format
-msgid "Update network in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:223
-#, python-format
-msgid "Update net failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:229
-#, python-format
-msgid "Delete network in progress: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:239
-#, python-format
-msgid "Delete net failed after deleting the network in DB: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:244
-#, python-format
-msgid "Get network in progress: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:250
-msgid "Get networks in progress"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:260
-#, python-format
-msgid "Create port in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:276
-msgid "Create port does not have tenant id info"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:282
-#, python-format
-msgid "Create port does not have tenant id info; obtained is: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:303
-#, python-format
-msgid "Create port failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:310
-#, python-format
-msgid "Update port in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:337
-#, python-format
-msgid "Update port failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:343
-#, python-format
-msgid "Delete port in progress: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:356
-#, python-format
-msgid "Delete port operation failed in SDN-VE after deleting the port from DB: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:365
-#, python-format
-msgid "Create subnet in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:377
-#, python-format
-msgid "Create subnet failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:379
-#, python-format
-msgid "Subnet created: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:385
-#, python-format
-msgid "Update subnet in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:410
-#, python-format
-msgid "Update subnet failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:416
-#, python-format
-msgid "Delete subnet in progress: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:421
-#, python-format
-msgid ""
-"Delete subnet operation failed in SDN-VE after deleting the subnet from "
-"DB: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:430
-#, python-format
-msgid "Create router in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:433
-#, python-format
-msgid "Ignoring admin_state_up=False for router=%r. Overriding with True"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:443
-msgid "Create router failed: no SDN-VE tenant."
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:451
-#, python-format
-msgid "Create router failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:453
-#, python-format
-msgid "Router created: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:458
-#, python-format
-msgid "Update router in progress: id=%(id)s router=%(router)r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:465
-msgid "admin_state_up=False routers are not supported."
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:489
-#, python-format
-msgid "Update router failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:495
-#, python-format
-msgid "Delete router in progress: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:502
-#, python-format
-msgid ""
-"Delete router operation failed in SDN-VE after deleting the router in DB:"
-" %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:507
-#, python-format
-msgid ""
-"Add router interface in progress: router_id=%(router_id)s "
-"interface_info=%(interface_info)r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:515
-#, python-format
-msgid "SdnvePluginV2.add_router_interface called. Port info: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:529
-#, python-format
-msgid "Update router-add-interface failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:532
-#, python-format
-msgid "Added router interface: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:536
-#, python-format
-msgid ""
-"Add router interface only called: router_id=%(router_id)s "
-"interface_info=%(interface_info)r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:546
-msgid ""
-"SdnvePluginV2._add_router_interface_only: failed to add the interface in "
-"the roll back. of a remove_router_interface operation"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:552
-#, python-format
-msgid ""
-"Remove router interface in progress: router_id=%(router_id)s "
-"interface_info=%(interface_info)r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:561
-msgid "No port ID"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:563
-#, python-format
-msgid "SdnvePluginV2.remove_router_interface port: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:567
-msgid "No fixed IP"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:572
-#, python-format
-msgid "SdnvePluginV2.remove_router_interface subnet_id: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:595
-#, python-format
-msgid "Update router-remove-interface failed SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:616
-#, python-format
-msgid "Create floatingip in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:627
-#, python-format
-msgid "Creating floating ip operation failed in SDN-VE controller: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:630
-#, python-format
-msgid "Created floatingip : %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:635
-#, python-format
-msgid "Update floatingip in progress: %r"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:655
-#, python-format
-msgid "Update floating ip failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:661
-#, python-format
-msgid "Delete floatingip in progress: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:666
-#, python-format
-msgid "Delete floatingip failed in SDN-VE: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:138
-msgid "info_update received"
-msgstr ""
-
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:143
-#, python-format
-msgid "info_update received. New controlleris to be set to: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:149
-msgid "info_update received. New controlleris set to be out of band"
-msgstr ""
-
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:194
-#, python-format
-msgid "Mapping physical network %(physical_network)s to interface %(interface)s"
-msgstr ""
-
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:200
-#, python-format
-msgid ""
-"Interface %(interface)s for physical network %(physical_network)s does "
-"not exist. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:218
-msgid "Agent in the rpc loop."
-msgstr ""
-
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:240
-#, python-format
-msgid "Controller IPs: %s"
-msgstr ""
-
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:262
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1529
-#, python-format
-msgid "%s Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:28
-msgid "Whether to use a fake controller."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:30
-msgid "Base URL for SDN-VE controller REST API."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:32
-msgid "List of IP addresses of SDN-VE controller(s)."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:34
-msgid "SDN-VE RPC subject."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:36
-msgid "SDN-VE controller port number."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:38
-msgid "SDN-VE request/response format."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:40
-msgid "SDN-VE administrator user ID."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:42
-msgid "SDN-VE administrator password."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:44
-#: neutron/plugins/nec/common/config.py:24
-#: neutron/plugins/openvswitch/common/config.py:29
-#: neutron/plugins/ryu/common/config.py:22
-msgid "Integration bridge to use."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:46
-msgid "Whether to reset the integration bridge before use."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:48
-msgid "Indicating if controller is out of band or not."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:51
-msgid "List of <physical_network_name>:<interface_name> mappings."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:54
-msgid "Tenant type: OVERLAY (default) or OF."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:56
-msgid ""
-"The string in tenant description that indicates the tenant is a OVERLAY "
-"tenant."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:59
-msgid "The string in tenant description that indicates the tenant is a OF tenant."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:65
-msgid "Agent polling interval if necessary."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:67
-msgid "Using root helper."
-msgstr ""
-
-#: neutron/plugins/ibm/common/config.py:69
-msgid "Whether to use rpc."
-msgstr ""
-
-#: neutron/plugins/ibm/common/exceptions.py:23
-#, python-format
-msgid ""
-"An unexpected error occurred in the SDN-VE Plugin. Here is the error "
-"message: %(msg)s"
-msgstr ""
-
-#: neutron/plugins/ibm/common/exceptions.py:28
-#, python-format
-msgid "The input does not contain nececessary info: %(msg)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:123
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:147
-#: neutron/plugins/ml2/rpc.py:130 neutron/plugins/ml2/rpc.py:154
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:125
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:150
-#, python-format
-msgid "Device %(device)s not bound to the agent host %(host)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:140
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:144
-#, python-format
-msgid "Device %(device)s up on %(agent_id)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:261
-#: neutron/plugins/mlnx/mlnx_plugin.py:207
-#, python-format
-msgid "Invalid tenant_network_type: %s. Service terminated!"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:272
-msgid "Linux Bridge Plugin initialization complete"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:301
-#, python-format
-msgid "%s. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:346
-#: neutron/plugins/mlnx/mlnx_plugin.py:251
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:418
-msgid "provider:segmentation_id specified for flat network"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:355
-#: neutron/plugins/mlnx/mlnx_plugin.py:259
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:427
-#, python-format
-msgid "provider:segmentation_id out of range (%(min_id)s through %(max_id)s)"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:362
-#: neutron/plugins/mlnx/mlnx_plugin.py:267
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:447
-msgid "provider:physical_network specified for local network"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:368
-#: neutron/plugins/mlnx/mlnx_plugin.py:271
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:453
-msgid "provider:segmentation_id specified for local network"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:83
-msgid "VXLAN is enabled, a valid local_ip must be provided"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:97
-msgid "Invalid Network ID, will lead to incorrect bridgename"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:104
-msgid "Invalid VLAN ID, will lead to incorrect subinterface name"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:111
-msgid "Invalid Interface ID, will lead to incorrect tap device name"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:120
-#, python-format
-msgid "Invalid Segmentation ID: %s, will lead to incorrect vxlan device name"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:183
-#, python-format
-msgid "Failed creating vxlan interface for %(segmentation_id)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:215
-#, python-format
-msgid ""
-"Creating subinterface %(interface)s for VLAN %(vlan_id)s on interface "
-"%(physical_interface)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:228
-#, python-format
-msgid "Done creating subinterface %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:235
-#, python-format
-msgid "Creating vxlan interface %(interface)s for VNI %(segmentation_id)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:250
-#, python-format
-msgid "Done creating vxlan interface %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:304
-#, python-format
-msgid "Starting bridge %(bridge_name)s for subinterface %(interface)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:319
-#, python-format
-msgid "Done starting bridge %(bridge_name)s for subinterface %(interface)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:341
-#, python-format
-msgid "Unable to add %(interface)s to %(bridge_name)s! Exception: %(e)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:354
-#, python-format
-msgid "Unable to add vxlan interface for network %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:361
-#, python-format
-msgid "No mapping for physical network %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:370
-#, python-format
-msgid "Unknown network_type %(network_type)s for network %(network_id)s."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:382
-#, python-format
-msgid "Tap device: %s does not exist on this host, skipped"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:400
-#, python-format
-msgid "Adding device %(tap_device_name)s to bridge %(bridge_name)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:409
-#, python-format
-msgid "%(tap_device_name)s already exists on bridge %(bridge_name)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:447
-#, python-format
-msgid "Deleting bridge %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:454
-#, python-format
-msgid "Done deleting bridge %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:457
-#, python-format
-msgid "Cannot delete bridge %s, does not exist"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:471
-#, python-format
-msgid "Removing device %(interface_name)s from bridge %(bridge_name)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:478
-#, python-format
-msgid "Done removing device %(interface_name)s from bridge %(bridge_name)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:484
-#, python-format
-msgid ""
-"Cannot remove device %(interface_name)s bridge %(bridge_name)s does not "
-"exist"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:492
-#, python-format
-msgid "Deleting subinterface %s for vlan"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:499
-#, python-format
-msgid "Done deleting subinterface %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:503
-#, python-format
-msgid "Deleting vxlan interface %s for vlan"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:508
-#, python-format
-msgid "Done deleting vxlan interface %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:522
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:556
-#, python-format
-msgid ""
-"Option \"%(option)s\" must be supported by command \"%(command)s\" to "
-"enable %(mode)s mode"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:533
-msgid "No valid Segmentation ID to perform UCAST test."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:550
-msgid ""
-"VXLAN muticast group must be provided in vxlan_group option to enable "
-"VXLAN MCAST mode"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:575
-msgid ""
-"Linux kernel vxlan module and iproute2 3.8 or above are required to "
-"enable VXLAN."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:585
-#, python-format
-msgid "Using %s VXLAN mode"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:662
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:163
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:297
-msgid "network_delete received"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:676
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:66
-#, python-format
-msgid "port_update RPC received for port: %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:679
-msgid "fdb_add received"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:701
-msgid "fdb_remove received"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:723
-msgid "update chg_ip received"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:748
-msgid "fdb_update received"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:805
-msgid "Unable to obtain MAC address for unique ID. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:809
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:220
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:144
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:109
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:100
-#, python-format
-msgid "RPC agent_id: %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:880
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1100
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:213
-#, python-format
-msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:913
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:934
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:354
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1126
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1187
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:240
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:920
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1172
-#, python-format
-msgid "Attachment %s removed"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:928
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1162
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179
-#, python-format
-msgid "port_removed failed for %(device)s: %(e)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:932
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:352
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1184
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:238
-#, python-format
-msgid "Port %s updated."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:985
-msgid "LinuxBridge Agent RPC Daemon Started!"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:999
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:267
-#, python-format
-msgid "Agent loop found changes! %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1003
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:273
-#, python-format
-msgid "Error in agent loop. Devices info: %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1026
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:407
-#, python-format
-msgid "Parsing physical_interface_mappings failed: %s. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1029
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:410
-#, python-format
-msgid "Interface mappings: %s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:29
-#: neutron/plugins/mlnx/common/config.py:26
-msgid "Network type for tenant networks (local, vlan, or none)"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:39
-msgid ""
-"Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 "
-"plugin using linuxbridge mechanism driver"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:43
-msgid "TTL for vxlan interface protocol packets."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:45
-msgid "TOS for vxlan interface protocol packets."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:47
-msgid "Multicast group for vxlan interface."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:49
-msgid "Local IP address of the VXLAN endpoints."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:51
-msgid ""
-"Extension to use alongside ml2 plugin's l2population mechanism driver. It"
-" enables the plugin to populate VXLAN forwarding table."
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:59
-#: neutron/plugins/mlnx/common/config.py:45
-#: neutron/plugins/ofagent/common/config.py:29
-msgid "List of <physical_network>:<physical_interface>"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/common/config.py:67
-#: neutron/plugins/mlnx/common/config.py:70
-msgid "Enable server RPC compatibility with old agents"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:142
-#: neutron/plugins/openvswitch/ovs_db_v2.py:161
-#, python-format
-msgid ""
-"Reserving specific vlan %(vlan_id)s on physical network "
-"%(physical_network)s outside pool"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:166
-#: neutron/plugins/openvswitch/ovs_db_v2.py:191
-#, python-format
-msgid ""
-"Releasing vlan %(vlan_id)s on physical network %(physical_network)s to "
-"pool"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:171
-#: neutron/plugins/openvswitch/ovs_db_v2.py:186
-#, python-format
-msgid ""
-"Releasing vlan %(vlan_id)s on physical network %(physical_network)s "
-"outside pool"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:202
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:212
-msgid "get_port_from_device() called"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:230
-#, python-format
-msgid "set_port_status as %s called"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:59
-#, python-format
-msgid "Flavor %(flavor)s could not be found"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:63
-msgid "Failed to add flavor binding"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:72
-msgid "Start initializing metaplugin"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:121
-#, python-format
-msgid "default_flavor %s is not plugin list"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:127
-#, python-format
-msgid "default_l3_flavor %s is not plugin list"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:133
-#, python-format
-msgid "rpc_flavor %s is not plugin list"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:165
-#, python-format
-msgid "Plugin location: %s"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:216
-#, python-format
-msgid "Created network: %(net_id)s with flavor %(flavor)s"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:222
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:366
-msgid "Failed to add flavor bindings"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:359
-#, python-format
-msgid "Created router: %(router_id)s with flavor %(flavor)s"
-msgstr ""
-
-#: neutron/plugins/metaplugin/meta_neutron_plugin.py:370
-#, python-format
-msgid "Created router: %s"
-msgstr ""
-
-#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:66
-#, python-format
-msgid "Update subnet failed: %s"
-msgstr ""
-
-#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:73
-msgid "Subnet in remote have already deleted"
-msgstr ""
-
-#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:94
-#, python-format
-msgid "Update network failed: %s"
-msgstr ""
-
-#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:101
-msgid "Network in remote have already deleted"
-msgstr ""
-
-#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:122
-#, python-format
-msgid "Update port failed: %s"
-msgstr ""
-
-#: neutron/plugins/metaplugin/proxy_neutron_plugin.py:133
-msgid "Port in remote have already deleted"
-msgstr ""
-
-#: neutron/plugins/metaplugin/common/config.py:23
-msgid ""
-"Comma separated list of flavor:neutron_plugin for plugins to load. "
-"Extension method is searched in the list order and the first one is used."
-msgstr ""
-
-#: neutron/plugins/metaplugin/common/config.py:29
-msgid ""
-"Comma separated list of flavor:neutron_plugin for L3 service plugins to "
-"load. This is intended for specifying L2 plugins which support L3 "
-"functions. If you use a router service plugin, set this blank."
-msgstr ""
-
-#: neutron/plugins/metaplugin/common/config.py:36
-msgid ""
-"Default flavor to use, when flavor:network is not specified at network "
-"creation."
-msgstr ""
-
-#: neutron/plugins/metaplugin/common/config.py:41
-msgid ""
-"Default L3 flavor to use, when flavor:router is not specified at router "
-"creation. Ignored if 'l3_plugin_list' is blank."
-msgstr ""
-
-#: neutron/plugins/metaplugin/common/config.py:47
-msgid "Comma separated list of supported extension aliases."
-msgstr ""
-
-#: neutron/plugins/metaplugin/common/config.py:51
-msgid ""
-"Comma separated list of method:flavor to select specific plugin for a "
-"method. This has priority over method search order based on "
-"'plugin_list'."
-msgstr ""
-
-#: neutron/plugins/metaplugin/common/config.py:57
-msgid "Specifies flavor for plugin to handle 'q-plugin' RPC requests."
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:44
-#, python-format
-msgid "MidoNet %(resource_type)s %(id)s could not be found"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:48
-#: neutron/plugins/midonet/plugin.py:86
-#, python-format
-msgid "MidoNet API error: %(msg)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:82
-#, python-format
-msgid "MidoClient.create_bridge called: kwargs=%(kwargs)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:92
-#, python-format
-msgid "MidoClient.delete_bridge called: id=%(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:102
-#, python-format
-msgid "MidoClient.get_bridge called: id=%s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:116
-#, python-format
-msgid "MidoClient.update_bridge called: id=%(id)s, kwargs=%(kwargs)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:136
-#, python-format
-msgid ""
-"MidoClient.create_dhcp called: bridge=%(bridge)s, cidr=%(cidr)s, "
-"gateway_ip=%(gateway_ip)s, host_rts=%(host_rts)s, "
-"dns_servers=%(dns_servers)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:154
-#, python-format
-msgid ""
-"MidoClient.add_dhcp_host called: bridge=%(bridge)s, cidr=%(cidr)s, "
-"ip=%(ip)s, mac=%(mac)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:159
-msgid "Tried to add tonon-existent DHCP"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:173
-#, python-format
-msgid ""
-"MidoClient.remove_dhcp_host called: bridge=%(bridge)s, cidr=%(cidr)s, "
-"ip=%(ip)s, mac=%(mac)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:178
-msgid "Tried to delete mapping from non-existent subnet"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:183
-#, python-format
-msgid "MidoClient.remove_dhcp_host: Deleting %(dh)r"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:196
-#, python-format
-msgid ""
-"MidoClient.delete_dhcp_host called: bridge_id=%(bridge_id)s, "
-"cidr=%(cidr)s, ip=%(ip)s, mac=%(mac)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:211
-#, python-format
-msgid "MidoClient.delete_dhcp called: bridge=%(bridge)s, cidr=%(cidr)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:218
-msgid "Tried to delete non-existent DHCP"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:230
-#, python-format
-msgid "MidoClient.delete_port called: id=%(id)s, delete_chains=%(delete_chains)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:245
-#, python-format
-msgid "MidoClient.get_port called: id=%(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:259
-#, python-format
-msgid "MidoClient.add_bridge_port called: bridge=%(bridge)s, kwargs=%(kwargs)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:271
-#, python-format
-msgid "MidoClient.update_port called: id=%(id)s, kwargs=%(kwargs)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:296
-#, python-format
-msgid "MidoClient.create_router called: kwargs=%(kwargs)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:306
-#, python-format
-msgid "MidoClient.delete_router called: id=%(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:316
-#, python-format
-msgid "MidoClient.get_router called: id=%(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:330
-#, python-format
-msgid "MidoClient.update_router called: id=%(id)s, kwargs=%(kwargs)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:351
-#, python-format
-msgid ""
-"MidoClient.add_dhcp_route_option called: bridge=%(bridge)s, "
-"cidr=%(cidr)s, gw_ip=%(gw_ip)sdst_ip=%(dst_ip)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:359
-msgid "Tried to access non-existent DHCP"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:391
-#, python-format
-msgid "MidoClient.unlink called: port=%(port)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:396
-#, python-format
-msgid "Attempted to unlink a port that was not linked. %s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:402
-#, python-format
-msgid ""
-"MidoClient.remove_rules_by_property called: tenant_id=%(tenant_id)s, "
-"chain_name=%(chain_name)skey=%(key)s, value=%(value)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:429
-#, python-format
-msgid ""
-"MidoClient.create_router_chains called: router=%(router)s, "
-"inbound_chain_name=%(in_chain)s, outbound_chain_name=%(out_chain)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:452
-#, python-format
-msgid "MidoClient.delete_router_chains called: id=%(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:467
-#, python-format
-msgid "MidoClient.delete_port_chains called: id=%(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:479
-#, python-format
-msgid ""
-"MidoClient.get_link_port called: router=%(router)s, "
-"peer_router_id=%(peer_router_id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:518
-#, python-format
-msgid ""
-"MidoClient.add_static_nat called: tenant_id=%(tenant_id)s, "
-"chain_name=%(chain_name)s, from_ip=%(from_ip)s, to_ip=%(to_ip)s, "
-"port_id=%(port_id)s, nat_type=%(nat_type)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:526
-#, python-format
-msgid "Invalid NAT type passed in %s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:578
-#, python-format
-msgid "MidoClient.remote_static_route called: router=%(router)s, ip=%(ip)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:589
-#, python-format
-msgid ""
-"MidoClient.update_port_chains called: "
-"port=%(port)sinbound_chain_id=%(inbound_chain_id)s, "
-"outbound_chain_id=%(outbound_chain_id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:600
-#, python-format
-msgid "MidoClient.create_chain called: tenant_id=%(tenant_id)s name=%(name)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:608
-#, python-format
-msgid "MidoClient.delete_chain called: id=%(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:614
-#, python-format
-msgid ""
-"MidoClient.delete_chains_by_names called: tenant_id=%(tenant_id)s "
-"names=%(names)s "
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:625
-#, python-format
-msgid ""
-"MidoClient.get_chain_by_name called: tenant_id=%(tenant_id)s "
-"name=%(name)s "
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:636
-#, python-format
-msgid ""
-"MidoClient.get_port_group_by_name called: tenant_id=%(tenant_id)s "
-"name=%(name)s "
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:650
-#, python-format
-msgid "MidoClient.create_port_group called: tenant_id=%(tenant_id)s name=%(name)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:659
-#, python-format
-msgid ""
-"MidoClient.delete_port_group_by_name called: tenant_id=%(tenant_id)s "
-"name=%(name)s "
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:665
-#, python-format
-msgid "Deleting pg %(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:671
-#, python-format
-msgid ""
-"MidoClient.add_port_to_port_group_by_name called: tenant_id=%(tenant_id)s"
-" name=%(name)s port_id=%(port_id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/midonet_lib.py:685
-#, python-format
-msgid "MidoClient.remove_port_from_port_groups called: port_id=%(port_id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:100
-#, python-format
-msgid "Invalid nat_type %s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:157
-#, python-format
-msgid "Unrecognized direction %s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:191
-#, python-format
-msgid "There is no %(name)s with ID %(id)s in MidoNet."
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:198
-#: neutron/plugins/ml2/drivers/arista/exceptions.py:23
-#: neutron/plugins/ml2/drivers/arista/exceptions.py:27
-#: neutron/plugins/ml2/drivers/arista/exceptions.py:31
-#: neutron/plugins/ml2/drivers/arista/exceptions.py:35
-#, python-format
-msgid "%(msg)s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:235
-msgid "provider_router_id should be configured in the plugin config file"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:405
-#, python-format
-msgid "MidonetPluginV2.create_subnet called: subnet=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:437
-#, python-format
-msgid "MidonetPluginV2.create_subnet exiting: sn_entry=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:446
-#, python-format
-msgid "MidonetPluginV2.delete_subnet called: id=%s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:465
-msgid "MidonetPluginV2.delete_subnet exiting"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:522
-#, python-format
-msgid "MidonetPluginV2.create_port called: port=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:583
-#, python-format
-msgid "Failed to create a port on network %(net_id)s: %(err)s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:588
-#, python-format
-msgid "MidonetPluginV2.create_port exiting: port=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:593
-#, python-format
-msgid "MidonetPluginV2.get_port called: id=%(id)s fields=%(fields)r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:600
-#, python-format
-msgid "There is no port with ID %(id)s in MidoNet."
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:604
-#, python-format
-msgid "MidonetPluginV2.get_port exiting: port=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:609
-#, python-format
-msgid "MidonetPluginV2.get_ports called: filters=%(filters)s fields=%(fields)r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:618
-#, python-format
-msgid ""
-"MidonetPluginV2.delete_port called: id=%(id)s "
-"l3_port_check=%(l3_port_check)r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:652
-#, python-format
-msgid "Failed to delete DHCP mapping for port %(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:727
-#, python-format
-msgid "MidonetPluginV2.create_router called: router=%(router)s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:774
-#, python-format
-msgid "MidonetPluginV2.create_router exiting: router_data=%(router_data)s."
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:786
-#, python-format
-msgid ""
-"MidonetPluginV2.set_router_gateway called: id=%(id)s, "
-"gw_router=%(gw_router)s, gw_ip=%(gw_ip)s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:830
-#, python-format
-msgid "MidonetPluginV2.remove_router_gateway called: id=%(id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:850
-#, python-format
-msgid "MidonetPluginV2.update_router called: id=%(id)s router=%(router)r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:890
-#, python-format
-msgid "MidonetPluginV2.update_router exiting: router=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:901
-#, python-format
-msgid "MidonetPluginV2.delete_router called: id=%s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1001
-#, python-format
-msgid ""
-"MidonetPluginV2.add_router_interface called: router_id=%(router_id)s "
-"interface_info=%(interface_info)r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1025
-msgid ""
-"DHCP agent is not working correctly. No port to reach the Metadata server"
-" on this network"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1034
-#, python-format
-msgid ""
-"Failed to create MidoNet resources to add router interface. "
-"info=%(info)s, router_id=%(router_id)s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1041
-#, python-format
-msgid "MidonetPluginV2.add_router_interface exiting: info=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1081
-#, python-format
-msgid ""
-"MidonetPluginV2.update_floatingip called: id=%(id)s "
-"floatingip=%(floatingip)s "
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1100
-#, python-format
-msgid "MidonetPluginV2.update_floating_ip exiting: fip=%s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1122
-#, python-format
-msgid ""
-"MidonetPluginV2.create_security_group called: "
-"security_group=%(security_group)s default_sg=%(default_sg)s "
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1151
-#, python-format
-msgid "Failed to create MidoNet resources for sg %(sg)r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1158
-#, python-format
-msgid "MidonetPluginV2.create_security_group exiting: sg=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1164
-#, python-format
-msgid "MidonetPluginV2.delete_security_group called: id=%s"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1196
-#, python-format
-msgid ""
-"MidonetPluginV2.create_security_group_rule called: "
-"security_group_rule=%(security_group_rule)r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1206
-#, python-format
-msgid "MidonetPluginV2.create_security_group_rule exiting: rule=%r"
-msgstr ""
-
-#: neutron/plugins/midonet/plugin.py:1216
-#, python-format
-msgid "MidonetPluginV2.delete_security_group_rule called: sg_rule_id=%s"
-msgstr ""
-
-#: neutron/plugins/midonet/common/config.py:23
-msgid "MidoNet API server URI."
-msgstr ""
-
-#: neutron/plugins/midonet/common/config.py:25
-msgid "MidoNet admin username."
-msgstr ""
-
-#: neutron/plugins/midonet/common/config.py:28
-msgid "MidoNet admin password."
-msgstr ""
-
-#: neutron/plugins/midonet/common/config.py:31
-msgid "ID of the project that MidoNet admin userbelongs to."
-msgstr ""
-
-#: neutron/plugins/midonet/common/config.py:34
-msgid "Virtual provider router ID."
-msgstr ""
-
-#: neutron/plugins/midonet/common/config.py:37
-msgid "Operational mode. Internal dev use only."
-msgstr ""
-
-#: neutron/plugins/midonet/common/config.py:40
-msgid "Path to midonet host uuid file"
-msgstr ""
-
-#: neutron/plugins/ml2/config.py:22
-msgid ""
-"List of network type driver entrypoints to be loaded from the "
-"neutron.ml2.type_drivers namespace."
-msgstr ""
-
-#: neutron/plugins/ml2/config.py:26
-msgid "Ordered list of network_types to allocate as tenant networks."
-msgstr ""
-
-#: neutron/plugins/ml2/config.py:30
-msgid ""
-"An ordered list of networking mechanism driver entrypoints to be loaded "
-"from the neutron.ml2.mechanism_drivers namespace."
-msgstr ""
-
-#: neutron/plugins/ml2/config.py:35
-msgid ""
-"An ordered list of extension driver entrypoints to be loaded from the "
-"neutron.ml2.extension_drivers namespace."
-msgstr ""
-
-#: neutron/plugins/ml2/db.py:54
-#, python-format
-msgid "Added segment %(id)s of type %(network_type)s for network %(network_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/db.py:197 neutron/plugins/ml2/db.py:249
-#: neutron/plugins/ml2/plugin.py:1025
-#, python-format
-msgid "Multiple ports have port_id starting with %s"
-msgstr ""
-
-#: neutron/plugins/ml2/db.py:203
-#, python-format
-msgid "get_port_from_device_mac() called for mac %s"
-msgstr ""
-
-#: neutron/plugins/ml2/db.py:245
-#, python-format
-msgid "No binding found for port %(port_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:39
-#, python-format
-msgid "Configured type driver names: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:44
-#, python-format
-msgid "Loaded type driver names: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:52
-#, python-format
-msgid ""
-"Type driver '%(new_driver)s' ignored because type driver '%(old_driver)s'"
-" is already registered for type '%(type)s'"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:60
-#, python-format
-msgid "Registered types: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:68
-#, python-format
-msgid "No type driver for tenant network_type: %s. Service terminated!"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:72
-#, python-format
-msgid "Tenant network_types: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:88
-msgid "network_type required"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:127
-#, python-format
-msgid "Network %s has no segments"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:145
-#, python-format
-msgid "Initializing driver for type '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:169 neutron/plugins/ml2/managers.py:178
-#: neutron/plugins/ml2/drivers/type_tunnel.py:179
-#, python-format
-msgid "network_type value '%s' not supported"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:204 neutron/plugins/ml2/managers.py:231
-#, python-format
-msgid "Failed to release segment '%s' because network type is not supported."
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:247
-#, python-format
-msgid "Configured mechanism driver names: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:253
-#, python-format
-msgid "Loaded mechanism driver names: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:265
-#, python-format
-msgid "Registered mechanism drivers: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:272
-#, python-format
-msgid "Initializing mechanism driver '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:294
-#, python-format
-msgid "Mechanism driver '%(name)s' failed in %(method)s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:596
-#, python-format
-msgid "Mechanism driver %s failed in bind_port"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:600
-#, python-format
-msgid "Failed to bind port %(port)s on host %(host)s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:613
-#, python-format
-msgid "Configured extension driver names: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:619
-#, python-format
-msgid "Loaded extension driver names: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:630
-#, python-format
-msgid "Registered extension drivers: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:636
-#, python-format
-msgid "Initializing extension driver '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:644
-#, python-format
-msgid "Got %(alias)s extension from driver '%(drv)s'"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:655
-#, python-format
-msgid "Extension driver '%(name)s' failed in %(method)s"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:691
-#, python-format
-msgid "Extended network dict for driver '%(drv)s'"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:698
-#, python-format
-msgid "Extended subnet dict for driver '%(drv)s'"
-msgstr ""
-
-#: neutron/plugins/ml2/managers.py:705
-#, python-format
-msgid "Extended port dict for driver '%(drv)s'"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:138
-msgid "Modular L2 Plugin initialization complete"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:197
-msgid "binding:profile value too large"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:253
-#, python-format
-msgid "Failed to commit binding results for %(port)s after %(max)s tries"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:259
-#, python-format
-msgid "Attempt %(count)s to bind port %(port)s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:385
-#, python-format
-msgid "Serialized vif_details DB value '%(value)s' for port %(port)s is invalid"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:396
-#, python-format
-msgid "Serialized profile DB value '%(value)s' for port %(port)s is invalid"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:465
-#, python-format
-msgid ""
-"In _notify_port_updated(), no bound segment for port %(port_id)s on "
-"network %(network_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:499
-#, python-format
-msgid "mechanism_manager.create_network_postcommit failed, deleting network '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:562
-#, python-format
-msgid "Deleting network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:583
-#, python-format
-msgid "Ports to auto-delete: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:589 neutron/plugins/ml2/plugin.py:717
-msgid "Tenant-owned ports exist"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:597
-#, python-format
-msgid "Subnets to auto-delete: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:609
-#, python-format
-msgid "Deleting network record %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:614 neutron/plugins/ml2/plugin.py:729
-msgid "Committing transaction"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:620
-msgid "A concurrent port creation has occurred"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:629
-#, python-format
-msgid "Exception auto-deleting port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:637
-#, python-format
-msgid "Exception auto-deleting subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:646
-msgid "mechanism_manager.delete_network_postcommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:662
-#, python-format
-msgid "mechanism_manager.create_subnet_postcommit failed, deleting subnet '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:694
-#, python-format
-msgid "Deleting subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:711
-#, python-format
-msgid "Ports to auto-deallocate: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:726
-msgid "Deleting subnet record"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:745
-#, python-format
-msgid "Exception deleting fixed_ip from port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:755
-msgid "mechanism_manager.delete_subnet_postcommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:787
-#, python-format
-msgid "mechanism_manager.create_port_postcommit failed, deleting port '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:799
-#, python-format
-msgid "_bind_port_if_needed failed, deleting port '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:881
-#, python-format
-msgid "No Host supplied to bind DVR Port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:941
-#: neutron/tests/unit/ml2/test_ml2_plugin.py:144
-#, python-format
-msgid "Deleting port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:961
-#: neutron/tests/unit/ml2/test_ml2_plugin.py:145
-#, python-format
-msgid "The port '%s' was deleted"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:1010
-#, python-format
-msgid "mechanism_manager.delete_port_postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:1034
-#, python-format
-msgid "Binding info for DVR port %s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:1060
-#, python-format
-msgid "Port %(port)s updated up by agent not found"
-msgstr ""
-
-#: neutron/plugins/ml2/plugin.py:1090
-#, python-format
-msgid "Port %s not found during update"
-msgstr ""
-
-#: neutron/plugins/ml2/rpc.py:66
-#, python-format
-msgid "Device %(device)s requested by agent %(agent_id)s not found in database"
-msgstr ""
-
-#: neutron/plugins/ml2/rpc.py:75
-#, python-format
-msgid ""
-"Device %(device)s requested by agent %(agent_id)s on network "
-"%(network_id)s not bound, vif_type: %(vif_type)s"
-msgstr ""
-
-#: neutron/plugins/ml2/rpc.py:103
-#, python-format
-msgid "Returning: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/rpc.py:122
-#, python-format
-msgid "Device %(device)s no longer exists at agent %(agent_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/rpc.py:148
-#, python-format
-msgid "Device %(device)s up at agent %(agent_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/common/exceptions.py:23
-#, python-format
-msgid "%(method)s failed."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/helpers.py:140
-#, python-format
-msgid ""
-"Allocate %(type)s segment from pool failed after %(number)s failed "
-"attempts"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_agent.py:54
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:327
-#, python-format
-msgid "Attempting to bind port %(port)s on network %(network)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_agent.py:61
-#, python-format
-msgid "Refusing to bind due to unsupported vnic_type: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_agent.py:65
-#, python-format
-msgid "Checking agent: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_agent.py:70
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:337
-#, python-format
-msgid "Bound using segment: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_agent.py:73
-#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:112
-#, python-format
-msgid "Attempting to bind with dead agent: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_hyperv.py:44
-#, python-format
-msgid "Checking segment: %(segment)s for mappings: %(mappings)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_linuxbridge.py:44
-#: neutron/plugins/ml2/drivers/mech_openvswitch.py:45
-#, python-format
-msgid ""
-"Checking segment: %(segment)s for mappings: %(mappings)s with "
-"tunnel_types: %(tunnel_types)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:35
-msgid "CRD service Username"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:38
-msgid "CRD Service Password"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:40
-msgid "CRD Tenant Name"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:43
-msgid "CRD Auth URL"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:46
-msgid "URL for connecting to CRD service"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:49
-msgid "Timeout value for connecting to CRD service in seconds"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:53
-msgid "Region name for connecting to CRD Service in admin context"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:57
-msgid "If set, ignore any SSL validation issues"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:60
-msgid "Auth strategy for connecting to neutron in admin context"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:63
-msgid "Location of ca certificates file to use for CRD client requests."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:87
-msgid "Initializing CRD client... "
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_ncs.py:29
-msgid "HTTP URL of Tail-f NCS REST interface."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_ncs.py:31
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:46
-msgid "HTTP username for authentication"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_ncs.py:33
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:48
-msgid "HTTP password for authentication"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_ncs.py:35
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:50
-msgid "HTTP timeout in seconds."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:44
-msgid "HTTP URL of OpenDaylight REST interface."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:52
-msgid "Tomcat session timeout in minutes."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:102
-#, python-format
-msgid "Failed to authenticate with OpenDaylight: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:105
-#, python-format
-msgid "Authentication Timed Out: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:315
-#, python-format
-msgid "ODL-----> sending URL (%s) <-----ODL"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:316
-#, python-format
-msgid "ODL-----> sending JSON (%s) <-----ODL"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:340
-#: neutron/plugins/ml2/drivers/mech_nuage/driver.py:94
-#, python-format
-msgid ""
-"Refusing to bind port for segment ID %(id)s, segment %(seg)s, phys net "
-"%(physnet)s, and network type %(nettype)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:31
-msgid ""
-"List of physical_network names with which flat networks can be created. "
-"Use * to allow flat networks with arbitrary physical_network names."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:69
-msgid "Arbitrary flat physical_network names allowed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:72
-msgid "physical network name is empty"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:75
-#, python-format
-msgid "Allowable flat physical_network names: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:82
-msgid "ML2 FlatTypeDriver initialization complete"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:90
-msgid "physical_network required for flat provider network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:93
-#, python-format
-msgid "physical_network '%s' unknown for flat provider network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:100
-#, python-format
-msgid "%s prohibited for flat provider network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:107
-#, python-format
-msgid "Reserving flat network on physical network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_flat.py:130
-#, python-format
-msgid "No flat network found on physical network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:34
-msgid ""
-"Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges of "
-"GRE tunnel IDs that are available for tenant network allocation"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:126
-#, python-format
-msgid "Gre endpoint with ip %s already exists"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_local.py:35
-msgid "ML2 LocalTypeDriver initialization complete"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_local.py:49
-#, python-format
-msgid "%s prohibited for local provider network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:76
-#, python-format
-msgid "Invalid tunnel ID range: '%(range)s' - %(e)s. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:79
-#, python-format
-msgid "%(type)s ID ranges: %(range)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:88
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:437
-#, python-format
-msgid "provider:physical_network specified for %s network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:95
-#, python-format
-msgid "%(key)s prohibited for %(tunnel)s provider network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:166
-msgid "Network_type value needed by the ML2 plugin"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vlan.py:38
-msgid ""
-"List of <physical_network>:<vlan_min>:<vlan_max> or <physical_network> "
-"specifying physical_network names usable for VLAN provider and tenant "
-"networks, as well as ranges of VLAN tags on each available for allocation"
-" to tenant networks."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vlan.py:93
-msgid "Failed to parse network_vlan_ranges. Service terminated!"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vlan.py:163
-msgid "VlanTypeDriver initialization complete"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vlan.py:173
-#, python-format
-msgid "physical_network '%s' unknown for VLAN provider network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vlan.py:178
-#, python-format
-msgid "segmentation_id out of range (%(min)s through %(max)s)"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vlan.py:184
-msgid "segmentation_id requires physical_network for VLAN provider network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vlan.py:192
-#, python-format
-msgid "%s prohibited for VLAN provider network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vlan.py:254
-#, python-format
-msgid "No vlan_id %(vlan_id)s found on physical network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:38
-msgid ""
-"Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges of "
-"VXLAN VNI IDs that are available for tenant network allocation"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:42
-msgid "Multicast group for VXLAN. If unset, disables VXLAN multicast mode."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:127
-msgid "get_vxlan_endpoints() called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:137
-#, python-format
-msgid "add_vxlan_endpoint() called for ip %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:146
-#, python-format
-msgid "Vxlan endpoint with ip %s already exists"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:32
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:32
-msgid "Unable to reach EOS"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:132
-msgid "Required option primary_l3_host is not set"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:138
-msgid "VRFs are not supported MLAG config mode"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:142
-msgid "Required option secondary_l3_host is not set"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:146
-msgid "Required option primary_l3_host_username is not set"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:327
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:435
-#, python-format
-msgid "Executing command on Arista EOS: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:333
-#, python-format
-msgid "Results of execution on Arista EOS: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:336
-#, python-format
-msgid "Error occured while trying to execute commands %(cmd)s on EOS %(host)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:31
-msgid ""
-"Username for Arista EOS. This is required field. If not set, all "
-"communications to Arista EOSwill fail."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:37
-msgid ""
-"Password for Arista EOS. This is required field. If not set, all "
-"communications to Arista EOS will fail."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:42
-msgid ""
-"Arista EOS IP address. This is required field. If not set, all "
-"communications to Arista EOSwill fail."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:47
-msgid ""
-"Defines if hostnames are sent to Arista EOS as FQDNs "
-"(\"node1.domain.com\") or as short names (\"node1\"). This is optional. "
-"If not set, a value of \"True\" is assumed."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:53
-msgid ""
-"Sync interval in seconds between Neutron plugin and EOS. This interval "
-"defines how often the synchronization is performed. This is an optional "
-"field. If not set, a value of 180 seconds is assumed."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:60
-msgid ""
-"Defines Region Name that is assigned to this OpenStack Controller. This "
-"is useful when multiple OpenStack/Neutron controllers are managing the "
-"same Arista HW clusters. Note that this name must match with the region "
-"name registered (or known) to keystone service. Authentication with "
-"Keysotne is performed by EOS. This is optional. If not set, a value of "
-"\"RegionOne\" is assumed."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:81
-msgid ""
-"Username for Arista EOS. This is required field. If not set, all "
-"communications to Arista EOS will fail"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:87
-msgid ""
-"Password for Arista EOS. This is required field. If not set, all "
-"communications to Arista EOS will fail"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:92
-msgid ""
-"Arista EOS IP address. This is required field. If not set, all "
-"communications to Arista EOS will fail"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:97
-msgid ""
-"Arista EOS IP address for second Switch MLAGed with the first one. This "
-"an optional field, however, if mlag_config flag is set, then this is "
-"required. If not set, all communications to Arista EOS will fail"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:104
-msgid ""
-"This flag is used indicate if Arista Switches are configured in MLAG "
-"mode. If yes, all L3 config is pushed to both the switches automatically."
-" If this flag is set to True, ensure to specify IP addresses of both "
-"switches. This is optional. If not set, a value of \"False\" is assumed."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:113
-msgid ""
-"A \"True\" value for this flag indicates to create a router in VRF. If "
-"not set, all routers are created in default VRF.This is optional. If not "
-"set, a value of \"False\" is assumed."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/config.py:120
-msgid ""
-"Sync interval in seconds between L3 Service plugin and EOS. This interval"
-" defines how often the synchronization is performed. This is an optional "
-"field. If not set, a value of 180 seconds is assumed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:75
-#, python-format
-msgid "'timestamp' command '%s' is not available on EOS"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:317
-#, python-format
-msgid "VM id %(vmid)s not found for port %(portid)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:336
-#, python-format
-msgid "Unknown device owner: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:450
-#, python-format
-msgid "Error %(err)s while trying to execute commands %(cmd)s on EOS %(host)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:522
-msgid "Required option eapi_host is not set"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:526
-msgid "Required option eapi_username is not set"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:546
-msgid "Syncing Neutron <-> EOS"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:552
-msgid "OpenStack and EOS are in sync!"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:574
-#, python-format
-msgid ""
-"No Tenants configured in Neutron DB. But %d tenants discovered in EOS "
-"during synchronization.Entire EOS region is cleared"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:739
-#, python-format
-msgid "Network %s is not created as it is not found inArista DB"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:753
-#, python-format
-msgid "Network name changed to %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:781
-#, python-format
-msgid "Network %s is not updated as it is not found inArista DB"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:873
-#, python-format
-msgid "VM %s is not created as it is not found in Arista DB"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:888
-#, python-format
-msgid "Port name changed to %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:938
-#, python-format
-msgid "VM %s is not updated as it is not found in Arista DB"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:40
-msgid "Allowed physical networks"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:42
-msgid "OS Type of the switch"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:44
-msgid "OS Version number"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:95
-msgid "Virtual Fabric: enabled"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:97
-msgid "Virtual Fabric: not enabled"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:135
-msgid ""
-"Brocade Mechanism: failed to create network, network cannot be created in"
-" the configured physical network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:141
-msgid ""
-"Brocade Mechanism: failed to create network, only network type vlan is "
-"supported"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:149
-msgid "Brocade Mechanism: failed to create network in db"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:151
-msgid "Brocade Mechanism: create_network_precommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:153
-#, python-format
-msgid ""
-"create network (precommit): %(network_id)s of network type = "
-"%(network_type)s with vlan = %(vlan_id)s for tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:165
-msgid "create_network_postcommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:185
-msgid "Brocade NOS driver: failed in create network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:188
-msgid "Brocade Mechanism: create_network_postcommmit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:190
-#, python-format
-msgid ""
-"created network (postcommit): %(network_id)s of network type = "
-"%(network_type)s with vlan = %(vlan_id)s for tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:202
-msgid "delete_network_precommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:215
-msgid "Brocade Mechanism: failed to delete network in db"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:217
-msgid "Brocade Mechanism: delete_network_precommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:219
-#, python-format
-msgid ""
-"delete network (precommit): %(network_id)s with vlan = %(vlan_id)s for "
-"tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:231
-msgid "delete_network_postcommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:243
-msgid "Brocade NOS driver: failed to delete network"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:245
-msgid "Brocade switch exception, delete_network_postcommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:248
-#, python-format
-msgid ""
-"delete network (postcommit): %(network_id)s with vlan = %(vlan_id)s for "
-"tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:266
-msgid "create_port_precommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:284
-msgid "Brocade Mechanism: failed to create port in db"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:286
-msgid "Brocade Mechanism: create_port_precommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:291
-msgid "create_port_postcommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:315
-#, python-format
-msgid "Brocade NOS driver: failed to associate mac %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:318
-msgid "Brocade switch exception: create_port_postcommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:321
-#, python-format
-msgid ""
-"created port (postcommit): port_id=%(port_id)s network_id=%(network_id)s "
-"tenant_id=%(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:329
-msgid "delete_port_precommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:338
-msgid "Brocade Mechanism: failed to delete port in db"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:340
-msgid "Brocade Mechanism: delete_port_precommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:345
-msgid "delete_port_postcommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:369
-#, python-format
-msgid "Brocade NOS driver: failed to dissociate MAC %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:372
-msgid "Brocade switch exception, delete_port_postcommit failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:375
-#, python-format
-msgid ""
-"delete port (postcommit): port_id=%(port_id)s network_id=%(network_id)s "
-"tenant_id=%(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:382
-msgid "update_port_precommit(self: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:386
-msgid "update_port_postcommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:390
-msgid "create_subnetwork_precommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:394
-msgid "create_subnetwork_postcommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:398
-msgid "delete_subnetwork_precommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:402
-msgid "delete_subnetwork_postcommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:406
-msgid "update_subnet_precommit(self: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:410
-msgid "update_subnet_postcommit: called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:77
-msgid ""
-"Brocade Switch IP address is not set, check config ml2_conf_brocade.ini "
-"file"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:88
-msgid "Connect failed to switch"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:107
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:117
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:145
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:162
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:175
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:188
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:355
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:374
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:388
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:401
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:414
-msgid "NETCONF error"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:30
-msgid "Prefix for APIC domain/names/profiles created"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:40
-msgid "An ordered list of host names or IP addresses of the APIC controller(s)."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:43
-msgid "Username for the APIC controller"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:45
-msgid "Password for the APIC controller"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:48
-msgid "Name mapping strategy to use: use_uuid | use_name"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:50
-msgid "Use SSL to connect to the APIC controller"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:53
-msgid "Name for the domain created on APIC"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:56
-msgid "Name for the app profile used for Openstack"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:59
-msgid "Name for the vlan namespace to be used for Openstack"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:62
-msgid "Name of the node profile to be created"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:65
-msgid "Name of the entity profile to be created"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:68
-msgid "Name of the function profile to be created"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:71
-msgid "Name of the LACP profile to be created"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:74
-msgid "The uplink ports to check for ACI connectivity"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:77
-msgid "The switch pairs for VPC connectivity"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:80
-msgid "Range of VLAN's to be used for Openstack"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:83
-msgid "Setup root helper as rootwrap or sudo"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:86
-msgid "Synchronization interval in seconds"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:89
-msgid "Interval between agent status updates (in sec)"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:92
-msgid "Interval between agent poll for topology (in sec)"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/config.py:25
-msgid "The physical network managed by the switches."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:33
-#, python-format
-msgid "Credential %(credential_name)s already exists for tenant %(tenant_id)s."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:54
-#, python-format
-msgid "Nexus Port Binding (%(filters)s) is not present"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:63
-#, python-format
-msgid "Missing required field(s) to configure nexus switch: %(fields)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/mech_cisco_nexus.py:45
-#, python-format
-msgid "nexus_switches found = %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:30
-msgid "get_nexusport_binding() called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:39
-msgid "get_nexusvlan_binding() called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:45
-msgid "add_nexusport_binding() called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:58
-msgid "remove_nexusport_binding() called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:74
-msgid "update_nexusport_binding called with no vlan"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:76
-msgid "update_nexusport_binding called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:87
-msgid "get_nexusvm_bindings() called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:94
-msgid "get_port_vlan_switch_binding() called"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_db_v2.py:102
-#, python-format
-msgid ""
-"get_port_switch_bindings() called, port:'%(port_id)s', "
-"switch:'%(switch_ip)s'"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py:123
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py:162
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py:171
-#, python-format
-msgid "NexusDriver: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/nexus/nexus_network_driver.py:178
-#, python-format
-msgid "NexusDriver created VLAN: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/l2pop/config.py:25
-msgid ""
-"Delay within which agent is expected to update existing ports whent it "
-"restarts"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:42
-msgid "Experimental L2 population driver"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:167
-msgid "Unable to retrieve the agent ip, check the agent configuration."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:173
-#, python-format
-msgid "Port %(port)s updated by agent %(agent)s isn't bound to any segment"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:226
-#, python-format
-msgid ""
-"Unable to retrieve the agent ip, check the agent %(agent_host)s "
-"configuration."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/l2pop/rpc.py:40
-#, python-format
-msgid ""
-"Fanout notify l2population agents at %(topic)s the message %(method)s "
-"with %(fdb_entries)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/l2pop/rpc.py:51
-#, python-format
-msgid ""
-"Notify l2population agent %(host)s at %(topic)s the message %(method)s "
-"with %(fdb_entries)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:54
-msgid "Initializing driver"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:72
-msgid "Initialization done"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:133
-msgid "Ignoring port notification to controller because of missing host ID."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:202
-#, python-format
-msgid "No cache entry for host %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:207
-#, python-format
-msgid "Expired cache entry for host %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:31
-msgid ""
-"Supported PCI vendor devices, defined by vendor_id:product_id according "
-"to the PCI ID Repository. Default enables support for Intel and Mellanox "
-"SR-IOV capable NICs"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:37
-msgid "SRIOV neutron agent is required for port binding"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:86
-msgid "Failed to parse supported PCI vendor devices"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:87
-msgid "Parsing supported pci_vendor_devs failed"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:176
-#, python-format
-msgid "Invalid pci_vendor_info: '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:179
-#, python-format
-msgid "Missing vendor_id in: '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:182
-#, python-format
-msgid "Missing product_id in: '%s'"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mlnx/config.py:24
-#: neutron/plugins/mlnx/common/config.py:48
-msgid "Type of VM network interface: mlnx_direct or hostdev"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mlnx/mech_mlnx.py:54
-#, python-format
-msgid "Checking segment: %(segment)s for mappings: %(mappings)s "
-msgstr ""
-
-#: neutron/plugins/mlnx/agent_notify_api.py:48
-msgid "Sending delete network message"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent_notify_api.py:56
-msgid "Sending update port message"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:121
-msgid "Mellanox Embedded Switch Plugin initialisation complete"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:161
-#, python-format
-msgid "Invalid physical network type %(type)s.Server terminated!"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:168
-#, python-format
-msgid "Parsing physical_network_type failed: %s. Server terminated!"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:173
-#, python-format
-msgid ""
-"Invalid physical network type %(type)s for network %(net)s. Server "
-"terminated!"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:177
-#, python-format
-msgid "Physical Network type mappings: %s"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:185
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:364
-#, python-format
-msgid "%s. Server terminated!"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:323
-#, python-format
-msgid "Unsupported vnic type %(vnic_type)s for physical network type %(net_type)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:327
-msgid "Invalid vnic_type on port_create"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:329
-msgid "vnic_type is not defined in port profile"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:373
-msgid "Update network"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:386
-msgid "Delete network"
-msgstr ""
-
-#: neutron/plugins/mlnx/mlnx_plugin.py:434
-#, python-format
-msgid "create_port with %s"
-msgstr ""
-
-#: neutron/plugins/mlnx/rpc_callbacks.py:97
-#, python-format
-msgid "Device %(device)s up %(agent_id)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:57
-#, python-format
-msgid "Agent cache inconsistency - port id is not stored for %s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:72
-#, python-format
-msgid "Network %s not defined on Agent."
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:85
-#, python-format
-msgid "Network %s is not available on this agent"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:96
-#, python-format
-msgid "Connecting port %s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:106
-#, python-format
-msgid "Binding Segmentation ID %(seg_id)sto eSwitch for vNIC mac_address %(mac)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:125
-#, python-format
-msgid "Port_mac %s is not available on this agent"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:132
-msgid "Creating VLAN Network"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:134
-#, python-format
-msgid "Unknown network type %(network_type)s for network %(network_id)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:166
-msgid "Invalid Network ID, cannot remove Network"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:168
-#, python-format
-msgid "Delete network %s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:311
-#, python-format
-msgid "Adding or updating port with mac %s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:314
-#, python-format
-msgid "Port %s updated"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:339
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:226
-#, python-format
-msgid "Removing device with mac_address %s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:347
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:233
-#, python-format
-msgid "Removing port failed for device %(device)s due to %(exc)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:364
-msgid "eSwitch Agent Started!"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:375
-msgid ""
-"Request timeout in agent event loop eSwitchD is not responding - "
-"exiting..."
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:415
-#, python-format
-msgid "Failed on Agent initialisation : %s. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:420
-msgid "Agent initialised successfully, now running... "
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:30
-msgid ""
-"Failed to import eventlet.green.zmq. Won't connect to eSwitchD - "
-"exiting..."
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:74
-#, python-format
-msgid "Action %(action)s failed: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:76
-#, python-format
-msgid "Unknown operation status %s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:81
-msgid "get_attached_vnics"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:88
-#, python-format
-msgid ""
-"Set Vlan %(segmentation_id)s on Port %(port_mac)s on Fabric "
-"%(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:101
-#, python-format
-msgid "Define Fabric %(fabric)s on interface %(ifc)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:110
-#, python-format
-msgid "Port Up for %(port_mac)s on fabric %(fabric)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:119
-#, python-format
-msgid "Port Down for %(port_mac)s on fabric %(fabric)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/utils.py:128
-#, python-format
-msgid "Port Release for %(port_mac)s on fabric %(fabric)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/comm_utils.py:57
-#, python-format
-msgid "Request timeout - call again after %s seconds"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/config.py:34
-msgid ""
-"List of <physical_network>:<physical_network_type> with "
-"physical_network_type is either eth or ib"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/config.py:37
-msgid "Physical network type for provider network (eth or ib)"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/config.py:52
-msgid "eswitch daemon end point"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/config.py:54
-msgid ""
-"The number of milliseconds the agent will wait for response on request to"
-" daemon."
-msgstr ""
-
-#: neutron/plugins/mlnx/common/config.py:57
-msgid ""
-"The number of retries the agent will send request to daemon before giving"
-" up"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/config.py:60
-msgid ""
-"backoff rate multiplier for waiting period between retries for request to"
-" daemon, i.e. value of 2 will double the request timeout each retry"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/exceptions.py:20
-#, python-format
-msgid "Mlnx Exception: %(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/exceptions.py:24
-msgid "Request Timeout: no response from eSwitchD"
-msgstr ""
-
-#: neutron/plugins/mlnx/common/exceptions.py:28
-#, python-format
-msgid "Operation Failed: %(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:42
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:63
-#, python-format
-msgid "Removing vlan %(seg_id)s on physical network %(net)s from pool"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:119
-#, python-format
-msgid "Reserving vlan %(seg_id)s on physical network %(net)s from pool"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:138
-#, python-format
-msgid ""
-"Reserving specific vlan %(seg_id)s on physical network %(phy_net)s from "
-"pool"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:143
-#, python-format
-msgid ""
-"Reserving specific vlan %(seg_id)s on physical network %(phy_net)s "
-"outside pool"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:170
-#, python-format
-msgid "Releasing vlan %(seg_id)s on physical network %(phy_net)s to pool"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:175
-#, python-format
-msgid "Releasing vlan %(seg_id)s on physical network %(phy_net)s outside pool"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:181
-#, python-format
-msgid "vlan_id %(seg_id)s on physical network %(phy_net)s not found"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:239
-msgid "Get_port_from_device_mac() called"
-msgstr ""
-
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:247
-#, python-format
-msgid "Set_port_status as %s called"
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:206
-#, python-format
-msgid "_cleanup_ofc_tenant: No OFC tenant for %s"
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:209
-#, python-format
-msgid "delete_ofc_tenant() failed due to %s"
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:225
-msgid "activate_port_if_ready(): skip, port.admin_state_up is False."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:229
-msgid "activate_port_if_ready(): skip, network.admin_state_up is False."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:233
-msgid "activate_port_if_ready(): skip, no portinfo for this port."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:237
-msgid "activate_port_if_ready(): skip, ofc_port already exists."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:245
-#, python-format
-msgid "create_ofc_port() failed due to %s"
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:258
-#, python-format
-msgid "deactivate_port(): skip, ofc_port for port=%s does not exist."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:277
-#, python-format
-msgid "deactivate_port(): OFC port for port=%s is already removed."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:285
-#, python-format
-msgid "Failed to delete port=%(port)s from OFC: %(exc)s"
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:304
-#, python-format
-msgid "NECPluginV2.create_network() called, network=%s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:321
-#, python-format
-msgid "Failed to create network id=%(id)s on OFC: %(exc)s"
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:337
-#, python-format
-msgid "NECPluginV2.update_network() called, id=%(id)s network=%(network)s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:381
-#, python-format
-msgid "NECPluginV2.delete_network() called, id=%s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:415
-#, python-format
-msgid "delete_network() failed due to %s"
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:556
-#, python-format
-msgid "NECPluginV2.create_port() called, port=%s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:620
-#, python-format
-msgid "NECPluginV2.update_port() called, id=%(id)s port=%(port)s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:648
-#, python-format
-msgid "NECPluginV2.delete_port() called, id=%s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:715
-#, python-format
-msgid "NECPluginV2RPCCallbacks.update_ports() called, kwargs=%s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:725
-#, python-format
-msgid ""
-"update_ports(): ignore unchanged portinfo in port_added message "
-"(port_id=%s)."
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:745
-#, python-format
-msgid ""
-"update_ports(): ignore port_removed message due to portinfo for "
-"port_id=%s was not registered"
-msgstr ""
-
-#: neutron/plugins/nec/nec_plugin.py:750
-#, python-format
-msgid ""
-"update_ports(): ignore port_removed message received from different host "
-"(registered_datapath_id=%(registered)s, "
-"received_datapath_id=%(received)s)."
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:58
-#, python-format
-msgid "RouterMixin.create_router() called, router=%s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:84
-#, python-format
-msgid "RouterMixin.update_router() called, id=%(id)s, router=%(router)s ."
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:102
-#, python-format
-msgid "RouterMixin.delete_router() called, id=%s."
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:121
-#, python-format
-msgid ""
-"RouterMixin.add_router_interface() called, id=%(id)s, "
-"interface=%(interface)s."
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:128
-#, python-format
-msgid ""
-"RouterMixin.remove_router_interface() called, id=%(id)s, "
-"interface=%(interface)s."
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:311
-#, python-format
-msgid ""
-"OFC does not support router with provider=%(provider)s, so removed it "
-"from supported provider (new router driver map=%(driver_map)s)"
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:319
-#, python-format
-msgid ""
-"default_router_provider %(default)s is supported! Please specify one of "
-"%(supported)s"
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:333
-#, python-format
-msgid "Enabled router drivers: %s"
-msgstr ""
-
-#: neutron/plugins/nec/nec_router.py:336
-#, python-format
-msgid ""
-"No router provider is enabled. neutron-server terminated! "
-"(supported=%(supported)s, configured=%(config)s)"
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:40
-msgid "Disabled packet-filter extension."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:45
-#, python-format
-msgid "create_packet_filter() called, packet_filter=%s ."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:61
-#, python-format
-msgid "update_packet_filter() called, id=%(id)s packet_filter=%(packet_filter)s ."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:134
-#: neutron/plugins/nec/packet_filter.py:187
-#, python-format
-msgid "Failed to create packet_filter id=%(id)s on OFC: %(exc)s"
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:144
-#, python-format
-msgid "delete_packet_filter() called, id=%s ."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:162
-#, python-format
-msgid "activate_packet_filter_if_ready() called, packet_filter=%s."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:171
-#, python-format
-msgid ""
-"activate_packet_filter_if_ready(): skip pf_id=%s, "
-"packet_filter.admin_state_up is False."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:174
-#, python-format
-msgid ""
-"activate_packet_filter_if_ready(): skip pf_id=%s, no portinfo for the "
-"in_port."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:177
-msgid ""
-"_activate_packet_filter_if_ready(): skip, ofc_packet_filter already "
-"exists."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:180
-#, python-format
-msgid "activate_packet_filter_if_ready(): create packet_filter id=%s on OFC."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:200
-#, python-format
-msgid "deactivate_packet_filter_if_ready() called, packet_filter=%s."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:205
-#, python-format
-msgid ""
-"deactivate_packet_filter(): skip, Not found OFC Mapping for packet_filter"
-" id=%s."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:210
-#, python-format
-msgid "deactivate_packet_filter(): deleting packet_filter id=%s from OFC."
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:219
-#, python-format
-msgid "Failed to delete packet_filter id=%(id)s from OFC: %(exc)s"
-msgstr ""
-
-#: neutron/plugins/nec/packet_filter.py:250
-#, python-format
-msgid "Error occurred while disabling packet filter(s) for port %s"
-msgstr ""
-
-#: neutron/plugins/nec/router_drivers.py:125
-#, python-format
-msgid "create_router() failed due to %s"
-msgstr ""
-
-#: neutron/plugins/nec/router_drivers.py:154
-#, python-format
-msgid "_update_ofc_routes() failed due to %s"
-msgstr ""
-
-#: neutron/plugins/nec/router_drivers.py:169
-#, python-format
-msgid "delete_router() failed due to %s"
-msgstr ""
-
-#: neutron/plugins/nec/router_drivers.py:180
-#, python-format
-msgid ""
-"RouterOpenFlowDriver.add_interface(): the requested port has no subnet. "
-"add_interface() is skipped. router_id=%(id)s, port=%(port)s)"
-msgstr ""
-
-#: neutron/plugins/nec/router_drivers.py:200
-#, python-format
-msgid "add_router_interface() failed due to %s"
-msgstr ""
-
-#: neutron/plugins/nec/router_drivers.py:218
-#, python-format
-msgid "delete_router_interface() failed due to %s"
-msgstr ""
-
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:53
-#, python-format
-msgid "Update ports: added=%(added)s, removed=%(removed)s"
-msgstr ""
-
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:76
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:51
-#, python-format
-msgid "port_update received: %s"
-msgstr ""
-
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:220
-msgid "No port changed."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:35
-msgid "Host to connect to."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:37
-msgid "Base URL of OFC REST API. It is prepended to each API request."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:40
-msgid "Port to connect to."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:42
-msgid "Driver to use."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:44
-msgid "Enable packet filter."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:46
-msgid "Use SSL to connect."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:48
-msgid "Location of key file."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:50
-msgid "Location of certificate file."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:52
-msgid "Disable SSL certificate verification."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:54
-msgid ""
-"Maximum attempts per OFC API request. NEC plugin retries API request to "
-"OFC when OFC returns ServiceUnavailable (503). The value must be greater "
-"than 0."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:63
-msgid "Default router provider to use."
-msgstr ""
-
-#: neutron/plugins/nec/common/config.py:66
-msgid "List of enabled router providers."
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:20
-#, python-format
-msgid "An OFC exception has occurred: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:30
-#, python-format
-msgid "The specified OFC resource (%(resource)s) is not found."
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:34
-#, python-format
-msgid "An exception occurred in NECPluginV2 DB: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:38
-#, python-format
-msgid ""
-"Neutron-OFC resource mapping for %(resource)s %(neutron_id)s is not "
-"found. It may be deleted during processing."
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:44
-#, python-format
-msgid "OFC returns Server Unavailable (503) (Retry-After=%(retry_after)s)"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:53
-#, python-format
-msgid "PortInfo %(id)s could not be found"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:57
-msgid ""
-"Invalid input for operation: datapath_id should be a hex string with at "
-"most 8 bytes"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:63
-msgid "Invalid input for operation: port_no should be [0:65535]"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:68
-#, python-format
-msgid "Router (provider=%(provider)s) does not support an external network"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:73
-#, python-format
-msgid "Provider %(provider)s could not be found"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:77
-#, python-format
-msgid "Cannot create more routers with provider=%(provider)s"
-msgstr ""
-
-#: neutron/plugins/nec/common/exceptions.py:81
-#, python-format
-msgid ""
-"Provider of Router %(router_id)s is %(provider)s. This operation is "
-"supported only for router provider %(expected_provider)s."
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:54
-#, python-format
-msgid "Operation on OFC failed: %(status)s%(msg)s"
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:78
-#, python-format
-msgid "Client request: %(host)s:%(port)s %(method)s %(action)s [%(body)s]"
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:87
-#, python-format
-msgid "OFC returns [%(status)s:%(data)s]"
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:104
-#, python-format
-msgid "OFC returns ServiceUnavailable (retry-after=%s)"
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:108
-#, python-format
-msgid "Specified resource %s does not exist on OFC "
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:112
-#, python-format
-msgid "Operation on OFC failed: status=%(status)s, detail=%(detail)s"
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:115
-msgid "Operation on OFC failed"
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:124
-#, python-format
-msgid "Failed to connect OFC : %s"
-msgstr ""
-
-#: neutron/plugins/nec/common/ofc_client.py:140
-#, python-format
-msgid "Waiting for %s seconds due to OFC Service_Unavailable."
-msgstr ""
-
-#: neutron/plugins/nec/db/api.py:103
-#, python-format
-msgid "del_ofc_item(): NotFound item (resource=%(resource)s, id=%(id)s) "
-msgstr ""
-
-#: neutron/plugins/nec/db/api.py:137
-#, python-format
-msgid "del_portinfo(): NotFound portinfo for port_id: %s"
-msgstr ""
-
-#: neutron/plugins/nec/db/api.py:158
-#: neutron/plugins/openvswitch/ovs_db_v2.py:317
-#, python-format
-msgid "get_port_with_securitygroups() called:port_id=%s"
-msgstr ""
-
-#: neutron/plugins/nec/db/router.py:85
-#, python-format
-msgid "Add provider binding (router=%(router_id)s, provider=%(provider)s)"
-msgstr ""
-
-#: neutron/plugins/nec/drivers/__init__.py:36
-#, python-format
-msgid "Loading OFC driver: %s"
-msgstr ""
-
-#: neutron/plugins/nec/drivers/pfc.py:33
-#, python-format
-msgid "OFC %(resource)s ID has an invalid format: %(ofc_id)s"
-msgstr ""
-
-#: neutron/plugins/nec/extensions/packetfilter.py:33
-msgid "Number of packet_filters allowed per tenant, -1 for unlimited"
-msgstr ""
-
-#: neutron/plugins/nec/extensions/packetfilter.py:40
-#, python-format
-msgid "PacketFilter %(id)s could not be found"
-msgstr ""
-
-#: neutron/plugins/nec/extensions/packetfilter.py:44
-#, python-format
-msgid ""
-"IP version %(version)s is not supported for %(field)s (%(value)s is "
-"specified)"
-msgstr ""
-
-#: neutron/plugins/nec/extensions/packetfilter.py:49
-#, python-format
-msgid "Packet Filter priority should be %(min)s-%(max)s (included)"
-msgstr ""
-
-#: neutron/plugins/nec/extensions/packetfilter.py:53
-#, python-format
-msgid "%(field)s field cannot be updated"
-msgstr ""
-
-#: neutron/plugins/nec/extensions/packetfilter.py:57
-#, python-format
-msgid ""
-"The backend does not support duplicated priority. Priority %(priority)s "
-"is in use"
-msgstr ""
-
-#: neutron/plugins/nec/extensions/packetfilter.py:62
-#, python-format
-msgid ""
-"Ether Type '%(eth_type)s' conflicts with protocol '%(protocol)s'. Update "
-"or clear protocol before changing ether type."
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:109
-#, python-format
-msgid "%(resource)s with id %(resource_id)s does not exist"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:118
-#, python-format
-msgid ""
-"Either %(resource)s %(req_resource)s not found or you dont have "
-"credential to access it"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:124
-#, python-format
-msgid ""
-"More than one entry found for %(resource)s %(req_resource)s. Use id "
-"instead"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:154
-#, python-format
-msgid "Router for subnet %s not found "
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:271
-#, python-format
-msgid "Subnet %s not found on VSD"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:416
-#, python-format
-msgid "provider:network_type %s not supported in VSP"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:461
-msgid "External network with subnets can not be changed to non-external network"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:539
-msgid ""
-"Either net_partition is not provided with subnet OR default net_partition"
-" is not created at the start"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:556
-#, python-format
-msgid "Only one subnet is allowed per Provider network %s"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:567
-#, python-format
-msgid "Only one subnet is allowed per external network %s"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:697
-#, python-format
-msgid ""
-"Unable to complete operation on subnet %s.One or more ports have an IP "
-"allocation from this subnet."
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:724
-#, python-format
-msgid ""
-"Router %s does not hold default zone OR domain in VSD. Router-IF add "
-"failed"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:736
-#, python-format
-msgid "Subnet %s does not hold Nuage VSD reference. Router-IF add failed"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:746
-#, python-format
-msgid ""
-"Subnet %(subnet)s and Router %(router)s belong to different net_partition"
-" Router-IF add not permitted"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:757
-#, python-format
-msgid "Subnet %s has one or more active VMs Router-IF add not permitted"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:809 neutron/plugins/nuage/plugin.py:814
-#: neutron/plugins/nuage/plugin.py:820
-#, python-format
-msgid "No router interface found for Router %s. Router-IF delete failed"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:836
-#, python-format
-msgid "Subnet %s has one or more active VMs Router-IF delete not permitted"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:845
-#, python-format
-msgid ""
-"Router %s does not hold net_partition assoc on Nuage VSD. Router-IF "
-"delete failed"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:886
-msgid ""
-"Either net_partition is not provided with router OR default net_partition"
-" is not created at the start"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:927
-msgid "for same subnet, multiple static routes not allowed"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:944
-#, python-format
-msgid "Router %s does not hold net-partition assoc on VSD. extra-route failed"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:1061
-#, python-format
-msgid "One or more router still attached to net_partition %s."
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:1066
-#, python-format
-msgid "NetPartition with %s does not exist"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:1108
-#, python-format
-msgid "sharedresource %s not found on VSD"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:1115 neutron/plugins/nuage/plugin.py:1257
-#, python-format
-msgid "router %s is not associated with any net-partition"
-msgstr ""
-
-#: neutron/plugins/nuage/plugin.py:1148
-msgid "Floating IP can not be associated to VM in different router context"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:22
-msgid "IP Address and Port of Nuage's VSD server"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:25
-msgid "Username and password for authentication"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:27
-msgid "Boolean for SSL connection with VSD server"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:29
-msgid "Nuage provided base uri to reach out to VSD"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:31
-msgid ""
-"Organization name in which VSD will orchestrate network resources using "
-"openstack"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:34
-msgid "Nuage provided uri for initial authorization to access VSD"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:38
-msgid ""
-"Default Network partition in which VSD will orchestrate network resources"
-" using openstack"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:42
-msgid "Per Net Partition quota of floating ips"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:47
-msgid "Nuage plugin will sync resources between openstack and VSD"
-msgstr ""
-
-#: neutron/plugins/nuage/common/config.py:50
-msgid ""
-"Sync interval in seconds between openstack and VSD. It defines how often "
-"the synchronization is done. If not set, value of 0 is assumed and sync "
-"will be performed only once, at the Neutron startup time."
-msgstr ""
-
-#: neutron/plugins/nuage/common/exceptions.py:23
-#, python-format
-msgid "Nuage Plugin does not support this operation: %(msg)s"
-msgstr ""
-
-#: neutron/plugins/nuage/common/exceptions.py:27
-#, python-format
-msgid "Bad request: %(msg)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:988
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1486
-#, python-format
-msgid "Parsing bridge_mappings failed: %s."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:993
-#, python-format
-msgid "Parsing physical_interface_mappings failed: %s."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:1014
-#, python-format
-msgid "Invalid tunnel type specificed: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:1017
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1514
-msgid "Tunneling cannot be enabled without a valid local_ip."
-msgstr ""
-
-#: neutron/plugins/ofagent/common/config.py:25
-msgid "Number of seconds to retry acquiring an Open vSwitch datapath"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/plugin.py:238
-msgid "Failed to create subnet, deleting it from neutron"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/plugin.py:302
-#, python-format
-msgid "Deleting newly created neutron port %s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/plugin.py:375
-msgid "Failed to create floatingip"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/plugin.py:414
-msgid "Failed to create router"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:154
-msgid "Port list is updated"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:161
-msgid "AGENT looping....."
-msgstr ""
-
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:173
-msgid "NVSD Agent initialized successfully, now running... "
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/config.py:26
-msgid "NVSD Controller IP address"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/config.py:29
-msgid "NVSD Controller Port number"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/config.py:32
-msgid "NVSD Controller username"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/config.py:35
-msgid "NVSD Controller password"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/config.py:38
-msgid "NVSD controller REST API request timeout in seconds"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/config.py:40
-msgid "Number of login retries to NVSD controller"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/config.py:45
-msgid "integration bridge"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:23
-#, python-format
-msgid "An unknown nvsd plugin exception occurred: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:27
-#: neutron/plugins/vmware/api_client/exception.py:68
-msgid "The request has timed out."
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:31
-msgid "Invalid access credentials to the Server."
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:35
-#, python-format
-msgid "A resource is not found: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:39
-#, python-format
-msgid "Request sent to server is invalid: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:43
-#, python-format
-msgid "Internal Server Error: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:47
-msgid "Connection is closed by the server."
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:51
-#, python-format
-msgid "The request is forbidden access to the resource: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/exception.py:55
-#, python-format
-msgid "Internal Server Error from NVSD controller: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:55
-#, python-format
-msgid "Could not create a %(resource)s under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:59
-#, python-format
-msgid "Failed to %(method)s %(resource)s id=%(resource_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:65
-#, python-format
-msgid "Failed to %(method)s %(resource)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:110
-#, python-format
-msgid "Network %(id)s created under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:127
-#, python-format
-msgid "Network %(id)s updated under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:148
-#, python-format
-msgid "Network %(id)s deleted under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:161
-#, python-format
-msgid "Subnet %(id)s created under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:175
-#, python-format
-msgid "Subnet %(id)s deleted under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:191
-#, python-format
-msgid "Subnet %(id)s updated under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:223
-#, python-format
-msgid "Port %(id)s created under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:247
-#, python-format
-msgid "Port %(id)s updated under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:260
-#, python-format
-msgid "Port %(id)s deleted under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:282
-#, python-format
-msgid "Flatingip %(id)s created under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:300
-#, python-format
-msgid "Flatingip %(id)s updated under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:314
-#, python-format
-msgid "Flatingip %(id)s deleted under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:327
-#, python-format
-msgid "Router %(id)s created under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:343
-#, python-format
-msgid "Router %(id)s updated under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:353
-#, python-format
-msgid "Router %(id)s deleted under tenant %(tenant_id)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:81
-#, python-format
-msgid "Unable to connect to NVSD controller. Exiting after %(retries)s attempts"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:90
-#, python-format
-msgid "Login Failed: %s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:91
-#, python-format
-msgid "Unable to establish connection with Controller %s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:93
-msgid "Retrying after 1 second..."
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:97
-#, python-format
-msgid "Login Successful %(uri)s %(status)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:101
-#, python-format
-msgid "AuthToken = %s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:103
-msgid "login failed"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:111
-msgid "No Token, Re-login"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:127
-#, python-format
-msgid "request: %(method)s %(uri)s successful"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:134
-#, python-format
-msgid "request: Request failed from Controller side :%s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:139
-#, python-format
-msgid "Response is Null, Request timed out: %(method)s to %(uri)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:151
-#, python-format
-msgid "Request %(method)s %(uri)s body = %(body)s failed with status %(status)s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:155
-#, python-format
-msgid "%s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:159
-#, python-format
-msgid "%(method)s to %(url)s, unexpected response code: %(status)d"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:165
-#, python-format
-msgid "Request failed from Controller side with Status=%s"
-msgstr ""
-
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:169
-#, python-format
-msgid "Success: %(method)s %(url)s status=%(status)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:210
-#, python-format
-msgid "Skipping unreasonable tunnel ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:229
-#, python-format
-msgid "Removing tunnel %s from pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:258
-#, python-format
-msgid "Reserving tunnel %s from pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:273
-#, python-format
-msgid "Reserving specific tunnel %s from pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:276
-#, python-format
-msgid "Reserving specific tunnel %s outside pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:299
-#, python-format
-msgid "Releasing tunnel %s outside pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:301
-#, python-format
-msgid "Releasing tunnel %s to pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:303
-#, python-format
-msgid "tunnel_id %s not found"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:375
-#, python-format
-msgid "Adding a tunnel endpoint for %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:391
-#, python-format
-msgid ""
-"Adding a tunnel endpoint failed due to a concurrenttransaction had been "
-"committed (%s attempts left)"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:396
-msgid "Unable to generate a new tunnel id"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:309
-#, python-format
-msgid "Invalid tenant_network_type: %s. Server terminated!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:326
-#, python-format
-msgid "Tunneling disabled but tenant_network_type is '%s'. Server terminated!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:375
-#, python-format
-msgid "Invalid tunnel ID range: '%(range)s' - %(e)s. Server terminated!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:379
-#, python-format
-msgid "Tunnel ID ranges: %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:434
-#, python-format
-msgid "%s networks are not enabled"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:159
-msgid "DVR: Failed to obtain local DVR Mac address"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:292
-#, python-format
-msgid "DVR: Duplicate DVR router interface detected for subnet %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:300
-#, python-format
-msgid "DVR: Unable to retrieve subnet information for subnet_id %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:459
-#, python-format
-msgid "Centralized-SNAT port %s already seen on "
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:461
-#, python-format
-msgid "a different subnet %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:59
-#, python-format
-msgid ""
-"Unable to retrieve port details for devices: %(devices)s because of "
-"error: %(error)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:305
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:557
-#, python-format
-msgid "Network %s not used on agent."
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:314
-#, python-format
-msgid "port_update message processed for port %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:317
-msgid "tunnel_update received"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:326
-msgid "No tunnel_type specified, cannot create tunnels"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:329
-#, python-format
-msgid "tunnel_type %s not supported by agent"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:437
-#, python-format
-msgid "Action %s not supported"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:458
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:466
-#, python-format
-msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:495
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:514
-#, python-format
-msgid ""
-"Cannot provision flat network for net-id=%(net_uuid)s - no bridge for "
-"physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:534
-#, python-format
-msgid ""
-"Cannot provision VLAN network for net-id=%(net_uuid)s - no bridge for "
-"physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:543
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-"
-"id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:560
-#, python-format
-msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:601
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-"
-"id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:655
-#, python-format
-msgid "port_unbound(): net_uuid %s not in local_vlan_map"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:728
-#, python-format
-msgid "Adding %s to list of bridges."
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:749
-msgid ""
-"Failed to create OVS patch port. Cannot have tunneling enabled on this "
-"agent, since this version of OVS does not support tunnels or patch ports."
-" Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:843
-#, python-format
-msgid ""
-"Creating an interface named %(name)s exceeds the %(limit)d character "
-"limitation. It was shortened to %(new_name)s to fit."
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:864
-#, python-format
-msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:870
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not "
-"exist. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:974
-#, python-format
-msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1003
-#, python-format
-msgid "VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1013
-#, python-format
-msgid "No VIF port for port %s defined on agent."
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1026
-#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:799
-#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1248
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1029
-#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:782
-#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:802
-#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1231
-#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1251
-#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1268
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1094
-#, python-format
-msgid ""
-"Port %s was not found on the integration bridge and will therefore not be"
-" processed"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1117
-#, python-format
-msgid "Setting status for %s to UP"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1121
-#, python-format
-msgid "Setting status for %s to DOWN"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1124
-#, python-format
-msgid "Configuration for device %s completed."
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1143
-#, python-format
-msgid "Ancillary Port %s added"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1215
-#, python-format
-msgid ""
-"process_network_ports - iteration:%(iter_num)d "
-"-treat_devices_added_or_updated completed. Skipped %(num_skipped)d "
-"devices of %(num_current)d devices currently available. Time elapsed: "
-"%(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1231
-#, python-format
-msgid ""
-"process_network_ports - iteration:%d - failure while retrieving port "
-"details from server"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1238
-#, python-format
-msgid ""
-"process_network_ports - iteration:%(iter_num)d -treat_devices_removed "
-"completed in %(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1252
-#, python-format
-msgid ""
-"process_ancillary_network_ports - iteration: %(iter_num)d - "
-"treat_ancillary_devices_added completed in %(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1260
-#, python-format
-msgid ""
-"process_ancillary_network_ports - iteration:%d - failure while retrieving"
-" port details from server"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1268
-#, python-format
-msgid ""
-"process_ancillary_network_ports - iteration: %(iter_num)d - "
-"treat_ancillary_devices_removed completed in %(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1281
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1310
-#, python-format
-msgid "Unable to sync tunnel IP %(local_ip)s: %(e)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1347
-#, python-format
-msgid "Agent rpc_loop - iteration:%d started"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1369
-msgid "Agent tunnel out of sync with plugin!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1373
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1377
-#, python-format
-msgid ""
-"Agent rpc_loop - iteration:%(iter_num)d - starting polling. "
-"Elapsed:%(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1389
-#, python-format
-msgid ""
-"Agent rpc_loop - iteration:%(iter_num)d - port information retrieved. "
-"Elapsed:%(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1399
-#, python-format
-msgid "Starting to process devices in:%s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1404
-#, python-format
-msgid ""
-"Agent rpc_loop - iteration:%(iter_num)d -ports processed. "
-"Elapsed:%(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1419
-#, python-format
-msgid ""
-"Agent rpc_loop - iteration:%(iter_num)d -ancillary port info retrieved. "
-"Elapsed:%(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1428
-#, python-format
-msgid ""
-"Agent rpc_loop - iteration:%(iter_num)d - ancillary ports processed. "
-"Elapsed:%(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1442
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1449
-#, python-format
-msgid ""
-"Agent rpc_loop - iteration:%(iter_num)d completed. Processed ports "
-"statistics: %(port_stats)s. Elapsed:%(elapsed).3f"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1511
-#, python-format
-msgid "Invalid tunnel type specified: %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:31
-msgid "Enable tunneling support."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:33
-msgid "Tunnel bridge to use."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:35
-msgid "Peer patch port in integration bridge for tunnel bridge."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:38
-msgid "Peer patch port in tunnel bridge for integration bridge."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:41
-msgid "Local IP address of GRE tunnel endpoints."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:44
-msgid "List of <physical_network>:<bridge>. Deprecated for ofagent."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:47
-msgid "Network type for tenant networks (local, vlan, gre, vxlan, or none)."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:51
-msgid "List of <physical_network>:<vlan_min>:<vlan_max> or <physical_network>."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:55
-msgid "List of <tun_min>:<tun_max>."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:57
-msgid ""
-"The type of tunnels to use when utilizing tunnels, either 'gre' or "
-"'vxlan'."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:60
-msgid ""
-"Use veths instead of patch ports to interconnect the integration bridge "
-"to physical bridges."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:70
-msgid "Minimize polling by monitoring ovsdb for interface changes."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:74
-msgid ""
-"The number of seconds to wait before respawning the ovsdb monitor after "
-"losing communication with it."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:77
-msgid "Network types supported by the agent (gre and/or vxlan)."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:82
-msgid "MTU size of veth interfaces"
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:84
-msgid ""
-"Use ML2 l2population mechanism driver to learn remote MAC and IPs and "
-"improve tunnel scalability."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:87
-msgid ""
-"Enable local ARP responder if it is supported. Requires OVS 2.1 and ML2 "
-"l2population driver. Allows the switch (when supporting an overlay) to "
-"respond to an ARP request locally without performing a costly ARP "
-"broadcast into the overlay."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:93
-msgid ""
-"Set or un-set the don't fragment (DF) bit on outgoing IP packet carrying "
-"GRE/VXLAN tunnel."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:96
-msgid "Make the l2 agent run in DVR mode."
-msgstr ""
-
-#: neutron/plugins/plumgrid/common/exceptions.py:24
-#, python-format
-msgid "PLUMgrid Plugin Error: %(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/plumgrid/common/exceptions.py:28
-#, python-format
-msgid "Connection failed with PLUMgrid Director: %(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:31
-msgid "Python PLUMgrid Fake Library Started "
-msgstr ""
-
-#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:36
-#, python-format
-msgid "Fake Director: %s"
-msgstr ""
-
-#: neutron/plugins/plumgrid/drivers/plumlib.py:37
-msgid "Python PLUMgrid Library Started "
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:46
-msgid "PLUMgrid Director server to connect to"
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:48
-msgid "PLUMgrid Director server port to connect to"
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:50
-msgid "PLUMgrid Director admin username"
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:52
-msgid "PLUMgrid Director admin password"
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:54
-msgid "PLUMgrid Director server timeout"
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:57
-msgid "PLUMgrid Driver"
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:75
-msgid "Neutron PLUMgrid Director: Starting Plugin"
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:93
-#, python-format
-msgid "Neutron PLUMgrid Director: %s"
-msgstr ""
-
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:770
-msgid ""
-"Networks with admin_state_up=False are not supported by PLUMgrid plugin "
-"yet."
-msgstr ""
-
-#: neutron/plugins/ryu/ryu_neutron_plugin.py:68
-#, python-format
-msgid "get_ofp_rest_api: %s"
-msgstr ""
-
-#: neutron/plugins/ryu/ryu_neutron_plugin.py:125
-msgid "Invalid configuration. check ryu.ini"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:95
-#, python-format
-msgid "Could not get IPv4 address from %(nic)s: %(cfg)s"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:161
-#, python-format
-msgid "External port %s"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:169
-msgid "Get Ryu rest API address"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:216
-msgid "Ryu rest API port isn't specified"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:217
-#, python-format
-msgid "Going to ofp controller mode %s"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:293
-#, python-format
-msgid "tunnel_ip %s"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:295
-#, python-format
-msgid "ovsdb_port %s"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:297
-#, python-format
-msgid "ovsdb_ip %s"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:303
-#, python-format
-msgid "Initialization failed: %s"
-msgstr ""
-
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:306
-msgid ""
-"Ryu initialization on the node is done. Agent initialized successfully, "
-"now running..."
-msgstr ""
-
-#: neutron/plugins/ryu/common/config.py:24
-msgid "OpenFlow REST API location."
-msgstr ""
-
-#: neutron/plugins/ryu/common/config.py:26
-msgid "Minimum tunnel ID to use."
-msgstr ""
-
-#: neutron/plugins/ryu/common/config.py:28
-msgid "Maximum tunnel ID to use."
-msgstr ""
-
-#: neutron/plugins/ryu/common/config.py:30
-msgid "Tunnel IP to use."
-msgstr ""
-
-#: neutron/plugins/ryu/common/config.py:32
-msgid "Tunnel interface to use."
-msgstr ""
-
-#: neutron/plugins/ryu/common/config.py:34
-msgid "OVSDB port to connect to."
-msgstr ""
-
-#: neutron/plugins/ryu/common/config.py:36
-msgid "OVSDB IP to connect to."
-msgstr ""
-
-#: neutron/plugins/ryu/common/config.py:38
-msgid "OVSDB interface to connect to."
-msgstr ""
-
-#: neutron/plugins/ryu/db/api_v2.py:39
-#, python-format
-msgid "get_port_from_device() called:port_id=%s"
-msgstr ""
-
-#: neutron/plugins/ryu/db/api_v2.py:75
-#, python-format
-msgid ""
-"Invalid tunnel key options tunnel_key_min: %(key_min)d tunnel_key_max: "
-"%(key_max)d. Using default value"
-msgstr ""
-
-#: neutron/plugins/ryu/db/api_v2.py:155
-#, python-format
-msgid "last_key %(last_key)s new_key %(new_key)s"
-msgstr ""
-
-#: neutron/plugins/ryu/db/api_v2.py:158
-msgid "No key found"
-msgstr ""
-
-#: neutron/plugins/ryu/db/api_v2.py:191
-#, python-format
-msgid "Transaction retry exhausted (%d). Abandoned tunnel key allocation."
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:46
-#, python-format
-msgid "Failed to get devices for %s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:48
-msgid "Device not found"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:62
-msgid "Device has no virtual functions"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:141
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:154
-#, python-format
-msgid "Cannot find vf index for pci slot %s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:279
-#, python-format
-msgid "device pci mismatch: %(device_mac)s - %(pci_slot)s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/pci_lib.py:58
-#: neutron/plugins/sriovnicagent/pci_lib.py:81
-#: neutron/plugins/sriovnicagent/pci_lib.py:108
-msgid "Failed executing ip command"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/pci_lib.py:129
-#, python-format
-msgid "Cannot find vfs %(vfs)s in device %(dev_name)s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/pci_lib.py:145
-#, python-format
-msgid "failed to parse vf link show line %(line)s: for %(device)s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:181
-#, python-format
-msgid "Failed to set device %s state"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:195
-#, python-format
-msgid "No device with MAC %s defined on agent."
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:220
-#, python-format
-msgid "Device with MAC %s not defined on plugin"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:247
-msgid "SRIOV NIC Agent RPC Daemon Started!"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:317
-#, python-format
-msgid "Device name %(dev_name)s is missing from physical_device_mappings"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:333
-#, python-format
-msgid "Failed on Agent configuration parse : %s. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:336
-#, python-format
-msgid "Physical Devices mappings: %s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:337
-#, python-format
-msgid "Exclude Devices: %s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:347
-msgid "Agent Initialization Failed"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/common/config.py:41
-#, python-format
-msgid "Device %(dev_name)s in mapping: %(mapping)s not unique"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/common/config.py:65
-msgid ""
-"List of <physical_network>:<network_device> mapping physical network "
-"names to the agent's node-specific physical network device of SR-IOV "
-"physical function to be used for VLAN networks. All physical networks "
-"listed in network_vlan_ranges on the server should have mappings to "
-"appropriate interfaces on each agent"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/common/config.py:74
-msgid ""
-"List of <network_device>:<excluded_devices> mapping network_device to the"
-" agent's node-specific list of virtual functions that should not be used "
-"for virtual networking. excluded_devices is a semicolon separated list of"
-" virtual functions (BDF format).to exclude from network_device. The "
-"network_device in the mapping should appear in the "
-"physical_device_mappings list."
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/common/exceptions.py:24
-#, python-format
-msgid "Invalid Device %(dev_name)s: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/common/exceptions.py:28
-#, python-format
-msgid "ip command failed on device %(dev_name)s: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/sriovnicagent/common/exceptions.py:32
-#, python-format
-msgid "Invalid pci slot %(pci_slot)s"
-msgstr ""
-
-#: neutron/plugins/vmware/check_nsx_config.py:45
-#: neutron/plugins/vmware/check_nsx_config.py:80
-#, python-format
-msgid "Error '%(err)s' when connecting to controller(s): %(ctl)s."
-msgstr ""
-
-#: neutron/plugins/vmware/dhcpmeta_modes.py:56
-#, python-format
-msgid "Invalid agent_mode: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcpmeta_modes.py:107
-msgid "network_auto_schedule has been disabled"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcpmeta_modes.py:128
-#, python-format
-msgid "Unable to run Neutron with config option '%s', as NSX does not support it"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcpmeta_modes.py:131
-#, python-format
-msgid "Unmet dependency for config option '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/nsx_cluster.py:49
-#, python-format
-msgid ""
-"Attribute '%s' has been deprecated or moved to a new section. See new "
-"configuration file for details."
-msgstr ""
-
-#: neutron/plugins/vmware/nsx_cluster.py:61
-#, python-format
-msgid "The following cluster attributes were not specified: %s'"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/__init__.py:28
-#, python-format
-msgid "Invalid connection type: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:103
-#, python-format
-msgid "[%d] no API providers currently available."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:106
-#, python-format
-msgid "[%d] Waiting to acquire API client connection."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:110
-#, python-format
-msgid "[%(rid)d] Connection %(conn)s idle for %(sec)0.2f seconds; reconnecting."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:119
-#, python-format
-msgid "[%(rid)d] Acquired connection %(conn)s. %(qsize)d connection(s) available."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:140
-#, python-format
-msgid ""
-"[%(rid)d] Released connection %(conn)s is not an API provider for the "
-"cluster"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:150
-#, python-format
-msgid "[%(rid)d] Connection returned in bad state, reconnecting to %(conn)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:176
-#, python-format
-msgid "[%(rid)d] Released connection %(conn)s. %(qsize)d connection(s) available."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:186
-#, python-format
-msgid "Login request for an invalid connection: '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:197
-msgid "Waiting for auth to complete"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/base.py:239
-#, python-format
-msgid "Invalid conn_params value: '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/client.py:89
-#, python-format
-msgid "Request returns \"%s\""
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/client.py:102
-#, python-format
-msgid "Request timed out: %(method)s to %(url)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/client.py:113
-#, python-format
-msgid "Received error code: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/client.py:114
-#, python-format
-msgid "Server Error Message: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/client.py:120
-#, python-format
-msgid ""
-"%(method)s to %(url)s, unexpected response code: %(status)d (content = "
-"'%(body)s')"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/client.py:137
-msgid "Unable to determine NSX version. Plugin might not work as expected."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/eventlet_client.py:145
-#, python-format
-msgid "Login error \"%s\""
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/eventlet_client.py:150
-#, python-format
-msgid "Saving new authentication cookie '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/eventlet_request.py:101
-msgid "Joining an invalid green thread"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/eventlet_request.py:121
-#, python-format
-msgid "[%d] Request timeout."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/eventlet_request.py:122
-msgid "Request timeout"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/eventlet_request.py:148
-#, python-format
-msgid "[%(rid)d] Completed request '%(method)s %(url)s': %(status)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/eventlet_request.py:155
-#, python-format
-msgid "[%(rid)d] Error while handling request: %(req)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/eventlet_request.py:211
-#, python-format
-msgid "[%(rid)d] Failed to parse API provider: %(e)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/exception.py:41
-msgid "Server denied session's authentication credentials."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/exception.py:45
-msgid "An entity referenced in the request was not found."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/exception.py:49
-msgid "Request conflicts with configuration on a different entity."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/exception.py:54
-msgid ""
-"Request could not completed because the associated resource could not be "
-"reached."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/exception.py:59
-msgid "The request is forbidden from accessing the referenced resource."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/exception.py:64
-msgid "Create/Update actions are forbidden when in read-only mode."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/exception.py:72
-msgid "The server is unable to fulfill the request due to a bad syntax"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/exception.py:77
-msgid "The backend received an invalid security certificate."
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:84
-msgid "No API connections available"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:89
-#, python-format
-msgid "[%(rid)d] Issuing - request url: %(conn)s body: %(body)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:117
-#, python-format
-msgid "Setting X-Nvp-Wait-For-Config-Generation request header: '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:123
-#, python-format
-msgid "[%(rid)d] Exception issuing request: %(e)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:131
-#, python-format
-msgid "[%(rid)d] Completed request '%(conn)s': %(status)s (%(elapsed)s seconds)"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:140
-#, python-format
-msgid "Reading X-Nvp-config-Generation response header: '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:167
-#, python-format
-msgid "[%d] Maximum redirects exceeded, aborting request"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:177
-#, python-format
-msgid "[%(rid)d] Redirecting request to: %(conn)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:190
-#, python-format
-msgid "[%(rid)d] Request '%(method)s %(url)s' received: %(status)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:194
-#, python-format
-msgid "Server error return: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:198
-msgid "Invalid server response"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:203
-#, python-format
-msgid "[%(rid)d] Failed request '%(conn)s': '%(msg)s' (%(elapsed)s seconds)"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:237
-#, python-format
-msgid "[%d] Received redirect status without location header field"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:254
-#, python-format
-msgid "[%(rid)d] Received invalid redirect location: '%(url)s'"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/request.py:258
-#, python-format
-msgid "[%(rid)d] Received malformed redirect location: %(url)s"
-msgstr ""
-
-#: neutron/plugins/vmware/api_client/version.py:30
-#, python-format
-msgid "Unable to fetch NSX version from response headers :%s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:39
-msgid ""
-"Maximum number of ports of a logical switch on a bridged transport zone "
-"(default 5000)"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:43
-msgid ""
-"Maximum number of ports of a logical switch on an overlay transport zone "
-"(default 256)"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:47
-msgid "Maximum concurrent connections to each NSX controller."
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:52
-msgid ""
-"Number of seconds a generation id should be valid for (default -1 meaning"
-" do not time out)"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:56
-msgid ""
-"If set to access_network this enables a dedicated connection to the "
-"metadata proxy for metadata server access via Neutron router. If set to "
-"dhcp_host_route this enables host route injection via the dhcp agent. "
-"This option is only useful if running on a host that does not support "
-"namespaces otherwise access_network should be used."
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:65
-msgid ""
-"The default network tranport type to use (stt, gre, bridge, ipsec_gre, or"
-" ipsec_stt)"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:69
-msgid "The mode used to implement DHCP/metadata services."
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:71
-msgid ""
-"The default option leverages service nodes to perform packet replication "
-"though one could set to this to 'source' to perform replication locally. "
-"This is useful if one does not want to deploy a service node(s). It must "
-"be set to 'service' for leveraging distributed routers."
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:82
-msgid ""
-"Interval in seconds between runs of the state synchronization task. Set "
-"it to 0 to disable it"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:86
-msgid ""
-"Maximum value for the additional random delay in seconds between runs of "
-"the state synchronization task"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:91
-msgid ""
-"Minimum delay, in seconds, between two state synchronization queries to "
-"NSX. It must not exceed state_sync_interval"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:96
-msgid ""
-"Minimum number of resources to be retrieved from NSX during state "
-"synchronization"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:100
-msgid ""
-"Always read operational status from backend on show operations. Enabling "
-"this option might slow down the system."
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:109
-msgid "User name for NSX controllers in this cluster"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:114
-msgid "Password for NSX controllers in this cluster"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:117
-msgid "Time before aborting a request"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:120
-msgid "Number of time a request should be retried"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:123
-msgid "Number of times a redirect should be followed"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:126
-msgid "Lists the NSX controllers in this cluster"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:131
-msgid ""
-"This is uuid of the default NSX Transport zone that will be used for "
-"creating tunneled isolated \"Neutron\" networks. It needs to be created "
-"in NSX before starting Neutron with the nsx plugin."
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:136
-msgid ""
-"Unique identifier of the NSX L3 Gateway service which will be used for "
-"implementing routers and floating IPs"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:140
-msgid ""
-"Unique identifier of the NSX L2 Gateway service which will be used by "
-"default for network gateways"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:143
-msgid ""
-"Unique identifier of the Service Cluster which will be used by logical "
-"services like dhcp and metadata"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:146
-msgid ""
-"Name of the interface on a L2 Gateway transport nodewhich should be used "
-"by default when setting up a network connection"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:156
-msgid "User name for vsm"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:160
-msgid "Password for vsm"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:162
-msgid "uri for vsm"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:164
-msgid "Optional parameter identifying the ID of datacenter to deploy NSX Edges"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:167
-#: neutron/plugins/vmware/common/config.py:173
-msgid "Optional parameter identifying the ID of datastore to deploy NSX Edges"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:170
-msgid "Optional parameter identifying the ID of resource to deploy NSX Edges"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:176
-msgid "Network ID for physical network connectivity"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:179
-msgid "Task status check interval"
-msgstr ""
-
-#: neutron/plugins/vmware/common/config.py:193
-#, python-format
-msgid "Invalid replication_mode: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:21
-#, python-format
-msgid "An unexpected error occurred in the NSX Plugin: %(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:25
-#, python-format
-msgid "Unable to fulfill request with version %(version)s."
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:29
-#, python-format
-msgid "Invalid NSX connection parameters: %(conn_params)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:33
-#, python-format
-msgid ""
-"Invalid cluster values: %(invalid_attrs)s. Please ensure that these "
-"values are specified in the [DEFAULT] section of the NSX plugin ini file."
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:39
-#, python-format
-msgid "Unable to find cluster config entry for nova zone: %(nova_zone)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:44
-#, python-format
-msgid ""
-"Unable to create port on network %(network)s. Maximum number of ports "
-"reached"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:49
-#, python-format
-msgid ""
-"While retrieving NAT rules, %(actual_rules)s were found whereas rules in "
-"the (%(min_rules)s,%(max_rules)s) interval were expected"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:55
-#, python-format
-msgid "Invalid NSX attachment type '%(attachment_type)s'"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:59
-msgid ""
-"The networking backend is currently in maintenance mode and therefore "
-"unable to accept requests which modify its state. Please try later."
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:65
-#, python-format
-msgid "Gateway Service %(gateway)s is already in use"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:69
-msgid ""
-"An invalid security certificate was specified for the gateway device. "
-"Certificates must be enclosed between '-----BEGIN CERTIFICATE-----' and '"
-"-----END CERTIFICATE-----'"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:76
-#, python-format
-msgid "Quota exceeded for Vcns resource: %(overs)s: %(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:80
-#, python-format
-msgid "Router %(router_id)s is in use by Loadbalancer Service %(vip_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:85
-#, python-format
-msgid "Router %(router_id)s is in use by firewall Service %(firewall_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:90
-#, python-format
-msgid "Error happened in NSX VCNS Driver: %(err_msg)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:94
-#, python-format
-msgid ""
-"Service cluster: '%(cluster_id)s' is unavailable. Please, check NSX setup"
-" and/or configuration"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:99
-#, python-format
-msgid ""
-"An error occurred while connecting LSN %(lsn_id)s and network %(net_id)s "
-"via port %(port_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:108
-#, python-format
-msgid "Unable to find LSN for %(entity)s %(entity_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:112
-#, python-format
-msgid "Unable to find port for LSN %(lsn_id)s and %(entity)s %(entity_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:117
-#, python-format
-msgid "Unable to migrate network '%(net_id)s' to LSN: %(reason)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/exceptions.py:121
-#, python-format
-msgid "Configuration conflict on Logical Service Node %(lsn_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/nsx_utils.py:67
-#, python-format
-msgid "Unable to find NSX switches for Neutron network %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/nsx_utils.py:114
-#, python-format
-msgid "Unable to find NSX port for Neutron port %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/nsx_utils.py:154
-#, python-format
-msgid "Unable to find NSX security profile for Neutron security group %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/nsx_utils.py:158
-#, python-format
-msgid "Multiple NSX security profiles found for Neutron security group %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/nsx_utils.py:189
-#, python-format
-msgid "Unable to find NSX router for Neutron router %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/nsx_utils.py:246
-#, python-format
-msgid ""
-"Unable to retrieve operational status for gateway devices belonging to "
-"tenant: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/nsx_utils.py:249
-msgid "Unable to retrieve operational status for gateway devices"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:231
-#, python-format
-msgid ""
-"Minimum request delay:%(req_delay)s must not exceed synchronization "
-"interval:%(sync_interval)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:264
-#, python-format
-msgid "Logical switch for neutron network %s not found on NSX."
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:299
-#: neutron/plugins/vmware/common/sync.py:381
-#: neutron/plugins/vmware/common/sync.py:476
-#, python-format
-msgid "Updating status for neutron resource %(q_id)s to: %(status)s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:351
-#, python-format
-msgid "Logical router for neutron router %s not found on NSX."
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:401
-#, python-format
-msgid "Unable to find Neutron router id for NSX logical router: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:443
-#, python-format
-msgid "Logical switch port for neutron port %s not found on NSX."
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:536
-#, python-format
-msgid ""
-"Requested page size is %(cur_chunk_size)d.It might be necessary to do "
-"%(num_requests)d round-trips to NSX for fetching data. Please tune sync "
-"parameters to ensure chunk size is less than %(max_page_size)d"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:569
-#, python-format
-msgid "Fetching up to %s resources from NSX backend"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:589
-#, python-format
-msgid "Total data size: %d"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:593
-#, python-format
-msgid ""
-"Fetched %(num_lswitches)d logical switches, %(num_lswitchports)d logical "
-"switch ports,%(num_lrouters)d logical routers"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:609
-#, python-format
-msgid "Running state synchronization task. Chunk: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:619
-#, python-format
-msgid ""
-"An error occurred while communicating with NSX backend. Will retry "
-"synchronization in %d seconds"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:623
-#, python-format
-msgid "Time elapsed querying NSX: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:630
-#, python-format
-msgid "Number of chunks: %d"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:648
-#, python-format
-msgid "Time elapsed hashing data: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:660
-#, python-format
-msgid "Synchronization for chunk %(chunk_num)d of %(total_chunks)d performed"
-msgstr ""
-
-#: neutron/plugins/vmware/common/sync.py:672
-#, python-format
-msgid "Time elapsed at end of sync: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/common/utils.py:64
-#, python-format
-msgid "Specified name:'%s' exceeds maximum length. It will be truncated on NSX"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/db.py:76
-#, python-format
-msgid "Port mapping for %s already available"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/db.py:123
-#, python-format
-msgid "NSX identifiers for neutron port %s not yet stored in Neutron DB"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/db.py:134
-#, python-format
-msgid "NSX identifiers for neutron router %s not yet stored in Neutron DB"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/db.py:149
-#, python-format
-msgid "NSX identifiers for neutron security group %s not yet stored in Neutron DB"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/lsn_db.py:87
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:71
-#, python-format
-msgid "Unable to find Logical Service Node for network %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:46
-#, python-format
-msgid ""
-"Network Gateway '%(gateway_id)s' still has active mappings with one or "
-"more neutron networks."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:51
-#, python-format
-msgid "Network Gateway %(gateway_id)s could not be found"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:55
-#, python-format
-msgid ""
-"Network Gateway Device '%(device_id)s' is still used by one or more "
-"network gateways."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:60
-#, python-format
-msgid "Network Gateway Device %(device_id)s could not be found."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:64
-#, python-format
-msgid ""
-"Port '%(port_id)s' is owned by '%(device_owner)s' and therefore cannot be"
-" deleted directly via the port API."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:69
-#, python-format
-msgid ""
-"The specified mapping '%(mapping)s' is already in use on network gateway "
-"'%(gateway_id)s'."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:74
-#, python-format
-msgid ""
-"Multiple network connections found on '%(gateway_id)s' with provided "
-"criteria."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:79
-#, python-format
-msgid ""
-"The connection %(network_mapping_info)s was not found on the network "
-"gateway '%(network_gateway_id)s'"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:84
-#, python-format
-msgid "The network gateway %(gateway_id)s cannot be updated or deleted"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:192
-msgid ""
-"A network identifier must be specified when connecting a network to a "
-"network gateway. Unable to complete operation"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:198
-#, python-format
-msgid ""
-"Invalid keys found among the ones provided in request body: "
-"%(connection_attrs)s."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:206
-msgid "Cannot specify a segmentation id when the segmentation type is flat"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:210
-#, python-format
-msgid "Invalid segmentation id (%d) for vlan segmentation type"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:265
-#, python-format
-msgid "Created network gateway with id:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:277
-#, python-format
-msgid "Updated network gateway with id:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:292
-#, python-format
-msgid "Network gateway '%s' was destroyed."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:309
-#, python-format
-msgid "Connecting network '%(network_id)s' to gateway '%(network_gateway_id)s'"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:350
-#, python-format
-msgid ""
-"Requested network '%(network_id)s' not found.Unable to create network "
-"connection on gateway '%(network_gateway_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:358
-#, python-format
-msgid ""
-"Gateway port for '%(network_gateway_id)s' created on network "
-"'%(network_id)s':%(port_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:374
-#, python-format
-msgid "Ensured no Ip addresses are configured on port %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:384
-#, python-format
-msgid ""
-"Disconnecting network '%(network_id)s' from gateway "
-"'%(network_gateway_id)s'"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:478
-#, python-format
-msgid "Created network gateway device: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:489
-#, python-format
-msgid "Updated network gateway device: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/networkgw_db.py:502
-#, python-format
-msgid "Deleted network gateway device: %s."
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/qos_db.py:295
-#, python-format
-msgid "DSCP value (%s) will be ignored with 'trusted' marking"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/vcns_db.py:77
-#, python-format
-msgid "Rule Resource binding with id:%s not found!"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/vcns_db.py:94
-msgid "Rule Resource binding not found!"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/vcns_db.py:123
-#: neutron/plugins/vmware/dbexts/vcns_db.py:133
-#, python-format
-msgid "VIP Resource binding with id:%s not found!"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/vcns_db.py:162
-#, python-format
-msgid ""
-"Pool Resource binding with edge_id:%(edge_id)s pool_vseid:%(pool_vseid)s "
-"not found!"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/vcns_db.py:174
-#, python-format
-msgid "Pool Resource binding with id:%s not found!"
-msgstr ""
-
-#: neutron/plugins/vmware/dbexts/vcns_db.py:200
-#, python-format
-msgid "Monitor Resource binding with id:%s not found!"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:40
-msgid ""
-"Pull LSN information from NSX in case it is missing from the local data "
-"store. This is useful to rebuild the local store in case of server "
-"recovery."
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:82
-#, python-format
-msgid "Unable to create LSN for network %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:90
-#, python-format
-msgid "Unable to delete Logical Service Node %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:107
-#, python-format
-msgid ""
-"Unable to find Logical Service Node Port for LSN %(lsn_id)s and subnet "
-"%(subnet_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:129
-#, python-format
-msgid ""
-"Unable to find Logical Service Node Port for LSN %(lsn_id)s and mac "
-"address %(mac)s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:149
-#, python-format
-msgid "Unable to create port for LSN %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:157
-#, python-format
-msgid "Unable to delete LSN Port %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:174
-#, python-format
-msgid "Metadata port not found while attempting to delete it from network %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:177
-#, python-format
-msgid "Unable to find Logical Services Node Port with MAC %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:262
-#, python-format
-msgid ""
-"Unable to configure dhcp for Logical Service Node %(lsn_id)s and port "
-"%(lsn_port_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:283
-#, python-format
-msgid "Unable to configure metadata for subnet %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:305
-#, python-format
-msgid "Error while configuring LSN port %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:377
-#, python-format
-msgid "Unable to save LSN for network %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/lsnmanager.py:443
-#, python-format
-msgid "Unable to save LSN port for subnet %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/migration.py:81
-#, python-format
-msgid "Port %s is already gone"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/migration.py:112
-msgid "LSN already exist"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/migration.py:116
-msgid "Cannot migrate an external network"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/migration.py:125
-msgid "Cannot migrate a 'metadata' network"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/migration.py:128
-msgid "Unable to support multiple subnets per network"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:39
-msgid "Comma separated list of additional domain name servers"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:47
-msgid "Default DHCP lease time"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:55
-msgid "IP address used by Metadata server."
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:59
-msgid "TCP Port used by Metadata server."
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:136
-#, python-format
-msgid ""
-"Error while creating subnet %(cidr)s for network %(network)s. Please, "
-"contact administrator"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:206
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:224
-#, python-format
-msgid "Performing DHCP %(action)s for resource: %(resource)s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:211
-#, python-format
-msgid "Network %s is external: no LSN to create"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:219
-#, python-format
-msgid "Logical Services Node for network %s configured successfully"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:241
-#, python-format
-msgid "Error while configuring DHCP for port %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:253
-#, python-format
-msgid "DHCP is disabled for subnet %s: nothing to do"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:272
-#, python-format
-msgid "DHCP for port %s configured successfully"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:280
-#, python-format
-msgid "Network %s is external: nothing to do"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:288
-#, python-format
-msgid "Configuring metadata entry for port %s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:300
-#, python-format
-msgid "Metadata for port %s configured successfully"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:304
-#, python-format
-msgid "Handle metadata access via router: %(r)s and interface %(i)s"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/nsx.py:321
-#, python-format
-msgid "Metadata for router %s handled successfully"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/rpc.py:67
-#, python-format
-msgid "Subnet %s does not have a gateway, the metadata route will not be created"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/rpc.py:91
-msgid "Metadata access network is disabled"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/rpc.py:94
-msgid ""
-"Overlapping IPs must be enabled in order to setup the metadata access "
-"network"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/rpc.py:114
-#, python-format
-msgid ""
-"No router interface found for router '%s'. No metadata access network "
-"should be created or destroyed"
-msgstr ""
-
-#: neutron/plugins/vmware/dhcp_meta/rpc.py:122
-#, python-format
-msgid ""
-"An error occurred while operating on the metadata access network for "
-"router:'%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/networkgw.py:84
-msgid "Cannot create a gateway with an empty device list"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/networkgw.py:100
-#, python-format
-msgid "Unexpected keys found in device description:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/networkgw.py:104
-#, python-format
-msgid "%s: provided data are not iterable"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/networkgw.py:111
-msgid "A connector type is required to create a gateway device"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/networkgw.py:120
-#, python-format
-msgid "Unknown connector type: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/networkgw.py:127
-msgid "Number of network gateways allowed per tenant, -1 for unlimited"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:34
-msgid "Need to be admin in order to create queue called default"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:38
-msgid "Default queue already exists."
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:42
-#, python-format
-msgid "Invalid value for dscp %(data)s must be integer value between 0 and 63."
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:47
-msgid "The qos marking cannot be set to 'trusted' when the DSCP field is set"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:52
-msgid "Invalid bandwidth rate, min greater than max."
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:56
-#, python-format
-msgid "Invalid bandwidth rate, %(data)s must be a non negative integer."
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:61
-#, python-format
-msgid "Queue %(id)s does not exist"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:65
-msgid "Unable to delete queue attached to port."
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:69
-msgid "Port is not associated with lqueue"
-msgstr ""
-
-#: neutron/plugins/vmware/extensions/qos.py:80
-#, python-format
-msgid "'%s' must be a non negative integer."
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/__init__.py:80
-#, python-format
-msgid "Error. %(type)s exception: %(exc)s."
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/__init__.py:84
-#, python-format
-msgid "locals=[%s]"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/lsn.py:171
-#, python-format
-msgid ""
-"Attempt to plug Logical Services Node %(lsn)s into network with port "
-"%(port)s failed. PatchAttachment already exists with another port"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:252
-#, python-format
-msgid "Cannot update NSX routes %(routes)s for router %(router_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:346
-#, python-format
-msgid "Created logical port %(lport_uuid)s on logical router %(lrouter_uuid)s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:374
-#, python-format
-msgid "Updated logical port %(lport_uuid)s on logical router %(lrouter_uuid)s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:385
-#, python-format
-msgid ""
-"Delete logical router port %(lport_uuid)s on logical router "
-"%(lrouter_uuid)s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:449
-#, python-format
-msgid "Invalid keys for NAT match: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:455
-#, python-format
-msgid "Creating NAT rule: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:470
-msgid ""
-"No SNAT rules cannot be applied as they are not available in this version"
-" of the NSX platform"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:475
-msgid ""
-"No DNAT rules cannot be applied as they are not available in this version"
-" of the NSX platform"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:576
-#, python-format
-msgid ""
-"Found %(actual_rule_num)d matching NAT rules, which is not in the "
-"expected range (%(min_exp_rule_num)d,%(max_exp_rule_num)d)"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:622
-#, python-format
-msgid "Router Port %(lport_id)s not found on router %(lrouter_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/router.py:627
-#, python-format
-msgid ""
-"An exception occurred while updating IP addresses on a router logical "
-"port:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/secgroup.py:94
-#, python-format
-msgid "Created Security Profile: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/secgroup.py:120
-#, python-format
-msgid "Updated Security Profile: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/secgroup.py:140
-#, python-format
-msgid "Unable to find security profile %s on NSX backend"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:130
-#, python-format
-msgid "Created logical switch: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:150
-#: neutron/plugins/vmware/nsxlib/switch.py:165
-#, python-format
-msgid "Network not found, Error: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:188
-msgid "Port or Network not found"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:247
-#, python-format
-msgid "Lswitch %s not found in NSX"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:256
-msgid "Unable to get ports"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:273
-#, python-format
-msgid ""
-"Looking for port with q_port_id tag '%(neutron_port_id)s' on: "
-"'%(lswitch_uuid)s'"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:281
-#, python-format
-msgid ""
-"Found '%(num_ports)d' ports with q_port_id tag: '%(neutron_port_id)s'. "
-"Only 1 was expected."
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:290
-#, python-format
-msgid "get_port() %(network)s %(port)s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:298
-#: neutron/plugins/vmware/nsxlib/switch.py:329
-#, python-format
-msgid "Port or Network not found, Error: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:324
-#, python-format
-msgid "Updated logical port %(result)s on logical switch %(uuid)s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:359
-#, python-format
-msgid "Created logical port %(result)s on logical switch %(uuid)s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/switch.py:371
-#, python-format
-msgid "Port not found, Error: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/versioning.py:56
-msgid "Operation may not be supported"
-msgstr ""
-
-#: neutron/plugins/vmware/nsxlib/versioning.py:64
-msgid ""
-"NSX version is not set. Unable to complete request correctly. Check log "
-"for NSX communication errors."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:213
-#, python-format
-msgid "Unable to process default l2 gw service:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:248
-#, python-format
-msgid "Created NSX router port:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:250
-#: neutron/plugins/vmware/plugins/service.py:439
-#, python-format
-msgid "Unable to create port on NSX logical router %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:253
-#, python-format
-msgid ""
-"Unable to create logical router port for neutron port id %(port_id)s on "
-"router %(nsx_router_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:332
-#, python-format
-msgid "Attached %(att)s to NSX router port %(port)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:338
-#, python-format
-msgid ""
-"Unable to plug attachment in NSX logical router port %(r_port_id)s, "
-"associated with Neutron %(q_port_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:344
-#, python-format
-msgid ""
-"Unable to plug attachment in router port %(r_port_id)s for neutron port "
-"id %(q_port_id)s on router %(router_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:390
-msgid "An exception occurred while selecting logical switch for the port"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:430
-#, python-format
-msgid ""
-"An exception occurred while creating the neutron port %s on the NSX "
-"plaform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:442
-#: neutron/plugins/vmware/plugins/base.py:494
-#: neutron/plugins/vmware/plugins/base.py:692
-#, python-format
-msgid ""
-"NSX plugin does not support regular VIF ports on external networks. Port "
-"%s will be down."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:463
-#, python-format
-msgid ""
-"_nsx_create_port completed for port %(name)s on network %(network_id)s. "
-"The new port id is %(id)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:474
-#, python-format
-msgid ""
-"Concurrent network deletion detected; Back-end Port %(nsx_id)s creation "
-"to be rolled back for Neutron port: %(neutron_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:486
-#, python-format
-msgid "NSX Port %s already gone"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:501
-#, python-format
-msgid "Port '%s' was already deleted on NSX platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:508
-#, python-format
-msgid "_nsx_delete_port completed for port %(port_id)s on network %(net_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:513
-#, python-format
-msgid "Port %s not found in NSX"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:522
-#, python-format
-msgid ""
-"Neutron port %(port_id)s not found on NSX backend. Terminating delete "
-"operation. A dangling router port might have been left on router "
-"%(router_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:537
-#, python-format
-msgid ""
-"Ignoring exception as this means the peer for port '%s' has already been "
-"deleted."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:549
-#, python-format
-msgid ""
-"It is not allowed to create router interface ports on external networks "
-"as '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:574
-#, python-format
-msgid ""
-"_nsx_create_router_port completed for port %(name)s on network "
-"%(network_id)s. The new port id is %(id)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:587
-#, python-format
-msgid ""
-"device_id field must be populated in order to create an external gateway "
-"port for network %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:597
-#, python-format
-msgid "The gateway port for the NSX router %s was not found on the backend"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:638
-#, python-format
-msgid ""
-"_nsx_create_ext_gw_port completed on external network %(ext_net_id)s, "
-"attached to router:%(router_id)s. NSX port id is %(nsx_port_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:673
-#: neutron/plugins/vmware/plugins/base.py:1739
-#, python-format
-msgid "Logical router resource %s not found on NSX platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:677
-#: neutron/plugins/vmware/plugins/base.py:1743
-msgid "Unable to update logical routeron NSX Platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:679
-#, python-format
-msgid ""
-"_nsx_delete_ext_gw_port completed on external network %(ext_net_id)s, "
-"attached to NSX router:%(router_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:721
-#, python-format
-msgid ""
-"_nsx_create_l2_gw_port completed for port %(name)s on network "
-"%(network_id)s. The new port id is %(id)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:765
-#, python-format
-msgid "%s required"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:770
-msgid "Segmentation ID cannot be specified with flat network type"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:774
-msgid "Segmentation ID must be specified with vlan network type"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:778
-#: neutron/plugins/vmware/plugins/base.py:794
-#, python-format
-msgid "%(segmentation_id)s out of range (%(min_id)s through %(max_id)s)"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:800
-#, python-format
-msgid "%(net_type_param)s %(net_type_value)s not supported"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:845
-#, python-format
-msgid "No switch has available ports (%d checked)"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:879
-#, python-format
-msgid "Maximum number of logical ports reached for logical network %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:925
-#, python-format
-msgid ""
-"Network with admin_state_up=False are not yet supported by this plugin. "
-"Ignoring setting for network %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1003
-#, python-format
-msgid "The following logical switches were not found on the NSX backend:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1040
-msgid "admin_state_up=False networks are not supported."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1060
-#, python-format
-msgid "Unable to find NSX mappings for neutron network:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1067
-#, python-format
-msgid ""
-"Logical switch update on NSX backend failed. Neutron network "
-"id:%(net_id)s; NSX lswitch id:%(lswitch_id)s;Error:%(error)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1138
-#, python-format
-msgid "port created on NSX backend for tenant %(tenant_id)s: (%(id)s)"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1141
-#, python-format
-msgid "Logical switch for network %s was not found in NSX."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1152
-msgid "Unable to create port or set port attachment in NSX."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1240
-#, python-format
-msgid "Updating port: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1275
-#, python-format
-msgid "Unable to update port id: %s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1358
-msgid ""
-"Cannot create a distributed router with the NSX platform currently in "
-"execution. Please, try without specifying the 'distributed' attribute."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1364
-msgid "Unable to create logical router on NSX Platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1375
-#, python-format
-msgid ""
-"Unable to create L3GW port on logical router %(router_uuid)s. Verify "
-"Default Layer-3 Gateway service %(def_l3_gw_svc)s id is correct"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1385
-#, python-format
-msgid "Unable to create router %s on NSX backend"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1414
-#: neutron/plugins/vmware/plugins/base.py:1499
-#: neutron/plugins/vmware/plugins/service.py:201
-#: neutron/plugins/vmware/plugins/service.py:1240
-#, python-format
-msgid "Network '%s' is not a valid external network"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1463
-#, python-format
-msgid "Failed to set gateway info for router being created:%s - removing router"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1466
-#, python-format
-msgid ""
-"Create router failed while setting external gateway. Router:%s has been "
-"removed from DB and backend"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1508
-msgid ""
-"'routes' cannot contain route '0.0.0.0/0', this must be updated through "
-"the default gateway attribute"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1524
-#, python-format
-msgid "Logical router %s not found on NSX Platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1528
-msgid "Unable to update logical router on NSX Platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1530
-msgid ""
-"Request cannot contain 'routes' with the NSX platform currently in "
-"execution. Please, try without specifying the static routes."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1587
-#, python-format
-msgid "Logical router '%s' not found on NSX Platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1591
-#, python-format
-msgid "Unable to delete logical router '%s' on NSX Platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1601
-#, python-format
-msgid ""
-"Unable to remove NSX mapping for Neutron router %(router_id)s because of "
-"the following exception:%(d_exc)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1676
-#, python-format
-msgid ""
-"Add_router_interface completed for subnet:%(subnet_id)s and "
-"router:%(router_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1775
-#, python-format
-msgid ""
-"An error occurred while removing NAT rules on the NSX platform for "
-"floating ip:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1780
-msgid "An incorrect number of matching NAT rules was found on the NSX platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1922
-#, python-format
-msgid ""
-"An error occurred while creating NAT rules on the NSX platform for "
-"floating ip:%(floating_ip)s mapped to internal ip:%(internal_ip)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1928
-msgid "Failed to update NAT rules for floatingip update"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1967
-#, python-format
-msgid "The port '%s' is not associated with floating IPs"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1970
-#, python-format
-msgid "Nat rules not found in nsx for port: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2010
-#, python-format
-msgid "Unable to create l2_gw_service for: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2033
-msgid ""
-"Unable to remove gateway service from NSX plaform - the resource was not "
-"found"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2062
-#, python-format
-msgid "Unable to update name on NSX backend for network gateway: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2134
-#: neutron/plugins/vmware/plugins/base.py:2172
-#, python-format
-msgid ""
-"Neutron gateway device: %(neutron_id)s; NSX transport node identifier: "
-"%(nsx_id)s; Operational status: %(status)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2269
-#, python-format
-msgid ""
-"Removal of gateway device: %(neutron_id)s failed on NSX backend (NSX "
-"id:%(nsx_id)s) because the NSX resource was not found"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2276
-#, python-format
-msgid ""
-"Removal of gateway device: %(neutron_id)s failed on NSX backend (NSX "
-"id:%(nsx_id)s). Neutron and NSX states have diverged."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2324
-#, python-format
-msgid ""
-"Error while updating security profile %(uuid)s with name %(name)s: "
-"%(error)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2356
-#, python-format
-msgid ""
-"The NSX security profile %(sec_profile_id)s, associated with the Neutron "
-"security group %(sec_group_id)s was not found on the backend"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2364
-#, python-format
-msgid ""
-"An exception occurred while removing the NSX security profile "
-"%(sec_profile_id)s, associated with Netron security group "
-"%(sec_group_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2371
-#, python-format
-msgid "Unable to remove security group %s from backend"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2384
-#, python-format
-msgid "Port values not valid for protocol: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:144
-#, python-format
-msgid "EDGE: router = %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:175
-msgid "EDGE: _vcns_create_ext_gw_port"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:184
-msgid "EDGE: _vcns_delete_ext_gw_port"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:339
-#, python-format
-msgid "VCNS: delete default gateway %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:424
-#, python-format
-msgid "An exception occurred while creating a port on lswitch %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:472
-#, python-format
-msgid "Unable to create integration logic switch for router %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:482
-#, python-format
-msgid "Unable to add router interface to integration lswitch for router %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:492
-#, python-format
-msgid "Unable to create advance service router for %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:541
-#, python-format
-msgid "Did not found lswitch %s in NSX"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:887
-#, python-format
-msgid "Failed to create firewall on vShield Edge bound on router %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:895
-msgid "Bad Firewall request Input"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:910
-#: neutron/plugins/vmware/plugins/service.py:1226
-msgid "router_id is not provided!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:914
-#: neutron/plugins/vmware/plugins/service.py:1614
-#, python-format
-msgid "router_id:%s is not an advanced router!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:919
-msgid "A firewall is already associated with the router"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1116
-#, python-format
-msgid "Failed to find the edge with vip_id: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1153
-#, python-format
-msgid ""
-"Operation can't be performed, Since resource %(model)s : %(id)s is in "
-"DELETEing status!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1162
-#, python-format
-msgid "Resource %(model)s : %(id)s not found!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1187
-#, python-format
-msgid "Failed to create healthmonitor associated with pool id: %s!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1204
-msgid "Failed to create pool on vshield edge"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1223
-msgid "create_vip() called"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1231
-#, python-format
-msgid "router_id: %s is not an advanced router!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1264
-msgid "Failed to create vip!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1304
-#, python-format
-msgid "Failed to update vip with id: %s!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1321
-#, python-format
-msgid "Failed to delete vip with id: %s!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1377
-#, python-format
-msgid "Failed to update pool with id: %s!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1399
-#: neutron/plugins/vmware/plugins/service.py:1446
-#: neutron/plugins/vmware/plugins/service.py:1469
-msgid "Failed to update pool with the member"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1425
-msgid "Failed to update old pool with the member"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1489
-#, python-format
-msgid "Failed to update monitor with id: %s!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1499
-msgid "Vcns right now can only support one monitor per pool"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1528
-msgid "Failed to associate monitor with pool!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1559
-msgid "Failed to update pool with pool_monitor!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1576
-#, python-format
-msgid ""
-"Failed to update ipsec vpn configuration on edge, since the router: %s "
-"does not have a gateway yet!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1601
-msgid "Bad or unsupported Input request!"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1604
-#, python-format
-msgid ""
-"Failed to update ipsec VPN configuration with vpnservice: "
-"%(vpnservice_id)s on vShield Edge: %(edge_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1611
-msgid "create_vpnservice() called"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1619
-#, python-format
-msgid "a vpnservice is already associated with the router: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1732
-#, python-format
-msgid "Start deploying %(edge_id)s for router %(name)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1756
-#, python-format
-msgid "Router %s not found"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1759
-#, python-format
-msgid "Successfully deployed %(edge_id)s for router %(name)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1775
-#, python-format
-msgid "Failed to deploy Edge for router %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1791
-#, python-format
-msgid "interface_update_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1794
-#, python-format
-msgid "snat_create_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1797
-#, python-format
-msgid "snat_delete_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1800
-#, python-format
-msgid "dnat_create_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1803
-#, python-format
-msgid "dnat_delete_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1806
-#, python-format
-msgid "routes_update_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1809
-#, python-format
-msgid "nat_update_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/shell/commands.py:24
-#, python-format
-msgid ""
-"\n"
-"Service type = %s\n"
-msgstr ""
-
-#: neutron/plugins/vmware/shell/commands.py:27
-#, python-format
-msgid "Service uuids = %s\n"
-msgstr ""
-
-#: neutron/plugins/vmware/shell/commands.py:28
-#, python-format
-msgid ""
-"Port uuids = %s\n"
-"\n"
-msgstr ""
-
-#: neutron/plugins/vmware/shell/commands.py:37
-msgid "ID or name of network to run report on"
-msgstr ""
-
-#: neutron/plugins/vmware/shell/commands.py:46
-msgid "Migration report is:\n"
-msgstr ""
-
-#: neutron/plugins/vmware/shell/commands.py:56
-msgid "ID or name of network to migrate"
-msgstr ""
-
-#: neutron/plugins/vmware/shell/commands.py:66
-msgid "Migration has been successful:\n"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:135
-#, python-format
-msgid ""
-"VCNS: Failed to get edge status:\n"
-"%s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:162
-#, python-format
-msgid "VCNS: start updating vnic %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:167
-#, python-format
-msgid ""
-"VCNS: Failed to update vnic %(config)s:\n"
-"%(response)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:173
-#, python-format
-msgid "VCNS: Failed to update vnic %d"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:181
-#, python-format
-msgid "VCNS: update vnic %(index)d: %(addr)s %(netmask)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:190
-#, python-format
-msgid "Vnic %d currently not supported"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:211
-#, python-format
-msgid "VCNS: start deploying edge %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:219
-#, python-format
-msgid "VCNS: deploying edge %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:224
-#, python-format
-msgid "VCNS: deploy edge failed for router %s."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:243
-#, python-format
-msgid "VCNS: Edge %s status query failed."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:248
-#, python-format
-msgid "VCNS: Unable to retrieve edge %(edge_id)s status. Retry %(retries)d."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:255
-#, python-format
-msgid "VCNS: Unable to retrieve edge %s status. Abort."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:259
-#, python-format
-msgid "VCNS: Edge %s status"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:266
-#, python-format
-msgid "VCNS: Failed to deploy edge %(edge_id)s for %(name)s, status %(status)d"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:273
-#, python-format
-msgid "VCNS: Edge %(edge_id)s deployed for router %(name)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:280
-#, python-format
-msgid "VCNS: start destroying edge %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:288
-#, python-format
-msgid ""
-"VCNS: Failed to delete %(edge_id)s:\n"
-"%(response)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:294
-#, python-format
-msgid "VCNS: Failed to delete %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:304
-#, python-format
-msgid ""
-"VCNS: Failed to get edges:\n"
-"%s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:382
-#, python-format
-msgid ""
-"VCNS: Failed to get nat config:\n"
-"%s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:389
-#, python-format
-msgid "VCNS: start creating nat rules: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:405
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:530
-#, python-format
-msgid ""
-"VCNS: Failed to create snat rule:\n"
-"%s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:413
-#, python-format
-msgid "VCNS: create snat rule %(src)s/%(translated)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:436
-#, python-format
-msgid "VCNS: start deleting %(type)s rules: %(addr)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:447
-#, python-format
-msgid ""
-"VCNS: Failed to delete snat rule:\n"
-"%s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:454
-#, python-format
-msgid "VCNS: delete snat rule %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:472
-#, python-format
-msgid "VCNS: create dnat rule %(dst)s/%(translated)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:493
-#, python-format
-msgid "VCNS: delete dnat rule %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:517
-#, python-format
-msgid "VCNS: start updating nat rules: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:538
-#, python-format
-msgid ""
-"VCNS: update nat rule\n"
-"SNAT:%(snat)s\n"
-"DNAT:%(dnat)s\n"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:576
-#, python-format
-msgid "VCNS: start updating routes for %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:600
-#, python-format
-msgid ""
-"VCNS: Failed to update routes:\n"
-"%s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:652
-msgid "Failed to get service config"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:664
-msgid "Failed to enable loadbalancer service config"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:41
-#, python-format
-msgid "Invalid action value %s in a firewall rule"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:50
-#, python-format
-msgid "Invalid action value %s in a vshield firewall rule"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:190
-#, python-format
-msgid "Failed to get firewall with edge id: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:208
-#, python-format
-msgid "No rule id:%s found in the edge_firewall_binding"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:218
-#, python-format
-msgid "Failed to get firewall rule: %(rule_id)s with edge_id: %(edge_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:234
-#, python-format
-msgid "Failed to update firewall with edge_id: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:246
-#, python-format
-msgid "Failed to delete firewall with edge_id:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:260
-#, python-format
-msgid "Failed to update firewall rule: %(rule_id)s with edge_id: %(edge_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:273
-#, python-format
-msgid "Failed to delete firewall rule: %(rule_id)s with edge_id: %(edge_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:290
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:318
-#, python-format
-msgid "Failed to add firewall rule above: %(rule_id)s with edge_id: %(edge_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:329
-#, python-format
-msgid "Failed to append a firewall rulewith edge_id: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:350
-msgid "Can't execute insert rule operation without reference rule_id"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:50
-#, python-format
-msgid ""
-"Unsupported ike_version: %s! Only 'v1' ike version is supported on "
-"vshield Edge!"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:64
-msgid ""
-"IKEPolicy and IPsecPolicy should have consistent auth_algorithm, "
-"encryption_algorithm and pfs for VSE!"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:72
-#, python-format
-msgid ""
-"Unsupported encryption_algorithm: %s! '3des', 'aes-128' and 'aes-256' are"
-" supported on VSE right now."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:81
-#, python-format
-msgid "Unsupported pfs: %s! 'group2' and 'group5' are supported on VSE right now."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:89
-#, python-format
-msgid ""
-"Unsupported transform protocol: %s! 'esp' is supported by default on VSE "
-"right now."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:98
-#, python-format
-msgid ""
-"Unsupported encapsulation mode: %s! 'tunnel' is supported by default on "
-"VSE right now."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:136
-#, python-format
-msgid "Failed to update ipsec vpn configuration with edge_id: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:143
-#, python-format
-msgid "IPsec config not found on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_ipsecvpn_driver.py:146
-#, python-format
-msgid "Failed to delete ipsec vpn configuration with edge_id: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:154
-#, python-format
-msgid "Invalid %(protocol)s persistence method: %(type)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:180
-#, python-format
-msgid "Failed to create app profile on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:191
-#, python-format
-msgid "Failed to create vip on vshield edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:209
-#, python-format
-msgid "vip_binding not found with id: %(id)s edge_id: %(edge_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:226
-msgid "Failed to get vip on edge"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:243
-#, python-format
-msgid "Failed to update app profile on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:251
-#, python-format
-msgid "Failed to update vip on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:262
-#, python-format
-msgid "vip not found on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:265
-#, python-format
-msgid "Failed to delete vip on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:270
-#, python-format
-msgid "app profile not found on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:273
-#, python-format
-msgid "Failed to delete app profile on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:284
-msgid "Failed to create pool"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:301
-#, python-format
-msgid "pool_binding not found with id: %(id)s edge_id: %(edge_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:311
-msgid "Failed to get pool on edge"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:323
-msgid "Failed to update pool"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:333
-msgid "Failed to delete pool"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:343
-#, python-format
-msgid "Failed to create monitor on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:361
-#, python-format
-msgid "monitor_binding not found with id: %(id)s edge_id: %(edge_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:371
-#, python-format
-msgid "Failed to get monitor on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:388
-#, python-format
-msgid "Failed to update monitor on edge: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:399
-msgid "Failed to delete monitor"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/vcns.py:54
-#, python-format
-msgid "VcnsApiHelper('%(method)s', '%(uri)s', '%(body)s')"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/vcns.py:62
-#, python-format
-msgid "Header: '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/vcns.py:63
-#, python-format
-msgid "Content: '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:35
-#, python-format
-msgid "%(resource)s not found: %(msg)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:39
-#, python-format
-msgid "An unknown exception %(status)s occurred: %(response)s."
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:50
-#, python-format
-msgid "Resource %(uri)s has been redirected"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:54
-#, python-format
-msgid "Request %(uri)s is Bad, response %(response)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:58
-#, python-format
-msgid "Forbidden: %(uri)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:62
-#, python-format
-msgid "Resource %(uri)s not found"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:66
-#, python-format
-msgid "Media Type %(uri)s is not supported"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:70
-#, python-format
-msgid "Service Unavailable: %(uri)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:46
-#, python-format
-msgid "Invalid state %(state)d"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:50
-#, python-format
-msgid "State %(state)d skipped. Current state %(current)d"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:96
-#, python-format
-msgid "Task %(task)s encountered exception in %(func)s at state %(state)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:182
-#, python-format
-msgid "Start task %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:188
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:208
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:231
-#, python-format
-msgid "Task %(task)s encountered exception in %(cb)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:194
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:213
-#, python-format
-msgid "Task %(task)s return %(status)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:296
-msgid "Stopping TaskManager"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:321
-msgid "TaskManager terminating because of an exception"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:343
-msgid "TaskManager terminated"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:375
-msgid "Exception in _check_pending_tasks"
-msgstr ""
-
-#: neutron/scheduler/dhcp_agent_scheduler.py:51
-#, python-format
-msgid "Agent %s already present"
-msgstr ""
-
-#: neutron/scheduler/dhcp_agent_scheduler.py:52
-#, python-format
-msgid ""
-"Network %(network_id)s is scheduled to be hosted by DHCP agent "
-"%(agent_id)s"
-msgstr ""
-
-#: neutron/scheduler/dhcp_agent_scheduler.py:70
-#, python-format
-msgid "Network %s is hosted already"
-msgstr ""
-
-#: neutron/scheduler/dhcp_agent_scheduler.py:79
-#: neutron/scheduler/dhcp_agent_scheduler.py:88
-msgid "No more DHCP agents"
-msgstr ""
-
-#: neutron/scheduler/dhcp_agent_scheduler.py:108
-msgid "No non-hosted networks"
-msgstr ""
-
-#: neutron/scheduler/dhcp_agent_scheduler.py:119
-#, python-format
-msgid "DHCP agent %s is not active"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:156
-#, python-format
-msgid "No routers compatible with L3 agent configuration on host %s"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:173
-#, python-format
-msgid "Router %(router_id)s has already been hosted by L3 agent %(agent_id)s"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:181
-msgid "No active L3 agents"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:193
-#, python-format
-msgid "No L3 agents can host the router %s"
-msgstr ""
-
-#: neutron/server/__init__.py:42
-msgid ""
-"ERROR: Unable to find configuration file via the default search paths "
-"(~/.neutron/, ~/, /etc/neutron/, /etc/) and the '--config-file' option!"
-msgstr ""
-
-#: neutron/server/__init__.py:54
-msgid "RPC was already started in parent process by plugin."
-msgstr ""
-
-#: neutron/server/__init__.py:66
-#, python-format
-msgid "ERROR: %s"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:27
-msgid ""
-"Defines providers for advanced services using the format: "
-"<service_type>:<name>:<driver>[:default]"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:45
-#, python-format
-msgid "Provider name is limited by 255 characters: %s"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:54
-msgid "Invalid service provider format"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:62
-#, python-format
-msgid "Invalid provider format. Last part should be 'default' or empty: %s"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:68
-#, python-format
-msgid "Service type '%(svc_type)s' is not allowed, allowed types: %(allowed)s"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:82
-#, python-format
-msgid ""
-"Service provider '%(provider)s' could not be found for service type "
-"%(service_type)s"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:87
-#, python-format
-msgid "Service type %(service_type)s does not have a default service provider"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:92
-#, python-format
-msgid ""
-"Resource '%(resource_id)s' is already associated with provider "
-"'%(provider)s' for service type '%(service_type)s'"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:105
-#, python-format
-msgid "Driver %s is not unique across providers"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:115
-#, python-format
-msgid "Multiple default providers for service %s"
-msgstr ""
-
-#: neutron/services/provider_configuration.py:126
-#, python-format
-msgid "Multiple providers specified for service %s"
-msgstr ""
-
-#: neutron/services/service_base.py:70
-#, python-format
-msgid "No providers specified for '%s' service, exiting"
-msgstr ""
-
-#: neutron/services/service_base.py:81
-#, python-format
-msgid "Loaded '%(provider)s' provider for service %(service_type)s"
-msgstr ""
-
-#: neutron/services/service_base.py:87
-#, python-format
-msgid "Error loading provider '%(provider)s' for service %(service_type)s"
-msgstr ""
-
-#: neutron/services/service_base.py:98
-#, python-format
-msgid "Default provider is not specified for service type %s"
-msgstr ""
-
-#: neutron/services/firewall/fwaas_plugin.py:42
-msgid "set_firewall_status() called"
-msgstr ""
-
-#: neutron/services/firewall/fwaas_plugin.py:50
-#, python-format
-msgid "Firewall %(fw_id)s in PENDING_DELETE state, not changing to %(status)s"
-msgstr ""
-
-#: neutron/services/firewall/fwaas_plugin.py:63
-msgid "firewall_deleted() called"
-msgstr ""
-
-#: neutron/services/firewall/fwaas_plugin.py:71
-#, python-format
-msgid "Firewall %(fw)s unexpectedly deleted by agent, status was %(status)s"
-msgstr ""
-
-#: neutron/services/firewall/fwaas_plugin.py:79
-msgid "get_firewalls_for_tenant() called"
-msgstr ""
-
-#: neutron/services/firewall/fwaas_plugin.py:88
-msgid "get_firewalls_for_tenant_without_rules() called"
-msgstr ""
-
-#: neutron/services/firewall/fwaas_plugin.py:94
-msgid "get_tenants_with_firewalls() called"
-msgstr ""
-
-#: neutron/services/firewall/fwaas_plugin.py:139
-#, python-format
-msgid ""
-"Exceeded allowed count of firewalls for tenant %(tenant_id)s. Only one "
-"firewall is supported per tenant."
-msgstr ""
-
-#: neutron/services/firewall/agents/firewall_agent_api.py:31
-msgid "Name of the FWaaS Driver"
-msgstr ""
-
-#: neutron/services/firewall/agents/firewall_agent_api.py:35
-msgid "Enable FWaaS"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:43
-msgid "Retrieve Firewall with rules from Plugin"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:51
-msgid "Retrieve Tenants with Firewalls configured from Plugin"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:62
-msgid "Initializing firewall agent"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:73
-msgid ""
-"FWaaS plugin is configured in the server side, but FWaaS is disabled in "
-"L3-agent."
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:83
-#, python-format
-msgid "FWaaS Driver Loaded: '%s'"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:86
-#, python-format
-msgid "Error importing FWaaS device driver: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:123
-#, python-format
-msgid "%(func_name)s from agent for fw: %(fwid)s"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:131
-#, python-format
-msgid "No Routers on tenant: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:138
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:278
-#, python-format
-msgid "Apply fw on Router List: '%s'"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:151
-#, python-format
-msgid "Firewall Driver Error for %(func_name)s for fw: %(fwid)s"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:166
-#, python-format
-msgid "FWaaS RPC failure in %(func_name)s for fw: %(fwid)s"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:186
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:205
-#, python-format
-msgid "Firewall Driver Error on fw state %(fwmsg)s for fw: %(fwid)s"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:217
-#, python-format
-msgid "Process router add, router_id: '%s'"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:228
-#, python-format
-msgid "Process router add, fw_list: '%s'"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:245
-#, python-format
-msgid "FWaaS RPC info call failed for '%s'."
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:260
-#, python-format
-msgid "Tenants with Firewalls: '%s'"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:270
-#, python-format
-msgid "Router List: '%s'"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:272
-#, python-format
-msgid "fw_list: '%s'"
-msgstr ""
-
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:289
-msgid "Failed fwaas process services sync"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:29
-msgid "vArmour director ip"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:31
-msgid "vArmour director port"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:33
-msgid "vArmour director username"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:35
-msgid "vArmour director password"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:45
-msgid "An unknown exception."
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:59
-msgid "Invalid login credential."
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:65
-msgid "vArmourRestAPI: started"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:98
-#, python-format
-msgid "vArmourRestAPI: %(server)s %(port)s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:104
-#, python-format
-msgid "vArmourRestAPI Sending: %(method)s %(action)s %(headers)s %(body_data)s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:115
-#, python-format
-msgid "vArmourRestAPI Response: %(status)s %(resp_str)s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_api.py:123
-msgid "vArmourRestAPI: Could not establish HTTP connection"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:50
-msgid "vArmourL3NATAgent: __init__"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:64
-#, python-format
-msgid "_router_added: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:71
-#, python-format
-msgid "_router_removed: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:112
-#, python-format
-msgid "_va_unset_zone_interfaces: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:144
-#, python-format
-msgid "_va_set_interface_ip: %(pif)s %(cidr)s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:164
-#, python-format
-msgid "_va_config_trusted_zone: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:195
-#, python-format
-msgid "_va_config_untrusted_zone: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:210
-#, python-format
-msgid "_va_config_untrusted_zone: gw=%r"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:223
-#, python-format
-msgid "_va_config_router_snat_rules: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:255
-#, python-format
-msgid "_va_config_floating_ips: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:277
-#, python-format
-msgid "process_router: %s"
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:288
-msgid "Unable to parse interface mapping."
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:291
-msgid "Unable to read interface mapping."
-msgstr ""
-
-#: neutron/services/firewall/agents/varmour/varmour_router.py:310
-#, python-format
-msgid "external_gateway_added: %s"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:51
-msgid "Initializing fwaas iptables driver"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:54
-#, python-format
-msgid "Creating firewall %(fw_id)s for tenant %(tid)s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:63
-#, python-format
-msgid "Failed to create firewall: %s"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:92
-#, python-format
-msgid "Deleting firewall %(fw_id)s for tenant %(tid)s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:107
-#, python-format
-msgid "Failed to delete firewall: %s"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:111
-#, python-format
-msgid "Updating firewall %(fw_id)s for tenant %(tid)s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:120
-#, python-format
-msgid "Failed to update firewall: %s"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:124
-#, python-format
-msgid "Applying firewall %(fw_id)s for tenant %(tid)s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:145
-#, python-format
-msgid "Failed to apply default policy on firewall: %s"
-msgstr ""
-
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:28
-msgid "Initializing fwaas vArmour driver"
-msgstr ""
-
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:33
-#, python-format
-msgid "create_firewall (%s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:38
-#, python-format
-msgid "update_firewall (%s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:46
-#, python-format
-msgid "delete_firewall (%s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:51
-#, python-format
-msgid "apply_default_policy (%s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:61
-#, python-format
-msgid "Updating firewall (%s)"
-msgstr ""
-
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:110
-msgid "Unsupported IP version rule."
-msgstr ""
-
-#: neutron/services/l3_router/l3_apic.py:60
-msgid "L3 Router Service Plugin for basic L3 using the APIC"
-msgstr ""
-
-#: neutron/services/l3_router/l3_arista.py:116
-#, python-format
-msgid "Error creating router on Arista HW router=%s "
-msgstr ""
-
-#: neutron/services/l3_router/l3_arista.py:139
-#, python-format
-msgid "Error updating router on Arista HW router=%s "
-msgstr ""
-
-#: neutron/services/l3_router/l3_arista.py:154
-#, python-format
-msgid "Error deleting router on Arista HW router %(r)s exception=%(e)s"
-msgstr ""
-
-#: neutron/services/l3_router/l3_arista.py:200
-#, python-format
-msgid "Error Adding subnet %(subnet)s to router %(router_id)s on Arista HW"
-msgstr ""
-
-#: neutron/services/l3_router/l3_arista.py:234
-#, python-format
-msgid ""
-"Error removing interface %(interface)s from router %(router_id)s on "
-"Arista HWException =(exc)s"
-msgstr ""
-
-#: neutron/services/l3_router/l3_arista.py:249
-msgid "Syncing Neutron Router DB <-> EOS"
-msgstr ""
-
-#: neutron/services/l3_router/l3_arista.py:280
-#, python-format
-msgid "Error Adding interface %(subnet_id)s to router %(router_id)s on Arista HW"
-msgstr ""
-
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:42
-msgid "Rbridge id of provider edge router(s)"
-msgstr ""
-
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:73
-#: neutron/tests/unit/ml2/drivers/brocade/test_brocade_l3_plugin.py:44
-#, python-format
-msgid "rbridge id %s"
-msgstr ""
-
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:154
-#, python-format
-msgid "BrocadeSVIPlugin.add_router_interface ports_count %d"
-msgstr ""
-
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:162
-msgid "BrocadeSVIPlugin: adding redundant router interface is not supported"
-msgstr ""
-
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:164
-msgid "BrocadeSVIPlugin:adding redundant router interface is not supported"
-msgstr ""
-
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:177
-#, python-format
-msgid ""
-"Failed to create Brocade resources to add router interface. "
-"info=%(info)s, router_id=%(router_id)s"
-msgstr ""
-
-#: neutron/services/l3_router/brocade/l3_router_plugin.py:223
-#, python-format
-msgid ""
-"Fail remove of interface from brocade router interface. info=%(info)s, "
-"router_id=%(router_id)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent_scheduler.py:101
-#, python-format
-msgid "Pool %(pool_id)s has already been hosted by lbaas agent %(agent_id)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent_scheduler.py:109
-#, python-format
-msgid "No active lbaas agents for pool %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent_scheduler.py:115
-#, python-format
-msgid "No lbaas agent supporting device driver %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent_scheduler.py:124
-#, python-format
-msgid "Pool %(pool_id)s is scheduled to lbaas agent %(agent_id)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/plugin.py:80
-#, python-format
-msgid "Delete associated loadbalancer pools before removing providers %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/plugin.py:89
-#, python-format
-msgid "Error retrieving driver for provider %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/plugin.py:97
-#, python-format
-msgid "Error retrieving provider for pool %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/plugin.py:188
-#, python-format
-msgid "Failed to delete pool %s, putting it in ERROR state"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent.py:36
-msgid "Seconds between periodic task runs"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:39
-msgid "Drivers used to manage loadbalancing devices"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:45
-#, python-format
-msgid "Unknown device with pool_id %(pool_id)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:94
-#, python-format
-msgid "Error importing loadbalancer device driver: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:101
-#, python-format
-msgid "Multiple device drivers with the same name found: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:141
-#, python-format
-msgid "Error updating statistics on pool %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:157
-msgid "Unable to retrieve ready devices"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:174
-#: neutron/services/loadbalancer/agent/agent_manager.py:239
-#, python-format
-msgid "No device driver on agent: %s."
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:184
-#, python-format
-msgid "Unable to deploy instance for pool: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:194
-#, python-format
-msgid "Unable to destroy device for pool: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:207
-#, python-format
-msgid "%(operation)s %(obj)s %(id)s failed on device driver %(driver)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:333
-#, python-format
-msgid "Destroying pool %s due to agent disabling"
-msgstr ""
-
-#: neutron/services/loadbalancer/agent/agent_manager.py:336
-#, python-format
-msgid "Agent_updated by server side %s!"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:40
-msgid "Driver to use for scheduling pool to a default loadbalancer agent"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:48
-msgid "Device driver for agent should be specified in plugin driver."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:72
-#, python-format
-msgid "Multiple lbaas agents found on host %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:152
-#, python-format
-msgid "Unknown object type: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:163
-#, python-format
-msgid ""
-"Cannot update status: %(obj_type)s %(obj_id)s not found in the DB, it was"
-" probably deleted concurrently"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:186
-#, python-format
-msgid "Unable to find port %s to plug."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:210
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:227
-#, python-format
-msgid ""
-"Unable to find port %s to unplug. This can occur when the Vip has been "
-"deleted first."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/config.py:32
-msgid "Load Balancer image id (Embrane LB)"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/config.py:34
-msgid "In band Security Zone id for LBs"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/config.py:36
-msgid "Out of band Security Zone id for LBs"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/config.py:38
-msgid "Management Security Zone id for LBs"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/config.py:40
-msgid "Dummy user traffic Security Zone id for LBs"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/config.py:44
-msgid "choose LB image flavor to use, accepted values: small, medium"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/config.py:47
-msgid "resource synchronization interval in seconds"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:51
-#, python-format
-msgid "%s, probably was cancelled through the heleos UI"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:58
-#, python-format
-msgid ""
-"Failed to delete the backend load balancer for reason %s. Please remove "
-"it manually through the heleos UI"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:61
-#, python-format
-msgid ""
-"No subnet is associated to member %s (required to identify the proper "
-"load balancer port)"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/driver.py:87
-msgid "Connection limit is not supported by Embrane LB"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/driver.py:93
-#, python-format
-msgid "Session persistence %s not supported by Embrane LBaaS"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/driver.py:131
-#, python-format
-msgid "Subnet assigned to pool %s doesn't exist, backend port can't be created"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/embrane/agent/lb_operations.py:111
-#, python-format
-msgid ""
-"The load balancer %s had no physical representation, likely already "
-"deleted"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:46
-msgid "Location to store config and state files"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:53
-msgid "The user group"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:59
-msgid ""
-"When delete and re-add the same vip, send this many gratuitous ARPs to "
-"flush the ARP cache in the Router. Set it below or equal to 0 to disable "
-"this feature."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:76
-#, python-format
-msgid "Error importing interface driver: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:172
-#, python-format
-msgid "Stats socket not found for pool %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:214
-#, python-format
-msgid "Error while connecting to stats socket: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:393
-#, python-format
-msgid "Unable to kill haproxy process: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:43
-#, python-format
-msgid "NCC Error %d"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:54
-msgid "No NetScaler Control Center URI specified. Cannot connect."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:133
-#, python-format
-msgid "Connection error occurred while connecting to %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:138
-#, python-format
-msgid "SSL error occurred while connecting to %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:143
-#, python-format
-msgid "Request to %s timed out"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:150
-msgid "Request did not specify a valid URL"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:154
-#, python-format
-msgid "Too many redirects occurred for request to %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:158
-#, python-format
-msgid "A request error while connecting to %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:163
-#, python-format
-msgid "A unknown error occurred during request to %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:168
-#, python-format
-msgid "Response: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:171
-#, python-format
-msgid "Unable to login. Invalid credentials passed.for: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/ncc_client.py:175
-#, python-format
-msgid "Failed %(method)s operation on %(url)s status code: %(response_status)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:29
-msgid "The URL to reach the NetScaler Control Center Server."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:33
-msgid "Username to login to the NetScaler Control Center Server."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:37
-msgid "Password to login to the NetScaler Control Center Server."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:75
-#, python-format
-msgid "NetScaler driver vip creation: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:90
-#, python-format
-msgid "NetScaler driver vip %(vip_id)s update: %(vip_obj)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:105
-#, python-format
-msgid "NetScaler driver vip removal: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:126
-#, python-format
-msgid "NetScaler driver pool creation: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:141
-#, python-format
-msgid "NetScaler driver pool %(pool_id)s update: %(pool_obj)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:156
-#, python-format
-msgid "NetScaler driver pool removal: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:173
-#, python-format
-msgid "NetScaler driver poolmember creation: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:191
-#, python-format
-msgid "NetScaler driver poolmember %(member_id)s update: %(member_obj)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:208
-#, python-format
-msgid "NetScaler driver poolmember removal: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:226
-#, python-format
-msgid ""
-"NetScaler driver healthmonitor creation for pool %(pool_id)s: "
-"%(monitor_obj)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:249
-#, python-format
-msgid "NetScaler driver healthmonitor %(monitor_id)s update: %(monitor_obj)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:270
-#, python-format
-msgid "NetScaler driver healthmonitor %(monitor_id)sremoval for pool %(pool_id)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:290
-#, python-format
-msgid "NetScaler driver pool stats retrieval: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:415
-#, python-format
-msgid ""
-"Filtering ports based on network_id=%(network_id)s, "
-"tenant_id=%(tenant_id)s, device_id=%(device_id)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:430
-#, python-format
-msgid "Found an existing SNAT port for subnet %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:433
-#, python-format
-msgid "Found no SNAT ports for subnet %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:454
-#, python-format
-msgid "Created SNAT port: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:462
-#, python-format
-msgid "Removed SNAT port: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:469
-#, python-format
-msgid "No SNAT port found for subnet %s. Creating one..."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:477
-#, python-format
-msgid "SNAT port: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/netscaler/netscaler_driver.py:487
-#, python-format
-msgid "Removing SNAT port for subnet %s as this is the last pool using it..."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:62
-msgid "IP address of vDirect server."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:64
-msgid "IP address of secondary vDirect server."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:67
-msgid "vDirect user name."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:70
-msgid "vDirect user password."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:73
-msgid "Service ADC type. Default: VA."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:76
-msgid "Service ADC version."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:79
-msgid "Enables or disables the Service HA pair. Default: False."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:83
-msgid "Service throughput. Default: 1000."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:86
-msgid "Service SSL throughput. Default: 100."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:89
-msgid "Service compression throughput. Default: 100."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:92
-msgid "Size of service cache. Default: 20."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:95
-msgid "Name of l2_l3 workflow. Default: openstack_l2_l3."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:99
-msgid "Name of l4 workflow. Default: openstack_l4."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:107
-msgid "Parameter for l2_l3 workflow constructor."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:114
-msgid "Parameter for l2_l3 workflow setup."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:117
-msgid "List of actions that are not pushed to the completion queue."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:121
-msgid "Name of the l4 workflow action. Default: BaseCreate."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:125
-msgid "Resource pool IDs."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:128
-msgid "A required VLAN for the interswitch link to use."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:131
-msgid ""
-"Enable or disable Alteon interswitch link for stateful session failover. "
-"Default: False."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:232
-#, python-format
-msgid ""
-"vip: %(vip)s, extended_vip: %(extended_vip)s, service_name: "
-"%(service_name)s, "
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:266
-#, python-format
-msgid "Retrieved pip nport: %(port)r for vip: %(vip)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:274
-#, python-format
-msgid "Found no pip nports associated with vip: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:283
-#, python-format
-msgid "Failed to remove workflow %s. Going to set vip to ERROR status"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:297
-#, python-format
-msgid "pip nport id: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:301
-#, python-format
-msgid "pip nport delete failed: %r"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:389
-#, python-format
-msgid ""
-"_handle_pool_health_monitor. health_monitor = %(hm_id)s pool_id = "
-"%(pool_id)s delete = %(delete)s vip_id = %(vip_id)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:420
-msgid "Starting operation completion handling thread"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:450
-#, python-format
-msgid "_update_workflow response: %s "
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:459
-#: neutron/services/loadbalancer/drivers/radware/driver.py:490
-#, python-format
-msgid "Pushing operation %s to the queue"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:467
-#, python-format
-msgid "Remove the workflow %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:475
-#, python-format
-msgid "Post-remove workflow function %r completed"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:479
-#, python-format
-msgid "Post-remove workflow function %r failed"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:596
-#, python-format
-msgid "create_workflow response: %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:650
-#, python-format
-msgid "Could not find or allocate IP address for subnet id %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:685
-#, python-format
-msgid ""
-"vDirectRESTClient:init server=%(server)s, secondary "
-"server=%(sec_server)s, port=%(port)d, ssl=%(ssl)r"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:691
-#, python-format
-msgid "Fliping servers. Current is: %(server)s, switching to %(secondary)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:704
-msgid ""
-"REST client is not able to recover since only one vDirect server is "
-"configured."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:712
-#, python-format
-msgid "vDirect server is not responding (%s)."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:716
-#, python-format
-msgid "vDirect server is not active (%s)."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:744
-msgid "vdirectRESTClient: Could not establish HTTPS connection"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:751
-msgid "vdirectRESTClient: Could not establish HTTP connection"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:768
-#, python-format
-msgid "vdirectRESTClient: %(action)s failure, %(e)r"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:836
-#, python-format
-msgid ""
-"Operation %(oper)s is completed after %(sec_to_completion)d sec with "
-"success status: %(success)s :"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:848
-#, python-format
-msgid "Operation %(operation)s failed. Reason: %(msg)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:880
-#, python-format
-msgid "Operation %s is not completed yet.."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:895
-msgid "Exception was thrown inside OperationCompletionHandler"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:904
-#, python-format
-msgid "Post-operation function %(func)r completed after operation %(oper)r"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:910
-#, python-format
-msgid "Post-operation function %(func)r failed after operation %(oper)r"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:951
-#, python-format
-msgid "_update: %s "
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/driver.py:991
-#, python-format
-msgid "_remove_object_from_db %s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:22
-msgid "An unknown exception occurred in Radware LBaaS provider."
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:26
-msgid ""
-"vDirect user/password missing. Specify in configuration file, under "
-"[radware] section"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:31
-#, python-format
-msgid ""
-"Workflow %(workflow)s is missing on vDirect server. Upload missing "
-"workflow"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:36
-#, python-format
-msgid ""
-"REST request failed with status %(status)s. Reason: %(reason)s, "
-"Description: %(description)s. Success status codes are %(success_codes)s"
-msgstr ""
-
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:42
-#, python-format
-msgid "%(operation)s operation is not supported for %(entity)s."
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:70
-msgid "Metering driver"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:72
-msgid "Interval between two metering measures"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:74
-msgid "Interval between two metering reports"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:98
-#, python-format
-msgid "Loading Metering driver %s"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:100
-msgid "A metering driver must be specified"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:115
-#, python-format
-msgid "Send metering report: %s"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:179
-#, python-format
-msgid "Driver %(driver)s does not implement %(func)s"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:183
-#, python-format
-msgid "Driver %(driver)s:%(func)s runtime error"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:218
-msgid "Get router traffic counters"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:222
-msgid "Update metering rules from agent"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:227
-msgid "Creating a metering label from agent"
-msgstr ""
-
-#: neutron/services/metering/agents/metering_agent.py:234
-msgid "Delete a metering label from agent"
-msgstr ""
-
-#: neutron/services/metering/drivers/iptables/iptables_driver.py:93
-#, python-format
-msgid "Loading interface driver %s"
-msgstr ""
-
-#: neutron/services/vpn/agent.py:26
-msgid "The vpn device drivers Neutron will use"
-msgstr ""
-
-#: neutron/services/vpn/plugin.py:46
-#, python-format
-msgid "VPN plugin using service driver: %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:89
-#, python-format
-msgid "RESPONSE: %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:102
-#, python-format
-msgid "%(method)s: Request for %(resource)s payload: %(payload)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:109
-#, python-format
-msgid "%(method)s Took %(time).2f seconds to process"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:115
-#, python-format
-msgid "%(method)s: Request timeout%(ssl)s (%(timeout).3f sec) for CSR(%(host)s)"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:124
-#, python-format
-msgid "%(method)s: Unable to connect to CSR(%(host)s)"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:128
-#, python-format
-msgid "%(method)s: Unexpected error for CSR (%(host)s): %(error)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:134
-#, python-format
-msgid "%(method)s: Completed [%(status)s]"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:149
-#, python-format
-msgid "%(auth)s with CSR %(host)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:156
-#, python-format
-msgid "Successfully authenticated with CSR %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:158
-#, python-format
-msgid "Failed authentication with CSR %(host)s [%(status)s]"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:193
-#, python-format
-msgid "%(method)s: Request timeout for CSR(%(host)s)"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:42
-msgid "Status check interval for Cisco CSR IPSec connections"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:53
-#, python-format
-msgid "Cisco CSR failed to create %(resource)s (%(which)s)"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:57
-#, python-format
-msgid "Cisco CSR failed to change %(tunnel)s admin state to %(state)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:62
-#, python-format
-msgid ""
-"Required %(resource)s attribute %(attr)s mapping for Cisco CSR is missing"
-" in device driver"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:67
-#, python-format
-msgid ""
-"Device driver does not have a mapping of '%(value)s for attribute "
-"%(attr)s of %(resource)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:130
-#, python-format
-msgid "Handling VPN service update notification '%s'"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:152
-#, python-format
-msgid "Update: Existing connection %s changed"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:159
-#, python-format
-msgid "Update: Connection %s no longer admin down"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:165
-#, python-format
-msgid "Update: Connection %s forced to admin down"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:173
-#, python-format
-msgid "Update: Created new connection %s in admin down state"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:178
-#, python-format
-msgid "Update: Created new connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:189
-#, python-format
-msgid "Update: Existing VPN service %s detected"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:193
-#, python-format
-msgid "Update: New VPN service %s detected"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:204
-msgid "Update: Completed update processing"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:234
-#, python-format
-msgid "Mark: %(service)d VPN services and %(conn)d IPSec connections marked dirty"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:256
-#, python-format
-msgid ""
-"Sweep: Removed %(service)d dirty VPN service%(splural)s and %(conn)d "
-"dirty IPSec connection%(cplural)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:271
-#, python-format
-msgid "Report: Collecting status for IPSec connections on VPN service %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:277
-#, python-format
-msgid "Connection %s forced down"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:281
-#, python-format
-msgid "Connection %(conn)s reported %(status)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:286
-#, python-format
-msgid "Report: Adding info for IPSec connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:306
-#, python-format
-msgid "Report: Adding info for VPN service %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:328
-msgid "Report: Starting status report processing"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:330
-#, python-format
-msgid "Report: Collecting status for VPN service %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:336
-msgid "Sending status report update to plugin"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:338
-msgid "Report: Completed status report processing"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:622
-#, python-format
-msgid "Unable to create %(resource)s %(which)s: %(status)d"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:635
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:663
-#, python-format
-msgid "Internal error - '%s' is not defined"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:648
-#, python-format
-msgid "Unable to delete %(resource)s %(which)s: %(status)d"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:657
-#, python-format
-msgid "Performing rollback action %(action)s for resource %(resource)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:683
-#, python-format
-msgid "Creating IPSec connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:716
-#, python-format
-msgid "FAILED: Create of IPSec site-to-site connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:719
-#, python-format
-msgid "SUCCESS: Created IPSec site-to-site connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:728
-#, python-format
-msgid "Deleting IPSec connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:730
-#, python-format
-msgid "Unable to find connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:734
-#, python-format
-msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:742
-#, python-format
-msgid "Unable to change %(tunnel)s admin state to %(state)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/ipsec.py:46
-msgid "Location to store ipsec server config files"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/ipsec.py:49
-msgid "Interval for checking ipsec status"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/ipsec.py:59
-msgid "Template file for ipsec configuration"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/ipsec.py:65
-msgid "Template file for ipsec secret configuration"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/ipsec.py:247
-#, python-format
-msgid "Failed to enable vpn process on router %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/ipsec.py:258
-#, python-format
-msgid "Failed to disable vpn process on router %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/__init__.py:97
-#, python-format
-msgid "Notify agent at %(topic)s.%(host)s the message %(method)s %(args)s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:66
-#, python-format
-msgid "Unable to parse config files %s for Cisco CSR info"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:106
-#, python-format
-msgid "Ignoring Cisco CSR for subnet %s - REST management is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:46
-#, python-format
-msgid "Fatal - %(reason)s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:80
-#, python-format
-msgid "No available Cisco CSR %(type)s IDs from %(min)d..%(max)d"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:135
-#, python-format
-msgid ""
-"Database inconsistency between IPSec connection and Cisco CSR mapping "
-"table (%s)"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:161
-#, python-format
-msgid "Reserved new CSR ID %(csr_id)d for %(policy)s ID %(policy_id)s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:188
-#, python-format
-msgid ""
-"Mappings for IPSec connection %(conn)s - tunnel=%(tunnel)s "
-"ike_policy=%(csr_ike)d ipsec_policy=%(csr_ipsec)d"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:197
-#, python-format
-msgid ""
-"Existing entry for IPSec connection %s not found in Cisco CSR mapping "
-"table"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:224
-#, python-format
-msgid ""
-"Attempt to create duplicate entry in Cisco CSR mapping table for "
-"connection %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:227
-#, python-format
-msgid ""
-"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
-"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:239
-#, python-format
-msgid "Removed mapping for connection %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_ipsec.py:104
-#, python-format
-msgid ""
-"Notify agent at %(topic)s.%(host)s the message %(method)s %(args)s for "
-"router %(router)s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_validator.py:34
-#, python-format
-msgid ""
-"Cisco CSR does not support %(resource)s attribute %(key)s with value "
-"'%(value)s'"
-msgstr ""
-
-#: neutron/tests/functional/agent/linux/simple_daemon.py:37
-msgid ""
-"uuid provided from the command line so external_process can track us via "
-"/proc/cmdline interface."
-msgstr ""
-
-#: neutron/tests/unit/test_api_v2_resource.py:181
-#: neutron/tests/unit/test_api_v2_resource.py:251
-msgid "Unmapped error"
-msgstr ""
-
-#: neutron/tests/unit/test_api_v2_resource.py:320
-msgid ""
-"The server has either erred or is incapable of performing the requested "
-"operation."
-msgstr ""
-
-#: neutron/tests/unit/bigswitch/fake_server.py:72
-#, python-format
-msgid ""
-"Request: action=%(action)s, uri=%(uri)r, body=%(body)s, "
-"headers=%(headers)s"
-msgstr ""
-
-#: neutron/tests/unit/bigswitch/fake_server.py:124
-#, python-format
-msgid "No floating IPs in requesturi=%(uri)s, body=%(body)s"
-msgstr ""
-
-#: neutron/tests/unit/bigswitch/fake_server.py:133
-#, python-format
-msgid "Expected floating IPs from multiple tenants.uri=%(uri)s, body=%(body)s"
-msgstr ""
-
-#: neutron/tests/unit/bigswitch/fake_server.py:178
-#, python-format
-msgid "No host cert for %(server)s in cert %(cert)s"
-msgstr ""
-
-#: neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py:215
-#: neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py:237
-#: neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py:256
-#: neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py:279
-#, python-format
-msgid "Unexpected error code: %s"
-msgstr ""
-
-#: neutron/tests/unit/ml2/drivers/mechanism_logger.py:32
-#, python-format
-msgid ""
-"%(method)s called with network settings %(current)s (original settings "
-"%(original)s) and network segments %(segments)s"
-msgstr ""
-
-#: neutron/tests/unit/ml2/drivers/mechanism_logger.py:59
-#, python-format
-msgid ""
-"%(method)s called with subnet settings %(current)s (original settings "
-"%(original)s)"
-msgstr ""
-
-#: neutron/tests/unit/ml2/drivers/mechanism_logger.py:85
-#, python-format
-msgid ""
-"%(method)s called with port settings %(current)s (original settings "
-"%(original)s) bound to segment %(segment)s (original segment "
-"%(original_segment)s) using driver %(driver)s (original driver "
-"%(original_driver)s) on network %(network)s"
-msgstr ""
-
-#: neutron/tests/unit/ml2/extensions/test_extension.py:54
-msgid "Adds test attributes to core resources."
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:65
-#, python-format
-msgid "(create_tenant) OFC tenant %s already exists"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:77
-#, python-format
-msgid "(delete_tenant) OFC tenant %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:79
-msgid "delete_tenant: SUCCEED"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:86
-#, python-format
-msgid "(create_network) OFC tenant %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:89
-#, python-format
-msgid "(create_network) OFC network %s already exists"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:100
-#, python-format
-msgid "(update_network) OFC network %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:104
-msgid "update_network: SUCCEED"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:112
-#, python-format
-msgid "(delete_network) OFC network %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:114
-msgid "delete_network: SUCCEED"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:121
-#, python-format
-msgid "(create_port) OFC network %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:124
-#, python-format
-msgid "(create_port) OFC port %s already exists"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:138
-#, python-format
-msgid "(delete_port) OFC port %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:140
-msgid "delete_port: SUCCEED"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:173
-#, python-format
-msgid "(create_router) OFC tenant %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:176
-#, python-format
-msgid "(create_router) OFC router %s already exists"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:179
-msgid "Operation on OFC is failed"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:193
-#: neutron/tests/unit/nec/stub_ofc_driver.py:283
-#, python-format
-msgid "(delete_router) OFC router %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:195
-msgid "delete_router: SUCCEED"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:203
-#, python-format
-msgid "(add_router_interface) ip_address %s is not a valid format (a.b.c.d/N)."
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:208
-#, python-format
-msgid "(add_router_interface) OFC router %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:211
-#, python-format
-msgid "(add_router_interface) OFC network %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:218
-#, python-format
-msgid "add_router_interface: SUCCEED (if_id=%s)"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:226
-#: neutron/tests/unit/nec/stub_ofc_driver.py:243
-#, python-format
-msgid "(delete_router_interface) OFC router interface %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:235
-msgid "update_router_route: SUCCEED"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:246
-msgid "delete_router_interface: SUCCEED"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:256
-#, python-format
-msgid "(add_router_route) OFC router %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:261
-#, python-format
-msgid "(add_router_route) route to \"%s\" already exists"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:266
-#, python-format
-msgid "add_router_route: SUCCEED (route_id=%s)"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:275
-#, python-format
-msgid "(delete_router_route) OFC router route %s not found"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:277
-msgid "delete_router_route: SUCCEED"
-msgstr ""
-
-#: neutron/tests/unit/nec/stub_ofc_driver.py:290
-#, python-format
-msgid "list_router_routes: routes=%s"
-msgstr ""
-
-#: neutron/tests/unit/nec/test_ofc_client.py:86
-msgid "The specified OFC resource (/somewhere) is not found."
-msgstr ""
-
-#: neutron/tests/unit/nec/test_ofc_client.py:90
-#: neutron/tests/unit/nec/test_ofc_client.py:96
-#: neutron/tests/unit/nec/test_ofc_client.py:105
-msgid "An OFC exception has occurred: Operation on OFC failed"
-msgstr ""
-
-#: neutron/tests/unit/nec/test_ofc_client.py:112
-msgid "An OFC exception has occurred: Failed to connect OFC : "
-msgstr ""
-
-#: neutron/tests/unit/vmware/apiclient/fake.py:406
-#, python-format
-msgid "lswitch:%s not found"
-msgstr ""
-
-#: neutron/tests/unit/vmware/apiclient/fake.py:415
-#, python-format
-msgid "lrouter:%s not found"
-msgstr ""
-
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:104
-#, python-format
-msgid "Job %s does not nexist"
-msgstr ""
-
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:116
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:127
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:144
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:162
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:184
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:206
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:291
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:305
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:319
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:361
-#, python-format
-msgid "Edge %s does not exist"
-msgstr ""
-
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:194
-#, python-format
-msgid "Rule id %d doest not exist"
-msgstr ""
-
-#: neutron/tests/unit/vmware/vshield/fake_vcns.py:258
-#, python-format
-msgid "Lswitch %s does not exist"
-msgstr ""
-
-#: neutron/tests/unit/vmware/vshield/test_edge_router.py:129
-msgid "Tasks not completed"
-msgstr ""
-
diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-error.po b/neutron/locale/es/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 5719fb678b..0000000000
--- a/neutron/locale/es/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,263 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 20:07+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Spanish (http://www.transifex.com/projects/p/neutron/language/"
-"es/)\n"
-"Language: es\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "Se está descartando excepción original: %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "La excepción inesperada ha ocurrido %d vez(veces)... reintentando."
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "Error durante %(full_task_name)s: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "Excepción durante limpieza de rpc."
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "Excepción no controlada"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po b/neutron/locale/es/LC_MESSAGES/neutron-log-info.po
index d40468cb02..574dff7374 100644
--- a/neutron/locale/es/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/es/LC_MESSAGES/neutron-log-info.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-07-18 20:49+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 11:04+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/neutron/language/"
"es/)\n"
@@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "La extensión security-group se ha inhabilitado."
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "Preparando filtros para dispositivos %s"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "Se ha actualizado la regla de grupo de seguridad %r"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "Se ha actualizado el miembro de grupo de seguridad %r"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "Se ha actualizado regla de proveedor"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "Eliminar filtro de dispositivo para %r"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "Renovar reglas de cortafuegos"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet oculto escuchando en %(port)s para el proceso %(pid)d"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "Candado creado ruta: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "No se ha podido eliminar el archivo %(file)s"
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -64,72 +131,77 @@ msgstr "Omitiendo la tarea periódica %(task)s porque el intervalo es negativo"
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Omitiendo la tarea periódica %(task)s porque está inhabilitada"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "Se ha captado %s, saliendo"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "El proceso padre se ha detenido inesperadamente, saliendo"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
-msgstr ""
+msgstr "Hijo captado %s, saliendo"
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Bifurcación demasiado rápida, en reposo"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "Se ha iniciado el hijo %d"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "Iniciando %d trabajadores"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Hijo %(pid)d matado por señal %(sig)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "El hijo %(pid)s ha salido con el estado %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "Se ha captado %s, deteniendo hijos"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr ""
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "En espera de %d hijos para salir"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -137,43 +209,30 @@ msgstr ""
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907
msgid "Agent out of sync with plugin!"
-msgstr ""
+msgstr "El agente está fuera de sincronización con el plug-in."
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
@@ -181,26 +240,28 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
msgstr ""
+"El agente se ha inicializado satisfactoriamente, ahora se está ejecutando... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
-msgstr ""
+msgstr "Asignando %(vlan_id)s como vlan local para net-id=%(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
+msgstr "Reclamando vlan = %(vlan_id)s de net-id = %(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "port_unbound() net_uuid %s no está en local_vlan_map"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
msgstr ""
+"Correlacionando la red física %(physical_network)s con el puente %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -212,7 +273,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "Se ha actualizado el puerto %(device)s. Detalles: %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
@@ -222,17 +283,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "Se ha eliminado el adjunto %s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "Túnel de agente fuera de sincronización con el plug-in. "
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/es/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/es/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index 65cb403ecb..0000000000
--- a/neutron/locale/es/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Spanish (http://www.transifex.com/projects/p/neutron/language/"
-"es/)\n"
-"Language: es\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "El pid %d no está en la lista de hijos"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-critical.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-critical.po
deleted file mode 100644
index 52ae6541ad..0000000000
--- a/neutron/locale/fr/LC_MESSAGES/neutron-log-critical.po
+++ /dev/null
@@ -1,23 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-06-20 06:09+0000\n"
-"PO-Revision-Date: 2014-05-30 06:24+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: French (http://www.transifex.com/projects/p/neutron/language/"
-"fr/)\n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#~ msgid "Dummy message for transifex setup."
-#~ msgstr "message fictif pour la configuration transifex"
diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-error.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 6a9e66cdac..0000000000
--- a/neutron/locale/fr/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,263 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 20:07+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: French (http://www.transifex.com/projects/p/neutron/language/"
-"fr/)\n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "Exception d'origine en cours de suppression : %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "Exception inattendue survenue %d fois... Nouvel essai."
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "Erreur pendant %(full_task_name)s : %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "Exception pendant le nettoyage rpc."
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "Exception non gérée"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po
index 808648be4e..76a85f9254 100644
--- a/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/fr/LC_MESSAGES/neutron-log-info.po
@@ -3,12 +3,13 @@
# This file is distributed under the same license as the neutron project.
#
# Translators:
+# Maxime COQUEREL <max.coquerel@gmail.com>, 2014
msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-08-12 21:40+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: French (http://www.transifex.com/projects/p/neutron/language/"
"fr/)\n"
@@ -19,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "Extension du groupe de sécurité désactivée."
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "Préparation des filtres pour les unités %s"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "Règle de groupe de sécurité mise à jour %r"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "Membre de groupe de sécurité mis à jour %r"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "Règle de fournisseur mise à jour"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "Suppression du filtre d'unités pour %r"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "Régénération des règles de pare-feu"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
-msgstr ""
+msgstr "IPv6 n'est pas activé sur le système."
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -54,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet backdoor en écoute sur le port %(port)s for process %(pid)d"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "Chemin de verrou créé: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "Echec de la suppression du fichier %(file)s"
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -64,72 +132,77 @@ msgstr "Tâche périodique %(task)s ignorée car son intervalle est négatif"
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Tâche périodique %(task)s car elle est désactivée"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "%s interceptée, sortie"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "Processus parent arrêté de manière inattendue, sortie"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
-msgstr ""
+msgstr "L'enfant a reçu %s, sortie"
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Bifurcation trop rapide, pause"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "Enfant démarré %d"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "Démarrage des travailleurs %d"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Enfant %(pid)d arrêté par le signal %(sig)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "Processus fils %(pid)s terminé avec le status %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "%s interceptée, arrêt de l'enfant"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr "Pause demandée après suppression de thread. Nettoyage."
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "En attente %d enfants pour sortie"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
-msgid "APIC service agent starting ..."
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
+msgid "APIC service agent starting ..."
+msgstr "Démarrage du service de l'agent APIC"
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
-msgstr ""
+msgstr "service de l'agent APIC démarré"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -139,68 +212,59 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr "Agent non synchronisé avec le plug-in !"
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
-msgstr ""
+msgstr "Pont inconnu %(dpid)s ours %(ours)s"
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
-msgstr ""
+msgstr "réseau inconnu %s "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
-msgstr ""
+msgstr "Agent initialisé avec succès, en cours d'exécution... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
msgstr ""
+"Affectation de %(vlan_id)s comme réseau local virtuel pour net-id = "
+"%(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
msgstr ""
+"Récupération du réseau local virtuel = %(vlan_id)s à partir de net-id = "
+"%(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "port_unbound() net_uuid %s absent de local_vlan_map"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
-msgstr ""
+msgstr "Mappage du réseau physique %(physical_network)s sur le pont %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -212,26 +276,63 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "Port %(device)s mis à jour. Détails : %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
msgid "Configuration for device %s completed."
-msgstr ""
+msgstr "Configuration complète de l'équipement %s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "Connexion %s retirée"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "Tunnel d'agent désynchronisé avec le plug-in !"
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr "ECHEC: Création de la connexion site à site IPsec %s"
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr "SUCCES: Création de la connexion site à site IPsec %s"
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+"Analyse des fichiers de configuration %s pour la configuration du Cisco CSR"
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
@@ -241,4 +342,4 @@ msgstr ""
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:75
#, python-format
msgid "_handle_request called: %s"
-msgstr ""
+msgstr "_handle_request called: %s"
diff --git a/neutron/locale/fr/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/fr/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index 1806bead73..0000000000
--- a/neutron/locale/fr/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: French (http://www.transifex.com/projects/p/neutron/language/"
-"fr/)\n"
-"Language: fr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "PID %d absent de la liste d'enfants"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/it/LC_MESSAGES/neutron-log-error.po b/neutron/locale/it/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 5d96c45fe1..0000000000
--- a/neutron/locale/it/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,264 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-# PierAlberto <pieralbertopierini@gmail.com>, 2014
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-07-06 03:50+0000\n"
-"Last-Translator: PierAlberto <pieralbertopierini@gmail.com>\n"
-"Language-Team: Italian (http://www.transifex.com/projects/p/neutron/language/"
-"it/)\n"
-"Language: it\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "Eccezione originale in corso di eliminazione: %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "Un errore inatteso si è verificato %d volte... ritento."
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "Errore durante %(full_task_name)s: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "Eccezioni durante pulitura rpc."
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "Eccezione non gestita"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/it/LC_MESSAGES/neutron-log-info.po b/neutron/locale/it/LC_MESSAGES/neutron-log-info.po
index 2e2426e88e..bd448f861d 100644
--- a/neutron/locale/it/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/it/LC_MESSAGES/neutron-log-info.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-08-17 05:19+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/neutron/language/"
"it/)\n"
@@ -20,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "Estensione di security-group disabilitata."
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "Preparazione filtri per i dispositivi %s"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "Regola gruppo di sicurezza aggiornata %r"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "Membro gruppo di sicurezza aggiornato %r"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "Provider regola aggiornato"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "Rimuovi filtro dispositivo per %r"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "Aggiorna regole firewall"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -55,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr ""
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "Preato percorso di blocco : %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "Tentativo fallito nella rimozione di %(file)s"
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -66,72 +133,77 @@ msgstr ""
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Abbadono dell'attività periodica %(task)s perché è disabilitata"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "Rilevato %s, esistente"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "Il processo principale è stato interrotto inaspettatamente, uscire"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr "Cogliere Child %s, uscendo"
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Sblocco troppo veloce, attendere"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "Child avviato %d"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "Avvio %d operatori"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Child %(pid)d interrotto dal segnale %(sig)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "Child %(pid)s terminato con stato %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "Intercettato %s, arresto in corso dei children"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr "Attendere la chiamata dopo l'uccisione de filo. Bonifica."
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "In attesa %d degli elementi secondari per uscire"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -141,68 +213,55 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr "Agent non sincronizzato con il plugin!"
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
-msgstr ""
+msgstr "Agent inizializzato correttamente, ora in esecuzione... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
-msgstr ""
+msgstr "Assegnazione %(vlan_id)s come vlan locale per net-id=%(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
+msgstr "Recupero vlan = %(vlan_id)s da net-id = %(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "port_unbound() net_uuid %s non in local_vlan_map"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
-msgstr ""
+msgstr "Associazione rete fisica %(physical_network)s al bridge %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -214,7 +273,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "Porta %(device)s aggiornata. Dettagli: %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
@@ -224,17 +283,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "Collegamento %s rimosso"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "Il tunnel agent non è sincronizzato con il plugin!"
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/it/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/it/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index d3bdf4d9d2..0000000000
--- a/neutron/locale/it/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Italian (http://www.transifex.com/projects/p/neutron/language/"
-"it/)\n"
-"Language: it\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d non incluso nell'elenco child"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/ja/LC_MESSAGES/neutron-log-error.po b/neutron/locale/ja/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index d82c599362..0000000000
--- a/neutron/locale/ja/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,263 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 20:07+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Japanese (http://www.transifex.com/projects/p/neutron/"
-"language/ja/)\n"
-"Language: ja\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "除去される元の例外: %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "予期せぬ例外が、%d回()発生しました。再試行中。"
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "%(full_task_name)s 中のエラー: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "RPCクリーンアップ中に例外が発生"
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "未処理例外"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po b/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po
index 92c03c083d..72d4cc36e3 100644
--- a/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/ja/LC_MESSAGES/neutron-log-info.po
@@ -3,12 +3,13 @@
# This file is distributed under the same license as the neutron project.
#
# Translators:
+# Kuo(Kyohei MORIYAMA) <>, 2014
msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-07-18 20:49+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 11:04+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Japanese (http://www.transifex.com/projects/p/neutron/"
"language/ja/)\n"
@@ -19,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "security-group 拡張を無効にしました。"
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "デバイス %s のフィルターを準備中"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "セキュリティー・グループ・ルールが %r を更新しました"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "セキュリティー・グループ・メンバーが %r を更新しました"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "プロバイダー・ルールが更新されました"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "%r のデバイス・フィルターを削除"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "ファイアウォール・ルールの最新表示"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
-msgstr ""
+msgstr " このシステムでは、 IPv6が有効ではありません。"
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -54,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet backdoorは、プロセス%(pid)dの%(port)sをリスニングしています。"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "作成されたロックのパス: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "%(file)sの削除に失敗しました"
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -64,72 +132,77 @@ msgstr "タスクの間隔が負であるため、定期タスク %(task)s を
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "タスクが使用不可であるため、定期タスク %(task)s をスキップしています"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "%s が見つかりました。終了しています"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "親プロセスが予期せずに停止しました。終了しています"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr ""
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "fork が早すぎます。スリープ状態にしています"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "子 %d を開始しました"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "%d ワーカーを開始しています"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "子 %(pid)d がシグナル %(sig)d によって強制終了されました"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "子 %(pid)s が状況 %(code)d で終了しました"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "%s が見つかりました。子を停止しています"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr ""
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "%d 個の子で終了を待機しています"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -137,70 +210,60 @@ msgstr ""
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907
msgid "Agent out of sync with plugin!"
-msgstr ""
+msgstr "エージェントがプラグインと非同期です。"
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
-msgstr ""
+msgstr "エージェントが正常に初期化されました。現在実行中です... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
msgstr ""
+"%(vlan_id)s を net-id=%(net_uuid)s のローカル VLAN として割り当てています"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
+msgstr "VLAN = %(vlan_id)s を net-id = %(net_uuid)s から再利用中"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "port_unbound() net_uuid %s が local_vlan_map にありません"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
msgstr ""
+"物理ネットワーク %(physical_network)s をブリッジ %(bridge)s にマップしていま"
+"す"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -212,7 +275,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "ポート %(device)s が更新されました。詳細: %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
@@ -222,17 +285,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "接続機構 %s が削除されました"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "エージェント・トンネルがプラグインと非同期です"
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/ja/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/ja/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index 4feb7d8137..0000000000
--- a/neutron/locale/ja/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Japanese (http://www.transifex.com/projects/p/neutron/"
-"language/ja/)\n"
-"Language: ja\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d は子リストにありません"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-error.po b/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 64590d5049..0000000000
--- a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,263 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 20:07+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/neutron/"
-"language/ko_KR/)\n"
-"Language: ko_KR\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "기존 예외가 삭제됨: %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "예기치 않은 예외 %d 번 발생하였습니다... 다시 시도중."
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "%(full_task_name)s 중 오류: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr ""
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "처리되지 않은 예외"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po b/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po
index c6adbb201b..6a97c247d0 100644
--- a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-info.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-07-18 20:49+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/neutron/"
"language/ko_KR/)\n"
@@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "보안 그룹 확장을 사용하지 않습니다. "
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "%s 디바이스에 대한 필터 준비"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "보안 그룹 규칙이 %r을(를) 업데이트함"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "보안 그룹 멤버가 %r을(를) 업데이트함"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "제공자 규칙이 업데이트됨"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "%r의 디바이스 필터 제거"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "방화벽 규칙 새로 고치기"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet 백도어는 프로세스 %(pid)d 일 동안 %(port)s에서 수신"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "생성된 lock path: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "%(file)s 화일 제거 실패."
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -64,72 +131,77 @@ msgstr "간격이 음수이기 때문에 주기적 태스크 %(task)s을(를)
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "사용 안하기 때문에 주기적 태스크 %(task)s을(를) 건너뜀"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "%s 발견, 종료 중"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "상위 프로세스가 예기치 않게 정지했습니다. 종료 중"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
-msgstr ""
+msgstr "자식으로 된 %s가 존재함."
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "포크가 너무 빠름. 정지 중"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "%d 하위를 시작했음"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "%d 작업자 시작 중"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "%(pid)d 하위가 %(sig)d 신호에 의해 강제 종료됨"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "%(pid)s 하위가 %(code)d 상태와 함께 종료했음"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "%s 발견, 하위 중지 중"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
-msgstr ""
+msgstr "쓰레드가 죽기를 기다려서, 지웁니다. "
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "%d 하위에서 종료하기를 대기 중임"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -137,70 +209,57 @@ msgstr ""
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907
msgid "Agent out of sync with plugin!"
-msgstr ""
+msgstr "에이전트가 플러그인과 동기화되지 않았습니다!"
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
-msgstr ""
+msgstr "에이전트가 초기화되었으며, 지금 실행 중... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
-msgstr ""
+msgstr "%(vlan_id)s을(를) net-id=%(net_uuid)s에 대한 로컬 vlan으로 지정 중"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
+msgstr "net-id = %(net_uuid)s에서 vlan = %(vlan_id)s 재확보 중"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "port_unbound() net_uuid %s이(가) local_vlan_map에 있지 않음"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
-msgstr ""
+msgstr "실제 네트워크 %(physical_network)s을(를) 브릿지 %(bridge)s에 맵핑 중"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -212,7 +271,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "%(device)s 포트가 업데이트되었습니다. 세부사항: %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
@@ -222,17 +281,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "첨부 %s이(가) 제거됨"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "에이전트 터널이 플러그인과 동기화되지 않았습니다!"
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index f1ee7d0ff9..0000000000
--- a/neutron/locale/ko_KR/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/neutron/"
-"language/ko_KR/)\n"
-"Language: ko_KR\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d이(가) 하위 목록에 없음"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/neutron-log-error.pot b/neutron/locale/neutron-log-error.pot
index 0cab0890c3..fd84af58a4 100644
--- a/neutron/locale/neutron-log-error.pot
+++ b/neutron/locale/neutron-log-error.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: neutron 2014.2.dev123.g62ae82d\n"
+"Project-Id-Version: neutron 2015.1.dev166.gf1384cc\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
+"POT-Creation-Date: 2014-10-22 06:20+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,45 +17,69 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.3\n"
-#: neutron/policy.py:115
+#: neutron/policy.py:119
#, python-format
msgid ""
"Backward compatibility unavailable for deprecated policy %s. The policy "
"will not be enforced"
msgstr ""
-#: neutron/policy.py:280
+#: neutron/policy.py:311
#, python-format
msgid "Policy check error while calling %s!"
msgstr ""
+#: neutron/agent/l3_agent.py:1852
+#, python-format
+msgid "Removing incompatible router '%s'"
+msgstr ""
+
#: neutron/agent/l3_ha_agent.py:136
#, python-format
msgid "Unable to process HA router %s without ha port"
msgstr ""
-#: neutron/agent/linux/external_process.py:230
+#: neutron/agent/linux/external_process.py:227
#, python-format
msgid ""
"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The "
"process should not have died"
msgstr ""
-#: neutron/agent/linux/external_process.py:250
+#: neutron/agent/linux/external_process.py:247
#, python-format
msgid "respawning %(service)s for uuid %(uuid)s"
msgstr ""
-#: neutron/agent/linux/external_process.py:256
+#: neutron/agent/linux/external_process.py:253
msgid "Exiting agent as programmed in check_child_processes_actions"
msgstr ""
+#: neutron/agent/linux/interface.py:154
+#, python-format
+msgid "Failed deleting ingress connection state of floatingip %s"
+msgstr ""
+
+#: neutron/agent/linux/interface.py:163
+#, python-format
+msgid "Failed deleting egress connection state of floatingip %s"
+msgstr ""
+
#: neutron/cmd/sanity_check.py:58
msgid ""
"Nova notifications are enabled, but novaclient is not installed. Either "
"disable nova notifications or install python-novaclient."
msgstr ""
+#: neutron/db/l3_agentschedulers_db.py:141
+#, python-format
+msgid "Failed to reschedule router %s"
+msgstr ""
+
+#: neutron/db/l3_agentschedulers_db.py:146
+msgid "Exception encountered during router rescheduling."
+msgstr ""
+
#: neutron/openstack/common/excutils.py:76
#, python-format
msgid "Original exception being dropped: %s"
@@ -66,53 +90,62 @@ msgstr ""
msgid "Unexpected exception occurred %d time(s)... retrying."
msgstr ""
-#: neutron/openstack/common/periodic_task.py:202
+#: neutron/openstack/common/lockutils.py:117
#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
+msgid "Could not release the acquired lock `%s`"
+msgstr ""
+
+#: neutron/openstack/common/loopingcall.py:95
+msgid "in fixed duration looping call"
msgstr ""
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
+#: neutron/openstack/common/loopingcall.py:138
+msgid "in dynamic looping call"
msgstr ""
-#: neutron/openstack/common/service.py:277
+#: neutron/openstack/common/periodic_task.py:202
+#, python-format
+msgid "Error during %(full_task_name)s: %(e)s"
+msgstr ""
+
+#: neutron/openstack/common/service.py:269
msgid "Unhandled exception"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:279
#, python-format
msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/type_gre.py:80
+#: neutron/plugins/ml2/drivers/type_gre.py:86
#, python-format
msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
+#: neutron/plugins/ml2/drivers/type_vxlan.py:92
#, python-format
msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:110
msgid "APIC service agent: failed in reporting state"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:205
#, python-format
msgid "No such interface (ignored): %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:255
msgid "APIC service agent: exception in LLDP parsing"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:310
#, python-format
msgid "APIC service agent: can not get MACaddr for %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:326
msgid "APIC host agent: failed in reporting state"
msgstr ""
@@ -120,7 +153,7 @@ msgstr ""
msgid "Error in agent event loop"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:56
+#: neutron/plugins/nuage/syncmanager.py:55
#, python-format
msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
msgstr ""
@@ -198,7 +231,7 @@ msgstr ""
msgid "Error while processing VIF ports"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2089
+#: neutron/plugins/vmware/plugins/base.py:2098
#, python-format
msgid ""
"Rolling back database changes for gateway device %s because of an error "
@@ -210,52 +243,103 @@ msgstr ""
msgid "Not enough candidates, a HA router needs at least %s agents"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
+#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:123
+#, python-format
+msgid "%(method)s: Unable to connect to CSR(%(host)s)"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:128
+#, python-format
+msgid "%(method)s: Unexpected error for CSR (%(host)s): %(error)s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:158
+#, python-format
+msgid "Failed authentication with CSR %(host)s [%(status)s]"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:193
+#, python-format
+msgid "%(method)s: Request timeout for CSR(%(host)s)"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:621
+#, python-format
+msgid "Unable to create %(resource)s %(which)s: %(status)d"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:634
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:662
+#, python-format
+msgid "Internal error - '%s' is not defined"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:741
+#, python-format
+msgid "Unable to change %(tunnel)s admin state to %(state)s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/ipsec.py:248
+#, python-format
+msgid "Failed to enable vpn process on router %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/ipsec.py:259
+#, python-format
+msgid "Failed to disable vpn process on router %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:61
#, python-format
msgid "Config file parse error: %s"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:75
#, python-format
msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:88
#, python-format
msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:96
#, python-format
msgid "Ignoring Cisco CSR for router %s - timeout is not a floating point number"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:105
+#, python-format
+msgid "Ignoring Cisco CSR for subnet %s - REST management is not an IP address"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:112
#, python-format
msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:118
#, python-format
msgid "Malformed interface name for Cisco CSR router entry - %s"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:154
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:201
msgid "No routers found in INI file!"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:173
#, python-format
msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:176
#, python-format
msgid "No matching routers on host %s"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:210
#, python-format
msgid "Unable to find host for router %s"
msgstr ""
diff --git a/neutron/locale/neutron-log-info.pot b/neutron/locale/neutron-log-info.pot
index 0649ada5c2..c37d770305 100644
--- a/neutron/locale/neutron-log-info.pot
+++ b/neutron/locale/neutron-log-info.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: neutron 2014.2.dev114.gf095f99\n"
+"Project-Id-Version: neutron 2015.1.dev166.gf1384cc\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,18 +17,70 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.3\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated "
"policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router "
"rescheduling is disabled."
@@ -53,6 +105,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr ""
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr ""
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr ""
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -63,72 +130,77 @@ msgstr ""
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr ""
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr ""
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr ""
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr ""
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr ""
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr ""
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr ""
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr ""
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr ""
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr ""
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr ""
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -138,41 +210,28 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
@@ -227,11 +286,47 @@ msgstr ""
msgid "Agent tunnel out of sync with plugin!"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/neutron-log-warning.pot b/neutron/locale/neutron-log-warning.pot
index 24abf9670b..afd67a31f9 100644
--- a/neutron/locale/neutron-log-warning.pot
+++ b/neutron/locale/neutron-log-warning.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: neutron 2014.2.dev114.gf095f99\n"
+"Project-Id-Version: neutron 2015.1.dev166.gf1384cc\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,50 +17,86 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.3\n"
-#: neutron/policy.py:94
+#: neutron/policy.py:98
#, python-format
msgid ""
"Found deprecated policy rule:%s. Please consider upgrading your policy "
"configuration file"
msgstr ""
-#: neutron/policy.py:137
+#: neutron/policy.py:155
#, python-format
msgid "Unable to find data type descriptor for attribute %s"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:183
+#: neutron/agent/l3_agent.py:541
+#, python-format
+msgid ""
+"l3-agent cannot check service plugins enabled at the neutron server when "
+"startup due to RPC error. It happens when the server does not support "
+"this RPC API. If the error is UnsupportedVersion you can ignore this "
+"warning. Detail message: %s"
+msgstr ""
+
+#: neutron/agent/l3_agent.py:553
+#, python-format
+msgid ""
+"l3-agent cannot check service plugins enabled on the neutron server. "
+"Retrying. Detail message: %s"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:186
msgid ""
"security_group_info_for_devices rpc call not supported by the server, "
"falling back to old security_group_rules_for_devices which scales worse."
msgstr ""
-#: neutron/agent/linux/keepalived.py:358
+#: neutron/agent/linux/keepalived.py:361
msgid ""
"A previous instance of keepalived seems to be dead, unable to restart it,"
" a new instance will be spawned"
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:105
+#: neutron/agent/linux/ovs_lib.py:413
+#, python-format
+msgid "ofport: %(ofport)s for VIF: %(vif)s is not a positive integer"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:425
+#, python-format
+msgid "Unable to parse interface details. Exception: %s"
+msgstr ""
+
+#: neutron/db/l3_agentschedulers_db.py:106
msgid ""
"Time since last L3 agent reschedule check has exceeded the interval "
"between checks. Waiting before check to allow agents to send a heartbeat "
"in case there was a clock adjustment."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:127
+#: neutron/db/l3_agentschedulers_db.py:128
#, python-format
msgid ""
"Rescheduling router %(router)s from agent %(agent)s because the agent did"
" not report to the server in the last %(dead_time)s seconds."
msgstr ""
-#: neutron/db/l3_hamode_db.py:404
+#: neutron/db/l3_hamode_db.py:406
#, python-format
msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
msgstr ""
-#: neutron/openstack/common/service.py:364
+#: neutron/db/vpn/vpn_db.py:660
+#, python-format
+msgid "vpnservice %s in db is already deleted"
+msgstr ""
+
+#: neutron/openstack/common/loopingcall.py:87
+#, python-format
+msgid "task %(func_name)s run outlasted interval by %(delay).2f sec"
+msgstr ""
+
+#: neutron/openstack/common/service.py:356
#, python-format
msgid "pid %d not in child list"
msgstr ""
@@ -70,69 +106,69 @@ msgstr ""
msgid "%(type)s tunnel %(id)s not found"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:66
#, python-format
msgid "Create network postcommit failed for network %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:76
#, python-format
msgid "Create subnet postcommit failed for subnet %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:89
#, python-format
msgid "Create port postcommit failed for port %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:108
#, python-format
msgid "Add interface postcommit failed for port %s"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:299
+#: neutron/plugins/nuage/syncmanager.py:298
#, python-format
msgid "Subnet %s not found in neutron for sync"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:317
+#: neutron/plugins/nuage/syncmanager.py:316
#, python-format
msgid "Router %s not found in neutron for sync"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:329
+#: neutron/plugins/nuage/syncmanager.py:328
#, python-format
msgid ""
"Route with destination %(dest)s and nexthop %(hop)s not found in neutron "
"for sync"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:343
+#: neutron/plugins/nuage/syncmanager.py:342
#, python-format
msgid "Security group %s not found in neutron for sync"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:354
+#: neutron/plugins/nuage/syncmanager.py:353
#, python-format
msgid "Security group rule %s not found in neutron for sync"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:364
+#: neutron/plugins/nuage/syncmanager.py:363
#, python-format
msgid "Floating ip %s not found in neutron for sync"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:376
+#: neutron/plugins/nuage/syncmanager.py:375
#, python-format
msgid "IP allocation for floating ip %s not found in neutron for sync"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:387
+#: neutron/plugins/nuage/syncmanager.py:386
#, python-format
msgid "Net-partition %s not found in neutron for sync"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:397
+#: neutron/plugins/nuage/syncmanager.py:396
#, python-format
msgid "VM port %s not found in neutron for sync"
msgstr ""
@@ -152,3 +188,18 @@ msgstr ""
msgid "Device %s not defined on plugin"
msgstr ""
+#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:114
+#, python-format
+msgid "%(method)s: Request timeout%(ssl)s (%(timeout).3f sec) for CSR(%(host)s)"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:647
+#, python-format
+msgid "Unable to delete %(resource)s %(which)s: %(status)d"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:729
+#, python-format
+msgid "Unable to find connection %s"
+msgstr ""
+
diff --git a/neutron/locale/neutron.pot b/neutron/locale/neutron.pot
index 220aa82616..5e119ec797 100644
--- a/neutron/locale/neutron.pot
+++ b/neutron/locale/neutron.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: neutron 2014.2.dev123.g62ae82d\n"
+"Project-Id-Version: neutron 2015.1.dev166.gf1384cc\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:10+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -88,48 +88,48 @@ msgstr ""
msgid "Successfully loaded %(type)s plugin. Description: %(desc)s"
msgstr ""
-#: neutron/policy.py:87
+#: neutron/policy.py:91
#, python-format
msgid "Loading policies from file: %s"
msgstr ""
-#: neutron/policy.py:142
+#: neutron/policy.py:160
#, python-format
msgid ""
"Attribute type descriptor is not a dict. Unable to generate any sub-attr "
"policy rule for %s."
msgstr ""
-#: neutron/policy.py:215
+#: neutron/policy.py:246
#, python-format
msgid ""
"Unable to identify a target field from:%s.match should be in the form "
"%%(<field_name>)s"
msgstr ""
-#: neutron/policy.py:241
+#: neutron/policy.py:272
#, python-format
msgid "Unable to find ':' as separator in %s."
msgstr ""
-#: neutron/policy.py:245
+#: neutron/policy.py:276
#, python-format
msgid "Unable to find resource name in %s"
msgstr ""
-#: neutron/policy.py:254
+#: neutron/policy.py:285
#, python-format
msgid ""
"Unable to verify match:%(match)s as the parent resource: %(res)s was not "
"found"
msgstr ""
-#: neutron/policy.py:312
+#: neutron/policy.py:343
#, python-format
msgid "Unable to find requested field: %(field)s in target: %(target_dict)s"
msgstr ""
-#: neutron/policy.py:370
+#: neutron/policy.py:401
#, python-format
msgid "Failed policy check for '%s'"
msgstr ""
@@ -185,7 +185,7 @@ msgid "Seconds between running periodic tasks"
msgstr ""
#: neutron/service.py:43
-msgid "Number of separate worker processes for service"
+msgid "Number of separate API worker processes for service"
msgstr ""
#: neutron/service.py:46
@@ -287,102 +287,102 @@ msgstr ""
msgid "Could not bind to %(host)s:%(port)s after trying for %(time)d seconds"
msgstr ""
-#: neutron/wsgi.py:342
+#: neutron/wsgi.py:340
msgid "Missing Content-Type"
msgstr ""
-#: neutron/wsgi.py:531
+#: neutron/wsgi.py:529
#, python-format
msgid "Data %(data)s type is %(type)s"
msgstr ""
-#: neutron/wsgi.py:614
+#: neutron/wsgi.py:612
msgid "Cannot understand JSON"
msgstr ""
-#: neutron/wsgi.py:627 neutron/wsgi.py:630
+#: neutron/wsgi.py:625 neutron/wsgi.py:628
msgid "Inline DTD forbidden"
msgstr ""
-#: neutron/wsgi.py:711
+#: neutron/wsgi.py:709
msgid "Cannot understand XML"
msgstr ""
-#: neutron/wsgi.py:820
+#: neutron/wsgi.py:818
msgid "Unrecognized Content-Type provided in request"
msgstr ""
-#: neutron/wsgi.py:824
+#: neutron/wsgi.py:822
msgid "No Content-Type provided in request"
msgstr ""
-#: neutron/wsgi.py:828
+#: neutron/wsgi.py:826
msgid "Empty body provided in request"
msgstr ""
-#: neutron/wsgi.py:835
+#: neutron/wsgi.py:833
msgid "Unable to deserialize body as provided Content-Type"
msgstr ""
-#: neutron/wsgi.py:931
+#: neutron/wsgi.py:929
msgid "You must implement __call__"
msgstr ""
-#: neutron/wsgi.py:1024 neutron/api/v2/base.py:191 neutron/api/v2/base.py:332
-#: neutron/api/v2/base.py:472 neutron/api/v2/base.py:527
+#: neutron/wsgi.py:1022 neutron/api/v2/base.py:191 neutron/api/v2/base.py:332
+#: neutron/api/v2/base.py:472 neutron/api/v2/base.py:531
#: neutron/extensions/l3agentscheduler.py:50
#: neutron/extensions/l3agentscheduler.py:93
msgid "The resource could not be found."
msgstr ""
-#: neutron/wsgi.py:1071
+#: neutron/wsgi.py:1069
#, python-format
msgid "%(method)s %(url)s"
msgstr ""
-#: neutron/wsgi.py:1077
+#: neutron/wsgi.py:1075
msgid "Unsupported Content-Type"
msgstr ""
-#: neutron/wsgi.py:1078
+#: neutron/wsgi.py:1076
#, python-format
msgid "InvalidContentType: %s"
msgstr ""
-#: neutron/wsgi.py:1082
+#: neutron/wsgi.py:1080
msgid "Malformed request body"
msgstr ""
-#: neutron/wsgi.py:1083
+#: neutron/wsgi.py:1081
#, python-format
msgid "MalformedRequestBody: %s"
msgstr ""
-#: neutron/wsgi.py:1090
+#: neutron/wsgi.py:1088
#, python-format
msgid "HTTP exception thrown: %s"
msgstr ""
-#: neutron/wsgi.py:1095
+#: neutron/wsgi.py:1093
msgid "Internal error"
msgstr ""
-#: neutron/wsgi.py:1110 neutron/wsgi.py:1212
+#: neutron/wsgi.py:1108 neutron/wsgi.py:1210
#, python-format
msgid "%(url)s returned with HTTP %(status)d"
msgstr ""
-#: neutron/wsgi.py:1113
+#: neutron/wsgi.py:1111
#, python-format
msgid "%(url)s returned a fault: %(exception)s"
msgstr ""
-#: neutron/wsgi.py:1231
+#: neutron/wsgi.py:1229
#, python-format
msgid "The requested content type %s is invalid."
msgstr ""
-#: neutron/wsgi.py:1290
+#: neutron/wsgi.py:1288
msgid "Could not deserialize data"
msgstr ""
@@ -408,7 +408,7 @@ msgstr ""
msgid "Number of threads to use during sync process."
msgstr ""
-#: neutron/agent/dhcp_agent.py:65 neutron/agent/l3_agent.py:496
+#: neutron/agent/dhcp_agent.py:65 neutron/agent/l3_agent.py:499
#: neutron/agent/metadata/namespace_proxy.py:165
msgid "Location of Metadata Proxy UNIX domain socket"
msgstr ""
@@ -488,25 +488,25 @@ msgid ""
"port %(port_id)s, for router %(router_id)s will be considered"
msgstr ""
-#: neutron/agent/dhcp_agent.py:582 neutron/agent/l3_agent.py:1984
-#: neutron/agent/metadata/agent.py:363
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:328
-#: neutron/services/metering/agents/metering_agent.py:272
+#: neutron/agent/dhcp_agent.py:582 neutron/agent/l3_agent.py:2017
+#: neutron/agent/metadata/agent.py:355
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:326
+#: neutron/services/metering/agents/metering_agent.py:270
msgid ""
"Neutron server does not support state report. State report for this agent"
" will be disabled."
msgstr ""
-#: neutron/agent/dhcp_agent.py:588 neutron/agent/l3_agent.py:1989
-#: neutron/agent/metadata/agent.py:368
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:110
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:795
+#: neutron/agent/dhcp_agent.py:588 neutron/agent/l3_agent.py:2022
+#: neutron/agent/metadata/agent.py:360
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:108
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:793
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:216
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:182
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:261
+#: neutron/plugins/nec/agent/nec_neutron_agent.py:180
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:264
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:131
-#: neutron/services/loadbalancer/agent/agent_manager.py:121
-#: neutron/services/metering/agents/metering_agent.py:277
+#: neutron/services/loadbalancer/agent/agent_manager.py:119
+#: neutron/services/metering/agents/metering_agent.py:275
msgid "Failed reporting state!"
msgstr ""
@@ -515,17 +515,17 @@ msgstr ""
msgid "Agent updated: %(payload)s"
msgstr ""
-#: neutron/agent/dhcp_agent.py:597 neutron/agent/l3_agent.py:1994
-#: neutron/services/metering/agents/metering_agent.py:280
+#: neutron/agent/dhcp_agent.py:597 neutron/agent/l3_agent.py:2027
+#: neutron/services/metering/agents/metering_agent.py:278
#, python-format
msgid "agent_updated by server side %s!"
msgstr ""
-#: neutron/agent/l3_agent.py:214
+#: neutron/agent/l3_agent.py:217
msgid "Cannot allocate link local address"
msgstr ""
-#: neutron/agent/l3_agent.py:457
+#: neutron/agent/l3_agent.py:460
msgid ""
"The working mode for the agent. Allowed modes are: 'legacy' - this "
"preserves the existing behavior where the L3 agent is deployed on a "
@@ -537,216 +537,207 @@ msgid ""
"centralized node (or in single-host deployments, e.g. devstack)"
msgstr ""
-#: neutron/agent/l3_agent.py:470 neutron/debug/debug_agent.py:41
+#: neutron/agent/l3_agent.py:473 neutron/debug/debug_agent.py:41
msgid "Name of bridge used for external network traffic."
msgstr ""
-#: neutron/agent/l3_agent.py:474
+#: neutron/agent/l3_agent.py:477
msgid "TCP Port used by Neutron metadata namespace proxy."
msgstr ""
-#: neutron/agent/l3_agent.py:478
+#: neutron/agent/l3_agent.py:481
msgid ""
"Send this many gratuitous ARPs for HA setup, if less than or equal to 0, "
"the feature is disabled"
msgstr ""
-#: neutron/agent/l3_agent.py:481
+#: neutron/agent/l3_agent.py:484
msgid ""
"If namespaces is disabled, the l3 agent can only configure a router that "
"has the matching router ID."
msgstr ""
-#: neutron/agent/l3_agent.py:486
+#: neutron/agent/l3_agent.py:489
msgid "Agent should implement routers with no gateway"
msgstr ""
-#: neutron/agent/l3_agent.py:488
+#: neutron/agent/l3_agent.py:491
msgid "UUID of external network for routers implemented by the agents."
msgstr ""
-#: neutron/agent/l3_agent.py:491
+#: neutron/agent/l3_agent.py:494
msgid "Allow running metadata proxy."
msgstr ""
-#: neutron/agent/l3_agent.py:493
+#: neutron/agent/l3_agent.py:496
msgid "Delete namespace after removing a router."
msgstr ""
-#: neutron/agent/l3_agent.py:516
+#: neutron/agent/l3_agent.py:519
#, python-format
msgid "Error importing interface driver '%s'"
msgstr ""
-#: neutron/agent/l3_agent.py:533
-#, python-format
-msgid ""
-"l3-agent cannot check service plugins enabled at the neutron server when "
-"startup due to RPC error. It happens when the server does not support "
-"this RPC API. If the error is UnsupportedVersion you can ignore this "
-"warning. Detail message: %s"
-msgstr ""
-
-#: neutron/agent/l3_agent.py:564 neutron/agent/linux/dhcp.py:785
-#: neutron/services/metering/drivers/iptables/iptables_driver.py:92
+#: neutron/agent/l3_agent.py:592 neutron/agent/linux/dhcp.py:786
+#: neutron/services/metering/drivers/iptables/iptables_driver.py:90
msgid "An interface driver must be specified"
msgstr ""
-#: neutron/agent/l3_agent.py:569
+#: neutron/agent/l3_agent.py:597
msgid "Router id is required if not using namespaces."
msgstr ""
-#: neutron/agent/l3_agent.py:587
+#: neutron/agent/l3_agent.py:615
msgid "RuntimeError in obtaining router list for namespace cleanup."
msgstr ""
-#: neutron/agent/l3_agent.py:617
+#: neutron/agent/l3_agent.py:651
#, python-format
msgid "Failed to destroy stale router namespace %s"
msgstr ""
-#: neutron/agent/l3_agent.py:635 neutron/agent/linux/dhcp.py:235
+#: neutron/agent/l3_agent.py:669 neutron/agent/linux/dhcp.py:235
#, python-format
msgid "Failed trying to delete namespace: %s"
msgstr ""
-#: neutron/agent/l3_agent.py:723
+#: neutron/agent/l3_agent.py:757
msgid ""
"The 'gateway_external_network_id' option must be configured for this "
"agent as Neutron has more than one external network."
msgstr ""
-#: neutron/agent/l3_agent.py:755
+#: neutron/agent/l3_agent.py:794
#, python-format
msgid "Info for router %s were not found. Skipping router removal"
msgstr ""
-#: neutron/agent/l3_agent.py:830
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:635
-#: neutron/services/firewall/agents/varmour/varmour_router.py:103
+#: neutron/agent/l3_agent.py:869
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:633
+#: neutron/services/firewall/agents/varmour/varmour_router.py:100
#, python-format
msgid "Router port %s has no IP address"
msgstr ""
-#: neutron/agent/l3_agent.py:832 neutron/db/l3_db.py:954
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:637
-#: neutron/services/firewall/agents/varmour/varmour_router.py:106
+#: neutron/agent/l3_agent.py:871 neutron/db/l3_db.py:1013
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:635
+#: neutron/services/firewall/agents/varmour/varmour_router.py:103
#, python-format
msgid "Ignoring multiple IPs on router port %s"
msgstr ""
-#: neutron/agent/l3_agent.py:893
+#: neutron/agent/l3_agent.py:932
#, python-format
msgid "Deleting stale internal router device: %s"
msgstr ""
-#: neutron/agent/l3_agent.py:930
+#: neutron/agent/l3_agent.py:969
#, python-format
msgid "Deleting stale external router device: %s"
msgstr ""
-#: neutron/agent/l3_agent.py:1098
+#: neutron/agent/l3_agent.py:1139
#, python-format
msgid "Unable to configure IP address for floating IP: %s"
msgstr ""
-#: neutron/agent/l3_agent.py:1178
+#: neutron/agent/l3_agent.py:1222
#, python-format
msgid "Failed sending gratuitous ARP: %s"
msgstr ""
-#: neutron/agent/l3_agent.py:1240
+#: neutron/agent/l3_agent.py:1287
msgid "DVR: no map match_port found!"
msgstr ""
-#: neutron/agent/l3_agent.py:1444
+#: neutron/agent/l3_agent.py:1491
msgid "DVR: error adding redirection logic"
msgstr ""
-#: neutron/agent/l3_agent.py:1456
+#: neutron/agent/l3_agent.py:1503
msgid "DVR: removed snat failed"
msgstr ""
-#: neutron/agent/l3_agent.py:1557
+#: neutron/agent/l3_agent.py:1604
msgid "Missing subnet/agent_gateway_port"
msgstr ""
-#: neutron/agent/l3_agent.py:1678
+#: neutron/agent/l3_agent.py:1724
#, python-format
msgid "Got router deleted notification for %s"
msgstr ""
-#: neutron/agent/l3_agent.py:1699
+#: neutron/agent/l3_agent.py:1745
msgid "DVR: Failed updating arp entry"
msgstr ""
-#: neutron/agent/l3_agent.py:1726
+#: neutron/agent/l3_agent.py:1772
#, python-format
msgid "Got routers updated notification :%s"
msgstr ""
-#: neutron/agent/l3_agent.py:1736
+#: neutron/agent/l3_agent.py:1782
#, python-format
msgid "Got router removed from agent :%r"
msgstr ""
-#: neutron/agent/l3_agent.py:1742
+#: neutron/agent/l3_agent.py:1788
#, python-format
msgid "Got router added to agent :%r"
msgstr ""
-#: neutron/agent/l3_agent.py:1749
+#: neutron/agent/l3_agent.py:1794
#, python-format
msgid "The external network bridge '%s' does not exist"
msgstr ""
-#: neutron/agent/l3_agent.py:1801
+#: neutron/agent/l3_agent.py:1834
#, python-format
msgid "Failed to fetch router information for '%s'"
msgstr ""
-#: neutron/agent/l3_agent.py:1840
+#: neutron/agent/l3_agent.py:1875
#, python-format
msgid "Starting _sync_routers_task - fullsync:%s"
msgstr ""
-#: neutron/agent/l3_agent.py:1860
+#: neutron/agent/l3_agent.py:1893
#, python-format
msgid "Processing :%r"
msgstr ""
-#: neutron/agent/l3_agent.py:1868
+#: neutron/agent/l3_agent.py:1901
msgid "_sync_routers_task successfully completed"
msgstr ""
-#: neutron/agent/l3_agent.py:1870
+#: neutron/agent/l3_agent.py:1903
msgid "Failed synchronizing routers due to RPC error"
msgstr ""
-#: neutron/agent/l3_agent.py:1873
-#: neutron/services/metering/agents/metering_agent.py:61
+#: neutron/agent/l3_agent.py:1906
+#: neutron/services/metering/agents/metering_agent.py:59
msgid "Failed synchronizing routers"
msgstr ""
-#: neutron/agent/l3_agent.py:1896
+#: neutron/agent/l3_agent.py:1929
msgid "L3 agent started"
msgstr ""
-#: neutron/agent/l3_agent.py:1915
+#: neutron/agent/l3_agent.py:1948
#, python-format
msgid "Added route entry is '%s'"
msgstr ""
-#: neutron/agent/l3_agent.py:1923
+#: neutron/agent/l3_agent.py:1956
#, python-format
msgid "Removed route entry is '%s'"
msgstr ""
-#: neutron/agent/l3_agent.py:1957
+#: neutron/agent/l3_agent.py:1990
msgid "Report state task started"
msgstr ""
-#: neutron/agent/l3_agent.py:1981
+#: neutron/agent/l3_agent.py:2014
msgid "Report state task successfully completed"
msgstr ""
@@ -792,8 +783,8 @@ msgid ""
msgstr ""
#: neutron/agent/ovs_cleanup_util.py:73
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:665
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:299
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:663
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:302
#, python-format
msgid "Delete %s"
msgstr ""
@@ -811,115 +802,78 @@ msgstr ""
msgid "DVR functionality requires a server upgrade."
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:33
+#: neutron/agent/securitygroups_rpc.py:36
msgid "Driver for security groups firewall in the L2 agent"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:37
+#: neutron/agent/securitygroups_rpc.py:40
msgid ""
"Controls whether the neutron security group API is enabled in the server."
" It should be false when using no security groups or using the nova "
"security group API."
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:44
+#: neutron/agent/securitygroups_rpc.py:47
msgid "Use ipset to speed-up the iptables based security groups."
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:64
-#: neutron/agent/securitygroups_rpc.py:156
+#: neutron/agent/securitygroups_rpc.py:67
+#: neutron/agent/securitygroups_rpc.py:159
msgid "Driver configuration doesn't match with enable_security_group"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:77
-msgid "Disabled security-group extension."
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:79
-msgid "Disabled allowed-address-pairs extension."
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:87
+#: neutron/agent/securitygroups_rpc.py:90
#, python-format
msgid "Get security group rules for devices via rpc %r"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:111
+#: neutron/agent/securitygroups_rpc.py:114
msgid ""
"Security group agent binding currently not set. This should be set by the"
" end of the init process."
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:122
+#: neutron/agent/securitygroups_rpc.py:125
#, python-format
msgid "Security group rule updated on remote: %s"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:134
+#: neutron/agent/securitygroups_rpc.py:137
#, python-format
msgid "Security group member updated on remote: %s"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:141
-#: neutron/agent/securitygroups_rpc.py:252
+#: neutron/agent/securitygroups_rpc.py:144
msgid "Provider rule updated"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:154
+#: neutron/agent/securitygroups_rpc.py:157
#, python-format
msgid "Init firewall settings (driver=%s)"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:193
-#, python-format
-msgid "Preparing filters for devices %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:223
-#, python-format
-msgid "Security group rule updated %r"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:230
-#, python-format
-msgid "Security group member updated %r"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:244
+#: neutron/agent/securitygroups_rpc.py:260
#, python-format
msgid ""
"Adding %s devices to the list of devices for which firewall needs to be "
"refreshed"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:264
-#, python-format
-msgid "Remove device filter for %r"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:273
-msgid "Refresh firewall rules"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:277
-msgid "No ports here to refresh firewall"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:291
+#: neutron/agent/securitygroups_rpc.py:308
#, python-format
msgid "Update port filter for %s"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:314
+#: neutron/agent/securitygroups_rpc.py:331
#, python-format
msgid "Preparing device filters for %d new devices"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:327
+#: neutron/agent/securitygroups_rpc.py:344
msgid "Refreshing firewall for all filtered devices"
msgstr ""
-#: neutron/agent/securitygroups_rpc.py:335
+#: neutron/agent/securitygroups_rpc.py:352
#, python-format
msgid "Refreshing firewall for %d devices"
msgstr ""
@@ -942,13 +896,17 @@ msgstr ""
msgid "Allow overlapping IP."
msgstr ""
-#: neutron/agent/common/config.py:102
+#: neutron/agent/common/config.py:51
+msgid "Add comments to iptables rules."
+msgstr ""
+
+#: neutron/agent/common/config.py:111
msgid ""
"DEFAULT.root_helper is deprecated! Please move root_helper configuration "
"to [AGENT] section."
msgstr ""
-#: neutron/agent/common/config.py:113
+#: neutron/agent/common/config.py:122
msgid "Top-level directory for maintaining dhcp state"
msgstr ""
@@ -994,20 +952,20 @@ msgstr ""
msgid "An error occurred while communicating with async process [%s]."
msgstr ""
-#: neutron/agent/linux/daemon.py:37
+#: neutron/agent/linux/daemon.py:35
#, python-format
msgid "Error while handling pidfile: %s"
msgstr ""
-#: neutron/agent/linux/daemon.py:45
+#: neutron/agent/linux/daemon.py:43
msgid "Unable to unlock pid file"
msgstr ""
-#: neutron/agent/linux/daemon.py:94
+#: neutron/agent/linux/daemon.py:92
msgid "Fork failed"
msgstr ""
-#: neutron/agent/linux/daemon.py:136
+#: neutron/agent/linux/daemon.py:134
#, python-format
msgid "Pidfile %s already exist. Daemon already running?"
msgstr ""
@@ -1048,17 +1006,17 @@ msgstr ""
msgid "No DHCP started for %s"
msgstr ""
-#: neutron/agent/linux/dhcp.py:256 neutron/agent/linux/utils.py:152
+#: neutron/agent/linux/dhcp.py:256 neutron/agent/linux/utils.py:155
#, python-format
msgid "Error while reading %s"
msgstr ""
-#: neutron/agent/linux/dhcp.py:263 neutron/agent/linux/utils.py:159
+#: neutron/agent/linux/dhcp.py:263 neutron/agent/linux/utils.py:162
#, python-format
msgid "Unable to convert value in %s"
msgstr ""
-#: neutron/agent/linux/dhcp.py:265 neutron/agent/linux/utils.py:161
+#: neutron/agent/linux/dhcp.py:265 neutron/agent/linux/utils.py:164
#, python-format
msgid "Unable to access %s"
msgstr ""
@@ -1107,118 +1065,124 @@ msgstr ""
msgid "Done building host file %s"
msgstr ""
-#: neutron/agent/linux/dhcp.py:792
+#: neutron/agent/linux/dhcp.py:793
#, python-format
msgid "Error importing interface driver '%(driver)s': %(inner)s"
msgstr ""
-#: neutron/agent/linux/dhcp.py:832
+#: neutron/agent/linux/dhcp.py:833
#, python-format
msgid "Setting gateway for dhcp netns on net %(n)s to %(ip)s"
msgstr ""
-#: neutron/agent/linux/dhcp.py:842
+#: neutron/agent/linux/dhcp.py:843
#, python-format
msgid "Removing gateway for dhcp netns on net %s"
msgstr ""
-#: neutron/agent/linux/dhcp.py:886
+#: neutron/agent/linux/dhcp.py:887
#, python-format
msgid ""
"DHCP port %(device_id)s on network %(network_id)s does not yet exist. "
"Checking for a reserved port."
msgstr ""
-#: neutron/agent/linux/dhcp.py:900
+#: neutron/agent/linux/dhcp.py:901
#, python-format
msgid "DHCP port %(device_id)s on network %(network_id)s does not yet exist."
msgstr ""
-#: neutron/agent/linux/dhcp.py:935 neutron/debug/debug_agent.py:67
+#: neutron/agent/linux/dhcp.py:936 neutron/debug/debug_agent.py:67
#, python-format
msgid "Reusing existing device: %s."
msgstr ""
-#: neutron/agent/linux/external_process.py:33
+#: neutron/agent/linux/external_process.py:32
msgid "Location to store child pid files"
msgstr ""
#: neutron/agent/linux/external_process.py:35
-msgid "Periodically check child processes"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:38
msgid "Action to be executed when a child process dies"
msgstr ""
-#: neutron/agent/linux/external_process.py:40
-msgid "Interval between checks of child process liveness (seconds)"
+#: neutron/agent/linux/external_process.py:37
+msgid ""
+"Interval between checks of child process liveness (seconds), use 0 to "
+"disable"
msgstr ""
-#: neutron/agent/linux/interface.py:37
+#: neutron/agent/linux/interface.py:39
msgid "Name of Open vSwitch bridge to use"
msgstr ""
-#: neutron/agent/linux/interface.py:40
+#: neutron/agent/linux/interface.py:42
msgid "Uses veth for an interface or not"
msgstr ""
-#: neutron/agent/linux/interface.py:42
+#: neutron/agent/linux/interface.py:44
msgid "MTU setting for device."
msgstr ""
-#: neutron/agent/linux/interface.py:44
-msgid "Mapping between flavor and LinuxInterfaceDriver"
+#: neutron/agent/linux/interface.py:46
+msgid ""
+"Mapping between flavor and LinuxInterfaceDriver. It is specific to "
+"MetaInterfaceDriver used with admin_user, admin_password, "
+"admin_tenant_name, admin_url, auth_strategy, auth_region and "
+"endpoint_type."
msgstr ""
-#: neutron/agent/linux/interface.py:46
+#: neutron/agent/linux/interface.py:52
msgid "Admin username"
msgstr ""
-#: neutron/agent/linux/interface.py:48 neutron/agent/metadata/agent.py:54
+#: neutron/agent/linux/interface.py:54 neutron/agent/metadata/agent.py:51
#: neutron/plugins/metaplugin/common/config.py:65
msgid "Admin password"
msgstr ""
-#: neutron/agent/linux/interface.py:51 neutron/agent/metadata/agent.py:57
+#: neutron/agent/linux/interface.py:57 neutron/agent/metadata/agent.py:54
#: neutron/plugins/metaplugin/common/config.py:68
msgid "Admin tenant name"
msgstr ""
-#: neutron/agent/linux/interface.py:53 neutron/agent/metadata/agent.py:59
+#: neutron/agent/linux/interface.py:59 neutron/agent/metadata/agent.py:56
#: neutron/plugins/metaplugin/common/config.py:70
msgid "Authentication URL"
msgstr ""
-#: neutron/agent/linux/interface.py:55 neutron/agent/metadata/agent.py:61
+#: neutron/agent/linux/interface.py:61 neutron/agent/metadata/agent.py:58
#: neutron/common/config.py:47 neutron/plugins/metaplugin/common/config.py:72
msgid "The type of authentication to use"
msgstr ""
-#: neutron/agent/linux/interface.py:57 neutron/agent/metadata/agent.py:63
+#: neutron/agent/linux/interface.py:63 neutron/agent/metadata/agent.py:60
#: neutron/plugins/metaplugin/common/config.py:74
msgid "Authentication region"
msgstr ""
-#: neutron/agent/linux/interface.py:214 neutron/agent/linux/interface.py:268
-#: neutron/agent/linux/interface.py:330 neutron/agent/linux/interface.py:379
+#: neutron/agent/linux/interface.py:66 neutron/agent/metadata/agent.py:70
+msgid "Network service endpoint type to pull from the keystone catalog"
+msgstr ""
+
+#: neutron/agent/linux/interface.py:265 neutron/agent/linux/interface.py:320
+#: neutron/agent/linux/interface.py:383 neutron/agent/linux/interface.py:430
#, python-format
msgid "Device %s already exists"
msgstr ""
-#: neutron/agent/linux/interface.py:232 neutron/agent/linux/interface.py:279
-#: neutron/agent/linux/interface.py:342 neutron/agent/linux/interface.py:386
+#: neutron/agent/linux/interface.py:283 neutron/agent/linux/interface.py:331
+#: neutron/agent/linux/interface.py:395 neutron/agent/linux/interface.py:437
#, python-format
msgid "Unplugged interface '%s'"
msgstr ""
-#: neutron/agent/linux/interface.py:234 neutron/agent/linux/interface.py:278
-#: neutron/agent/linux/interface.py:344 neutron/agent/linux/interface.py:388
+#: neutron/agent/linux/interface.py:285 neutron/agent/linux/interface.py:330
+#: neutron/agent/linux/interface.py:397 neutron/agent/linux/interface.py:439
#, python-format
msgid "Failed unplugging interface '%s'"
msgstr ""
-#: neutron/agent/linux/interface.py:446
+#: neutron/agent/linux/interface.py:498
#, python-format
msgid "Driver location: %s"
msgstr ""
@@ -1227,61 +1191,61 @@ msgstr ""
msgid "Force ip_lib calls to use the root helper"
msgstr ""
-#: neutron/agent/linux/iptables_firewall.py:85
+#: neutron/agent/linux/iptables_firewall.py:87
#, python-format
msgid "Preparing device (%s) filter"
msgstr ""
-#: neutron/agent/linux/iptables_firewall.py:93
+#: neutron/agent/linux/iptables_firewall.py:95
#, python-format
msgid "Updating device (%s) filter"
msgstr ""
-#: neutron/agent/linux/iptables_firewall.py:95
+#: neutron/agent/linux/iptables_firewall.py:97
#, python-format
msgid "Attempted to update port filter which is not filtered %s"
msgstr ""
-#: neutron/agent/linux/iptables_firewall.py:104
+#: neutron/agent/linux/iptables_firewall.py:106
#, python-format
msgid "Removing device (%s) filter"
msgstr ""
-#: neutron/agent/linux/iptables_firewall.py:106
+#: neutron/agent/linux/iptables_firewall.py:108
#, python-format
msgid "Attempted to remove port filter which is not filtered %r"
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:157
+#: neutron/agent/linux/iptables_manager.py:167
#, python-format
msgid "Attempted to remove chain %s which does not exist"
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:199
+#: neutron/agent/linux/iptables_manager.py:210
#, python-format
msgid "Unknown chain: %r"
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:234
+#: neutron/agent/linux/iptables_manager.py:247
#, python-format
msgid ""
"Tried to remove rule that was not there: %(chain)r %(rule)r %(wrap)r "
"%(top)r"
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:389
+#: neutron/agent/linux/iptables_manager.py:404
#, python-format
msgid "Got semaphore / lock \"%s\""
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:392
+#: neutron/agent/linux/iptables_manager.py:407
#, python-format
msgid "Semaphore / lock released \"%s\""
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:443
-#: neutron/tests/unit/test_iptables_manager.py:753
-#: neutron/tests/unit/test_iptables_manager.py:787
+#: neutron/agent/linux/iptables_manager.py:458
+#: neutron/tests/unit/test_iptables_manager.py:858
+#: neutron/tests/unit/test_iptables_manager.py:892
#, python-format
msgid ""
"IPTablesManager.apply failed to apply the following set of iptables "
@@ -1289,16 +1253,16 @@ msgid ""
"%s"
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:446
+#: neutron/agent/linux/iptables_manager.py:461
msgid "IPTablesManager.apply completed with success"
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:456
+#: neutron/agent/linux/iptables_manager.py:471
#, python-format
msgid "Unable to find table %s"
msgstr ""
-#: neutron/agent/linux/iptables_manager.py:660
+#: neutron/agent/linux/iptables_manager.py:675
#, python-format
msgid "Attempted to get traffic counters of chain %s which does not exist"
msgstr ""
@@ -1322,48 +1286,33 @@ msgid ""
"%(valid_auth_types)s"
msgstr ""
-#: neutron/agent/linux/ovs_lib.py:38
+#: neutron/agent/linux/ovs_lib.py:39
msgid "Timeout in seconds for ovs-vsctl commands"
msgstr ""
-#: neutron/agent/linux/ovs_lib.py:72 neutron/agent/linux/ovs_lib.py:170
-#: neutron/agent/linux/ovs_lib.py:290
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:55
+#: neutron/agent/linux/ovs_lib.py:73 neutron/agent/linux/ovs_lib.py:171
+#: neutron/agent/linux/ovs_lib.py:291
+#: neutron/plugins/bigswitch/agent/restproxy_agent.py:54
#, python-format
msgid "Unable to execute %(cmd)s. Exception: %(exception)s"
msgstr ""
-#: neutron/agent/linux/ovs_lib.py:241
+#: neutron/agent/linux/ovs_lib.py:242
msgid ""
"Unable to create VXLAN tunnel port. Please ensure that an openvswitch "
"version that supports VXLAN is installed."
msgstr ""
-#: neutron/agent/linux/ovs_lib.py:338
+#: neutron/agent/linux/ovs_lib.py:339
#, python-format
msgid "Found not yet ready openvswitch port: %s"
msgstr ""
-#: neutron/agent/linux/ovs_lib.py:353
+#: neutron/agent/linux/ovs_lib.py:354
#, python-format
msgid "Found failed openvswitch port: %s"
msgstr ""
-#: neutron/agent/linux/ovs_lib.py:408
-#, python-format
-msgid "Port: %(port_name)s is on %(switch)s, not on %(br_name)s"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:416
-#, python-format
-msgid "ofport: %(ofport)s for VIF: %(vif)s is not a positive integer"
-msgstr ""
-
-#: neutron/agent/linux/ovs_lib.py:426
-#, python-format
-msgid "Unable to parse interface details. Exception: %s"
-msgstr ""
-
#: neutron/agent/linux/ovs_lib.py:444
#, python-format
msgid "Unable to determine mac address for %s"
@@ -1411,12 +1360,12 @@ msgstr ""
msgid "Location to store IPv6 RA config files"
msgstr ""
-#: neutron/agent/linux/utils.py:48
+#: neutron/agent/linux/utils.py:46
#, python-format
msgid "Running command: %s"
msgstr ""
-#: neutron/agent/linux/utils.py:71
+#: neutron/agent/linux/utils.py:70
#, python-format
msgid ""
"\n"
@@ -1426,75 +1375,71 @@ msgid ""
"Stderr: %(stderr)r"
msgstr ""
-#: neutron/agent/metadata/agent.py:52
+#: neutron/agent/metadata/agent.py:49
#: neutron/plugins/metaplugin/common/config.py:63
msgid "Admin user"
msgstr ""
-#: neutron/agent/metadata/agent.py:66
+#: neutron/agent/metadata/agent.py:63
msgid "Turn off verification of the certificate for ssl"
msgstr ""
-#: neutron/agent/metadata/agent.py:69
+#: neutron/agent/metadata/agent.py:66
msgid "Certificate Authority public key (CA cert) file for ssl"
msgstr ""
#: neutron/agent/metadata/agent.py:73
-msgid "Network service endpoint type to pull from the keystone catalog"
-msgstr ""
-
-#: neutron/agent/metadata/agent.py:76
msgid "IP address used by Nova metadata server."
msgstr ""
-#: neutron/agent/metadata/agent.py:79
+#: neutron/agent/metadata/agent.py:76
msgid "TCP Port used by Nova metadata server."
msgstr ""
-#: neutron/agent/metadata/agent.py:82
+#: neutron/agent/metadata/agent.py:79
#: neutron/plugins/vmware/dhcp_meta/nsx.py:63
msgid "Shared secret to sign instance-id request"
msgstr ""
-#: neutron/agent/metadata/agent.py:87
+#: neutron/agent/metadata/agent.py:84
msgid "Protocol to access nova metadata, http or https"
msgstr ""
-#: neutron/agent/metadata/agent.py:89
+#: neutron/agent/metadata/agent.py:86
msgid "Allow to perform insecure SSL (https) requests to nova metadata"
msgstr ""
-#: neutron/agent/metadata/agent.py:93
+#: neutron/agent/metadata/agent.py:90
msgid "Client certificate for nova metadata api server."
msgstr ""
-#: neutron/agent/metadata/agent.py:96
+#: neutron/agent/metadata/agent.py:93
msgid "Private key of client certificate."
msgstr ""
-#: neutron/agent/metadata/agent.py:126
-#: neutron/agent/metadata/namespace_proxy.py:68
+#: neutron/agent/metadata/agent.py:123
+#: neutron/agent/metadata/namespace_proxy.py:66
#, python-format
msgid "Request: %s"
msgstr ""
-#: neutron/agent/metadata/agent.py:135
-#: neutron/agent/metadata/namespace_proxy.py:76
+#: neutron/agent/metadata/agent.py:132
+#: neutron/agent/metadata/namespace_proxy.py:74
msgid "Unexpected error."
msgstr ""
-#: neutron/agent/metadata/agent.py:136
-#: neutron/agent/metadata/namespace_proxy.py:77
+#: neutron/agent/metadata/agent.py:133
+#: neutron/agent/metadata/namespace_proxy.py:75
msgid "An unknown error has occurred. Please try your request again."
msgstr ""
-#: neutron/agent/metadata/agent.py:182
+#: neutron/agent/metadata/agent.py:179
msgid ""
"Either one of parameter network_id or router_id must be passed to "
"_get_ports method."
msgstr ""
-#: neutron/agent/metadata/agent.py:231
+#: neutron/agent/metadata/agent.py:229
msgid ""
"The remote metadata server responded with Forbidden. This response "
"usually occurs when shared secrets do not match."
@@ -1511,19 +1456,19 @@ msgstr ""
msgid "Unexpected response code: %s"
msgstr ""
-#: neutron/agent/metadata/agent.py:308
+#: neutron/agent/metadata/agent.py:300
msgid "Location for Metadata Proxy UNIX domain socket"
msgstr ""
-#: neutron/agent/metadata/agent.py:311
+#: neutron/agent/metadata/agent.py:303
msgid "Number of separate worker processes for metadata server"
msgstr ""
-#: neutron/agent/metadata/agent.py:315
+#: neutron/agent/metadata/agent.py:307
msgid "Number of backlog requests to configure the metadata server socket with"
msgstr ""
-#: neutron/agent/metadata/namespace_proxy.py:63
+#: neutron/agent/metadata/namespace_proxy.py:61
msgid "network_id and router_id are None. One must be provided."
msgstr ""
@@ -1576,7 +1521,7 @@ msgid ""
" and '%(desc)s'"
msgstr ""
-#: neutron/api/api_common.py:315 neutron/api/v2/base.py:597
+#: neutron/api/api_common.py:315 neutron/api/v2/base.py:599
#, python-format
msgid "Unable to find '%s' in request body"
msgstr ""
@@ -1724,36 +1669,36 @@ msgid ""
"available. Payload: %(payload)s"
msgstr ""
-#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:38
+#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:40
#, python-format
msgid "Nofity agent at %(host)s the message %(method)s"
msgstr ""
-#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:57
+#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:62
#, python-format
msgid "Notify agent at %(topic)s.%(host)s the message %(method)s"
msgstr ""
-#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:99
+#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:105
#, python-format
msgid ""
"No plugin for L3 routing registered. Cannot notify agents with the "
"message %s"
msgstr ""
-#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:117
+#: neutron/api/rpc/agentnotifiers/l3_rpc_agent_api.py:123
#, python-format
msgid ""
"Fanout notify agent at %(topic)s the message %(method)s on router "
"%(router_id)s"
msgstr ""
-#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:49
+#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:47
#, python-format
msgid "Notify metering agent at %(topic)s.%(host)s the message %(method)s"
msgstr ""
-#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:64
+#: neutron/api/rpc/agentnotifiers/metering_rpc_agent_api.py:62
#, python-format
msgid ""
"Fanout notify metering agent at %(topic)s the message %(method)s on "
@@ -1829,10 +1774,6 @@ msgstr ""
msgid "Update dhcp port %(port)s from %(host)s."
msgstr ""
-#: neutron/api/rpc/handlers/dvr_rpc.py:128
-msgid "DVR agent binding currently not set."
-msgstr ""
-
#: neutron/api/rpc/handlers/l3_rpc.py:70
msgid ""
"No plugin for L3 routing registered! Will reply to l3 agent with empty "
@@ -2003,7 +1944,7 @@ msgid "'%s' is not a valid input"
msgstr ""
#: neutron/api/v2/attributes.py:355
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:534
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:529
#, python-format
msgid "'%s' is not a valid UUID"
msgstr ""
@@ -2029,7 +1970,7 @@ msgid "'%s' cannot be converted to boolean"
msgstr ""
#: neutron/api/v2/attributes.py:491
-#: neutron/plugins/nec/extensions/packetfilter.py:75
+#: neutron/plugins/nec/extensions/packetfilter.py:72
#, python-format
msgid "'%s' is not a integer"
msgstr ""
@@ -2057,60 +1998,60 @@ msgstr ""
msgid "Invalid format: %s"
msgstr ""
-#: neutron/api/v2/base.py:550
+#: neutron/api/v2/base.py:554
msgid ""
"Specifying 'tenant_id' other than authenticated tenant in request "
"requires admin privileges"
msgstr ""
-#: neutron/api/v2/base.py:558
+#: neutron/api/v2/base.py:562
msgid "Running without keystone AuthN requires that tenant_id is specified"
msgstr ""
-#: neutron/api/v2/base.py:576
+#: neutron/api/v2/base.py:580
msgid "Resource body required"
msgstr ""
-#: neutron/api/v2/base.py:578
+#: neutron/api/v2/base.py:582
#, python-format
msgid "Request body: %(body)s"
msgstr ""
-#: neutron/api/v2/base.py:588
+#: neutron/api/v2/base.py:585
msgid "Bulk operation not supported"
msgstr ""
-#: neutron/api/v2/base.py:592
+#: neutron/api/v2/base.py:588
msgid "Resources required"
msgstr ""
-#: neutron/api/v2/base.py:608
+#: neutron/api/v2/base.py:610
#, python-format
msgid "Failed to parse request. Required attribute '%s' not specified"
msgstr ""
-#: neutron/api/v2/base.py:615
+#: neutron/api/v2/base.py:617
#, python-format
msgid "Attribute '%s' not allowed in POST"
msgstr ""
-#: neutron/api/v2/base.py:620
+#: neutron/api/v2/base.py:622
#, python-format
msgid "Cannot update read-only attribute %s"
msgstr ""
-#: neutron/api/v2/base.py:638
+#: neutron/api/v2/base.py:640
#, python-format
msgid "Invalid input for %(attr)s. Reason: %(reason)s."
msgstr ""
-#: neutron/api/v2/base.py:647 neutron/extensions/allowedaddresspairs.py:75
+#: neutron/api/v2/base.py:649 neutron/extensions/allowedaddresspairs.py:75
#: neutron/extensions/multiprovidernet.py:45
#, python-format
msgid "Unrecognized attribute(s) '%s'"
msgstr ""
-#: neutron/api/v2/base.py:666
+#: neutron/api/v2/base.py:668
#, python-format
msgid "Tenant %(tenant_id)s not allowed to create %(resource)s on this network"
msgstr ""
@@ -2127,7 +2068,7 @@ msgid "%s failed"
msgstr ""
#: neutron/api/v2/resource.py:130
-#: neutron/tests/unit/test_api_v2_resource.py:299
+#: neutron/tests/unit/test_api_v2_resource.py:296
msgid "Request Failed: internal server error while processing your request."
msgstr ""
@@ -2195,7 +2136,7 @@ msgstr ""
msgid "The core plugin Neutron will use"
msgstr ""
-#: neutron/common/config.py:51 neutron/db/migration/cli.py:35
+#: neutron/common/config.py:51 neutron/db/migration/cli.py:33
msgid "The service plugins Neutron will use"
msgstr ""
@@ -2288,51 +2229,55 @@ msgstr ""
msgid "The uuid of the admin nova tenant"
msgstr ""
-#: neutron/common/config.py:106
+#: neutron/common/config.py:105
+msgid "The name of the admin nova tenant"
+msgstr ""
+
+#: neutron/common/config.py:108
msgid "Authorization URL for connecting to nova in admin context"
msgstr ""
-#: neutron/common/config.py:109
+#: neutron/common/config.py:111
msgid "CA file for novaclient to verify server certificates"
msgstr ""
-#: neutron/common/config.py:111
+#: neutron/common/config.py:113
msgid "If True, ignore any SSL validation issues"
msgstr ""
-#: neutron/common/config.py:113
+#: neutron/common/config.py:115
msgid ""
"Name of nova region to use. Useful if keystone manages more than one "
"region."
msgstr ""
-#: neutron/common/config.py:116
+#: neutron/common/config.py:118
msgid ""
"Number of seconds between sending events to nova if there are any events "
"to send."
msgstr ""
-#: neutron/common/config.py:123
+#: neutron/common/config.py:125
msgid ""
"Where to store Neutron state files. This directory must be writable by "
"the agent."
msgstr ""
-#: neutron/common/config.py:156
+#: neutron/common/config.py:158
#, python-format
msgid "Base MAC: %s"
msgstr ""
-#: neutron/common/config.py:164
+#: neutron/common/config.py:166
msgid "Logging enabled!"
msgstr ""
-#: neutron/common/config.py:180
+#: neutron/common/config.py:182
#, python-format
msgid "Config paste file: %s"
msgstr ""
-#: neutron/common/config.py:185
+#: neutron/common/config.py:187
#, python-format
msgid "Unable to load %(app_name)s from configuration file %(config_path)s."
msgstr ""
@@ -2626,30 +2571,40 @@ msgstr ""
#: neutron/common/exceptions.py:309
#, python-format
+msgid "Invalid network Tunnel range: '%(tunnel_range)s' - %(error)s"
+msgstr ""
+
+#: neutron/common/exceptions.py:320
+#, python-format
msgid "Invalid network VXLAN port range: '%(vxlan_range)s'"
msgstr ""
-#: neutron/common/exceptions.py:313
+#: neutron/common/exceptions.py:324
msgid "VXLAN Network unsupported."
msgstr ""
-#: neutron/common/exceptions.py:317
+#: neutron/common/exceptions.py:328
#, python-format
msgid "Found duplicate extension: %(alias)s"
msgstr ""
-#: neutron/common/exceptions.py:321
+#: neutron/common/exceptions.py:332
#, python-format
msgid ""
"The following device_id %(device_id)s is not owned by your tenant or "
"matches another tenants router."
msgstr ""
-#: neutron/common/exceptions.py:326
+#: neutron/common/exceptions.py:337
#, python-format
msgid "Invalid CIDR %(input)s given as IP prefix"
msgstr ""
+#: neutron/common/exceptions.py:341
+#, python-format
+msgid "Router '%(router_id)s' is not compatible with this agent"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:35
msgid "Unable to generate IP address by EUI64 for IPv4 prefix"
msgstr ""
@@ -2680,7 +2635,7 @@ msgid ""
"therefore results cannot be cached for %(func_name)s."
msgstr ""
-#: neutron/common/utils.py:118 neutron/openstack/common/fileutils.py:63
+#: neutron/common/utils.py:118
#, python-format
msgid "Reloading cached file %s"
msgstr ""
@@ -2768,117 +2723,117 @@ msgstr ""
msgid "Delete allocated IP %(ip_address)s (%(network_id)s/%(subnet_id)s)"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:224
-#, python-format
-msgid "All IPs from subnet %(subnet_id)s (%(cidr)s) allocated"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:229
-#, python-format
-msgid "Allocated IP - %(ip_address)s from %(first_ip)s to %(last_ip)s"
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:236
-msgid "No more free IP's in slice. Deleting allocation pool."
-msgstr ""
-
-#: neutron/db/db_base_plugin_v2.py:255
+#: neutron/db/db_base_plugin_v2.py:266
#, python-format
msgid "Rebuilding availability ranges for subnet %s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:398
+#: neutron/db/db_base_plugin_v2.py:411
msgid "IP allocation requires subnet_id or ip_address"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:410
+#: neutron/db/db_base_plugin_v2.py:423
#, python-format
msgid "IP address %s is not a valid IP for the defined networks subnets"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:416
+#: neutron/db/db_base_plugin_v2.py:429
#, python-format
msgid ""
"Failed to create port on network %(network_id)s, because fixed_ips "
"included invalid subnet %(subnet_id)s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:436
+#: neutron/db/db_base_plugin_v2.py:449
#, python-format
msgid "IP address %s is not a valid IP for the defined subnet"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:445 neutron/db/db_base_plugin_v2.py:478
+#: neutron/db/db_base_plugin_v2.py:453
+#, python-format
+msgid ""
+"IPv6 address %(address)s can not be directly assigned to a port on subnet"
+" %(id)s with %(mode)s address mode"
+msgstr ""
+
+#: neutron/db/db_base_plugin_v2.py:465 neutron/db/db_base_plugin_v2.py:507
#: neutron/plugins/opencontrail/contrail_plugin.py:388
msgid "Exceeded maximim amount of fixed ips per port"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:493
+#: neutron/db/db_base_plugin_v2.py:522
#, python-format
msgid "Port update. Hold %s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:500
+#: neutron/db/db_base_plugin_v2.py:529
#, python-format
msgid "Port update. Adding %s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:574
+#: neutron/db/db_base_plugin_v2.py:604
msgid "0 is not allowed as CIDR prefix length"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:584
+#: neutron/db/db_base_plugin_v2.py:614
#, python-format
msgid ""
"Requested subnet with cidr: %(cidr)s for network: %(network_id)s overlaps"
" with another subnet"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:589
+#: neutron/db/db_base_plugin_v2.py:619
#, python-format
msgid ""
"Validation for CIDR: %(new_cidr)s failed - overlaps with subnet "
"%(subnet_id)s (CIDR: %(cidr)s)"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:609
+#: neutron/db/db_base_plugin_v2.py:639
msgid "Performing IP validity checks on allocation pools"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:616
+#: neutron/db/db_base_plugin_v2.py:646
#, python-format
msgid "Found invalid IP address in pool: %(start)s - %(end)s:"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:623
+#: neutron/db/db_base_plugin_v2.py:653
msgid "Specified IP addresses do not match the subnet IP version"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:627
+#: neutron/db/db_base_plugin_v2.py:657
#, python-format
msgid "Start IP (%(start)s) is greater than end IP (%(end)s)"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:632
+#: neutron/db/db_base_plugin_v2.py:662
#, python-format
msgid "Found pool larger than subnet CIDR:%(start)s - %(end)s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:645
+#: neutron/db/db_base_plugin_v2.py:675
msgid "Checking for overlaps among allocation pools and gateway ip"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:656
+#: neutron/db/db_base_plugin_v2.py:686
#, python-format
msgid "Found overlapping ranges: %(l_range)s and %(r_range)s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:669 neutron/db/db_base_plugin_v2.py:673
+#: neutron/db/db_base_plugin_v2.py:699 neutron/db/db_base_plugin_v2.py:703
#, python-format
msgid "Invalid route: %s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:751
+#: neutron/db/db_base_plugin_v2.py:781
+#, python-format
+msgid ""
+"Invalid CIDR %s for IPv6 address mode. OpenStack uses the EUI-64 address "
+"format, which requires the prefix to be /64."
+msgstr ""
+
+#: neutron/db/db_base_plugin_v2.py:789
#, python-format
msgid ""
"ipv6_ra_mode set to '%(ra_mode)s' with ipv6_address_mode set to "
@@ -2886,49 +2841,49 @@ msgid ""
"the same value"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:759
+#: neutron/db/db_base_plugin_v2.py:797
msgid ""
"ipv6_ra_mode or ipv6_address_mode cannot be set when enable_dhcp is set "
"to False."
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:765
+#: neutron/db/db_base_plugin_v2.py:803
msgid "Cannot disable enable_dhcp with ipv6 attributes set"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:857
+#: neutron/db/db_base_plugin_v2.py:895
#, python-format
msgid "An exception occurred while creating the %(resource)s:%(item)s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:954
+#: neutron/db/db_base_plugin_v2.py:992
#, python-format
msgid "%(name)s '%(addr)s' does not match the ip_version '%(ip_version)s'"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:978
+#: neutron/db/db_base_plugin_v2.py:1016
msgid "Gateway is not valid on subnet"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:998 neutron/db/db_base_plugin_v2.py:1012
+#: neutron/db/db_base_plugin_v2.py:1036 neutron/db/db_base_plugin_v2.py:1050
#: neutron/plugins/opencontrail/contrail_plugin.py:312
msgid "new subnet"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:1005
+#: neutron/db/db_base_plugin_v2.py:1043
#, python-format
msgid "Error parsing dns address %s"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:1021
+#: neutron/db/db_base_plugin_v2.py:1059
msgid "ipv6_ra_mode is not valid when ip_version is 4"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:1025
+#: neutron/db/db_base_plugin_v2.py:1063
msgid "ipv6_address_mode is not valid when ip_version is 4"
msgstr ""
-#: neutron/db/db_base_plugin_v2.py:1395
+#: neutron/db/db_base_plugin_v2.py:1432
#, python-format
msgid ""
"Ignoring PortNotFound when deleting port '%s'. The port has already been "
@@ -2971,119 +2926,119 @@ msgstr ""
msgid "Removed routes are %s"
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:48
+#: neutron/db/l3_agentschedulers_db.py:49
msgid "Driver to use for scheduling router to a default L3 agent"
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:51
+#: neutron/db/l3_agentschedulers_db.py:52
msgid "Allow auto scheduling of routers to L3 agent."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:53
+#: neutron/db/l3_agentschedulers_db.py:54
msgid ""
"Automatically reschedule routers from offline L3 agents to online L3 "
"agents."
msgstr ""
-#: neutron/db/l3_db.py:230
+#: neutron/db/l3_db.py:259
#, python-format
msgid "No eligible l3 agent associated with external network %s found"
msgstr ""
-#: neutron/db/l3_db.py:251
+#: neutron/db/l3_db.py:280
#, python-format
msgid "No IPs available for external network %s"
msgstr ""
-#: neutron/db/l3_db.py:265
+#: neutron/db/l3_db.py:300
#, python-format
msgid "Network %s is not an external network"
msgstr ""
-#: neutron/db/l3_db.py:377
+#: neutron/db/l3_db.py:407
#, python-format
msgid "Router already has a port on subnet %s"
msgstr ""
-#: neutron/db/l3_db.py:391
+#: neutron/db/l3_db.py:421
#, python-format
msgid ""
"Cidr %(subnet_cidr)s of subnet %(subnet_id)s overlaps with cidr %(cidr)s "
"of subnet %(sub_id)s"
msgstr ""
-#: neutron/db/l3_db.py:407 neutron/db/l3_db.py:534 neutron/db/l3_dvr_db.py:210
+#: neutron/db/l3_db.py:437 neutron/db/l3_db.py:584 neutron/db/l3_dvr_db.py:239
#: neutron/plugins/bigswitch/l3_router_plugin.py:170
#: neutron/plugins/bigswitch/l3_router_plugin.py:179
#: neutron/plugins/opencontrail/contrail_plugin.py:499
msgid "Either subnet_id or port_id must be specified"
msgstr ""
-#: neutron/db/l3_db.py:410 neutron/plugins/opencontrail/contrail_plugin.py:509
+#: neutron/db/l3_db.py:440 neutron/plugins/opencontrail/contrail_plugin.py:509
msgid "Cannot specify both subnet-id and port-id"
msgstr ""
-#: neutron/db/l3_db.py:423
+#: neutron/db/l3_db.py:453
msgid "Router port must have exactly one fixed IP"
msgstr ""
-#: neutron/db/l3_db.py:437
+#: neutron/db/l3_db.py:467
msgid "Subnet for router interface must have a gateway IP"
msgstr ""
-#: neutron/db/l3_db.py:580 neutron/plugins/nec/nec_router.py:197
+#: neutron/db/l3_db.py:632 neutron/plugins/nec/nec_router.py:195
#, python-format
msgid "Cannot add floating IP to port on subnet %s which has no gateway_ip"
msgstr ""
-#: neutron/db/l3_db.py:616
+#: neutron/db/l3_db.py:668
#, python-format
msgid ""
"Port %(port_id)s is associated with a different tenant than Floating IP "
"%(floatingip_id)s and therefore cannot be bound."
msgstr ""
-#: neutron/db/l3_db.py:620
+#: neutron/db/l3_db.py:672
#, python-format
msgid ""
"Cannot create floating IP and bind it to Port %s, since that port is "
"owned by a different tenant."
msgstr ""
-#: neutron/db/l3_db.py:632
+#: neutron/db/l3_db.py:684
#, python-format
msgid "Port %(id)s does not have fixed ip %(address)s"
msgstr ""
-#: neutron/db/l3_db.py:639
+#: neutron/db/l3_db.py:691
#, python-format
msgid "Cannot add floating IP to port %s that hasno fixed IP addresses"
msgstr ""
-#: neutron/db/l3_db.py:643
+#: neutron/db/l3_db.py:695
#, python-format
msgid ""
"Port %s has multiple fixed IPs. Must provide a specific IP when "
"assigning a floating IP"
msgstr ""
-#: neutron/db/l3_db.py:673 neutron/plugins/vmware/plugins/base.py:1804
+#: neutron/db/l3_db.py:725 neutron/plugins/vmware/plugins/base.py:1813
msgid "fixed_ip_address cannot be specified without a port_id"
msgstr ""
-#: neutron/db/l3_db.py:713
+#: neutron/db/l3_db.py:765
#, python-format
msgid "Network %s is not a valid external network"
msgstr ""
-#: neutron/db/l3_db.py:846
+#: neutron/db/l3_db.py:898
#, python-format
msgid ""
"Port %(port_id)s has owner %(port_owner)s, but no IP address, so it can "
"be deleted"
msgstr ""
-#: neutron/db/l3_db.py:960
+#: neutron/db/l3_db.py:1019
#, python-format
msgid "Skipping port %s as no IP is configure on it"
msgstr ""
@@ -3099,25 +3054,25 @@ msgstr ""
msgid "Centralizing distributed router %s is not supported"
msgstr ""
-#: neutron/db/l3_dvr_db.py:404
+#: neutron/db/l3_dvr_db.py:443
#, python-format
msgid "Agent Gateway port does not exist, so create one: %s"
msgstr ""
-#: neutron/db/l3_dvr_db.py:419
+#: neutron/db/l3_dvr_db.py:458
msgid "Unable to create the Agent Gateway Port"
msgstr ""
-#: neutron/db/l3_dvr_db.py:445
+#: neutron/db/l3_dvr_db.py:491
msgid "Unable to create the SNAT Interface Port"
msgstr ""
-#: neutron/db/l3_dvr_db.py:469
+#: neutron/db/l3_dvr_db.py:526
#, python-format
msgid "SNAT interface port list does not exist, so create one: %s"
msgstr ""
-#: neutron/db/l3_dvrscheduler_db.py:307
+#: neutron/db/l3_dvrscheduler_db.py:296
msgid "No active L3 agents found for SNAT"
msgstr ""
@@ -3137,17 +3092,17 @@ msgstr ""
msgid "Subnet used for the l3 HA admin network."
msgstr ""
-#: neutron/db/routedserviceinsertion_db.py:36
+#: neutron/db/routedserviceinsertion_db.py:34
#, python-format
msgid "Resource type '%(resource_type)s' is longer than %(maxlen)d characters"
msgstr ""
-#: neutron/db/securitygroups_rpc_base.py:58
+#: neutron/db/securitygroups_rpc_base.py:57
#, python-format
msgid "%s must implement get_port_from_device."
msgstr ""
-#: neutron/db/securitygroups_rpc_base.py:338
+#: neutron/db/securitygroups_rpc_base.py:349
#, python-format
msgid "No valid gateway port on subnet %s is found for IPv6 RA"
msgstr ""
@@ -3164,97 +3119,90 @@ msgid ""
"sort '%(resource)s'"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:241
-#: neutron/plugins/vmware/plugins/service.py:907
-#: neutron/services/firewall/fwaas_plugin.py:218
+#: neutron/db/firewall/firewall_db.py:267
+#: neutron/services/firewall/fwaas_plugin.py:216
msgid "create_firewall() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:262
-#: neutron/plugins/vmware/plugins/service.py:941
-#: neutron/services/firewall/fwaas_plugin.py:232
+#: neutron/db/firewall/firewall_db.py:288
+#: neutron/services/firewall/fwaas_plugin.py:230
msgid "update_firewall() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:271
-#: neutron/plugins/vmware/plugins/service.py:967
-#: neutron/services/firewall/fwaas_plugin.py:247
+#: neutron/db/firewall/firewall_db.py:297
+#: neutron/services/firewall/fwaas_plugin.py:245
msgid "delete_firewall() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:280
+#: neutron/db/firewall/firewall_db.py:306
msgid "get_firewall() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:285
+#: neutron/db/firewall/firewall_db.py:311
msgid "get_firewalls() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:291
+#: neutron/db/firewall/firewall_db.py:317
msgid "get_firewalls_count() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:296
+#: neutron/db/firewall/firewall_db.py:322
msgid "create_firewall_policy() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:312
-#: neutron/plugins/vmware/plugins/service.py:1029
-#: neutron/services/firewall/fwaas_plugin.py:256
+#: neutron/db/firewall/firewall_db.py:337
+#: neutron/services/firewall/fwaas_plugin.py:254
msgid "update_firewall_policy() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:326
+#: neutron/db/firewall/firewall_db.py:359
msgid "delete_firewall_policy() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:338
+#: neutron/db/firewall/firewall_db.py:371
msgid "get_firewall_policy() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:343
+#: neutron/db/firewall/firewall_db.py:376
msgid "get_firewall_policies() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:349
+#: neutron/db/firewall/firewall_db.py:382
msgid "get_firewall_policies_count() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:354
+#: neutron/db/firewall/firewall_db.py:387
msgid "create_firewall_rule() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:386
-#: neutron/plugins/vmware/plugins/service.py:1003
-#: neutron/services/firewall/fwaas_plugin.py:264
+#: neutron/db/firewall/firewall_db.py:419
+#: neutron/services/firewall/fwaas_plugin.py:262
msgid "update_firewall_rule() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:418
+#: neutron/db/firewall/firewall_db.py:455
msgid "delete_firewall_rule() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:426
+#: neutron/db/firewall/firewall_db.py:463
msgid "get_firewall_rule() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:431
+#: neutron/db/firewall/firewall_db.py:468
msgid "get_firewall_rules() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:437
+#: neutron/db/firewall/firewall_db.py:474
msgid "get_firewall_rules_count() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:446
-#: neutron/plugins/vmware/plugins/service.py:1056
-#: neutron/services/firewall/fwaas_plugin.py:274
+#: neutron/db/firewall/firewall_db.py:483
+#: neutron/services/firewall/fwaas_plugin.py:272
msgid "insert_rule() called"
msgstr ""
-#: neutron/db/firewall/firewall_db.py:490
-#: neutron/plugins/vmware/plugins/service.py:1085
-#: neutron/services/firewall/fwaas_plugin.py:282
+#: neutron/db/firewall/firewall_db.py:529
+#: neutron/services/firewall/fwaas_plugin.py:280
msgid "remove_rule() called"
msgstr ""
@@ -3271,99 +3219,99 @@ msgstr ""
msgid "'cookie_name' is not allowed for this type of session persistence"
msgstr ""
-#: neutron/db/metering/metering_rpc.py:46
+#: neutron/db/metering/metering_rpc.py:44
#, python-format
msgid "Unable to find agent %s."
msgstr ""
-#: neutron/db/migration/__init__.py:44
+#: neutron/db/migration/__init__.py:38
#, python-format
msgid "%s cannot be called while in offline mode"
msgstr ""
-#: neutron/db/migration/cli.py:32
+#: neutron/db/migration/cli.py:30
msgid "Neutron plugin provider module"
msgstr ""
-#: neutron/db/migration/cli.py:41
+#: neutron/db/migration/cli.py:39
msgid "Neutron quota driver class"
msgstr ""
-#: neutron/db/migration/cli.py:49
+#: neutron/db/migration/cli.py:47
msgid "URL to database"
msgstr ""
-#: neutron/db/migration/cli.py:52
+#: neutron/db/migration/cli.py:50
msgid "Database engine"
msgstr ""
-#: neutron/db/migration/cli.py:75
+#: neutron/db/migration/cli.py:73
msgid "You must provide a revision or relative delta"
msgstr ""
-#: neutron/db/migration/cli.py:105 neutron/db/migration/cli.py:118
+#: neutron/db/migration/cli.py:103 neutron/db/migration/cli.py:116
msgid "Timeline branches unable to generate timeline"
msgstr ""
-#: neutron/db/migration/cli.py:112
+#: neutron/db/migration/cli.py:110
msgid "HEAD file does not match migration timeline head"
msgstr ""
-#: neutron/db/migration/cli.py:158
+#: neutron/db/migration/cli.py:156
msgid "Available commands"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:89
+#: neutron/db/migration/migrate_to_ml2.py:90
msgid "Missing version in alembic_versions table"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:91
+#: neutron/db/migration/migrate_to_ml2.py:92
#, python-format
msgid "Multiple versions in alembic_versions table: %s"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:95
+#: neutron/db/migration/migrate_to_ml2.py:96
#, python-format
msgid ""
"Unsupported database schema %(current)s. Please migrate your database to "
"one of following versions: %(supported)s"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:415
+#: neutron/db/migration/migrate_to_ml2.py:425
#, python-format
msgid "Unknown tunnel type: %s"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:429
+#: neutron/db/migration/migrate_to_ml2.py:453
msgid "The plugin type whose database will be migrated"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:432
+#: neutron/db/migration/migrate_to_ml2.py:456
msgid "The connection url for the target db"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:435
+#: neutron/db/migration/migrate_to_ml2.py:459
#, python-format
msgid "The %s tunnel type to migrate from"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:438
-#: neutron/plugins/openvswitch/common/config.py:80
+#: neutron/db/migration/migrate_to_ml2.py:462
+#: neutron/plugins/openvswitch/common/config.py:67
msgid "The UDP port to use for VXLAN tunnels."
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:441
+#: neutron/db/migration/migrate_to_ml2.py:465
msgid "Retain the old plugin's tables"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:447
+#: neutron/db/migration/migrate_to_ml2.py:471
#, python-format
msgid ""
"Tunnel args (tunnel-type and vxlan-udp-port) are not valid for the %s "
"plugin"
msgstr ""
-#: neutron/db/migration/migrate_to_ml2.py:454
+#: neutron/db/migration/migrate_to_ml2.py:478
#, python-format
msgid ""
"Support for migrating %(plugin)s for release %(release)s is not yet "
@@ -3385,11 +3333,6 @@ msgstr ""
msgid "Table %(old_t)r was renamed to %(new_t)r"
msgstr ""
-#: neutron/db/vpn/vpn_db.py:651
-#, python-format
-msgid "vpnservice %s in db is already deleted"
-msgstr ""
-
#: neutron/debug/commands.py:33
msgid "Unimplemented commands"
msgstr ""
@@ -3526,12 +3469,12 @@ msgstr ""
msgid "Adds external network attribute to network resource."
msgstr ""
-#: neutron/extensions/extra_dhcp_opt.py:25
+#: neutron/extensions/extra_dhcp_opt.py:23
#, python-format
msgid "ExtraDhcpOpt %(id)s could not be found"
msgstr ""
-#: neutron/extensions/extra_dhcp_opt.py:29
+#: neutron/extensions/extra_dhcp_opt.py:27
#, python-format
msgid "Invalid data format for extra-dhcp-opt: %(data)s"
msgstr ""
@@ -3555,51 +3498,67 @@ msgid ""
"exceeds the maximum %(quota)s."
msgstr ""
-#: neutron/extensions/firewall.py:37
+#: neutron/extensions/firewall.py:35
#, python-format
msgid "Firewall %(firewall_id)s could not be found."
msgstr ""
-#: neutron/extensions/firewall.py:41
+#: neutron/extensions/firewall.py:39
#, python-format
msgid "Firewall %(firewall_id)s is still active."
msgstr ""
-#: neutron/extensions/firewall.py:45
+#: neutron/extensions/firewall.py:43
#, python-format
msgid ""
"Operation cannot be performed since associated Firewall %(firewall_id)s "
"is in %(pending_state)s."
msgstr ""
-#: neutron/extensions/firewall.py:50
+#: neutron/extensions/firewall.py:48
#, python-format
msgid "Firewall Policy %(firewall_policy_id)s could not be found."
msgstr ""
-#: neutron/extensions/firewall.py:54
+#: neutron/extensions/firewall.py:52
#, python-format
msgid "Firewall Policy %(firewall_policy_id)s is being used."
msgstr ""
-#: neutron/extensions/firewall.py:58
+#: neutron/extensions/firewall.py:62
+#, python-format
+msgid ""
+"Operation cannot be performed since Firewall Policy "
+"%(firewall_policy_id)s is shared but Firewall Rule %(firewall_rule_id)s "
+"is not shared"
+msgstr ""
+
+#: neutron/extensions/firewall.py:74
+#, python-format
+msgid ""
+"Operation cannot be performed. Before sharing Firewall Policy "
+"%(firewall_policy_id)s, share associated Firewall Rule "
+"%(firewall_rule_id)s"
+msgstr ""
+
+#: neutron/extensions/firewall.py:80
#, python-format
msgid "Firewall Rule %(firewall_rule_id)s could not be found."
msgstr ""
-#: neutron/extensions/firewall.py:62
+#: neutron/extensions/firewall.py:84
#, python-format
msgid "Firewall Rule %(firewall_rule_id)s is being used."
msgstr ""
-#: neutron/extensions/firewall.py:66
+#: neutron/extensions/firewall.py:88
#, python-format
msgid ""
"Firewall Rule %(firewall_rule_id)s is not associated with Firewall "
"Policy %(firewall_policy_id)s."
msgstr ""
-#: neutron/extensions/firewall.py:71
+#: neutron/extensions/firewall.py:93
#, python-format
msgid ""
"Firewall Rule protocol %(protocol)s is not supported. Only protocol "
@@ -3607,62 +3566,69 @@ msgid ""
"supported."
msgstr ""
-#: neutron/extensions/firewall.py:77
+#: neutron/extensions/firewall.py:99
#, python-format
msgid ""
"Firewall rule action %(action)s is not supported. Only action values "
"%(values)s are supported."
msgstr ""
-#: neutron/extensions/firewall.py:82
+#: neutron/extensions/firewall.py:104
#, python-format
msgid "%(param)s are not allowed when protocol is set to ICMP."
msgstr ""
-#: neutron/extensions/firewall.py:87
+#: neutron/extensions/firewall.py:109
msgid "Source/destination port requires a protocol"
msgstr ""
-#: neutron/extensions/firewall.py:91
+#: neutron/extensions/firewall.py:113
#, python-format
msgid "Invalid value for port %(port)s."
msgstr ""
-#: neutron/extensions/firewall.py:95
+#: neutron/extensions/firewall.py:117
msgid "Missing rule info argument for insert/remove rule operation."
msgstr ""
-#: neutron/extensions/firewall.py:105
+#: neutron/extensions/firewall.py:127
#, python-format
msgid "%(driver)s: Internal driver error."
msgstr ""
-#: neutron/extensions/firewall.py:154
+#: neutron/extensions/firewall.py:138
+#, python-format
+msgid ""
+"Operation cannot be performed since Firewall Rule %(firewall_rule_id)s is"
+" not shared and belongs to another tenant %(tenant_id)s"
+msgstr ""
+
+#: neutron/extensions/firewall.py:189
#, python-format
msgid "Port '%s' is not a valid number"
msgstr ""
-#: neutron/extensions/firewall.py:158
+#: neutron/extensions/firewall.py:193
#, python-format
msgid "Invalid port '%s'"
msgstr ""
-#: neutron/extensions/firewall.py:172
+#: neutron/extensions/firewall.py:207
#, python-format
msgid "%(msg_ip)s and %(msg_subnet)s"
msgstr ""
-#: neutron/extensions/firewall.py:293
+#: neutron/extensions/firewall.py:328
msgid "Number of firewalls allowed per tenant. A negative value means unlimited."
msgstr ""
-#: neutron/extensions/firewall.py:297
+#: neutron/extensions/firewall.py:332
msgid ""
"Number of firewall policies allowed per tenant. A negative value means "
"unlimited."
msgstr ""
-#: neutron/extensions/firewall.py:301
+#: neutron/extensions/firewall.py:336
msgid ""
"Number of firewall rules allowed per tenant. A negative value means "
"unlimited."
@@ -3730,11 +3696,11 @@ msgid ""
"external network %(net_id)s is required by one or more floating IPs."
msgstr ""
-#: neutron/extensions/l3.py:138
+#: neutron/extensions/l3.py:151
msgid "Number of routers allowed per tenant. A negative value means unlimited."
msgstr ""
-#: neutron/extensions/l3.py:142
+#: neutron/extensions/l3.py:155
msgid ""
"Number of floating IPs allowed per tenant. A negative value means "
"unlimited."
@@ -3924,21 +3890,21 @@ msgid ""
"unlimited."
msgstr ""
-#: neutron/extensions/metering.py:33
+#: neutron/extensions/metering.py:31
#, python-format
msgid "Metering label %(label_id)s does not exist"
msgstr ""
-#: neutron/extensions/metering.py:37
+#: neutron/extensions/metering.py:35
msgid "Duplicate Metering Rule in POST."
msgstr ""
-#: neutron/extensions/metering.py:41
+#: neutron/extensions/metering.py:39
#, python-format
msgid "Metering label rule %(rule_id)s does not exist"
msgstr ""
-#: neutron/extensions/metering.py:45
+#: neutron/extensions/metering.py:43
#, python-format
msgid ""
"Metering label rule with remote_ip_prefix %(remote_ip_prefix)s overlaps "
@@ -3970,19 +3936,19 @@ msgid "Port does not have port security binding."
msgstr ""
#: neutron/extensions/providernet.py:54
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:272
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:267
msgid "Plugin does not support updating provider attributes"
msgstr ""
-#: neutron/extensions/quotasv2.py:67
+#: neutron/extensions/quotasv2.py:66
msgid "POST requests are not supported on this resource."
msgstr ""
-#: neutron/extensions/quotasv2.py:86
+#: neutron/extensions/quotasv2.py:85
msgid "Only admin is authorized to access quotas for another tenant"
msgstr ""
-#: neutron/extensions/quotasv2.py:91
+#: neutron/extensions/quotasv2.py:90
msgid "Only admin can view or configure quota"
msgstr ""
@@ -4091,138 +4057,138 @@ msgid ""
"unlimited."
msgstr ""
-#: neutron/extensions/servicetype.py:52
+#: neutron/extensions/servicetype.py:49
msgid "Neutron Service Type Management"
msgstr ""
-#: neutron/extensions/servicetype.py:60
+#: neutron/extensions/servicetype.py:57
msgid "API for retrieving service providers for Neutron advanced services"
msgstr ""
-#: neutron/extensions/vpnaas.py:31
+#: neutron/extensions/vpnaas.py:29
#, python-format
msgid "VPNService %(vpnservice_id)s could not be found"
msgstr ""
-#: neutron/extensions/vpnaas.py:35
+#: neutron/extensions/vpnaas.py:33
#, python-format
msgid "ipsec_site_connection %(ipsec_site_conn_id)s not found"
msgstr ""
-#: neutron/extensions/vpnaas.py:39
+#: neutron/extensions/vpnaas.py:37
#, python-format
msgid "ipsec_site_connection %(attr)s is equal to or less than dpd_interval"
msgstr ""
-#: neutron/extensions/vpnaas.py:44
+#: neutron/extensions/vpnaas.py:42
#, python-format
msgid "ipsec_site_connection MTU %(mtu)d is too small for ipv%(version)s"
msgstr ""
-#: neutron/extensions/vpnaas.py:49
+#: neutron/extensions/vpnaas.py:47
#, python-format
msgid "IKEPolicy %(ikepolicy_id)s could not be found"
msgstr ""
-#: neutron/extensions/vpnaas.py:53
+#: neutron/extensions/vpnaas.py:51
#, python-format
msgid "IPsecPolicy %(ipsecpolicy_id)s could not be found"
msgstr ""
-#: neutron/extensions/vpnaas.py:57
+#: neutron/extensions/vpnaas.py:55
#, python-format
msgid ""
"IKEPolicy %(ikepolicy_id)s is in use by existing IPsecSiteConnection and "
"can't be updated or deleted"
msgstr ""
-#: neutron/extensions/vpnaas.py:62
+#: neutron/extensions/vpnaas.py:60
#, python-format
msgid "VPNService %(vpnservice_id)s is still in use"
msgstr ""
-#: neutron/extensions/vpnaas.py:66
+#: neutron/extensions/vpnaas.py:64
#, python-format
msgid "Router %(router_id)s is used by VPNService %(vpnservice_id)s"
msgstr ""
-#: neutron/extensions/vpnaas.py:70
+#: neutron/extensions/vpnaas.py:68
+#, python-format
+msgid "Subnet %(subnet_id)s is used by VPNService %(vpnservice_id)s"
+msgstr ""
+
+#: neutron/extensions/vpnaas.py:72
#, python-format
msgid "Invalid state %(state)s of vpnaas resource %(id)s for updating"
msgstr ""
-#: neutron/extensions/vpnaas.py:75
+#: neutron/extensions/vpnaas.py:77
#, python-format
msgid ""
"IPsecPolicy %(ipsecpolicy_id)s is in use by existing IPsecSiteConnection "
"and can't be updated or deleted"
msgstr ""
-#: neutron/extensions/vpnaas.py:80
+#: neutron/extensions/vpnaas.py:82
#, python-format
msgid "Can not load driver :%(device_driver)s"
msgstr ""
-#: neutron/extensions/vpnaas.py:84
+#: neutron/extensions/vpnaas.py:86
#, python-format
msgid "Subnet %(subnet_id)s is not connected to Router %(router_id)s"
msgstr ""
-#: neutron/extensions/vpnaas.py:89
+#: neutron/extensions/vpnaas.py:91
#, python-format
msgid "Router %(router_id)s has no external network gateway set"
msgstr ""
-#: neutron/notifiers/nova.py:165
+#: neutron/notifiers/nova.py:169
msgid "device_id is not set on port yet."
msgstr ""
-#: neutron/notifiers/nova.py:169
+#: neutron/notifiers/nova.py:173
msgid "Port ID not set! Nova will not be notified of port status change."
msgstr ""
-#: neutron/notifiers/nova.py:194
+#: neutron/notifiers/nova.py:198
#, python-format
msgid ""
"Ignoring state change previous_port_status: %(pre_status)s "
"current_port_status: %(cur_status)s port_id %(id)s"
msgstr ""
-#: neutron/notifiers/nova.py:220
+#: neutron/notifiers/nova.py:224
#, python-format
msgid "Sending events: %s"
msgstr ""
-#: neutron/notifiers/nova.py:225
+#: neutron/notifiers/nova.py:229
#, python-format
msgid "Nova returned NotFound for event: %s"
msgstr ""
-#: neutron/notifiers/nova.py:228
+#: neutron/notifiers/nova.py:232
#, python-format
msgid "Failed to notify nova on events: %s"
msgstr ""
-#: neutron/notifiers/nova.py:232 neutron/notifiers/nova.py:248
+#: neutron/notifiers/nova.py:236 neutron/notifiers/nova.py:252
#, python-format
msgid "Error response returned from nova: %s"
msgstr ""
-#: neutron/notifiers/nova.py:243
+#: neutron/notifiers/nova.py:247
#, python-format
msgid "Nova event: %s returned with failed status"
msgstr ""
-#: neutron/notifiers/nova.py:246
+#: neutron/notifiers/nova.py:250
#, python-format
msgid "Nova event response: %s"
msgstr ""
-#: neutron/openstack/common/eventlet_backdoor.py:140
-#, python-format
-msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
-msgstr ""
-
#: neutron/openstack/common/gettextutils.py:320
msgid "Message objects do not support addition."
msgstr ""
@@ -4233,84 +4199,31 @@ msgid ""
"characters. Please use unicode() or translate() instead."
msgstr ""
-#: neutron/openstack/common/lockutils.py:103
-#, python-format
-msgid "Could not release the acquired lock `%s`"
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:168
-#, python-format
-msgid "Got semaphore \"%(lock)s\""
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:177
-#, python-format
-msgid "Attempting to grab file lock \"%(lock)s\""
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:187
-#, python-format
-msgid "Created lock path: %s"
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:205
-#, python-format
-msgid "Got file lock \"%(lock)s\" at %(path)s"
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:209
+#: neutron/openstack/common/lockutils.py:101
#, python-format
-msgid "Released file lock \"%(lock)s\" at %(path)s"
+msgid "Unable to acquire lock on `%(filename)s` due to %(exception)s"
msgstr ""
-#: neutron/openstack/common/lockutils.py:247
-#, python-format
-msgid "Got semaphore / lock \"%(function)s\""
-msgstr ""
-
-#: neutron/openstack/common/lockutils.py:251
-#, python-format
-msgid "Semaphore / lock released \"%(function)s\""
-msgstr ""
-
-#: neutron/openstack/common/log.py:327
+#: neutron/openstack/common/log.py:287
#, python-format
msgid "Deprecated: %s"
msgstr ""
-#: neutron/openstack/common/log.py:436
+#: neutron/openstack/common/log.py:395
#, python-format
msgid "Error loading logging config %(log_config)s: %(err_msg)s"
msgstr ""
-#: neutron/openstack/common/log.py:486
+#: neutron/openstack/common/log.py:456
#, python-format
msgid "syslog facility must be one of: %s"
msgstr ""
-#: neutron/openstack/common/log.py:729
+#: neutron/openstack/common/log.py:707
#, python-format
msgid "Fatal call to deprecated config: %(msg)s"
msgstr ""
-#: neutron/openstack/common/loopingcall.py:82
-#, python-format
-msgid "task run outlasted interval by %s sec"
-msgstr ""
-
-#: neutron/openstack/common/loopingcall.py:89
-msgid "in fixed duration looping call"
-msgstr ""
-
-#: neutron/openstack/common/loopingcall.py:129
-#, python-format
-msgid "Dynamic looping call sleeping for %.02f seconds"
-msgstr ""
-
-#: neutron/openstack/common/loopingcall.py:136
-msgid "in dynamic looping call"
-msgstr ""
-
#: neutron/openstack/common/periodic_task.py:40
#, python-format
msgid "Unexpected argument for periodic task creation: %(arg)s."
@@ -4365,32 +4278,6 @@ msgstr ""
msgid "process_input not supported over SSH"
msgstr ""
-#: neutron/openstack/common/sslutils.py:50
-#, python-format
-msgid "Unable to find cert_file : %s"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:53
-#, python-format
-msgid "Unable to find ca_file : %s"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:56
-#, python-format
-msgid "Unable to find key_file : %s"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:59
-msgid ""
-"When running server in SSL mode, you must specify both a cert_file and "
-"key_file option value in your configuration file"
-msgstr ""
-
-#: neutron/openstack/common/sslutils.py:98
-#, python-format
-msgid "Invalid SSL version : %s"
-msgstr ""
-
#: neutron/openstack/common/strutils.py:92
#, python-format
msgid "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s"
@@ -4406,20 +4293,6 @@ msgstr ""
msgid "Invalid string format: %s"
msgstr ""
-#: neutron/openstack/common/versionutils.py:69
-#, python-format
-msgid ""
-"%(what)s is deprecated as of %(as_of)s in favor of %(in_favor_of)s and "
-"may be removed in %(remove_in)s."
-msgstr ""
-
-#: neutron/openstack/common/versionutils.py:73
-#, python-format
-msgid ""
-"%(what)s is deprecated as of %(as_of)s and may be removed in "
-"%(remove_in)s. It will not be superseded."
-msgstr ""
-
#: neutron/openstack/common/middleware/catch_errors.py:40
#, python-format
msgid "An error occurred during processing the request: %s"
@@ -4431,7 +4304,7 @@ msgstr ""
msgid "Request is too large."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:32
+#: neutron/plugins/bigswitch/config.py:28
msgid ""
"A comma separated list of Big Switch or Floodlight servers and port "
"numbers. The plugin proxies the requests to the Big Switch/Floodlight "
@@ -4440,76 +4313,76 @@ msgid ""
"support failover."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:39
+#: neutron/plugins/bigswitch/config.py:35
msgid ""
"The username and password for authenticating against the Big Switch or "
"Floodlight controller."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:42
+#: neutron/plugins/bigswitch/config.py:38
msgid ""
"If True, Use SSL when connecting to the Big Switch or Floodlight "
"controller."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:45
+#: neutron/plugins/bigswitch/config.py:41
msgid ""
"Trust and store the first certificate received for each controller "
"address and use it to validate future connections to that address."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:49
+#: neutron/plugins/bigswitch/config.py:45
msgid "Disables SSL certificate validation for controllers"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:51
+#: neutron/plugins/bigswitch/config.py:47
msgid "Re-use HTTP/HTTPS connections to the controller."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:54
+#: neutron/plugins/bigswitch/config.py:50
msgid "Directory containing ca_certs and host_certs certificate directories."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:57
+#: neutron/plugins/bigswitch/config.py:53
msgid "Sync data on connect"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:59
+#: neutron/plugins/bigswitch/config.py:55
msgid ""
"If neutron fails to create a resource because the backend controller "
"doesn't know of a dependency, the plugin automatically triggers a full "
"data synchronization to the controller."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:64
+#: neutron/plugins/bigswitch/config.py:60
msgid ""
"Time between verifications that the backend controller database is "
"consistent with Neutron. (0 to disable)"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:67
+#: neutron/plugins/bigswitch/config.py:63
msgid ""
"Maximum number of seconds to wait for proxy request to connect and "
"complete."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:70
+#: neutron/plugins/bigswitch/config.py:66
msgid ""
"Maximum number of threads to spawn to handle large volumes of port "
"creations."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:74
+#: neutron/plugins/bigswitch/config.py:70
msgid "User defined identifier for this Neutron deployment"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:76
+#: neutron/plugins/bigswitch/config.py:72
msgid ""
"Flag to decide if a route to the metadata server should be injected into "
"the VM"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:81
+#: neutron/plugins/bigswitch/config.py:77
msgid ""
"The default router rules installed in new tenant routers. Repeat the "
"config option for each rule. Format is "
@@ -4517,34 +4390,34 @@ msgid ""
"all tenants."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:86
+#: neutron/plugins/bigswitch/config.py:82
msgid "Maximum number of router rules"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:90
+#: neutron/plugins/bigswitch/config.py:86
msgid "Virtual interface type to configure on Nova compute nodes"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:97
+#: neutron/plugins/bigswitch/config.py:93
#, python-format
msgid "Nova compute nodes to manually set VIF type to %s"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:104
+#: neutron/plugins/bigswitch/config.py:100
msgid "List of allowed vif_type values."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:108
+#: neutron/plugins/bigswitch/config.py:104
msgid ""
"Name of integration bridge on compute nodes used for security group "
"insertion."
msgstr ""
-#: neutron/plugins/bigswitch/config.py:111
+#: neutron/plugins/bigswitch/config.py:107
msgid "Seconds between agent checks for port changes"
msgstr ""
-#: neutron/plugins/bigswitch/config.py:113
+#: neutron/plugins/bigswitch/config.py:109
msgid "Virtual switch type."
msgstr ""
@@ -4561,99 +4434,99 @@ msgstr ""
msgid "NeutronRestProxyV2: too many external networks"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:93
+#: neutron/plugins/bigswitch/plugin.py:90
msgid "Syntax error in server config file, aborting plugin"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:127 neutron/plugins/ml2/db.py:212
+#: neutron/plugins/bigswitch/plugin.py:124 neutron/plugins/ml2/db.py:215
#, python-format
msgid "get_port_and_sgs() called for port_id %s"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:237
+#: neutron/plugins/bigswitch/plugin.py:234
#, python-format
msgid "Unable to update remote topology: %s"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:322
+#: neutron/plugins/bigswitch/plugin.py:319
#, python-format
msgid ""
"Setting admin_state_up=False is not supported in this plugin version. "
"Ignoring setting for resource: %s"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:328
+#: neutron/plugins/bigswitch/plugin.py:325
#, python-format
msgid ""
"Operational status is internally set by the plugin. Ignoring setting "
"status=%s."
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:353
+#: neutron/plugins/bigswitch/plugin.py:350
#, python-format
msgid "Unrecognized vif_type in configuration [%s]. Defaulting to ovs."
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:399
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:106
+#: neutron/plugins/bigswitch/plugin.py:398
+#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:109
msgid "Iconsistency with backend controller triggering full synchronization."
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:416
+#: neutron/plugins/bigswitch/plugin.py:415
#, python-format
msgid "NeutronRestProxyV2: Unable to create port: %s"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:475
+#: neutron/plugins/bigswitch/plugin.py:476
#, python-format
msgid "NeutronRestProxy: Starting plugin. Version=%s"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:502
+#: neutron/plugins/bigswitch/plugin.py:503
msgid "NeutronRestProxyV2: initialization done"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:546
+#: neutron/plugins/bigswitch/plugin.py:547
msgid "NeutronRestProxyV2: create_network() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:589
+#: neutron/plugins/bigswitch/plugin.py:590
msgid "NeutronRestProxyV2.update_network() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:617
+#: neutron/plugins/bigswitch/plugin.py:618
msgid "NeutronRestProxyV2: delete_network() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:655
+#: neutron/plugins/bigswitch/plugin.py:656
msgid "NeutronRestProxyV2: create_port() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:747
+#: neutron/plugins/bigswitch/plugin.py:748
msgid "NeutronRestProxyV2: update_port() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:807
+#: neutron/plugins/bigswitch/plugin.py:808
msgid "NeutronRestProxyV2: delete_port() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:830
+#: neutron/plugins/bigswitch/plugin.py:831
msgid "NeutronRestProxyV2: create_subnet() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:847
+#: neutron/plugins/bigswitch/plugin.py:848
msgid "NeutronRestProxyV2: update_subnet() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:866
+#: neutron/plugins/bigswitch/plugin.py:867
msgid "NeutronRestProxyV2: delete_subnet() called"
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:890
+#: neutron/plugins/bigswitch/plugin.py:891
msgid "Adding host route: "
msgstr ""
-#: neutron/plugins/bigswitch/plugin.py:891
+#: neutron/plugins/bigswitch/plugin.py:892
#, python-format
msgid "Destination:%(dst)s nexthop:%(next)s"
msgstr ""
@@ -4667,237 +4540,237 @@ msgstr ""
msgid "Updating router rules to %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:82
+#: neutron/plugins/bigswitch/servermanager.py:79
#, python-format
msgid "Error in REST call to remote network controller: %(reason)s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:121
+#: neutron/plugins/bigswitch/servermanager.py:118
msgid "Couldn't retrieve capabilities. Newer API calls won't be supported."
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:123
+#: neutron/plugins/bigswitch/servermanager.py:120
#, python-format
msgid "The following capabilities were received for %(server)s: %(cap)s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:152
+#: neutron/plugins/bigswitch/servermanager.py:148
#, python-format
msgid "ServerProxy: server=%(server)s, port=%(port)d, ssl=%(ssl)r"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:155
+#: neutron/plugins/bigswitch/servermanager.py:151
#, python-format
msgid ""
"ServerProxy: resource=%(resource)s, data=%(data)r, headers=%(headers)r, "
"action=%(action)s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:176
+#: neutron/plugins/bigswitch/servermanager.py:172
msgid "ServerProxy: Could not establish HTTPS connection"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:184
+#: neutron/plugins/bigswitch/servermanager.py:180
msgid "ServerProxy: Could not establish HTTP connection"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:220
+#: neutron/plugins/bigswitch/servermanager.py:216
#, python-format
msgid "ServerProxy: %(action)s failure, %(e)r"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:223
+#: neutron/plugins/bigswitch/servermanager.py:219
#, python-format
msgid ""
"ServerProxy: status=%(status)d, reason=%(reason)r, ret=%(ret)s, "
"data=%(data)r"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:244
+#: neutron/plugins/bigswitch/servermanager.py:240
msgid "ServerPool: initializing"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:267
+#: neutron/plugins/bigswitch/servermanager.py:263
msgid "Servers not defined. Aborting server manager."
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:274
+#: neutron/plugins/bigswitch/servermanager.py:270
#, python-format
msgid "Servers must be defined as <ip>:<port>. Configuration was %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:283
+#: neutron/plugins/bigswitch/servermanager.py:279
msgid "ServerPool: initialization done"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:333
+#: neutron/plugins/bigswitch/servermanager.py:329
#, python-format
msgid "ssl_cert_directory [%s] does not exist. Create it or disable ssl."
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:350
+#: neutron/plugins/bigswitch/servermanager.py:346
#, python-format
msgid "No certificates were found to verify controller %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:392
+#: neutron/plugins/bigswitch/servermanager.py:388
#, python-format
msgid ""
"Could not retrieve initial certificate from controller %(server)s. Error "
"details: %(error)s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:397
+#: neutron/plugins/bigswitch/servermanager.py:393
#, python-format
msgid "Storing to certificate for host %(server)s at %(path)s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:444
+#: neutron/plugins/bigswitch/servermanager.py:448
msgid "Server requires synchronization, but no topology function was defined."
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:461
+#: neutron/plugins/bigswitch/servermanager.py:463
#, python-format
msgid ""
"ServerProxy: %(action)s failure for servers: %(server)r Response: "
"%(response)s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:467
+#: neutron/plugins/bigswitch/servermanager.py:469
#, python-format
msgid ""
"ServerProxy: Error details: status=%(status)d, reason=%(reason)r, "
"ret=%(ret)s, data=%(data)r"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:474
+#: neutron/plugins/bigswitch/servermanager.py:476
#, python-format
msgid "ServerProxy: %(action)s failure for all servers: %(server)r"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:497
+#: neutron/plugins/bigswitch/servermanager.py:501
#, python-format
msgid ""
"NeutronRestProxyV2: Received and ignored error code %(code)s on "
"%(action)s action to resource %(resource)s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:507
+#: neutron/plugins/bigswitch/servermanager.py:511
#, python-format
msgid "Unable to create remote router: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:513
+#: neutron/plugins/bigswitch/servermanager.py:517
#, python-format
msgid "Unable to update remote router: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:518
+#: neutron/plugins/bigswitch/servermanager.py:522
#, python-format
msgid "Unable to delete remote router: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:524
+#: neutron/plugins/bigswitch/servermanager.py:528
#, python-format
msgid "Unable to add router interface: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:529
+#: neutron/plugins/bigswitch/servermanager.py:533
#, python-format
msgid "Unable to delete remote intf: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:535
+#: neutron/plugins/bigswitch/servermanager.py:539
#, python-format
msgid "Unable to create remote network: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:541
-#: neutron/plugins/bigswitch/servermanager.py:546
+#: neutron/plugins/bigswitch/servermanager.py:545
+#: neutron/plugins/bigswitch/servermanager.py:550
#, python-format
msgid "Unable to update remote network: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:555
+#: neutron/plugins/bigswitch/servermanager.py:559
#, python-format
msgid "No device MAC attached to port %s. Skipping notification to controller."
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:560
+#: neutron/plugins/bigswitch/servermanager.py:564
#, python-format
msgid "Unable to create remote port: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:565
+#: neutron/plugins/bigswitch/servermanager.py:569
#, python-format
msgid "Unable to delete remote port: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:575
+#: neutron/plugins/bigswitch/servermanager.py:579
#, python-format
msgid "Unable to create floating IP: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:580
+#: neutron/plugins/bigswitch/servermanager.py:584
#, python-format
msgid "Unable to update floating IP: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:585
+#: neutron/plugins/bigswitch/servermanager.py:589
#, python-format
msgid "Unable to delete floating IP: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:590
+#: neutron/plugins/bigswitch/servermanager.py:594
#, python-format
msgid "Unable to retrieve switch: %s"
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:595
+#: neutron/plugins/bigswitch/servermanager.py:599
msgid "Backend server(s) do not support automated consitency checks."
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:599
+#: neutron/plugins/bigswitch/servermanager.py:603
#, python-format
msgid "Consistency watchdog disabled by polling interval setting of %s."
msgstr ""
-#: neutron/plugins/bigswitch/servermanager.py:611
+#: neutron/plugins/bigswitch/servermanager.py:615
msgid "Encountered an error checking controller health."
msgstr ""
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:116
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:234
+#: neutron/plugins/bigswitch/agent/restproxy_agent.py:115
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:233
msgid "Port update received"
msgstr ""
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:120
+#: neutron/plugins/bigswitch/agent/restproxy_agent.py:119
#, python-format
msgid "Port %s is not present on this host."
msgstr ""
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:123
+#: neutron/plugins/bigswitch/agent/restproxy_agent.py:122
#, python-format
msgid "Port %s found. Refreshing firewall."
msgstr ""
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:151
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:267
+#: neutron/plugins/bigswitch/agent/restproxy_agent.py:150
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:266
msgid "Agent loop has new device"
msgstr ""
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:155
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:225
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:159
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:271
+#: neutron/plugins/bigswitch/agent/restproxy_agent.py:154
+#: neutron/plugins/nec/agent/nec_neutron_agent.py:223
+#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:157
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:270
msgid "Error in agent event loop"
msgstr ""
-#: neutron/plugins/bigswitch/agent/restproxy_agent.py:161
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:225
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1012
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1458
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:277
+#: neutron/plugins/bigswitch/agent/restproxy_agent.py:160
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:223
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1010
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1461
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:276
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:285
#, python-format
msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)!"
@@ -4927,675 +4800,667 @@ msgstr ""
msgid "Logging port %(port)s on host_id %(host)s"
msgstr ""
-#: neutron/plugins/bigswitch/extensions/routerrule.py:28
+#: neutron/plugins/bigswitch/extensions/routerrule.py:26
#, python-format
msgid "Invalid format for router rules: %(rule)s, %(reason)s"
msgstr ""
-#: neutron/plugins/bigswitch/extensions/routerrule.py:32
+#: neutron/plugins/bigswitch/extensions/routerrule.py:30
#, python-format
msgid ""
"Unable to complete rules update for %(router_id)s. The number of rules "
"exceeds the maximum %(quota)s."
msgstr ""
-#: neutron/plugins/bigswitch/extensions/routerrule.py:49
+#: neutron/plugins/bigswitch/extensions/routerrule.py:47
#, python-format
msgid "Invalid data format for router rule: '%s'"
msgstr ""
-#: neutron/plugins/bigswitch/extensions/routerrule.py:81
+#: neutron/plugins/bigswitch/extensions/routerrule.py:79
#, python-format
msgid "Duplicate nexthop in rule '%s'"
msgstr ""
-#: neutron/plugins/bigswitch/extensions/routerrule.py:89
+#: neutron/plugins/bigswitch/extensions/routerrule.py:87
#, python-format
msgid "Action must be either permit or deny. '%s' was provided"
msgstr ""
-#: neutron/plugins/bigswitch/extensions/routerrule.py:101
+#: neutron/plugins/bigswitch/extensions/routerrule.py:99
#, python-format
msgid "Duplicate router rules (src,dst) found '%s'"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:64
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:34
+#: neutron/plugins/brocade/NeutronPlugin.py:59
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:31
#: neutron/services/l3_router/brocade/l3_router_plugin.py:36
msgid "The address of the host to SSH to"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:66
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:36
+#: neutron/plugins/brocade/NeutronPlugin.py:61
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:33
#: neutron/services/l3_router/brocade/l3_router_plugin.py:38
msgid "The SSH username to use"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:68
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:38
+#: neutron/plugins/brocade/NeutronPlugin.py:63
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:35
#: neutron/services/l3_router/brocade/l3_router_plugin.py:40
msgid "The SSH password to use"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:70
+#: neutron/plugins/brocade/NeutronPlugin.py:65
msgid "Currently unused"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:74
+#: neutron/plugins/brocade/NeutronPlugin.py:69
msgid "The network interface to use when creatinga port"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:96
-#: neutron/plugins/hyperv/rpc_callbacks.py:42
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:71
+#: neutron/plugins/brocade/NeutronPlugin.py:91
+#: neutron/plugins/hyperv/rpc_callbacks.py:41
#: neutron/plugins/mlnx/rpc_callbacks.py:37
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:80
#, python-format
msgid "Device %(device)s details requested from %(agent_id)s"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:110
-#: neutron/plugins/brocade/NeutronPlugin.py:137
-#: neutron/plugins/hyperv/rpc_callbacks.py:58
-#: neutron/plugins/hyperv/rpc_callbacks.py:87
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:95
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:132
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:155
+#: neutron/plugins/brocade/NeutronPlugin.py:106
+#: neutron/plugins/brocade/NeutronPlugin.py:133
+#: neutron/plugins/hyperv/rpc_callbacks.py:57
+#: neutron/plugins/hyperv/rpc_callbacks.py:86
#: neutron/plugins/mlnx/rpc_callbacks.py:60
#: neutron/plugins/mlnx/rpc_callbacks.py:90
#: neutron/plugins/mlnx/rpc_callbacks.py:106
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:98
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:135
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:158
#, python-format
msgid "%s can not be found in database"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:303
-#: neutron/plugins/brocade/NeutronPlugin.py:347
-#: neutron/plugins/brocade/NeutronPlugin.py:400
-#: neutron/plugins/brocade/NeutronPlugin.py:430
+#: neutron/plugins/brocade/NeutronPlugin.py:299
+#: neutron/plugins/brocade/NeutronPlugin.py:343
+#: neutron/plugins/brocade/NeutronPlugin.py:396
+#: neutron/plugins/brocade/NeutronPlugin.py:426
msgid "Brocade NOS driver error"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:304
+#: neutron/plugins/brocade/NeutronPlugin.py:300
#, python-format
msgid "Returning the allocated vlan (%d) to the pool"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:307
-#: neutron/plugins/brocade/NeutronPlugin.py:348
-#: neutron/plugins/brocade/NeutronPlugin.py:401
-#: neutron/plugins/brocade/NeutronPlugin.py:432
+#: neutron/plugins/brocade/NeutronPlugin.py:303
+#: neutron/plugins/brocade/NeutronPlugin.py:344
+#: neutron/plugins/brocade/NeutronPlugin.py:397
+#: neutron/plugins/brocade/NeutronPlugin.py:428
msgid "Brocade plugin raised exception, check logs"
msgstr ""
-#: neutron/plugins/brocade/NeutronPlugin.py:313
+#: neutron/plugins/brocade/NeutronPlugin.py:309
#, python-format
msgid "Allocated vlan (%d) from the pool"
msgstr ""
-#: neutron/plugins/brocade/nos/nosdriver.py:69
+#: neutron/plugins/brocade/nos/nosdriver.py:65
#, python-format
msgid "Connect failed to switch: %s"
msgstr ""
-#: neutron/plugins/brocade/nos/nosdriver.py:71
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:90
+#: neutron/plugins/brocade/nos/nosdriver.py:67
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:86
#, python-format
msgid "Connect success to host %(host)s:%(ssh_port)d"
msgstr ""
-#: neutron/plugins/brocade/nos/nosdriver.py:96
-#: neutron/plugins/brocade/nos/nosdriver.py:110
-#: neutron/plugins/brocade/nos/nosdriver.py:123
-#: neutron/plugins/brocade/nos/nosdriver.py:136
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:331
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:342
+#: neutron/plugins/brocade/nos/nosdriver.py:92
+#: neutron/plugins/brocade/nos/nosdriver.py:106
+#: neutron/plugins/brocade/nos/nosdriver.py:119
+#: neutron/plugins/brocade/nos/nosdriver.py:132
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:327
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:338
#, python-format
msgid "NETCONF error: %s"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:89
+#: neutron/plugins/cisco/network_plugin.py:87
msgid "Plugin initialization complete"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:117
+#: neutron/plugins/cisco/network_plugin.py:115
#, python-format
msgid "'%(model)s' object has no attribute '%(name)s'"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:134
-#: neutron/plugins/cisco/db/network_db_v2.py:32
+#: neutron/plugins/cisco/network_plugin.py:132
+#: neutron/plugins/cisco/db/network_db_v2.py:30
msgid "get_all_qoss() called"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:140
+#: neutron/plugins/cisco/network_plugin.py:138
msgid "get_qos_details() called"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:145
+#: neutron/plugins/cisco/network_plugin.py:143
msgid "create_qos() called"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:151
+#: neutron/plugins/cisco/network_plugin.py:149
msgid "delete_qos() called"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:156
+#: neutron/plugins/cisco/network_plugin.py:154
msgid "rename_qos() called"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:161
+#: neutron/plugins/cisco/network_plugin.py:159
msgid "get_all_credentials() called"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:167
+#: neutron/plugins/cisco/network_plugin.py:165
msgid "get_credential_details() called"
msgstr ""
-#: neutron/plugins/cisco/network_plugin.py:172
+#: neutron/plugins/cisco/network_plugin.py:170
msgid "rename_credential() called"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:108
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:106
msgid ""
"Interval when the process_services() loop executes in seconds. This is "
"when the config agent lets each service helper to process its neutron "
"resources."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:115
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:113
msgid "Path of the routing service helper class."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:137
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:135
#, python-format
msgid ""
"Error in loading routing service helper. Class specified is %(class)s. "
"Reason:%(reason)s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:148
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:146
msgid "Cisco cfg agent started"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:208
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:206
msgid "No routing service helper loaded"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:237
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:235
#, python-format
msgid ""
"Invalid payload format for received RPC message "
"`hosting_devices_removed`. Error is %{error}s. Payload is %(payload)s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:281
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:279
msgid "[Agent registration] Agent successfully registered"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:285
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:283
#, python-format
msgid ""
"[Agent registration] Neutron server said that device manager was not "
"ready. Retrying in %0.2f seconds "
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:290
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:288
msgid ""
"[Agent registration] Neutron server said that no device manager was "
"found. Cannot continue. Exiting!"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:294
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:292
#, python-format
msgid "[Agent registration] %d unsuccessful registration attempts. Exiting!"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:333
+#: neutron/plugins/cisco/cfg_agent/cfg_agent.py:331
msgid "Failed sending agent report!"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:28
+#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:26
msgid ""
"Critical device parameter missing. Failed initializing CSR1kv routing "
"driver."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:34
+#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:32
#, python-format
msgid ""
"Failed connecting to CSR1kv. Reason: %(reason)s. Connection params are "
"User:%(user)s, Host:%(host)s, Port:%(port)s, Device timeout:%(timeout)s."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:41
+#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:39
#, python-format
msgid "Error executing snippet:%(snippet)s. ErrorType:%(type)s ErrorTag:%(tag)s."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:47
+#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:45
#, python-format
msgid ""
"Data in attribute: %(attribute)s does not correspond to expected value. "
"Value received is %(value)s. "
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:52
+#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:50
#, python-format
msgid "Driver %(driver)s does not exist."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:56
+#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:54
#, python-format
msgid "Driver not found for resource id:%(id)s."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:60
+#: neutron/plugins/cisco/cfg_agent/cfg_exceptions.py:58
#, python-format
msgid "Driver cannot be set for missing parameter:%(p)s."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_status.py:30
+#: neutron/plugins/cisco/cfg_agent/device_status.py:28
msgid "Time in seconds for connecting to a hosting device"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_status.py:32
+#: neutron/plugins/cisco/cfg_agent/device_status.py:30
msgid ""
"The time in seconds until a backlogged hosting device is presumed dead. "
"This value should be set up high enough to recover from a period of "
"connectivity loss or high load when the device may not be responding."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_status.py:59
+#: neutron/plugins/cisco/cfg_agent/device_status.py:57
#, python-format
msgid "Cannot ping ip address: %s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_status.py:143
+#: neutron/plugins/cisco/cfg_agent/device_status.py:141
#, python-format
msgid ""
"Hosting device: %(hd_id)s @ %(ip)s hasn't passed minimum boot time. "
"Skipping it. "
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_status.py:147
+#: neutron/plugins/cisco/cfg_agent/device_status.py:145
#, python-format
msgid "Checking hosting device: %(hd_id)s @ %(ip)s for reachability."
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_status.py:154
+#: neutron/plugins/cisco/cfg_agent/device_status.py:152
#, python-format
msgid "Hosting device: %(hd_id)s @ %(ip)s is now reachable. Adding it to response"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_status.py:158
+#: neutron/plugins/cisco/cfg_agent/device_status.py:156
#, python-format
msgid "Hosting device: %(hd_id)s @ %(ip)s still not reachable "
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/driver_mgr.py:80
+#: neutron/plugins/cisco/cfg_agent/device_drivers/driver_mgr.py:79
#, python-format
msgid ""
"Error loading cfg agent driver %(driver)s for hosting device template "
"%(t_name)s(%(t_id)s)"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:64
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:62
#, python-format
msgid "Missing device parameter:%s. Aborting CSR1kvRoutingDriver initialization"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:230
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:228
#, python-format
msgid "Unknown route command %s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:322
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:320
#, python-format
msgid "Interfaces:%s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:337
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:335
#, python-format
msgid "IP Address:%s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:339
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:337
#, python-format
msgid "Cannot find interface: %s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:374
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:372
#, python-format
msgid "Enabled interface %s "
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:393
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:391
#, python-format
msgid "VRFs:%s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:438
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:436
#, python-format
msgid "Mismatch in ACL configuration for %s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:467
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:465
#, python-format
msgid "VRF %s successfully created"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:469
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:467
#, python-format
msgid "Failed creating VRF %s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:477
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:475
#, python-format
msgid "VRF %s removed"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:479
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:483
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:496
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:477
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:481
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:494
#, python-format
msgid "VRF %s not present"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:681
+#: neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py:679
#, python-format
msgid "%s successfully executed"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:229
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:227
msgid "Failed processing routers"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:290
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:288
msgid "RPC Error in fetching routers from plugin"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:377
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:375
#, python-format
msgid "Router: %(id)s is on an unreachable hosting device. "
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:386
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:384
#, python-format
msgid "Key Error, missing key: %s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:390
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:388
#, python-format
msgid "Driver Exception on router:%(id)s. Error is %(e)s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:401
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:399
#, python-format
msgid "Exception in processing routers on device:%s"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:544
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:542
#, python-format
msgid "Info for router %s was not found. Skipping router removal"
msgstr ""
-#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:559
+#: neutron/plugins/cisco/cfg_agent/service_helpers/routing_svc_helper.py:557
#, python-format
msgid ""
"Router remove for router_id: %s was incomplete. Adding the router to "
"removed_routers list"
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:25
+#: neutron/plugins/cisco/common/cisco_exceptions.py:22
#, python-format
msgid "Segmentation ID for network %(net_id)s is not found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:30
+#: neutron/plugins/cisco/common/cisco_exceptions.py:27
msgid ""
"Unable to complete operation. No more dynamic NICs are available in the "
"system."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:36
+#: neutron/plugins/cisco/common/cisco_exceptions.py:33
#, python-format
msgid ""
"NetworkVlanBinding for %(vlan_id)s and network %(network_id)s already "
"exists."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:42
+#: neutron/plugins/cisco/common/cisco_exceptions.py:39
#, python-format
msgid "Vlan ID %(vlan_id)s not found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:47
+#: neutron/plugins/cisco/common/cisco_exceptions.py:44
msgid ""
"Unable to complete operation. VLAN ID exists outside of the configured "
"network segment range."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:53
+#: neutron/plugins/cisco/common/cisco_exceptions.py:50
msgid "No Vlan ID available."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:58
+#: neutron/plugins/cisco/common/cisco_exceptions.py:55
#, python-format
msgid "QoS level %(qos_id)s could not be found for tenant %(tenant_id)s."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:64
+#: neutron/plugins/cisco/common/cisco_exceptions.py:61
#, python-format
msgid "QoS level with name %(qos_name)s already exists for tenant %(tenant_id)s."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:70
+#: neutron/plugins/cisco/common/cisco_exceptions.py:67
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:23
#, python-format
msgid "Credential %(credential_id)s could not be found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:75
+#: neutron/plugins/cisco/common/cisco_exceptions.py:72
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:28
#, python-format
msgid "Credential %(credential_name)s could not be found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:80
+#: neutron/plugins/cisco/common/cisco_exceptions.py:77
#, python-format
msgid "Credential %(credential_name)s already exists."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:85
+#: neutron/plugins/cisco/common/cisco_exceptions.py:82
#, python-format
msgid "Provider network %s already exists"
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:90
+#: neutron/plugins/cisco/common/cisco_exceptions.py:87
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:39
#, python-format
msgid "Connection to %(host)s is not configured."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:95
+#: neutron/plugins/cisco/common/cisco_exceptions.py:92
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:44
#, python-format
msgid "Unable to connect to Nexus %(nexus_host)s. Reason: %(exc)s."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:100
+#: neutron/plugins/cisco/common/cisco_exceptions.py:97
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:49
#, python-format
msgid "Failed to configure Nexus: %(config)s. Reason: %(exc)s."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:105
+#: neutron/plugins/cisco/common/cisco_exceptions.py:102
#, python-format
msgid "Nexus Port Binding (%(filters)s) is not present."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:114
+#: neutron/plugins/cisco/common/cisco_exceptions.py:111
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:69
msgid "No usable Nexus switch found to create SVI interface."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:119
+#: neutron/plugins/cisco/common/cisco_exceptions.py:116
#, python-format
msgid "PortVnic Binding %(port_id)s already exists."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:124
+#: neutron/plugins/cisco/common/cisco_exceptions.py:121
#, python-format
msgid "PortVnic Binding %(port_id)s is not present."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:129
+#: neutron/plugins/cisco/common/cisco_exceptions.py:126
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:74
msgid "No subnet_id specified for router gateway."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:134
+#: neutron/plugins/cisco/common/cisco_exceptions.py:131
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:79
#, python-format
msgid "Subnet %(subnet_id)s has an interface on %(router_id)s."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:139
+#: neutron/plugins/cisco/common/cisco_exceptions.py:136
#: neutron/plugins/ml2/drivers/cisco/nexus/exceptions.py:84
msgid "Nexus hardware router gateway only uses Subnet Ids."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:143
+#: neutron/plugins/cisco/common/cisco_exceptions.py:140
#, python-format
msgid ""
"Unable to unplug the attachment %(att_id)s from port %(port_id)s for "
"network %(net_id)s. The attachment %(att_id)s does not exist."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:150
+#: neutron/plugins/cisco/common/cisco_exceptions.py:147
#, python-format
msgid "Policy Profile %(profile_id)s already exists."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:156
+#: neutron/plugins/cisco/common/cisco_exceptions.py:153
#, python-format
msgid "Policy Profile %(profile_id)s could not be found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:161
+#: neutron/plugins/cisco/common/cisco_exceptions.py:158
#, python-format
msgid "Network Profile %(profile_id)s already exists."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:167
+#: neutron/plugins/cisco/common/cisco_exceptions.py:164
#, python-format
msgid "Network Profile %(profile)s could not be found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:172
+#: neutron/plugins/cisco/common/cisco_exceptions.py:169
#, python-format
msgid ""
"One or more network segments belonging to network profile %(profile)s is "
"in use."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:178
+#: neutron/plugins/cisco/common/cisco_exceptions.py:175
#, python-format
msgid ""
"No more segments available in network segment pool "
"%(network_profile_name)s."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:184
+#: neutron/plugins/cisco/common/cisco_exceptions.py:181
#, python-format
msgid "VM Network %(name)s could not be found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:189
+#: neutron/plugins/cisco/common/cisco_exceptions.py:186
#, python-format
msgid "Unable to create the network. The VXLAN ID %(vxlan_id)s is in use."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:195
+#: neutron/plugins/cisco/common/cisco_exceptions.py:192
#, python-format
msgid "Vxlan ID %(vxlan_id)s not found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:200
+#: neutron/plugins/cisco/common/cisco_exceptions.py:197
msgid ""
"Unable to complete operation. VXLAN ID exists outside of the configured "
"network segment range."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:206
+#: neutron/plugins/cisco/common/cisco_exceptions.py:203
#, python-format
msgid "Connection to VSM failed: %(reason)s."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:211
+#: neutron/plugins/cisco/common/cisco_exceptions.py:208
#, python-format
msgid "Internal VSM Error: %(reason)s."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:216
+#: neutron/plugins/cisco/common/cisco_exceptions.py:213
#, python-format
msgid "Network Binding for network %(network_id)s could not be found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:222
+#: neutron/plugins/cisco/common/cisco_exceptions.py:219
#, python-format
msgid "Port Binding for port %(port_id)s could not be found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:228
+#: neutron/plugins/cisco/common/cisco_exceptions.py:225
#, python-format
msgid "Profile-Tenant binding for profile %(profile_id)s could not be found."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_exceptions.py:234
+#: neutron/plugins/cisco/common/cisco_exceptions.py:231
msgid "No service cluster found to perform multi-segment bridging."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:72
+#: neutron/plugins/cisco/common/cisco_faults.py:70
msgid "Port not Found"
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:73
+#: neutron/plugins/cisco/common/cisco_faults.py:71
msgid "Unable to find a port with the specified identifier."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:87
+#: neutron/plugins/cisco/common/cisco_faults.py:85
msgid "Credential Not Found"
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:88
+#: neutron/plugins/cisco/common/cisco_faults.py:86
msgid "Unable to find a Credential with the specified identifier."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:103
+#: neutron/plugins/cisco/common/cisco_faults.py:101
msgid "QoS Not Found"
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:104
+#: neutron/plugins/cisco/common/cisco_faults.py:102
msgid "Unable to find a QoS with the specified identifier."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:119
+#: neutron/plugins/cisco/common/cisco_faults.py:117
msgid "Nova tenant Not Found"
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:120
+#: neutron/plugins/cisco/common/cisco_faults.py:118
msgid "Unable to find a Novatenant with the specified identifier."
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:135
+#: neutron/plugins/cisco/common/cisco_faults.py:133
msgid "Requested State Invalid"
msgstr ""
-#: neutron/plugins/cisco/common/cisco_faults.py:136
+#: neutron/plugins/cisco/common/cisco_faults.py:134
msgid "Unable to update port state with specified value."
msgstr ""
@@ -5696,1173 +5561,1154 @@ msgstr ""
msgid "Some config files were not parsed properly"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:330
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:325
#, python-format
msgid "seg_min %(seg_min)s, seg_max %(seg_max)s"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:561
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:556
#, python-format
msgid "Reserving specific vlan %(vlan)s on physical network %(network)s from pool"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:586
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:581
#, python-format
msgid "vlan_id %(vlan)s on physical network %(network)s not found"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:600
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:595
#, python-format
msgid "Unreasonable vxlan ID range %(vxlan_min)s - %(vxlan_max)s"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:642
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:637
#, python-format
msgid "Reserving specific vxlan %s from pool"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:663
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:658
#, python-format
msgid "vxlan_id %s not found"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:772
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:767
msgid "create_network_profile()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:794
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:789
msgid "delete_network_profile()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:808
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:803
msgid "update_network_profile()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:817
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:812
msgid "get_network_profile()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:842
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:837
msgid "create_policy_profile()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:853
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:848
msgid "delete_policy_profile()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:862
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:857
msgid "update_policy_profile()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:871
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:866
msgid "get_policy_profile()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:890
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:944
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:885
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:939
msgid "Invalid profile type"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:908
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:903
msgid "_profile_binding_exists()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:917
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:912
msgid "get_profile_binding()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:927
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:922
msgid "delete_profile_binding()"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:934
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:929
#, python-format
msgid ""
"Profile-Tenant binding missing for profile ID %(profile_id)s and tenant "
"ID %(tenant_id)s"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:965
-msgid "_get_profile_bindings()"
-msgstr ""
-
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1121
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1126
msgid "segment_range not required for TRUNK"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1127
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1132
msgid "multicast_ip_range not required"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1254
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1259
msgid "Invalid segment range. example range: 500-550"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1267
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1272
msgid "Invalid multicast ip address range. example range: 224.1.1.1-224.1.1.10"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1274
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1279
#, python-format
msgid "%s is not a valid multicast ip address"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1278
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1283
#, python-format
msgid "%s is reserved multicast ip address"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1282
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1287
#, python-format
msgid "%s is not a valid ip address"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1286
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1291
#, python-format
msgid ""
"Invalid multicast IP range '%(min_ip)s-%(max_ip)s': Range should be from "
"low address to high address"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1299
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1304
msgid "Arguments segment_type missing for network profile"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1308
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1313
msgid "segment_type should either be vlan, overlay, multi-segment or trunk"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1314
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1319
msgid "Argument physical_network missing for network profile"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1320
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1325
msgid "segment_range not required for trunk"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1326
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1331
msgid "Argument sub_type missing for network profile"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1333
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1338
msgid "Argument segment_range missing for network profile"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1344
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1349
msgid "Argument multicast_ip_range missing for VXLAN multicast network profile"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1372
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1377
#, python-format
msgid "Segment range is invalid, select from %(min)s-%(nmin)s, %(nmax)s-%(max)s"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1390
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1395
#, python-format
msgid "segment range is invalid. Valid range is : %(min)s-%(max)s"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1404
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1409
#, python-format
msgid "NetworkProfile name %s already exists"
msgstr ""
-#: neutron/plugins/cisco/db/n1kv_db_v2.py:1421
+#: neutron/plugins/cisco/db/n1kv_db_v2.py:1426
msgid "Segment range overlaps with another profile"
msgstr ""
-#: neutron/plugins/cisco/db/network_db_v2.py:40
+#: neutron/plugins/cisco/db/network_db_v2.py:38
msgid "get_qos() called"
msgstr ""
-#: neutron/plugins/cisco/db/network_db_v2.py:53
+#: neutron/plugins/cisco/db/network_db_v2.py:51
msgid "add_qos() called"
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:44
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:42
msgid "Name of the L3 admin tenant."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:46
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:44
msgid ""
"Name of management network for device configuration. Default value is "
"osn_mgmt_nw"
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:49
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:47
msgid ""
"Default security group applied on management port. Default value is "
"mgmt_sec_grp."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:52
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:50
msgid "Seconds of no status update until a cfg agent is considered down."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:55
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:53
msgid "Ensure that Nova is running before attempting to create any VM."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:61
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:59
msgid "Name of Glance image for CSR1kv."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:63
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:61
msgid "UUID of Nova flavor for CSR1kv."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:67
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:65
msgid "Plugging driver for CSR1kv."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:71
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:69
msgid "Hosting device driver for CSR1kv."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:75
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:73
msgid "Config agent driver for CSR1kv."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:77
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:75
msgid "Booting time in seconds before a CSR1kv becomes operational."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:80
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:78
msgid "Username to use for CSR1kv configurations."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:82
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:80
msgid "Password to use for CSR1kv configurations."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:124
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:122
#, python-format
msgid "No tenant with a name or ID of %s exists."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:127
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:125
#, python-format
msgid "Multiple tenants matches found for %s"
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:146
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:144
msgid "The virtual management network has no subnet. Please assign one."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:150
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:148
#, python-format
msgid "The virtual management network has %d subnets. The first one will be used."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:156
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:154
msgid ""
"The virtual management network does not have unique name. Please ensure "
"that it is."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:160
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:158
msgid "There is no virtual management network. Please create one."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:182
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:180
msgid ""
"The security group for the virtual management network does not have "
"unique name. Please ensure that it is."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:187
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:185
msgid ""
"There is no security group for the virtual management network. Please "
"create one."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:201
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:199
msgid "Error loading hosting device driver"
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:214
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:212
msgid "Error loading plugging driver"
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:330
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:328
#, python-format
msgid "Cisco cfg agent %s is not alive"
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:367
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:365
msgid ""
"Not all Nova services are up and running. Skipping this CSR1kv vm create "
"request."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:404
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:402
msgid "Created a CSR1kv hosting device VM"
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:422
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:420
#, python-format
msgid "Failed to delete hosting device %s service VM. Will un-register it anyway."
msgstr ""
-#: neutron/plugins/cisco/db/l3/device_handling_db.py:463
+#: neutron/plugins/cisco/db/l3/device_handling_db.py:461
msgid "There are no active Cisco cfg agents"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:45
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:43
msgid ""
"Time in seconds between renewed scheduling attempts of non-scheduled "
"routers."
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:53
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:51
msgid "Router could not be created due to internal error."
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:57
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:55
msgid "Internal error during router processing."
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:61
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:59
#, python-format
msgid "Could not get binding information for router %(router_id)s."
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:316
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:314
#, python-format
msgid "Attempting to schedule router %s."
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:328
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:326
#, python-format
msgid "Successfully scheduled router %(r_id)s to hosting device %(d_id)s"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:335
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:333
#, python-format
msgid "Un-schedule router %s."
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:348
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:346
#, python-format
msgid "Backlogging router %s for renewed scheduling attempt later"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:355
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:353
#, python-format
msgid "Router %s removed from backlog"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:365
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:363
msgid "Processing router (scheduling) backlog"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:385
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:383
msgid "Synchronizing router (scheduling) backlog"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:408
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:406
#, python-format
msgid "DB inconsistency: No type and hosting info associated with router %s"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:413
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:411
#, python-format
msgid "DB inconsistency: Multiple type and hosting info associated with router %s"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:436
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:434
#, python-format
msgid "DB inconsistency: No hosting info associated with router %s"
msgstr ""
-#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:513
+#: neutron/plugins/cisco/db/l3/l3_router_appliance_db.py:511
#, python-format
msgid "Failed to allocate hosting port for port %s"
msgstr ""
-#: neutron/plugins/cisco/l3/service_vm_lib.py:34
+#: neutron/plugins/cisco/l3/service_vm_lib.py:30
msgid "Path to templates for hosting devices."
msgstr ""
-#: neutron/plugins/cisco/l3/service_vm_lib.py:37
+#: neutron/plugins/cisco/l3/service_vm_lib.py:33
msgid "Path to config drive files for service VM instances."
msgstr ""
-#: neutron/plugins/cisco/l3/service_vm_lib.py:71
+#: neutron/plugins/cisco/l3/service_vm_lib.py:67
#, python-format
msgid "Failure determining running Nova services: %s"
msgstr ""
-#: neutron/plugins/cisco/l3/service_vm_lib.py:88
+#: neutron/plugins/cisco/l3/service_vm_lib.py:84
#, python-format
msgid "Failed to get status of service VM instance %(id)s, due to %(err)s"
msgstr ""
-#: neutron/plugins/cisco/l3/service_vm_lib.py:104
+#: neutron/plugins/cisco/l3/service_vm_lib.py:100
#, python-format
msgid "Failure finding needed Nova resource: %s"
msgstr ""
-#: neutron/plugins/cisco/l3/service_vm_lib.py:126
+#: neutron/plugins/cisco/l3/service_vm_lib.py:122
#, python-format
msgid "Failed to create service VM instance: %s"
msgstr ""
-#: neutron/plugins/cisco/l3/service_vm_lib.py:142
+#: neutron/plugins/cisco/l3/service_vm_lib.py:138
#, python-format
msgid "Failed to delete service VM instance %(id)s, due to %(err)s"
msgstr ""
-#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:34
+#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:32
msgid "CSR1kv configdrive template file."
msgstr ""
-#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:68
+#: neutron/plugins/cisco/l3/hosting_device_drivers/csr1kv_hd_driver.py:66
#, python-format
msgid "Failed to create config file: %s. Trying toclean up."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:42
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:40
msgid "Name of N1kv port profile for management ports."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:44
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:42
msgid ""
"Name of N1kv port profile for T1 ports (i.e., ports carrying traffic from"
" VXLAN segmented networks)."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:47
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:45
msgid ""
"Name of N1kv port profile for T2 ports (i.e., ports carrying traffic from"
" VLAN segmented networks)."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:50
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:48
msgid ""
"Name of N1kv network profile for T1 networks (i.e., trunk networks for "
"VXLAN segmented traffic)."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:53
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:51
msgid ""
"Name of N1kv network profile for T2 networks (i.e., trunk networks for "
"VLAN segmented traffic)."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:109
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:107
#, python-format
msgid ""
"The %(resource)s %(name)s does not have unique name. Please refer to "
"admin guide and create one."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:114
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:112
#, python-format
msgid ""
"There is no %(resource)s %(name)s. Please refer to admin guide and create"
" one."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:214
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:212
#, python-format
msgid "Error %s when creating service VM resources. Cleaning up."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:285
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:283
#, python-format
msgid "Aborting resource deletion after %d unsuccessful attempts"
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:291
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:289
#, python-format
msgid "Resource deletion attempt %d starting"
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:310
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:308
msgid "Resource deletion succeeded"
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:321
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:319
#, python-format
-msgid "Failed to delete %(resource_name) %(net_id)s for service vm due to %(err)s"
+msgid ""
+"Failed to delete %(resource_name)s %(net_id)s for service vm due to "
+"%(err)s"
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:413
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:411
#, python-format
msgid "Updating trunk: %(action)s VLAN %(tag)d for network_id %(id)s"
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:453
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:451
#, python-format
msgid "Hosting port DB inconsistency for hosting device %s"
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:460
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:458
#, python-format
msgid ""
"Attempt %(attempt)d to find trunk ports for hosting device %(hd_id)s "
"failed. Trying again in %(time)d seconds."
msgstr ""
-#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:506
+#: neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py:504
#, python-format
msgid "Port trunk pair DB inconsistency for port %s"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:79
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:75
#, python-format
msgid "%(module)s.%(name)s init done"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:120
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:116
#, python-format
msgid "No %s Plugin loaded"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:121
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:117
#, python-format
msgid "%(plugin_key)s: %(function_name)s with args %(args)s ignored"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:145
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:141
msgid "create_network() called"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:158
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:154
#, python-format
msgid "Provider network added to DB: %(network_id)s, %(vlan_id)s"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:169
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:165
msgid "update_network() called"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:193
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:189
#, python-format
msgid "Provider network removed from DB: %s"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:235
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:231
msgid "create_port() called"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:261
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:257
msgid "update_port() called"
msgstr ""
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:273
+#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:269
msgid "delete_port() called"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:226
+#: neutron/plugins/cisco/n1kv/n1kv_client.py:223
msgid "Logical network"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:251
+#: neutron/plugins/cisco/n1kv/n1kv_client.py:248
msgid "network_segment_pool"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:298
+#: neutron/plugins/cisco/n1kv/n1kv_client.py:295
msgid "Invalid input for CIDR"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:440
+#: neutron/plugins/cisco/n1kv/n1kv_client.py:437
#, python-format
msgid "req: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:450
+#: neutron/plugins/cisco/n1kv/n1kv_client.py:447
#, python-format
msgid "status_code %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_client.py:458
+#: neutron/plugins/cisco/n1kv/n1kv_client.py:455
#, python-format
msgid "VSM: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:129
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:124
msgid "_setup_vsm"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:148
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:143
msgid "_populate_policy_profiles"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:175
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:170
msgid "No policy profile populated from VSM"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:212
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:342
-#: neutron/plugins/mlnx/mlnx_plugin.py:226 neutron/plugins/nuage/plugin.py:413
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:414
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:207
+#: neutron/plugins/mlnx/mlnx_plugin.py:223 neutron/plugins/nuage/plugin.py:419
msgid "provider:network_type required"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:216
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:230
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:352
-#: neutron/plugins/mlnx/mlnx_plugin.py:256 neutron/plugins/nuage/plugin.py:423
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:424
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:443
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:211
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:225
+#: neutron/plugins/mlnx/mlnx_plugin.py:253 neutron/plugins/nuage/plugin.py:429
msgid "provider:segmentation_id required"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:219
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:214
msgid "provider:segmentation_id out of range (1 through 4094)"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:224
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:219
msgid "provider:physical_network specified for Overlay network"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:233
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:228
msgid "provider:segmentation_id out of range (5000+)"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:237
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:374
-#: neutron/plugins/mlnx/mlnx_plugin.py:242
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:459
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:232
+#: neutron/plugins/mlnx/mlnx_plugin.py:239
#, python-format
msgid "provider:network_type %s not supported"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:248
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:380
-#: neutron/plugins/mlnx/mlnx_plugin.py:282
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:465
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:243
+#: neutron/plugins/mlnx/mlnx_plugin.py:279
#, python-format
msgid "Unknown provider:physical_network %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:252
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:386
-#: neutron/plugins/mlnx/mlnx_plugin.py:288 neutron/plugins/nuage/plugin.py:420
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:471
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:247
+#: neutron/plugins/mlnx/mlnx_plugin.py:285 neutron/plugins/nuage/plugin.py:426
msgid "provider:physical_network required"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:430
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:425
#, python-format
msgid "_populate_member_segments %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:469
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:464
msgid "Invalid pairing supplied"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:474
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:469
#, python-format
msgid "Invalid UUID supplied in %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:475
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:470
msgid "Invalid UUID supplied"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:504
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:499
#, python-format
msgid "Cannot add a trunk segment '%s' as a member of another trunk segment"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:509
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:504
#, python-format
msgid "Cannot add vlan segment '%s' as a member of a vxlan trunk segment"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:515
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:510
#, python-format
msgid "Network UUID '%s' belongs to a different physical network"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:520
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:515
#, python-format
msgid "Cannot add vxlan segment '%s' as a member of a vlan trunk segment"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:525
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:520
#, python-format
msgid "Vlan tag '%s' is out of range"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:528
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:523
#, python-format
msgid "Vlan tag '%s' is not an integer value"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:533
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:528
#, python-format
msgid "%s is not a valid uuid"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:580
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:583
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:575
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:578
msgid "n1kv:profile_id does not exist"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:595
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:590
msgid "_send_create_logical_network"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:618
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:613
#, python-format
msgid "_send_create_network_profile_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:628
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:623
#, python-format
msgid "_send_update_network_profile_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:638
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:633
#, python-format
msgid "_send_delete_network_profile_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:653
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:648
#, python-format
msgid "_send_create_network_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:685
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:680
#, python-format
msgid "_send_update_network_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:707
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:702
#, python-format
msgid "add_segments=%s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:708
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:703
#, python-format
msgid "del_segments=%s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:732
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:727
#, python-format
msgid "_send_delete_network_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:772
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:767
#, python-format
msgid "_send_create_subnet_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:782
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:777
#, python-format
msgid "_send_update_subnet_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:793
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:788
#, python-format
msgid "_send_delete_subnet_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:819
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:814
#, python-format
msgid "_send_create_port_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:836
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:831
#, python-format
msgid "_send_update_port_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:852
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:846
#, python-format
msgid "_send_delete_port_request: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:883
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:875
#, python-format
msgid "Create network: profile_id=%s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:891
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:883
#, python-format
msgid ""
"Physical_network %(phy_net)s, seg_type %(net_type)s, seg_id %(seg_id)s, "
"multicast_ip %(multicast_ip)s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:903
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:913
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:895
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:905
#, python-format
msgid "Seg list %s "
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:954
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:255
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:198
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:946
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:254
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:196
#: neutron/plugins/metaplugin/meta_neutron_plugin.py:226
-#: neutron/plugins/mlnx/mlnx_plugin.py:369
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:519
+#: neutron/plugins/mlnx/mlnx_plugin.py:366
#, python-format
msgid "Created network: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1012
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1004
#, python-format
msgid "Updated network: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1026
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1018
#, python-format
msgid "Cannot delete network '%s', delete the associated subnet first"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1030
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1022
#, python-format
msgid "Cannot delete network '%s' that is member of a trunk segment"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1034
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1026
#, python-format
msgid "Cannot delete network '%s' that is a member of a multi-segment network"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1062
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1054
#, python-format
msgid "Get network: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1084
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1076
msgid "Get networks"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1135
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1127
#, python-format
msgid "Create port: profile_id=%s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1182
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:305
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1174
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:303
#, python-format
msgid "Created port: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1193
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1185
#, python-format
msgid "Update port: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1256
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1248
#, python-format
msgid "Get port: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1276
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1268
msgid "Get ports"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1292
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1284
msgid "Create subnet"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1302
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1294
#, python-format
msgid "Created subnet: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1317
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1309
msgid "Update subnet"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1332
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1324
#, python-format
msgid "Delete subnet: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1347
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1339
#, python-format
msgid "Get subnet: %s"
msgstr ""
-#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1367
+#: neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py:1359
msgid "Get subnets"
msgstr ""
-#: neutron/plugins/common/utils.py:30
+#: neutron/plugins/common/utils.py:33
+#, python-format
+msgid "%(id)s is not a valid %(type)s identifier"
+msgstr ""
+
+#: neutron/plugins/common/utils.py:38
+msgid "End of tunnel range is less than start of tunnel range"
+msgstr ""
+
+#: neutron/plugins/common/utils.py:48
#, python-format
msgid "%s is not a valid VLAN tag"
msgstr ""
-#: neutron/plugins/common/utils.py:34
+#: neutron/plugins/common/utils.py:52
msgid "End of VLAN range is less than start of VLAN range"
msgstr ""
-#: neutron/plugins/embrane/base_plugin.py:107
-#: neutron/plugins/embrane/agent/dispatcher.py:132
-#: neutron/services/loadbalancer/drivers/embrane/poller.py:56
-#: neutron/services/loadbalancer/drivers/embrane/agent/dispatcher.py:108
+#: neutron/plugins/embrane/base_plugin.py:105
+#: neutron/plugins/embrane/agent/dispatcher.py:130
+#: neutron/services/loadbalancer/drivers/embrane/poller.py:54
+#: neutron/services/loadbalancer/drivers/embrane/agent/dispatcher.py:106
msgid "Unhandled exception occurred"
msgstr ""
-#: neutron/plugins/embrane/base_plugin.py:172
-#: neutron/plugins/embrane/base_plugin.py:191
+#: neutron/plugins/embrane/base_plugin.py:170
+#: neutron/plugins/embrane/base_plugin.py:189
#, python-format
msgid "The following routers have not physical match: %s"
msgstr ""
-#: neutron/plugins/embrane/base_plugin.py:177
+#: neutron/plugins/embrane/base_plugin.py:175
#, python-format
msgid "Requested router: %s"
msgstr ""
-#: neutron/plugins/embrane/base_plugin.py:229
+#: neutron/plugins/embrane/base_plugin.py:227
#, python-format
msgid "Deleting router=%s"
msgstr ""
-#: neutron/plugins/embrane/agent/operations/router_operations.py:97
+#: neutron/plugins/embrane/agent/operations/router_operations.py:95
#, python-format
msgid "The router %s had no physical representation,likely already deleted"
msgstr ""
-#: neutron/plugins/embrane/agent/operations/router_operations.py:126
+#: neutron/plugins/embrane/agent/operations/router_operations.py:124
#, python-format
msgid "Interface %s not found in the heleos back-end,likely already deleted"
msgstr ""
-#: neutron/plugins/embrane/common/config.py:23
-#: neutron/services/loadbalancer/drivers/embrane/config.py:25
+#: neutron/plugins/embrane/common/config.py:21
+#: neutron/services/loadbalancer/drivers/embrane/config.py:23
msgid "ESM management root address"
msgstr ""
-#: neutron/plugins/embrane/common/config.py:25
-#: neutron/services/loadbalancer/drivers/embrane/config.py:27
+#: neutron/plugins/embrane/common/config.py:23
+#: neutron/services/loadbalancer/drivers/embrane/config.py:25
msgid "ESM admin username."
msgstr ""
-#: neutron/plugins/embrane/common/config.py:28
-#: neutron/services/loadbalancer/drivers/embrane/config.py:30
+#: neutron/plugins/embrane/common/config.py:26
+#: neutron/services/loadbalancer/drivers/embrane/config.py:28
msgid "ESM admin password."
msgstr ""
-#: neutron/plugins/embrane/common/config.py:30
+#: neutron/plugins/embrane/common/config.py:28
msgid "Router image id (Embrane FW/VPN)"
msgstr ""
-#: neutron/plugins/embrane/common/config.py:32
+#: neutron/plugins/embrane/common/config.py:30
msgid "In band Security Zone id"
msgstr ""
-#: neutron/plugins/embrane/common/config.py:34
+#: neutron/plugins/embrane/common/config.py:32
msgid "Out of band Security Zone id"
msgstr ""
-#: neutron/plugins/embrane/common/config.py:36
+#: neutron/plugins/embrane/common/config.py:34
msgid "Management Security Zone id"
msgstr ""
-#: neutron/plugins/embrane/common/config.py:38
+#: neutron/plugins/embrane/common/config.py:36
msgid "Dummy user traffic Security Zone id"
msgstr ""
-#: neutron/plugins/embrane/common/config.py:40
-#: neutron/services/loadbalancer/drivers/embrane/config.py:42
+#: neutron/plugins/embrane/common/config.py:38
+#: neutron/services/loadbalancer/drivers/embrane/config.py:40
msgid "Shared resource pool id"
msgstr ""
-#: neutron/plugins/embrane/common/config.py:42
-#: neutron/services/loadbalancer/drivers/embrane/config.py:49
+#: neutron/plugins/embrane/common/config.py:40
+#: neutron/services/loadbalancer/drivers/embrane/config.py:47
msgid "Define if the requests have run asynchronously or not"
msgstr ""
-#: neutron/plugins/embrane/common/constants.py:49
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:50
+#: neutron/plugins/embrane/common/constants.py:47
+#: neutron/services/loadbalancer/drivers/embrane/constants.py:48
#, python-format
msgid "Dva is pending for the following reason: %s"
msgstr ""
-#: neutron/plugins/embrane/common/constants.py:50
+#: neutron/plugins/embrane/common/constants.py:48
msgid ""
"Dva can't be found to execute the operation, probably was cancelled "
"through the heleos UI"
msgstr ""
-#: neutron/plugins/embrane/common/constants.py:52
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:53
+#: neutron/plugins/embrane/common/constants.py:50
+#: neutron/services/loadbalancer/drivers/embrane/constants.py:51
#, python-format
msgid "Dva seems to be broken for reason %s"
msgstr ""
-#: neutron/plugins/embrane/common/constants.py:53
+#: neutron/plugins/embrane/common/constants.py:51
#, python-format
msgid "Dva interface seems to be broken for reason %s"
msgstr ""
-#: neutron/plugins/embrane/common/constants.py:55
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:54
+#: neutron/plugins/embrane/common/constants.py:53
+#: neutron/services/loadbalancer/drivers/embrane/constants.py:52
#, python-format
msgid "Dva creation failed reason %s"
msgstr ""
-#: neutron/plugins/embrane/common/constants.py:56
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:55
+#: neutron/plugins/embrane/common/constants.py:54
+#: neutron/services/loadbalancer/drivers/embrane/constants.py:53
#, python-format
msgid "Dva creation is in pending state for reason %s"
msgstr ""
-#: neutron/plugins/embrane/common/constants.py:58
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:57
+#: neutron/plugins/embrane/common/constants.py:56
+#: neutron/services/loadbalancer/drivers/embrane/constants.py:55
#, python-format
msgid "Dva configuration failed for reason %s"
msgstr ""
-#: neutron/plugins/embrane/common/constants.py:59
+#: neutron/plugins/embrane/common/constants.py:57
#, python-format
msgid ""
"Failed to delete the backend router for reason %s. Please remove it "
"manually through the heleos UI"
msgstr ""
-#: neutron/plugins/embrane/common/exceptions.py:22
+#: neutron/plugins/embrane/common/exceptions.py:20
#, python-format
msgid "An unexpected error occurred:%(err_msg)s"
msgstr ""
-#: neutron/plugins/embrane/common/exceptions.py:26
+#: neutron/plugins/embrane/common/exceptions.py:24
#, python-format
msgid "%(err_msg)s"
msgstr ""
-#: neutron/plugins/embrane/common/utils.py:45
+#: neutron/plugins/embrane/common/utils.py:43
msgid "No ip allocation set"
msgstr ""
-#: neutron/plugins/embrane/l2base/support_exceptions.py:22
+#: neutron/plugins/embrane/l2base/support_exceptions.py:20
#, python-format
msgid "Cannot retrieve utif info for the following reason: %(err_msg)s"
msgstr ""
-#: neutron/plugins/embrane/l2base/ml2/ml2_support.py:46
+#: neutron/plugins/embrane/l2base/ml2/ml2_support.py:43
#, python-format
msgid ""
"Network type %s not supported. Please be sure that tenant_network_type is"
" vlan"
msgstr ""
-#: neutron/plugins/hyperv/db.py:38
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:113
-#: neutron/plugins/openvswitch/ovs_db_v2.py:131
+#: neutron/plugins/hyperv/db.py:37
#, python-format
msgid ""
"Reserving vlan %(vlan_id)s on physical network %(physical_network)s from "
"pool"
msgstr ""
-#: neutron/plugins/hyperv/db.py:53
+#: neutron/plugins/hyperv/db.py:52
#, python-format
msgid "Reserving flat physical network %(physical_network)s from pool"
msgstr ""
-#: neutron/plugins/hyperv/db.py:76
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:136
-#: neutron/plugins/openvswitch/ovs_db_v2.py:155
+#: neutron/plugins/hyperv/db.py:75
#, python-format
msgid ""
"Reserving specific vlan %(vlan_id)s on physical network "
"%(physical_network)s from pool"
msgstr ""
-#: neutron/plugins/hyperv/db.py:133
+#: neutron/plugins/hyperv/db.py:132
#, python-format
msgid "Releasing vlan %(vlan_id)s on physical network %(physical_network)s"
msgstr ""
-#: neutron/plugins/hyperv/db.py:138
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:177
-#: neutron/plugins/openvswitch/ovs_db_v2.py:196
+#: neutron/plugins/hyperv/db.py:137
#, python-format
msgid "vlan_id %(vlan_id)s on physical network %(physical_network)s not found"
msgstr ""
-#: neutron/plugins/hyperv/db.py:163 neutron/plugins/hyperv/db.py:176
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:64
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:83
+#: neutron/plugins/hyperv/db.py:162 neutron/plugins/hyperv/db.py:175
#: neutron/plugins/ml2/drivers/type_vlan.py:130
#: neutron/plugins/ml2/drivers/type_vlan.py:151
-#: neutron/plugins/openvswitch/ovs_db_v2.py:87
-#: neutron/plugins/openvswitch/ovs_db_v2.py:105
#, python-format
msgid ""
"Removing vlan %(vlan_id)s on physical network %(physical_network)s from "
"pool"
msgstr ""
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:46
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:45
msgid "Network type for tenant networks (local, flat, vlan or none)"
msgstr ""
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:50
-#: neutron/plugins/linuxbridge/common/config.py:33
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:49
+#: neutron/plugins/linuxbridge/common/config.py:30
#: neutron/plugins/mlnx/common/config.py:30
msgid "List of <physical_network>:<vlan_min>:<vlan_max> or <physical_network>"
msgstr ""
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:78
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:100
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:77
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:99
#, python-format
msgid "segmentation_id specified for %s network"
msgstr ""
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:85
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:84
#, python-format
msgid "physical_network specified for %s network"
msgstr ""
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:127
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:126
msgid "physical_network not provided"
msgstr ""
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:179
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:178
#, python-format
msgid "Invalid tenant_network_type: %s. Agent terminated!"
msgstr ""
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:204
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:303
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:203
#: neutron/plugins/ml2/drivers/type_vlan.py:96
-#: neutron/plugins/mlnx/mlnx_plugin.py:187
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:366
+#: neutron/plugins/mlnx/mlnx_plugin.py:184
#, python-format
msgid "Network VLAN ranges: %s"
msgstr ""
-#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:229
+#: neutron/plugins/hyperv/hyperv_neutron_plugin.py:228
#, python-format
msgid "Network type %s not supported"
msgstr ""
-#: neutron/plugins/hyperv/rpc_callbacks.py:76
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:114
+#: neutron/plugins/hyperv/rpc_callbacks.py:75
#: neutron/plugins/mlnx/rpc_callbacks.py:77
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:117
#, python-format
msgid "Device %(device)s no longer exists on %(agent_id)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:50
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:48
msgid ""
"List of <physical_network>:<vswitch> where the physical networks can be "
"expressed with wildcards, e.g.: .\"*:external\""
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:56
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:54
msgid "Private vswitch name used for local networks"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:58
-#: neutron/plugins/linuxbridge/common/config.py:64
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:56
+#: neutron/plugins/linuxbridge/common/config.py:61
#: neutron/plugins/mlnx/common/config.py:67
-#: neutron/plugins/nec/common/config.py:29
+#: neutron/plugins/nec/common/config.py:28
#: neutron/plugins/oneconvergence/lib/config.py:47
-#: neutron/plugins/openvswitch/common/config.py:66
+#: neutron/plugins/openvswitch/common/config.py:53
#: neutron/plugins/ryu/common/config.py:43
#: neutron/plugins/sriovnicagent/common/config.py:58
msgid ""
@@ -6870,14 +6716,14 @@ msgid ""
"device changes."
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:62
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:60
msgid ""
"Enables metrics collections for switch ports by using Hyper-V's metric "
"APIs. Collected data can by retrieved by other apps and services, e.g.: "
"Ceilometer. Requires Hyper-V / Windows Server 2012 and above"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:69
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:67
msgid ""
"Specifies the maximum number of retries to enable Hyper-V's port metrics "
"collection. The agent will try to enable the feature once every "
@@ -6885,1199 +6731,1110 @@ msgid ""
"succeedes."
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:151
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:149
#, python-format
msgid "Failed reporting state! %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:186
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:184
#, python-format
msgid "Invalid physical network mapping: %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:207
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:205
#, python-format
msgid "network_delete received. Deleting network %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:213
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:211
#, python-format
msgid "Network %s not defined on agent."
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:216
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:214
msgid "port_delete received"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:221
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:219
msgid "port_update received"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:243
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:241
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:130
#, python-format
msgid "Provisioning network %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:256
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:254
#, python-format
msgid ""
"Cannot provision unknown network type %(network_type)s for network "
"%(net_uuid)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:268
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:266
#, python-format
msgid "Reclaiming local network %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:276
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:274
#, python-format
msgid "Binding port %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:289
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:287
#, python-format
msgid "Binding VLAN ID %(segmentation_id)s to switch port %(port_id)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:302
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:300
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:115
#, python-format
msgid "Unsupported network type %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:311
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:309
#, python-format
msgid "Network %s is not avalailable on this agent"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:315
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:313
#, python-format
msgid "Unbinding port %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:328
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:326
#, python-format
msgid "Port metrics enabled for port: %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:332
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:330
#, python-format
msgid "Port metrics raw enabling for port: %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:357
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:355
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:294
#, python-format
msgid "No port %s defined on agent."
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:374
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:372
#, python-format
msgid "Adding port %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:377
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:375
#, python-format
msgid "Port %(device)s updated. Details: %(device_details)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:403
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:401
#, python-format
msgid "Removing port %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:411
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:409
#, python-format
msgid "Removing port failed for device %(device)s: %(e)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:436
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:995
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1350
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:434
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:993
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1353
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:254
msgid "Agent out of sync with plugin!"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:444
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:442
msgid "Agent loop has new devices!"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:451
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:449
#, python-format
msgid "Error in agent event loop: %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:459
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:457
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:393
#, python-format
msgid "Loop iteration exceeded interval (%(polling_interval)s vs. %(elapsed)s)"
msgstr ""
-#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:472
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:268
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1036
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1542
+#: neutron/plugins/hyperv/agent/hyperv_neutron_agent.py:470
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:266
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1034
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1545
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:350
msgid "Agent initialized successfully, now running... "
msgstr ""
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:62
+#: neutron/plugins/hyperv/agent/security_groups_driver.py:61
#, python-format
msgid "Hyper-V Exception: %(hyperv_exeption)s while adding rule: %(rule)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:72
+#: neutron/plugins/hyperv/agent/security_groups_driver.py:71
#, python-format
msgid "Hyper-V Exception: %(hyperv_exeption)s while removing rule: %(rule)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:92
+#: neutron/plugins/hyperv/agent/security_groups_driver.py:91
msgid "Aplying port filter."
msgstr ""
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:95
+#: neutron/plugins/hyperv/agent/security_groups_driver.py:94
msgid "Updating port rules."
msgstr ""
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:108
+#: neutron/plugins/hyperv/agent/security_groups_driver.py:107
#, python-format
msgid "Creating %(new)s new rules, removing %(old)s old rules."
msgstr ""
-#: neutron/plugins/hyperv/agent/security_groups_driver.py:119
+#: neutron/plugins/hyperv/agent/security_groups_driver.py:118
msgid "Removing port filter"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:36
+#: neutron/plugins/hyperv/agent/utils.py:34
#, python-format
msgid "HyperVException: %(msg)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:81
+#: neutron/plugins/hyperv/agent/utils.py:79
#, python-format
msgid "Vnic not found: %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:116
+#: neutron/plugins/hyperv/agent/utils.py:114
#, python-format
msgid "Job failed with error %d"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:135
+#: neutron/plugins/hyperv/agent/utils.py:133
#, python-format
msgid ""
"WMI job failed with status %(job_state)d. Error details: %(err_sum_desc)s"
" - %(err_desc)s - Error code: %(err_code)d"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:144
+#: neutron/plugins/hyperv/agent/utils.py:142
#, python-format
msgid "WMI job failed with status %(job_state)d. Error details: %(error)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:148
+#: neutron/plugins/hyperv/agent/utils.py:146
#, python-format
msgid "WMI job failed with status %d. No error description available"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:153
+#: neutron/plugins/hyperv/agent/utils.py:151
#, python-format
msgid "WMI job succeeded: %(desc)s, Elapsed=%(elap)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:167
+#: neutron/plugins/hyperv/agent/utils.py:165
#, python-format
msgid "Failed creating port for %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:190
+#: neutron/plugins/hyperv/agent/utils.py:188
#, python-format
msgid ""
"Failed to disconnect port %(switch_port_name)s from switch "
"%(vswitch_name)s with error %(ret_val)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:201
+#: neutron/plugins/hyperv/agent/utils.py:199
#, python-format
msgid ""
"Failed to delete port %(switch_port_name)s from switch %(vswitch_name)s "
"with error %(ret_val)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:208
-#: neutron/plugins/hyperv/agent/utilsv2.py:135
+#: neutron/plugins/hyperv/agent/utils.py:206
+#: neutron/plugins/hyperv/agent/utilsv2.py:133
#, python-format
msgid "VSwitch not found: %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utils.py:249
-#: neutron/plugins/hyperv/agent/utils.py:253
+#: neutron/plugins/hyperv/agent/utils.py:247
+#: neutron/plugins/hyperv/agent/utils.py:251
msgid "Metrics collection is not supported on this version of Hyper-V"
msgstr ""
-#: neutron/plugins/hyperv/agent/utilsfactory.py:32
+#: neutron/plugins/hyperv/agent/utilsfactory.py:31
msgid "Force V1 WMI utility classes"
msgstr ""
-#: neutron/plugins/hyperv/agent/utilsfactory.py:61
+#: neutron/plugins/hyperv/agent/utilsfactory.py:60
msgid ""
"V1 virtualization namespace no longer supported on Windows Server / "
"Hyper-V Server 2012 R2 or above."
msgstr ""
-#: neutron/plugins/hyperv/agent/utilsfactory.py:68
+#: neutron/plugins/hyperv/agent/utilsfactory.py:67
#, python-format
msgid "Loading class: %(module_name)s.%(class_name)s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utilsv2.py:158
-#: neutron/plugins/hyperv/agent/utilsv2.py:318
+#: neutron/plugins/hyperv/agent/utilsv2.py:156
+#: neutron/plugins/hyperv/agent/utilsv2.py:316
#, python-format
msgid "Port Allocation not found: %s"
msgstr ""
-#: neutron/plugins/hyperv/agent/utilsv2.py:268
+#: neutron/plugins/hyperv/agent/utilsv2.py:266
#, python-format
msgid "Cannot get VM summary data for: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:77
+#: neutron/plugins/ibm/sdnve_api.py:75
#, python-format
msgid "The IP addr of available SDN-VE controllers: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:80
+#: neutron/plugins/ibm/sdnve_api.py:78
#, python-format
msgid "The SDN-VE controller IP address: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:97
+#: neutron/plugins/ibm/sdnve_api.py:95
#, python-format
msgid "unable to serialize object type: '%s'"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:164
+#: neutron/plugins/ibm/sdnve_api.py:162
#, python-format
msgid ""
"Sending request to SDN-VE. url: %(myurl)s method: %(method)s body: "
"%(body)s header: %(header)s "
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:177
+#: neutron/plugins/ibm/sdnve_api.py:175
#, python-format
msgid "Error: Could not reach server: %(url)s Exception: %(excp)s."
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:184
+#: neutron/plugins/ibm/sdnve_api.py:182
#, python-format
msgid "Error message: %(reply)s -- Status: %(status)s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:187
+#: neutron/plugins/ibm/sdnve_api.py:185
#, python-format
msgid "Received response status: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:194
+#: neutron/plugins/ibm/sdnve_api.py:192
#, python-format
msgid "Deserialized body: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:236
+#: neutron/plugins/ibm/sdnve_api.py:234
msgid "Bad resource for forming a list request"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:246
+#: neutron/plugins/ibm/sdnve_api.py:244
msgid "Bad resource for forming a show request"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:256
+#: neutron/plugins/ibm/sdnve_api.py:254
msgid "Bad resource for forming a create request"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:268
+#: neutron/plugins/ibm/sdnve_api.py:266
msgid "Bad resource for forming a update request"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:279
+#: neutron/plugins/ibm/sdnve_api.py:277
msgid "Bad resource for forming a delete request"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:307
+#: neutron/plugins/ibm/sdnve_api.py:305
#, python-format
msgid "Non matching tenant and network types: %(ttype)s %(ntype)s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api.py:369
+#: neutron/plugins/ibm/sdnve_api.py:367
#, python-format
msgid "Did not find tenant: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:32
+#: neutron/plugins/ibm/sdnve_api_fake.py:30
msgid "Fake SDNVE controller initialized"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:35
+#: neutron/plugins/ibm/sdnve_api_fake.py:33
msgid "Fake SDNVE controller: list"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:39
+#: neutron/plugins/ibm/sdnve_api_fake.py:37
msgid "Fake SDNVE controller: show"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:43
+#: neutron/plugins/ibm/sdnve_api_fake.py:41
msgid "Fake SDNVE controller: create"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:47
+#: neutron/plugins/ibm/sdnve_api_fake.py:45
msgid "Fake SDNVE controller: update"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:51
+#: neutron/plugins/ibm/sdnve_api_fake.py:49
msgid "Fake SDNVE controller: delete"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:55
+#: neutron/plugins/ibm/sdnve_api_fake.py:53
msgid "Fake SDNVE controller: get tenant by id"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:59
+#: neutron/plugins/ibm/sdnve_api_fake.py:57
msgid "Fake SDNVE controller: check and create tenant"
msgstr ""
-#: neutron/plugins/ibm/sdnve_api_fake.py:63
+#: neutron/plugins/ibm/sdnve_api_fake.py:61
msgid "Fake SDNVE controller: get controller"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:152
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:150
msgid "Set a new controller if needed."
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:158
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:156
#, python-format
msgid "Set the controller to a new controller: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:166
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:164
#, python-format
msgid "Original SDN-VE HTTP request: %(orig)s; New request: %(new)s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:176
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:174
#, python-format
msgid "Create network in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:185
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:183
msgid "Create net failed: no SDN-VE tenant."
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:196
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:194
#, python-format
msgid "Create net failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:203
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:201
#, python-format
msgid "Update network in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:223
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:221
#, python-format
msgid "Update net failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:229
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:227
#, python-format
msgid "Delete network in progress: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:239
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:237
#, python-format
msgid "Delete net failed after deleting the network in DB: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:244
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:242
#, python-format
msgid "Get network in progress: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:250
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:248
msgid "Get networks in progress"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:260
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:258
#, python-format
msgid "Create port in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:276
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:274
msgid "Create port does not have tenant id info"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:282
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:280
#, python-format
msgid "Create port does not have tenant id info; obtained is: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:303
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:301
#, python-format
msgid "Create port failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:310
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:308
#, python-format
msgid "Update port in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:337
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:335
#, python-format
msgid "Update port failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:343
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:341
#, python-format
msgid "Delete port in progress: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:356
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:354
#, python-format
msgid "Delete port operation failed in SDN-VE after deleting the port from DB: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:365
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:363
#, python-format
msgid "Create subnet in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:377
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:375
#, python-format
msgid "Create subnet failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:379
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:377
#, python-format
msgid "Subnet created: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:385
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:383
#, python-format
msgid "Update subnet in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:410
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:408
#, python-format
msgid "Update subnet failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:416
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:414
#, python-format
msgid "Delete subnet in progress: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:421
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:419
#, python-format
msgid ""
"Delete subnet operation failed in SDN-VE after deleting the subnet from "
"DB: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:430
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:428
#, python-format
msgid "Create router in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:433
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:431
#, python-format
msgid "Ignoring admin_state_up=False for router=%r. Overriding with True"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:443
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:441
msgid "Create router failed: no SDN-VE tenant."
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:451
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:449
#, python-format
msgid "Create router failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:453
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:451
#, python-format
msgid "Router created: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:458
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:456
#, python-format
msgid "Update router in progress: id=%(id)s router=%(router)r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:465
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:463
msgid "admin_state_up=False routers are not supported."
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:489
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:487
#, python-format
msgid "Update router failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:495
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:493
#, python-format
msgid "Delete router in progress: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:502
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:500
#, python-format
msgid ""
"Delete router operation failed in SDN-VE after deleting the router in DB:"
" %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:507
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:505
#, python-format
msgid ""
"Add router interface in progress: router_id=%(router_id)s "
"interface_info=%(interface_info)r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:515
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:513
#, python-format
msgid "SdnvePluginV2.add_router_interface called. Port info: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:529
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:527
#, python-format
msgid "Update router-add-interface failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:532
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:530
#, python-format
msgid "Added router interface: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:536
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:534
#, python-format
msgid ""
"Add router interface only called: router_id=%(router_id)s "
"interface_info=%(interface_info)r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:546
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:544
msgid ""
"SdnvePluginV2._add_router_interface_only: failed to add the interface in "
"the roll back. of a remove_router_interface operation"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:552
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:550
#, python-format
msgid ""
"Remove router interface in progress: router_id=%(router_id)s "
"interface_info=%(interface_info)r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:561
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:559
msgid "No port ID"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:563
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:561
#, python-format
msgid "SdnvePluginV2.remove_router_interface port: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:567
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:565
msgid "No fixed IP"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:572
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:570
#, python-format
msgid "SdnvePluginV2.remove_router_interface subnet_id: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:595
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:593
#, python-format
msgid "Update router-remove-interface failed SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:616
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:614
#, python-format
msgid "Create floatingip in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:627
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:625
#, python-format
msgid "Creating floating ip operation failed in SDN-VE controller: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:630
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:628
#, python-format
msgid "Created floatingip : %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:635
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:633
#, python-format
msgid "Update floatingip in progress: %r"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:655
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:653
#, python-format
msgid "Update floating ip failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:661
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:659
#, python-format
msgid "Delete floatingip in progress: %s"
msgstr ""
-#: neutron/plugins/ibm/sdnve_neutron_plugin.py:666
+#: neutron/plugins/ibm/sdnve_neutron_plugin.py:664
#, python-format
msgid "Delete floatingip failed in SDN-VE: %s"
msgstr ""
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:138
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:136
msgid "info_update received"
msgstr ""
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:143
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:141
#, python-format
msgid "info_update received. New controlleris to be set to: %s"
msgstr ""
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:149
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:147
msgid "info_update received. New controlleris set to be out of band"
msgstr ""
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:194
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:192
#, python-format
msgid "Mapping physical network %(physical_network)s to interface %(interface)s"
msgstr ""
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:200
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:198
#, python-format
msgid ""
"Interface %(interface)s for physical network %(physical_network)s does "
"not exist. Agent terminated!"
msgstr ""
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:218
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:216
msgid "Agent in the rpc loop."
msgstr ""
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:240
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:238
#, python-format
msgid "Controller IPs: %s"
msgstr ""
-#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:262
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1529
+#: neutron/plugins/ibm/agent/sdnve_neutron_agent.py:260
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1532
#, python-format
msgid "%s Agent terminated!"
msgstr ""
-#: neutron/plugins/ibm/common/config.py:28
+#: neutron/plugins/ibm/common/config.py:26
msgid "Whether to use a fake controller."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:30
+#: neutron/plugins/ibm/common/config.py:28
msgid "Base URL for SDN-VE controller REST API."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:32
+#: neutron/plugins/ibm/common/config.py:30
msgid "List of IP addresses of SDN-VE controller(s)."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:34
+#: neutron/plugins/ibm/common/config.py:32
msgid "SDN-VE RPC subject."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:36
+#: neutron/plugins/ibm/common/config.py:34
msgid "SDN-VE controller port number."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:38
+#: neutron/plugins/ibm/common/config.py:36
msgid "SDN-VE request/response format."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:40
+#: neutron/plugins/ibm/common/config.py:38
msgid "SDN-VE administrator user ID."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:42
+#: neutron/plugins/ibm/common/config.py:40
msgid "SDN-VE administrator password."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:44
-#: neutron/plugins/nec/common/config.py:24
+#: neutron/plugins/ibm/common/config.py:42
+#: neutron/plugins/nec/common/config.py:23
#: neutron/plugins/openvswitch/common/config.py:29
#: neutron/plugins/ryu/common/config.py:22
msgid "Integration bridge to use."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:46
+#: neutron/plugins/ibm/common/config.py:44
msgid "Whether to reset the integration bridge before use."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:48
+#: neutron/plugins/ibm/common/config.py:46
msgid "Indicating if controller is out of band or not."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:51
+#: neutron/plugins/ibm/common/config.py:49
msgid "List of <physical_network_name>:<interface_name> mappings."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:54
+#: neutron/plugins/ibm/common/config.py:52
msgid "Tenant type: OVERLAY (default) or OF."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:56
+#: neutron/plugins/ibm/common/config.py:54
msgid ""
"The string in tenant description that indicates the tenant is a OVERLAY "
"tenant."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:59
+#: neutron/plugins/ibm/common/config.py:57
msgid "The string in tenant description that indicates the tenant is a OF tenant."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:65
+#: neutron/plugins/ibm/common/config.py:63
msgid "Agent polling interval if necessary."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:67
+#: neutron/plugins/ibm/common/config.py:65
msgid "Using root helper."
msgstr ""
-#: neutron/plugins/ibm/common/config.py:69
+#: neutron/plugins/ibm/common/config.py:67
msgid "Whether to use rpc."
msgstr ""
-#: neutron/plugins/ibm/common/exceptions.py:23
+#: neutron/plugins/ibm/common/exceptions.py:21
#, python-format
msgid ""
"An unexpected error occurred in the SDN-VE Plugin. Here is the error "
"message: %(msg)s"
msgstr ""
-#: neutron/plugins/ibm/common/exceptions.py:28
+#: neutron/plugins/ibm/common/exceptions.py:26
#, python-format
msgid "The input does not contain nececessary info: %(msg)s"
msgstr ""
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:123
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:147
-#: neutron/plugins/ml2/rpc.py:130 neutron/plugins/ml2/rpc.py:154
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:125
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:150
-#, python-format
-msgid "Device %(device)s not bound to the agent host %(host)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:140
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:144
-#, python-format
-msgid "Device %(device)s up on %(agent_id)s"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:261
-#: neutron/plugins/mlnx/mlnx_plugin.py:207
-#, python-format
-msgid "Invalid tenant_network_type: %s. Service terminated!"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:272
-msgid "Linux Bridge Plugin initialization complete"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:301
-#, python-format
-msgid "%s. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:346
-#: neutron/plugins/mlnx/mlnx_plugin.py:251
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:418
-msgid "provider:segmentation_id specified for flat network"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:355
-#: neutron/plugins/mlnx/mlnx_plugin.py:259
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:427
-#, python-format
-msgid "provider:segmentation_id out of range (%(min_id)s through %(max_id)s)"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:362
-#: neutron/plugins/mlnx/mlnx_plugin.py:267
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:447
-msgid "provider:physical_network specified for local network"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/lb_neutron_plugin.py:368
-#: neutron/plugins/mlnx/mlnx_plugin.py:271
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:453
-msgid "provider:segmentation_id specified for local network"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:83
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:81
msgid "VXLAN is enabled, a valid local_ip must be provided"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:97
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:95
msgid "Invalid Network ID, will lead to incorrect bridgename"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:104
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:102
msgid "Invalid VLAN ID, will lead to incorrect subinterface name"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:111
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:109
msgid "Invalid Interface ID, will lead to incorrect tap device name"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:120
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:118
#, python-format
msgid "Invalid Segmentation ID: %s, will lead to incorrect vxlan device name"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:183
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:181
#, python-format
msgid "Failed creating vxlan interface for %(segmentation_id)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:215
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:213
#, python-format
msgid ""
"Creating subinterface %(interface)s for VLAN %(vlan_id)s on interface "
"%(physical_interface)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:228
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:226
#, python-format
msgid "Done creating subinterface %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:235
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:233
#, python-format
msgid "Creating vxlan interface %(interface)s for VNI %(segmentation_id)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:250
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:248
#, python-format
msgid "Done creating vxlan interface %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:304
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:302
#, python-format
msgid "Starting bridge %(bridge_name)s for subinterface %(interface)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:319
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:317
#, python-format
msgid "Done starting bridge %(bridge_name)s for subinterface %(interface)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:341
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:339
#, python-format
msgid "Unable to add %(interface)s to %(bridge_name)s! Exception: %(e)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:354
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:352
#, python-format
msgid "Unable to add vxlan interface for network %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:361
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:359
#, python-format
msgid "No mapping for physical network %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:370
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:368
#, python-format
msgid "Unknown network_type %(network_type)s for network %(network_id)s."
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:382
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:380
#, python-format
msgid "Tap device: %s does not exist on this host, skipped"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:400
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:398
#, python-format
msgid "Adding device %(tap_device_name)s to bridge %(bridge_name)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:409
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:407
#, python-format
msgid "%(tap_device_name)s already exists on bridge %(bridge_name)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:447
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:445
#, python-format
msgid "Deleting bridge %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:454
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:452
#, python-format
msgid "Done deleting bridge %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:457
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:455
#, python-format
msgid "Cannot delete bridge %s, does not exist"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:471
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:469
#, python-format
msgid "Removing device %(interface_name)s from bridge %(bridge_name)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:478
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:476
#, python-format
msgid "Done removing device %(interface_name)s from bridge %(bridge_name)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:484
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:482
#, python-format
msgid ""
"Cannot remove device %(interface_name)s bridge %(bridge_name)s does not "
"exist"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:492
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:490
#, python-format
msgid "Deleting subinterface %s for vlan"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:499
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:497
#, python-format
msgid "Done deleting subinterface %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:503
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:501
#, python-format
msgid "Deleting vxlan interface %s for vlan"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:508
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:506
#, python-format
msgid "Done deleting vxlan interface %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:522
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:556
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:520
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:554
#, python-format
msgid ""
"Option \"%(option)s\" must be supported by command \"%(command)s\" to "
"enable %(mode)s mode"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:533
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:531
msgid "No valid Segmentation ID to perform UCAST test."
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:550
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:548
msgid ""
"VXLAN muticast group must be provided in vxlan_group option to enable "
"VXLAN MCAST mode"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:575
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:573
msgid ""
"Linux kernel vxlan module and iproute2 3.8 or above are required to "
"enable VXLAN."
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:585
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:583
#, python-format
msgid "Using %s VXLAN mode"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:662
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:660
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:163
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:297
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:300
msgid "network_delete received"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:676
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:674
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:66
#, python-format
msgid "port_update RPC received for port: %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:679
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:677
msgid "fdb_add received"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:701
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:699
msgid "fdb_remove received"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:723
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:721
msgid "update chg_ip received"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:748
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:746
msgid "fdb_update received"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:805
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:803
msgid "Unable to obtain MAC address for unique ID. Agent terminated!"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:809
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:807
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:220
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:144
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:109
+#: neutron/plugins/nec/agent/nec_neutron_agent.py:142
+#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:107
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:100
#, python-format
msgid "RPC agent_id: %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:880
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1100
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:878
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1103
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:213
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:913
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:934
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:911
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:932
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:354
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1126
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1187
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1129
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1190
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:240
#, python-format
msgid "Device %s not defined on plugin"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:920
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1155
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1172
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:918
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1158
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1175
#, python-format
msgid "Attachment %s removed"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:928
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1162
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1179
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:926
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1165
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1182
#, python-format
msgid "port_removed failed for %(device)s: %(e)s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:932
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:930
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:352
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1184
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1187
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:238
#, python-format
msgid "Port %s updated."
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:985
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:983
msgid "LinuxBridge Agent RPC Daemon Started!"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:999
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:997
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:267
#, python-format
msgid "Agent loop found changes! %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1003
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1001
#: neutron/plugins/sriovnicagent/sriov_nic_agent.py:273
#, python-format
msgid "Error in agent loop. Devices info: %s"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1026
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1024
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:407
#, python-format
msgid "Parsing physical_interface_mappings failed: %s. Agent terminated!"
msgstr ""
-#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1029
+#: neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py:1027
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:410
#, python-format
msgid "Interface mappings: %s"
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:29
+#: neutron/plugins/linuxbridge/common/config.py:26
#: neutron/plugins/mlnx/common/config.py:26
msgid "Network type for tenant networks (local, vlan, or none)"
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:39
+#: neutron/plugins/linuxbridge/common/config.py:36
msgid ""
"Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 "
"plugin using linuxbridge mechanism driver"
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:43
+#: neutron/plugins/linuxbridge/common/config.py:40
msgid "TTL for vxlan interface protocol packets."
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:45
+#: neutron/plugins/linuxbridge/common/config.py:42
msgid "TOS for vxlan interface protocol packets."
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:47
+#: neutron/plugins/linuxbridge/common/config.py:44
msgid "Multicast group for vxlan interface."
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:49
+#: neutron/plugins/linuxbridge/common/config.py:46
msgid "Local IP address of the VXLAN endpoints."
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:51
+#: neutron/plugins/linuxbridge/common/config.py:48
msgid ""
"Extension to use alongside ml2 plugin's l2population mechanism driver. It"
" enables the plugin to populate VXLAN forwarding table."
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:59
+#: neutron/plugins/linuxbridge/common/config.py:56
#: neutron/plugins/mlnx/common/config.py:45
#: neutron/plugins/ofagent/common/config.py:29
msgid "List of <physical_network>:<physical_interface>"
msgstr ""
-#: neutron/plugins/linuxbridge/common/config.py:67
+#: neutron/plugins/linuxbridge/common/config.py:64
#: neutron/plugins/mlnx/common/config.py:70
msgid "Enable server RPC compatibility with old agents"
msgstr ""
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:142
-#: neutron/plugins/openvswitch/ovs_db_v2.py:161
-#, python-format
-msgid ""
-"Reserving specific vlan %(vlan_id)s on physical network "
-"%(physical_network)s outside pool"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:166
-#: neutron/plugins/openvswitch/ovs_db_v2.py:191
-#, python-format
-msgid ""
-"Releasing vlan %(vlan_id)s on physical network %(physical_network)s to "
-"pool"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:171
-#: neutron/plugins/openvswitch/ovs_db_v2.py:186
-#, python-format
-msgid ""
-"Releasing vlan %(vlan_id)s on physical network %(physical_network)s "
-"outside pool"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:202
-#: neutron/plugins/mlnx/db/mlnx_db_v2.py:212
-msgid "get_port_from_device() called"
-msgstr ""
-
-#: neutron/plugins/linuxbridge/db/l2network_db_v2.py:230
-#, python-format
-msgid "set_port_status as %s called"
-msgstr ""
-
#: neutron/plugins/metaplugin/meta_neutron_plugin.py:59
#, python-format
msgid "Flavor %(flavor)s could not be found"
@@ -8198,38 +7955,38 @@ msgstr ""
msgid "Specifies flavor for plugin to handle 'q-plugin' RPC requests."
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:44
+#: neutron/plugins/midonet/midonet_lib.py:39
#, python-format
msgid "MidoNet %(resource_type)s %(id)s could not be found"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:48
-#: neutron/plugins/midonet/plugin.py:86
+#: neutron/plugins/midonet/midonet_lib.py:43
+#: neutron/plugins/midonet/plugin.py:80
#, python-format
msgid "MidoNet API error: %(msg)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:82
+#: neutron/plugins/midonet/midonet_lib.py:77
#, python-format
msgid "MidoClient.create_bridge called: kwargs=%(kwargs)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:92
+#: neutron/plugins/midonet/midonet_lib.py:87
#, python-format
msgid "MidoClient.delete_bridge called: id=%(id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:102
+#: neutron/plugins/midonet/midonet_lib.py:97
#, python-format
msgid "MidoClient.get_bridge called: id=%s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:116
+#: neutron/plugins/midonet/midonet_lib.py:111
#, python-format
msgid "MidoClient.update_bridge called: id=%(id)s, kwargs=%(kwargs)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:136
+#: neutron/plugins/midonet/midonet_lib.py:131
#, python-format
msgid ""
"MidoClient.create_dhcp called: bridge=%(bridge)s, cidr=%(cidr)s, "
@@ -8237,142 +7994,142 @@ msgid ""
"dns_servers=%(dns_servers)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:154
+#: neutron/plugins/midonet/midonet_lib.py:149
#, python-format
msgid ""
"MidoClient.add_dhcp_host called: bridge=%(bridge)s, cidr=%(cidr)s, "
"ip=%(ip)s, mac=%(mac)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:159
+#: neutron/plugins/midonet/midonet_lib.py:154
msgid "Tried to add tonon-existent DHCP"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:173
+#: neutron/plugins/midonet/midonet_lib.py:168
#, python-format
msgid ""
"MidoClient.remove_dhcp_host called: bridge=%(bridge)s, cidr=%(cidr)s, "
"ip=%(ip)s, mac=%(mac)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:178
+#: neutron/plugins/midonet/midonet_lib.py:173
msgid "Tried to delete mapping from non-existent subnet"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:183
+#: neutron/plugins/midonet/midonet_lib.py:178
#, python-format
msgid "MidoClient.remove_dhcp_host: Deleting %(dh)r"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:196
+#: neutron/plugins/midonet/midonet_lib.py:191
#, python-format
msgid ""
"MidoClient.delete_dhcp_host called: bridge_id=%(bridge_id)s, "
"cidr=%(cidr)s, ip=%(ip)s, mac=%(mac)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:211
+#: neutron/plugins/midonet/midonet_lib.py:206
#, python-format
msgid "MidoClient.delete_dhcp called: bridge=%(bridge)s, cidr=%(cidr)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:218
+#: neutron/plugins/midonet/midonet_lib.py:213
msgid "Tried to delete non-existent DHCP"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:230
+#: neutron/plugins/midonet/midonet_lib.py:226
#, python-format
msgid "MidoClient.delete_port called: id=%(id)s, delete_chains=%(delete_chains)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:245
+#: neutron/plugins/midonet/midonet_lib.py:241
#, python-format
msgid "MidoClient.get_port called: id=%(id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:259
+#: neutron/plugins/midonet/midonet_lib.py:255
#, python-format
msgid "MidoClient.add_bridge_port called: bridge=%(bridge)s, kwargs=%(kwargs)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:271
+#: neutron/plugins/midonet/midonet_lib.py:267
#, python-format
msgid "MidoClient.update_port called: id=%(id)s, kwargs=%(kwargs)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:296
+#: neutron/plugins/midonet/midonet_lib.py:292
#, python-format
msgid "MidoClient.create_router called: kwargs=%(kwargs)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:306
+#: neutron/plugins/midonet/midonet_lib.py:302
#, python-format
msgid "MidoClient.delete_router called: id=%(id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:316
+#: neutron/plugins/midonet/midonet_lib.py:312
#, python-format
msgid "MidoClient.get_router called: id=%(id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:330
+#: neutron/plugins/midonet/midonet_lib.py:326
#, python-format
msgid "MidoClient.update_router called: id=%(id)s, kwargs=%(kwargs)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:351
+#: neutron/plugins/midonet/midonet_lib.py:347
#, python-format
msgid ""
"MidoClient.add_dhcp_route_option called: bridge=%(bridge)s, "
"cidr=%(cidr)s, gw_ip=%(gw_ip)sdst_ip=%(dst_ip)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:359
+#: neutron/plugins/midonet/midonet_lib.py:355
msgid "Tried to access non-existent DHCP"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:391
+#: neutron/plugins/midonet/midonet_lib.py:387
#, python-format
msgid "MidoClient.unlink called: port=%(port)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:396
+#: neutron/plugins/midonet/midonet_lib.py:392
#, python-format
msgid "Attempted to unlink a port that was not linked. %s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:402
+#: neutron/plugins/midonet/midonet_lib.py:398
#, python-format
msgid ""
"MidoClient.remove_rules_by_property called: tenant_id=%(tenant_id)s, "
"chain_name=%(chain_name)skey=%(key)s, value=%(value)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:429
+#: neutron/plugins/midonet/midonet_lib.py:425
#, python-format
msgid ""
"MidoClient.create_router_chains called: router=%(router)s, "
"inbound_chain_name=%(in_chain)s, outbound_chain_name=%(out_chain)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:452
+#: neutron/plugins/midonet/midonet_lib.py:448
#, python-format
msgid "MidoClient.delete_router_chains called: id=%(id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:467
+#: neutron/plugins/midonet/midonet_lib.py:463
#, python-format
msgid "MidoClient.delete_port_chains called: id=%(id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:479
+#: neutron/plugins/midonet/midonet_lib.py:475
#, python-format
msgid ""
"MidoClient.get_link_port called: router=%(router)s, "
"peer_router_id=%(peer_router_id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:518
+#: neutron/plugins/midonet/midonet_lib.py:514
#, python-format
msgid ""
"MidoClient.add_static_nat called: tenant_id=%(tenant_id)s, "
@@ -8380,17 +8137,17 @@ msgid ""
"port_id=%(port_id)s, nat_type=%(nat_type)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:526
+#: neutron/plugins/midonet/midonet_lib.py:522
#, python-format
msgid "Invalid NAT type passed in %s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:578
+#: neutron/plugins/midonet/midonet_lib.py:574
#, python-format
msgid "MidoClient.remote_static_route called: router=%(router)s, ip=%(ip)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:589
+#: neutron/plugins/midonet/midonet_lib.py:585
#, python-format
msgid ""
"MidoClient.update_port_chains called: "
@@ -8398,82 +8155,82 @@ msgid ""
"outbound_chain_id=%(outbound_chain_id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:600
+#: neutron/plugins/midonet/midonet_lib.py:596
#, python-format
msgid "MidoClient.create_chain called: tenant_id=%(tenant_id)s name=%(name)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:608
+#: neutron/plugins/midonet/midonet_lib.py:604
#, python-format
msgid "MidoClient.delete_chain called: id=%(id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:614
+#: neutron/plugins/midonet/midonet_lib.py:610
#, python-format
msgid ""
"MidoClient.delete_chains_by_names called: tenant_id=%(tenant_id)s "
"names=%(names)s "
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:625
+#: neutron/plugins/midonet/midonet_lib.py:621
#, python-format
msgid ""
"MidoClient.get_chain_by_name called: tenant_id=%(tenant_id)s "
"name=%(name)s "
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:636
+#: neutron/plugins/midonet/midonet_lib.py:632
#, python-format
msgid ""
"MidoClient.get_port_group_by_name called: tenant_id=%(tenant_id)s "
"name=%(name)s "
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:650
+#: neutron/plugins/midonet/midonet_lib.py:646
#, python-format
msgid "MidoClient.create_port_group called: tenant_id=%(tenant_id)s name=%(name)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:659
+#: neutron/plugins/midonet/midonet_lib.py:655
#, python-format
msgid ""
"MidoClient.delete_port_group_by_name called: tenant_id=%(tenant_id)s "
"name=%(name)s "
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:665
+#: neutron/plugins/midonet/midonet_lib.py:661
#, python-format
msgid "Deleting pg %(id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:671
+#: neutron/plugins/midonet/midonet_lib.py:667
#, python-format
msgid ""
"MidoClient.add_port_to_port_group_by_name called: tenant_id=%(tenant_id)s"
" name=%(name)s port_id=%(port_id)s"
msgstr ""
-#: neutron/plugins/midonet/midonet_lib.py:685
+#: neutron/plugins/midonet/midonet_lib.py:681
#, python-format
msgid "MidoClient.remove_port_from_port_groups called: port_id=%(port_id)s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:100
+#: neutron/plugins/midonet/plugin.py:94
#, python-format
msgid "Invalid nat_type %s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:157
+#: neutron/plugins/midonet/plugin.py:151
#, python-format
msgid "Unrecognized direction %s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:191
+#: neutron/plugins/midonet/plugin.py:185
#, python-format
msgid "There is no %(name)s with ID %(id)s in MidoNet."
msgstr ""
-#: neutron/plugins/midonet/plugin.py:198
+#: neutron/plugins/midonet/plugin.py:192
#: neutron/plugins/ml2/drivers/arista/exceptions.py:23
#: neutron/plugins/ml2/drivers/arista/exceptions.py:27
#: neutron/plugins/ml2/drivers/arista/exceptions.py:31
@@ -8482,214 +8239,214 @@ msgstr ""
msgid "%(msg)s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:235
+#: neutron/plugins/midonet/plugin.py:229
msgid "provider_router_id should be configured in the plugin config file"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:405
+#: neutron/plugins/midonet/plugin.py:399
#, python-format
msgid "MidonetPluginV2.create_subnet called: subnet=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:437
+#: neutron/plugins/midonet/plugin.py:431
#, python-format
msgid "MidonetPluginV2.create_subnet exiting: sn_entry=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:446
+#: neutron/plugins/midonet/plugin.py:440
#, python-format
msgid "MidonetPluginV2.delete_subnet called: id=%s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:465
+#: neutron/plugins/midonet/plugin.py:459
msgid "MidonetPluginV2.delete_subnet exiting"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:522
+#: neutron/plugins/midonet/plugin.py:516
#, python-format
msgid "MidonetPluginV2.create_port called: port=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:583
+#: neutron/plugins/midonet/plugin.py:577
#, python-format
msgid "Failed to create a port on network %(net_id)s: %(err)s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:588
+#: neutron/plugins/midonet/plugin.py:582
#, python-format
msgid "MidonetPluginV2.create_port exiting: port=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:593
+#: neutron/plugins/midonet/plugin.py:587
#, python-format
msgid "MidonetPluginV2.get_port called: id=%(id)s fields=%(fields)r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:600
+#: neutron/plugins/midonet/plugin.py:594
#, python-format
msgid "There is no port with ID %(id)s in MidoNet."
msgstr ""
-#: neutron/plugins/midonet/plugin.py:604
+#: neutron/plugins/midonet/plugin.py:598
#, python-format
msgid "MidonetPluginV2.get_port exiting: port=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:609
+#: neutron/plugins/midonet/plugin.py:603
#, python-format
msgid "MidonetPluginV2.get_ports called: filters=%(filters)s fields=%(fields)r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:618
+#: neutron/plugins/midonet/plugin.py:612
#, python-format
msgid ""
"MidonetPluginV2.delete_port called: id=%(id)s "
"l3_port_check=%(l3_port_check)r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:652
+#: neutron/plugins/midonet/plugin.py:646
#, python-format
msgid "Failed to delete DHCP mapping for port %(id)s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:727
+#: neutron/plugins/midonet/plugin.py:721
#, python-format
msgid "MidonetPluginV2.create_router called: router=%(router)s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:774
+#: neutron/plugins/midonet/plugin.py:768
#, python-format
msgid "MidonetPluginV2.create_router exiting: router_data=%(router_data)s."
msgstr ""
-#: neutron/plugins/midonet/plugin.py:786
+#: neutron/plugins/midonet/plugin.py:780
#, python-format
msgid ""
"MidonetPluginV2.set_router_gateway called: id=%(id)s, "
"gw_router=%(gw_router)s, gw_ip=%(gw_ip)s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:830
+#: neutron/plugins/midonet/plugin.py:824
#, python-format
msgid "MidonetPluginV2.remove_router_gateway called: id=%(id)s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:850
+#: neutron/plugins/midonet/plugin.py:844
#, python-format
msgid "MidonetPluginV2.update_router called: id=%(id)s router=%(router)r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:890
+#: neutron/plugins/midonet/plugin.py:884
#, python-format
msgid "MidonetPluginV2.update_router exiting: router=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:901
+#: neutron/plugins/midonet/plugin.py:895
#, python-format
msgid "MidonetPluginV2.delete_router called: id=%s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1001
+#: neutron/plugins/midonet/plugin.py:995
#, python-format
msgid ""
"MidonetPluginV2.add_router_interface called: router_id=%(router_id)s "
"interface_info=%(interface_info)r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1025
+#: neutron/plugins/midonet/plugin.py:1019
msgid ""
"DHCP agent is not working correctly. No port to reach the Metadata server"
" on this network"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1034
+#: neutron/plugins/midonet/plugin.py:1028
#, python-format
msgid ""
"Failed to create MidoNet resources to add router interface. "
"info=%(info)s, router_id=%(router_id)s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1041
+#: neutron/plugins/midonet/plugin.py:1035
#, python-format
msgid "MidonetPluginV2.add_router_interface exiting: info=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1081
+#: neutron/plugins/midonet/plugin.py:1075
#, python-format
msgid ""
"MidonetPluginV2.update_floatingip called: id=%(id)s "
"floatingip=%(floatingip)s "
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1100
+#: neutron/plugins/midonet/plugin.py:1094
#, python-format
msgid "MidonetPluginV2.update_floating_ip exiting: fip=%s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1122
+#: neutron/plugins/midonet/plugin.py:1116
#, python-format
msgid ""
"MidonetPluginV2.create_security_group called: "
"security_group=%(security_group)s default_sg=%(default_sg)s "
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1151
+#: neutron/plugins/midonet/plugin.py:1145
#, python-format
msgid "Failed to create MidoNet resources for sg %(sg)r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1158
+#: neutron/plugins/midonet/plugin.py:1152
#, python-format
msgid "MidonetPluginV2.create_security_group exiting: sg=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1164
+#: neutron/plugins/midonet/plugin.py:1158
#, python-format
msgid "MidonetPluginV2.delete_security_group called: id=%s"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1196
+#: neutron/plugins/midonet/plugin.py:1190
#, python-format
msgid ""
"MidonetPluginV2.create_security_group_rule called: "
"security_group_rule=%(security_group_rule)r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1206
+#: neutron/plugins/midonet/plugin.py:1200
#, python-format
msgid "MidonetPluginV2.create_security_group_rule exiting: rule=%r"
msgstr ""
-#: neutron/plugins/midonet/plugin.py:1216
+#: neutron/plugins/midonet/plugin.py:1210
#, python-format
msgid "MidonetPluginV2.delete_security_group_rule called: sg_rule_id=%s"
msgstr ""
-#: neutron/plugins/midonet/common/config.py:23
+#: neutron/plugins/midonet/common/config.py:21
msgid "MidoNet API server URI."
msgstr ""
-#: neutron/plugins/midonet/common/config.py:25
+#: neutron/plugins/midonet/common/config.py:23
msgid "MidoNet admin username."
msgstr ""
-#: neutron/plugins/midonet/common/config.py:28
+#: neutron/plugins/midonet/common/config.py:26
msgid "MidoNet admin password."
msgstr ""
-#: neutron/plugins/midonet/common/config.py:31
+#: neutron/plugins/midonet/common/config.py:29
msgid "ID of the project that MidoNet admin userbelongs to."
msgstr ""
-#: neutron/plugins/midonet/common/config.py:34
+#: neutron/plugins/midonet/common/config.py:32
msgid "Virtual provider router ID."
msgstr ""
-#: neutron/plugins/midonet/common/config.py:37
+#: neutron/plugins/midonet/common/config.py:35
msgid "Operational mode. Internal dev use only."
msgstr ""
-#: neutron/plugins/midonet/common/config.py:40
+#: neutron/plugins/midonet/common/config.py:38
msgid "Path to midonet host uuid file"
msgstr ""
@@ -8715,23 +8472,23 @@ msgid ""
"neutron.ml2.extension_drivers namespace."
msgstr ""
-#: neutron/plugins/ml2/db.py:54
+#: neutron/plugins/ml2/db.py:56
#, python-format
msgid "Added segment %(id)s of type %(network_type)s for network %(network_id)s"
msgstr ""
-#: neutron/plugins/ml2/db.py:197 neutron/plugins/ml2/db.py:249
-#: neutron/plugins/ml2/plugin.py:1025
+#: neutron/plugins/ml2/db.py:200 neutron/plugins/ml2/db.py:252
+#: neutron/plugins/ml2/plugin.py:1058
#, python-format
msgid "Multiple ports have port_id starting with %s"
msgstr ""
-#: neutron/plugins/ml2/db.py:203
+#: neutron/plugins/ml2/db.py:206
#, python-format
msgid "get_port_from_device_mac() called for mac %s"
msgstr ""
-#: neutron/plugins/ml2/db.py:245
+#: neutron/plugins/ml2/db.py:248
#, python-format
msgid "No binding found for port %(port_id)s"
msgstr ""
@@ -8782,254 +8539,254 @@ msgstr ""
msgid "Initializing driver for type '%s'"
msgstr ""
-#: neutron/plugins/ml2/managers.py:169 neutron/plugins/ml2/managers.py:178
+#: neutron/plugins/ml2/managers.py:170 neutron/plugins/ml2/managers.py:179
#: neutron/plugins/ml2/drivers/type_tunnel.py:179
#, python-format
msgid "network_type value '%s' not supported"
msgstr ""
-#: neutron/plugins/ml2/managers.py:204 neutron/plugins/ml2/managers.py:231
+#: neutron/plugins/ml2/managers.py:205 neutron/plugins/ml2/managers.py:232
#, python-format
msgid "Failed to release segment '%s' because network type is not supported."
msgstr ""
-#: neutron/plugins/ml2/managers.py:247
+#: neutron/plugins/ml2/managers.py:248
#, python-format
msgid "Configured mechanism driver names: %s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:253
+#: neutron/plugins/ml2/managers.py:254
#, python-format
msgid "Loaded mechanism driver names: %s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:265
+#: neutron/plugins/ml2/managers.py:266
#, python-format
msgid "Registered mechanism drivers: %s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:272
+#: neutron/plugins/ml2/managers.py:273
#, python-format
msgid "Initializing mechanism driver '%s'"
msgstr ""
-#: neutron/plugins/ml2/managers.py:294
+#: neutron/plugins/ml2/managers.py:295
#, python-format
msgid "Mechanism driver '%(name)s' failed in %(method)s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:596
+#: neutron/plugins/ml2/managers.py:597
#, python-format
msgid "Mechanism driver %s failed in bind_port"
msgstr ""
-#: neutron/plugins/ml2/managers.py:600
+#: neutron/plugins/ml2/managers.py:601
#, python-format
msgid "Failed to bind port %(port)s on host %(host)s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:613
+#: neutron/plugins/ml2/managers.py:614
#, python-format
msgid "Configured extension driver names: %s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:619
+#: neutron/plugins/ml2/managers.py:620
#, python-format
msgid "Loaded extension driver names: %s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:630
+#: neutron/plugins/ml2/managers.py:631
#, python-format
msgid "Registered extension drivers: %s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:636
+#: neutron/plugins/ml2/managers.py:637
#, python-format
msgid "Initializing extension driver '%s'"
msgstr ""
-#: neutron/plugins/ml2/managers.py:644
+#: neutron/plugins/ml2/managers.py:645
#, python-format
msgid "Got %(alias)s extension from driver '%(drv)s'"
msgstr ""
-#: neutron/plugins/ml2/managers.py:655
+#: neutron/plugins/ml2/managers.py:656
#, python-format
msgid "Extension driver '%(name)s' failed in %(method)s"
msgstr ""
-#: neutron/plugins/ml2/managers.py:691
+#: neutron/plugins/ml2/managers.py:692
#, python-format
msgid "Extended network dict for driver '%(drv)s'"
msgstr ""
-#: neutron/plugins/ml2/managers.py:698
+#: neutron/plugins/ml2/managers.py:699
#, python-format
msgid "Extended subnet dict for driver '%(drv)s'"
msgstr ""
-#: neutron/plugins/ml2/managers.py:705
+#: neutron/plugins/ml2/managers.py:706
#, python-format
msgid "Extended port dict for driver '%(drv)s'"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:138
+#: neutron/plugins/ml2/plugin.py:136
msgid "Modular L2 Plugin initialization complete"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:197
+#: neutron/plugins/ml2/plugin.py:206
msgid "binding:profile value too large"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:253
+#: neutron/plugins/ml2/plugin.py:262
#, python-format
msgid "Failed to commit binding results for %(port)s after %(max)s tries"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:259
+#: neutron/plugins/ml2/plugin.py:268
#, python-format
msgid "Attempt %(count)s to bind port %(port)s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:385
+#: neutron/plugins/ml2/plugin.py:394
#, python-format
msgid "Serialized vif_details DB value '%(value)s' for port %(port)s is invalid"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:396
+#: neutron/plugins/ml2/plugin.py:405
#, python-format
msgid "Serialized profile DB value '%(value)s' for port %(port)s is invalid"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:465
+#: neutron/plugins/ml2/plugin.py:474
#, python-format
msgid ""
"In _notify_port_updated(), no bound segment for port %(port_id)s on "
"network %(network_id)s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:499
+#: neutron/plugins/ml2/plugin.py:508
#, python-format
msgid "mechanism_manager.create_network_postcommit failed, deleting network '%s'"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:562
+#: neutron/plugins/ml2/plugin.py:571
#, python-format
msgid "Deleting network %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:583
+#: neutron/plugins/ml2/plugin.py:598
#, python-format
msgid "Ports to auto-delete: %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:589 neutron/plugins/ml2/plugin.py:717
+#: neutron/plugins/ml2/plugin.py:604 neutron/plugins/ml2/plugin.py:732
msgid "Tenant-owned ports exist"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:597
+#: neutron/plugins/ml2/plugin.py:612
#, python-format
msgid "Subnets to auto-delete: %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:609
+#: neutron/plugins/ml2/plugin.py:624
#, python-format
msgid "Deleting network record %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:614 neutron/plugins/ml2/plugin.py:729
+#: neutron/plugins/ml2/plugin.py:629 neutron/plugins/ml2/plugin.py:744
msgid "Committing transaction"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:620
+#: neutron/plugins/ml2/plugin.py:635
msgid "A concurrent port creation has occurred"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:629
+#: neutron/plugins/ml2/plugin.py:644
#, python-format
msgid "Exception auto-deleting port %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:637
+#: neutron/plugins/ml2/plugin.py:652
#, python-format
msgid "Exception auto-deleting subnet %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:646
+#: neutron/plugins/ml2/plugin.py:661
msgid "mechanism_manager.delete_network_postcommit failed"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:662
+#: neutron/plugins/ml2/plugin.py:677
#, python-format
msgid "mechanism_manager.create_subnet_postcommit failed, deleting subnet '%s'"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:694
+#: neutron/plugins/ml2/plugin.py:709
#, python-format
msgid "Deleting subnet %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:711
+#: neutron/plugins/ml2/plugin.py:726
#, python-format
msgid "Ports to auto-deallocate: %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:726
+#: neutron/plugins/ml2/plugin.py:741
msgid "Deleting subnet record"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:745
+#: neutron/plugins/ml2/plugin.py:760
#, python-format
msgid "Exception deleting fixed_ip from port %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:755
+#: neutron/plugins/ml2/plugin.py:770
msgid "mechanism_manager.delete_subnet_postcommit failed"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:787
+#: neutron/plugins/ml2/plugin.py:806
#, python-format
msgid "mechanism_manager.create_port_postcommit failed, deleting port '%s'"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:799
+#: neutron/plugins/ml2/plugin.py:818
#, python-format
msgid "_bind_port_if_needed failed, deleting port '%s'"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:881
+#: neutron/plugins/ml2/plugin.py:904
#, python-format
msgid "No Host supplied to bind DVR Port %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:941
-#: neutron/tests/unit/ml2/test_ml2_plugin.py:144
+#: neutron/plugins/ml2/plugin.py:968
+#: neutron/tests/unit/ml2/test_ml2_plugin.py:148
#, python-format
msgid "Deleting port %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:961
-#: neutron/tests/unit/ml2/test_ml2_plugin.py:145
+#: neutron/plugins/ml2/plugin.py:988
+#: neutron/tests/unit/ml2/test_ml2_plugin.py:149
#, python-format
msgid "The port '%s' was deleted"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:1010
+#: neutron/plugins/ml2/plugin.py:1043
#, python-format
msgid "mechanism_manager.delete_port_postcommit failed for port %s"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:1034
+#: neutron/plugins/ml2/plugin.py:1067
#, python-format
msgid "Binding info for DVR port %s not found"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:1060
+#: neutron/plugins/ml2/plugin.py:1093
#, python-format
msgid "Port %(port)s updated up by agent not found"
msgstr ""
-#: neutron/plugins/ml2/plugin.py:1090
+#: neutron/plugins/ml2/plugin.py:1123
#, python-format
msgid "Port %s not found during update"
msgstr ""
@@ -9056,6 +8813,11 @@ msgstr ""
msgid "Device %(device)s no longer exists at agent %(agent_id)s"
msgstr ""
+#: neutron/plugins/ml2/rpc.py:130 neutron/plugins/ml2/rpc.py:154
+#, python-format
+msgid "Device %(device)s not bound to the agent host %(host)s"
+msgstr ""
+
#: neutron/plugins/ml2/rpc.py:148
#, python-format
msgid "Device %(device)s up at agent %(agent_id)s"
@@ -9074,7 +8836,6 @@ msgid ""
msgstr ""
#: neutron/plugins/ml2/drivers/mech_agent.py:54
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:327
#, python-format
msgid "Attempting to bind port %(port)s on network %(network)s"
msgstr ""
@@ -9090,7 +8851,6 @@ msgid "Checking agent: %s"
msgstr ""
#: neutron/plugins/ml2/drivers/mech_agent.py:70
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:337
#, python-format
msgid "Bound using segment: %s"
msgstr ""
@@ -9114,105 +8874,33 @@ msgid ""
"tunnel_types: %(tunnel_types)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:35
-msgid "CRD service Username"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:38
-msgid "CRD Service Password"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:40
-msgid "CRD Tenant Name"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:43
-msgid "CRD Auth URL"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:46
-msgid "URL for connecting to CRD service"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:49
-msgid "Timeout value for connecting to CRD service in seconds"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:53
-msgid "Region name for connecting to CRD Service in admin context"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:57
-msgid "If set, ignore any SSL validation issues"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:60
-msgid "Auth strategy for connecting to neutron in admin context"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:63
-msgid "Location of ca certificates file to use for CRD client requests."
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_fslsdn.py:87
-msgid "Initializing CRD client... "
-msgstr ""
-
#: neutron/plugins/ml2/drivers/mechanism_ncs.py:29
msgid "HTTP URL of Tail-f NCS REST interface."
msgstr ""
#: neutron/plugins/ml2/drivers/mechanism_ncs.py:31
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:46
+#: neutron/plugins/ml2/drivers/mechanism_odl.py:41
msgid "HTTP username for authentication"
msgstr ""
#: neutron/plugins/ml2/drivers/mechanism_ncs.py:33
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:48
+#: neutron/plugins/ml2/drivers/mechanism_odl.py:43
msgid "HTTP password for authentication"
msgstr ""
#: neutron/plugins/ml2/drivers/mechanism_ncs.py:35
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:50
+#: neutron/plugins/ml2/drivers/mechanism_odl.py:45
msgid "HTTP timeout in seconds."
msgstr ""
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:44
+#: neutron/plugins/ml2/drivers/mechanism_odl.py:39
msgid "HTTP URL of OpenDaylight REST interface."
msgstr ""
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:52
+#: neutron/plugins/ml2/drivers/mechanism_odl.py:47
msgid "Tomcat session timeout in minutes."
msgstr ""
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:102
-#, python-format
-msgid "Failed to authenticate with OpenDaylight: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:105
-#, python-format
-msgid "Authentication Timed Out: %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:315
-#, python-format
-msgid "ODL-----> sending URL (%s) <-----ODL"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:316
-#, python-format
-msgid "ODL-----> sending JSON (%s) <-----ODL"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/mechanism_odl.py:340
-#: neutron/plugins/ml2/drivers/mech_nuage/driver.py:94
-#, python-format
-msgid ""
-"Refusing to bind port for segment ID %(id)s, segment %(seg)s, phys net "
-"%(physnet)s, and network type %(nettype)s"
-msgstr ""
-
#: neutron/plugins/ml2/drivers/type_flat.py:31
msgid ""
"List of physical_network names with which flat networks can be created. "
@@ -9260,13 +8948,17 @@ msgstr ""
msgid "No flat network found on physical network %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/type_gre.py:34
+#: neutron/plugins/ml2/drivers/type_gre.py:35
msgid ""
"Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges of "
"GRE tunnel IDs that are available for tenant network allocation"
msgstr ""
-#: neutron/plugins/ml2/drivers/type_gre.py:126
+#: neutron/plugins/ml2/drivers/type_gre.py:75
+msgid "Failed to parse tunnel_id_ranges. Service terminated!"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/type_gre.py:132
#, python-format
msgid "Gre endpoint with ip %s already exists"
msgstr ""
@@ -9280,18 +8972,7 @@ msgstr ""
msgid "%s prohibited for local provider network"
msgstr ""
-#: neutron/plugins/ml2/drivers/type_tunnel.py:76
-#, python-format
-msgid "Invalid tunnel ID range: '%(range)s' - %(e)s. Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:79
-#, python-format
-msgid "%(type)s ID ranges: %(range)s"
-msgstr ""
-
#: neutron/plugins/ml2/drivers/type_tunnel.py:88
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:437
#, python-format
msgid "provider:physical_network specified for %s network"
msgstr ""
@@ -9355,53 +9036,69 @@ msgstr ""
msgid "Multicast group for VXLAN. If unset, disables VXLAN multicast mode."
msgstr ""
-#: neutron/plugins/ml2/drivers/type_vxlan.py:127
+#: neutron/plugins/ml2/drivers/type_vxlan.py:82
+msgid "Failed to parse vni_ranges. Service terminated!"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/type_vxlan.py:132
msgid "get_vxlan_endpoints() called"
msgstr ""
-#: neutron/plugins/ml2/drivers/type_vxlan.py:137
+#: neutron/plugins/ml2/drivers/type_vxlan.py:142
#, python-format
msgid "add_vxlan_endpoint() called for ip %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/type_vxlan.py:146
+#: neutron/plugins/ml2/drivers/type_vxlan.py:151
#, python-format
msgid "Vxlan endpoint with ip %s already exists"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:32
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:29
#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:32
msgid "Unable to reach EOS"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:132
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:131
msgid "Required option primary_l3_host is not set"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:138
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:137
msgid "VRFs are not supported MLAG config mode"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:142
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:141
msgid "Required option secondary_l3_host is not set"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:146
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:145
msgid "Required option primary_l3_host_username is not set"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:327
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:435
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:261
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:280
+#, python-format
+msgid "Failed to create router %s on EOS"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:322
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:354
+#, python-format
+msgid "Failed to add interface to router %s on EOS"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:372
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:453
#, python-format
msgid "Executing command on Arista EOS: %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:333
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:378
#, python-format
msgid "Results of execution on Arista EOS: %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:336
+#: neutron/plugins/ml2/drivers/arista/arista_l3_driver.py:381
#, python-format
msgid "Error occured while trying to execute commands %(cmd)s on EOS %(host)s"
msgstr ""
@@ -9495,380 +9192,384 @@ msgid ""
"field. If not set, a value of 180 seconds is assumed"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:75
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:76
#, python-format
msgid "'timestamp' command '%s' is not available on EOS"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:317
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:330
#, python-format
msgid "VM id %(vmid)s not found for port %(portid)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:336
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:349
#, python-format
msgid "Unknown device owner: %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:450
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:468
#, python-format
msgid "Error %(err)s while trying to execute commands %(cmd)s on EOS %(host)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:522
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:540
msgid "Required option eapi_host is not set"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:526
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:544
msgid "Required option eapi_username is not set"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:546
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:565
+msgid "Sync start trigger sent to EOS"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:582
msgid "Syncing Neutron <-> EOS"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:552
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:588
msgid "OpenStack and EOS are in sync!"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:574
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:610
#, python-format
msgid ""
"No Tenants configured in Neutron DB. But %d tenants discovered in EOS "
"during synchronization.Entire EOS region is cleared"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:739
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:775
#, python-format
msgid "Network %s is not created as it is not found inArista DB"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:753
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:789
#, python-format
msgid "Network name changed to %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:781
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:817
#, python-format
msgid "Network %s is not updated as it is not found inArista DB"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:873
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:909
#, python-format
msgid "VM %s is not created as it is not found in Arista DB"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:888
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:924
#, python-format
msgid "Port name changed to %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:938
+#: neutron/plugins/ml2/drivers/arista/mechanism_arista.py:974
#, python-format
msgid "VM %s is not updated as it is not found in Arista DB"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:40
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:37
msgid "Allowed physical networks"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:42
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:39
msgid "OS Type of the switch"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:44
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:41
msgid "OS Version number"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:95
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:92
msgid "Virtual Fabric: enabled"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:97
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:94
msgid "Virtual Fabric: not enabled"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:135
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:132
msgid ""
"Brocade Mechanism: failed to create network, network cannot be created in"
" the configured physical network"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:141
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:138
msgid ""
"Brocade Mechanism: failed to create network, only network type vlan is "
"supported"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:149
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:146
msgid "Brocade Mechanism: failed to create network in db"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:151
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:148
msgid "Brocade Mechanism: create_network_precommit failed"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:153
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:150
#, python-format
msgid ""
"create network (precommit): %(network_id)s of network type = "
"%(network_type)s with vlan = %(vlan_id)s for tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:165
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:162
msgid "create_network_postcommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:185
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:182
msgid "Brocade NOS driver: failed in create network"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:188
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:185
msgid "Brocade Mechanism: create_network_postcommmit failed"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:190
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:187
#, python-format
msgid ""
"created network (postcommit): %(network_id)s of network type = "
"%(network_type)s with vlan = %(vlan_id)s for tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:202
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:199
msgid "delete_network_precommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:215
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:212
msgid "Brocade Mechanism: failed to delete network in db"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:217
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:214
msgid "Brocade Mechanism: delete_network_precommit failed"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:219
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:216
#, python-format
msgid ""
"delete network (precommit): %(network_id)s with vlan = %(vlan_id)s for "
"tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:231
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:228
msgid "delete_network_postcommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:243
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:240
msgid "Brocade NOS driver: failed to delete network"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:245
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:242
msgid "Brocade switch exception, delete_network_postcommit failed"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:248
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:245
#, python-format
msgid ""
"delete network (postcommit): %(network_id)s with vlan = %(vlan_id)s for "
"tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:266
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:263
msgid "create_port_precommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:284
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:281
msgid "Brocade Mechanism: failed to create port in db"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:286
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:283
msgid "Brocade Mechanism: create_port_precommit failed"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:291
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:288
msgid "create_port_postcommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:315
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:312
#, python-format
msgid "Brocade NOS driver: failed to associate mac %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:318
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:315
msgid "Brocade switch exception: create_port_postcommit failed"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:321
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:318
#, python-format
msgid ""
"created port (postcommit): port_id=%(port_id)s network_id=%(network_id)s "
"tenant_id=%(tenant_id)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:329
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:326
msgid "delete_port_precommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:338
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:335
msgid "Brocade Mechanism: failed to delete port in db"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:340
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:337
msgid "Brocade Mechanism: delete_port_precommit failed"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:345
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:342
msgid "delete_port_postcommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:369
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:366
#, python-format
msgid "Brocade NOS driver: failed to dissociate MAC %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:372
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:369
msgid "Brocade switch exception, delete_port_postcommit failed"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:375
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:372
#, python-format
msgid ""
"delete port (postcommit): port_id=%(port_id)s network_id=%(network_id)s "
"tenant_id=%(tenant_id)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:382
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:379
msgid "update_port_precommit(self: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:386
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:383
msgid "update_port_postcommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:390
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:387
msgid "create_subnetwork_precommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:394
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:391
msgid "create_subnetwork_postcommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:398
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:395
msgid "delete_subnetwork_precommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:402
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:399
msgid "delete_subnetwork_postcommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:406
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:403
msgid "update_subnet_precommit(self: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:410
+#: neutron/plugins/ml2/drivers/brocade/mechanism_brocade.py:407
msgid "update_subnet_postcommit: called"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:77
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:73
msgid ""
"Brocade Switch IP address is not set, check config ml2_conf_brocade.ini "
"file"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:88
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:84
msgid "Connect failed to switch"
msgstr ""
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:107
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:117
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:145
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:162
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:175
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:188
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:355
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:374
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:388
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:401
-#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:414
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:103
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:113
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:141
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:158
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:171
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:184
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:351
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:370
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:384
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:397
+#: neutron/plugins/ml2/drivers/brocade/nos/nosdriver.py:410
msgid "NETCONF error"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:30
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:28
msgid "Prefix for APIC domain/names/profiles created"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:40
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:38
msgid "An ordered list of host names or IP addresses of the APIC controller(s)."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:43
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:41
msgid "Username for the APIC controller"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:45
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:43
msgid "Password for the APIC controller"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:48
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:46
msgid "Name mapping strategy to use: use_uuid | use_name"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:50
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:48
msgid "Use SSL to connect to the APIC controller"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:53
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:51
msgid "Name for the domain created on APIC"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:56
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:54
msgid "Name for the app profile used for Openstack"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:59
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:57
msgid "Name for the vlan namespace to be used for Openstack"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:62
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:60
msgid "Name of the node profile to be created"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:65
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:63
msgid "Name of the entity profile to be created"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:68
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:66
msgid "Name of the function profile to be created"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:71
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:69
msgid "Name of the LACP profile to be created"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:74
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:72
msgid "The uplink ports to check for ACI connectivity"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:77
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:75
msgid "The switch pairs for VPC connectivity"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:80
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:78
msgid "Range of VLAN's to be used for Openstack"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:83
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:81
msgid "Setup root helper as rootwrap or sudo"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:86
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:84
msgid "Synchronization interval in seconds"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:89
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:87
msgid "Interval between agent status updates (in sec)"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/config.py:92
+#: neutron/plugins/ml2/drivers/cisco/apic/config.py:90
msgid "Interval between agent poll for topology (in sec)"
msgstr ""
@@ -9947,68 +9648,119 @@ msgstr ""
msgid "NexusDriver created VLAN: %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/l2pop/config.py:25
+#: neutron/plugins/ml2/drivers/freescale/config.py:29
+msgid "CRD service Username."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:32
+msgid "CRD Service Password."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:34
+msgid "CRD Tenant Name."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:37
+msgid "CRD Auth URL."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:40
+msgid "URL for connecting to CRD service."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:43
+msgid "Timeout value for connecting to CRD service in seconds."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:47
+msgid "Region name for connecting to CRD Service in admin context."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:51
+msgid "If set, ignore any SSL validation issues."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:54
+msgid "Auth strategy for connecting to neutron in admin context."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/config.py:57
+msgid "Location of ca certificates file to use for CRD client requests."
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/freescale/mechanism_fslsdn.py:38
+msgid "Initializing CRD client... "
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/l2pop/config.py:21
msgid ""
"Delay within which agent is expected to update existing ports whent it "
"restarts"
msgstr ""
-#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:42
+#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:38
msgid "Experimental L2 population driver"
msgstr ""
-#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:167
+#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:149
msgid "Unable to retrieve the agent ip, check the agent configuration."
msgstr ""
-#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:173
+#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:155
#, python-format
msgid "Port %(port)s updated by agent %(agent)s isn't bound to any segment"
msgstr ""
-#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:226
+#: neutron/plugins/ml2/drivers/l2pop/mech_driver.py:208
#, python-format
msgid ""
"Unable to retrieve the agent ip, check the agent %(agent_host)s "
"configuration."
msgstr ""
-#: neutron/plugins/ml2/drivers/l2pop/rpc.py:40
+#: neutron/plugins/ml2/drivers/l2pop/rpc.py:36
#, python-format
msgid ""
"Fanout notify l2population agents at %(topic)s the message %(method)s "
"with %(fdb_entries)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/l2pop/rpc.py:51
+#: neutron/plugins/ml2/drivers/l2pop/rpc.py:47
#, python-format
msgid ""
"Notify l2population agent %(host)s at %(topic)s the message %(method)s "
"with %(fdb_entries)s"
msgstr ""
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:54
+#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:52
msgid "Initializing driver"
msgstr ""
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:72
+#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:70
msgid "Initialization done"
msgstr ""
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:133
+#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:137
msgid "Ignoring port notification to controller because of missing host ID."
msgstr ""
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:202
+#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:206
#, python-format
msgid "No cache entry for host %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:207
+#: neutron/plugins/ml2/drivers/mech_bigswitch/driver.py:211
#, python-format
msgid "Expired cache entry for host %s"
msgstr ""
+#: neutron/plugins/ml2/drivers/mech_nuage/driver.py:91
+#, python-format
+msgid ""
+"Refusing to bind port for segment ID %(id)s, segment %(seg)s, phys net "
+"%(physnet)s, and network type %(nettype)s"
+msgstr ""
+
#: neutron/plugins/ml2/drivers/mech_sriov/mech_driver.py:31
msgid ""
"Supported PCI vendor devices, defined by vendor_id:product_id according "
@@ -10061,60 +9813,81 @@ msgstr ""
msgid "Sending update port message"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:121
+#: neutron/plugins/mlnx/mlnx_plugin.py:118
msgid "Mellanox Embedded Switch Plugin initialisation complete"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:161
+#: neutron/plugins/mlnx/mlnx_plugin.py:158
#, python-format
msgid "Invalid physical network type %(type)s.Server terminated!"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:168
+#: neutron/plugins/mlnx/mlnx_plugin.py:165
#, python-format
msgid "Parsing physical_network_type failed: %s. Server terminated!"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:173
+#: neutron/plugins/mlnx/mlnx_plugin.py:170
#, python-format
msgid ""
"Invalid physical network type %(type)s for network %(net)s. Server "
"terminated!"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:177
+#: neutron/plugins/mlnx/mlnx_plugin.py:174
#, python-format
msgid "Physical Network type mappings: %s"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:185
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:364
+#: neutron/plugins/mlnx/mlnx_plugin.py:182
#, python-format
msgid "%s. Server terminated!"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:323
+#: neutron/plugins/mlnx/mlnx_plugin.py:204
+#, python-format
+msgid "Invalid tenant_network_type: %s. Service terminated!"
+msgstr ""
+
+#: neutron/plugins/mlnx/mlnx_plugin.py:248
+msgid "provider:segmentation_id specified for flat network"
+msgstr ""
+
+#: neutron/plugins/mlnx/mlnx_plugin.py:256
+#, python-format
+msgid "provider:segmentation_id out of range (%(min_id)s through %(max_id)s)"
+msgstr ""
+
+#: neutron/plugins/mlnx/mlnx_plugin.py:264
+msgid "provider:physical_network specified for local network"
+msgstr ""
+
+#: neutron/plugins/mlnx/mlnx_plugin.py:268
+msgid "provider:segmentation_id specified for local network"
+msgstr ""
+
+#: neutron/plugins/mlnx/mlnx_plugin.py:320
#, python-format
msgid "Unsupported vnic type %(vnic_type)s for physical network type %(net_type)s"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:327
+#: neutron/plugins/mlnx/mlnx_plugin.py:324
msgid "Invalid vnic_type on port_create"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:329
+#: neutron/plugins/mlnx/mlnx_plugin.py:326
msgid "vnic_type is not defined in port profile"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:373
+#: neutron/plugins/mlnx/mlnx_plugin.py:370
msgid "Update network"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:386
+#: neutron/plugins/mlnx/mlnx_plugin.py:383
msgid "Delete network"
msgstr ""
-#: neutron/plugins/mlnx/mlnx_plugin.py:434
+#: neutron/plugins/mlnx/mlnx_plugin.py:431
#, python-format
msgid "create_port with %s"
msgstr ""
@@ -10260,7 +10033,7 @@ msgstr ""
msgid "Port Release for %(port_mac)s on fabric %(fabric)s"
msgstr ""
-#: neutron/plugins/mlnx/common/comm_utils.py:57
+#: neutron/plugins/mlnx/common/comm_utils.py:56
#, python-format
msgid "Request timeout - call again after %s seconds"
msgstr ""
@@ -10351,6 +10124,10 @@ msgstr ""
msgid "vlan_id %(seg_id)s on physical network %(phy_net)s not found"
msgstr ""
+#: neutron/plugins/mlnx/db/mlnx_db_v2.py:212
+msgid "get_port_from_device() called"
+msgstr ""
+
#: neutron/plugins/mlnx/db/mlnx_db_v2.py:239
msgid "Get_port_from_device_mac() called"
msgstr ""
@@ -10360,112 +10137,112 @@ msgstr ""
msgid "Set_port_status as %s called"
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:206
+#: neutron/plugins/nec/nec_plugin.py:204
#, python-format
msgid "_cleanup_ofc_tenant: No OFC tenant for %s"
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:209
+#: neutron/plugins/nec/nec_plugin.py:207
#, python-format
msgid "delete_ofc_tenant() failed due to %s"
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:225
+#: neutron/plugins/nec/nec_plugin.py:223
msgid "activate_port_if_ready(): skip, port.admin_state_up is False."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:229
+#: neutron/plugins/nec/nec_plugin.py:227
msgid "activate_port_if_ready(): skip, network.admin_state_up is False."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:233
+#: neutron/plugins/nec/nec_plugin.py:231
msgid "activate_port_if_ready(): skip, no portinfo for this port."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:237
+#: neutron/plugins/nec/nec_plugin.py:235
msgid "activate_port_if_ready(): skip, ofc_port already exists."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:245
+#: neutron/plugins/nec/nec_plugin.py:243
#, python-format
msgid "create_ofc_port() failed due to %s"
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:258
+#: neutron/plugins/nec/nec_plugin.py:256
#, python-format
msgid "deactivate_port(): skip, ofc_port for port=%s does not exist."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:277
+#: neutron/plugins/nec/nec_plugin.py:275
#, python-format
msgid "deactivate_port(): OFC port for port=%s is already removed."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:285
+#: neutron/plugins/nec/nec_plugin.py:283
#, python-format
msgid "Failed to delete port=%(port)s from OFC: %(exc)s"
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:304
+#: neutron/plugins/nec/nec_plugin.py:302
#, python-format
msgid "NECPluginV2.create_network() called, network=%s ."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:321
+#: neutron/plugins/nec/nec_plugin.py:319
#, python-format
msgid "Failed to create network id=%(id)s on OFC: %(exc)s"
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:337
+#: neutron/plugins/nec/nec_plugin.py:335
#, python-format
msgid "NECPluginV2.update_network() called, id=%(id)s network=%(network)s ."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:381
+#: neutron/plugins/nec/nec_plugin.py:379
#, python-format
msgid "NECPluginV2.delete_network() called, id=%s ."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:415
+#: neutron/plugins/nec/nec_plugin.py:413
#, python-format
msgid "delete_network() failed due to %s"
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:556
+#: neutron/plugins/nec/nec_plugin.py:554
#, python-format
msgid "NECPluginV2.create_port() called, port=%s ."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:620
+#: neutron/plugins/nec/nec_plugin.py:618
#, python-format
msgid "NECPluginV2.update_port() called, id=%(id)s port=%(port)s ."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:648
+#: neutron/plugins/nec/nec_plugin.py:646
#, python-format
msgid "NECPluginV2.delete_port() called, id=%s ."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:715
+#: neutron/plugins/nec/nec_plugin.py:713
#, python-format
msgid "NECPluginV2RPCCallbacks.update_ports() called, kwargs=%s ."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:725
+#: neutron/plugins/nec/nec_plugin.py:723
#, python-format
msgid ""
"update_ports(): ignore unchanged portinfo in port_added message "
"(port_id=%s)."
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:745
+#: neutron/plugins/nec/nec_plugin.py:743
#, python-format
msgid ""
"update_ports(): ignore port_removed message due to portinfo for "
"port_id=%s was not registered"
msgstr ""
-#: neutron/plugins/nec/nec_plugin.py:750
+#: neutron/plugins/nec/nec_plugin.py:748
#, python-format
msgid ""
"update_ports(): ignore port_removed message received from different host "
@@ -10473,361 +10250,360 @@ msgid ""
"received_datapath_id=%(received)s)."
msgstr ""
-#: neutron/plugins/nec/nec_router.py:58
+#: neutron/plugins/nec/nec_router.py:56
#, python-format
msgid "RouterMixin.create_router() called, router=%s ."
msgstr ""
-#: neutron/plugins/nec/nec_router.py:84
+#: neutron/plugins/nec/nec_router.py:82
#, python-format
msgid "RouterMixin.update_router() called, id=%(id)s, router=%(router)s ."
msgstr ""
-#: neutron/plugins/nec/nec_router.py:102
+#: neutron/plugins/nec/nec_router.py:100
#, python-format
msgid "RouterMixin.delete_router() called, id=%s."
msgstr ""
-#: neutron/plugins/nec/nec_router.py:121
+#: neutron/plugins/nec/nec_router.py:119
#, python-format
msgid ""
"RouterMixin.add_router_interface() called, id=%(id)s, "
"interface=%(interface)s."
msgstr ""
-#: neutron/plugins/nec/nec_router.py:128
+#: neutron/plugins/nec/nec_router.py:126
#, python-format
msgid ""
"RouterMixin.remove_router_interface() called, id=%(id)s, "
"interface=%(interface)s."
msgstr ""
-#: neutron/plugins/nec/nec_router.py:311
+#: neutron/plugins/nec/nec_router.py:310
#, python-format
msgid ""
"OFC does not support router with provider=%(provider)s, so removed it "
"from supported provider (new router driver map=%(driver_map)s)"
msgstr ""
-#: neutron/plugins/nec/nec_router.py:319
+#: neutron/plugins/nec/nec_router.py:318
#, python-format
msgid ""
"default_router_provider %(default)s is supported! Please specify one of "
"%(supported)s"
msgstr ""
-#: neutron/plugins/nec/nec_router.py:333
+#: neutron/plugins/nec/nec_router.py:332
#, python-format
msgid "Enabled router drivers: %s"
msgstr ""
-#: neutron/plugins/nec/nec_router.py:336
+#: neutron/plugins/nec/nec_router.py:335
#, python-format
msgid ""
"No router provider is enabled. neutron-server terminated! "
"(supported=%(supported)s, configured=%(config)s)"
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:40
+#: neutron/plugins/nec/packet_filter.py:39
msgid "Disabled packet-filter extension."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:45
+#: neutron/plugins/nec/packet_filter.py:44
#, python-format
msgid "create_packet_filter() called, packet_filter=%s ."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:61
+#: neutron/plugins/nec/packet_filter.py:60
#, python-format
msgid "update_packet_filter() called, id=%(id)s packet_filter=%(packet_filter)s ."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:134
-#: neutron/plugins/nec/packet_filter.py:187
+#: neutron/plugins/nec/packet_filter.py:133
+#: neutron/plugins/nec/packet_filter.py:186
#, python-format
msgid "Failed to create packet_filter id=%(id)s on OFC: %(exc)s"
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:144
+#: neutron/plugins/nec/packet_filter.py:143
#, python-format
msgid "delete_packet_filter() called, id=%s ."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:162
+#: neutron/plugins/nec/packet_filter.py:161
#, python-format
msgid "activate_packet_filter_if_ready() called, packet_filter=%s."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:171
+#: neutron/plugins/nec/packet_filter.py:170
#, python-format
msgid ""
"activate_packet_filter_if_ready(): skip pf_id=%s, "
"packet_filter.admin_state_up is False."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:174
+#: neutron/plugins/nec/packet_filter.py:173
#, python-format
msgid ""
"activate_packet_filter_if_ready(): skip pf_id=%s, no portinfo for the "
"in_port."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:177
+#: neutron/plugins/nec/packet_filter.py:176
msgid ""
"_activate_packet_filter_if_ready(): skip, ofc_packet_filter already "
"exists."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:180
+#: neutron/plugins/nec/packet_filter.py:179
#, python-format
msgid "activate_packet_filter_if_ready(): create packet_filter id=%s on OFC."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:200
+#: neutron/plugins/nec/packet_filter.py:199
#, python-format
msgid "deactivate_packet_filter_if_ready() called, packet_filter=%s."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:205
+#: neutron/plugins/nec/packet_filter.py:204
#, python-format
msgid ""
"deactivate_packet_filter(): skip, Not found OFC Mapping for packet_filter"
" id=%s."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:210
+#: neutron/plugins/nec/packet_filter.py:209
#, python-format
msgid "deactivate_packet_filter(): deleting packet_filter id=%s from OFC."
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:219
+#: neutron/plugins/nec/packet_filter.py:218
#, python-format
msgid "Failed to delete packet_filter id=%(id)s from OFC: %(exc)s"
msgstr ""
-#: neutron/plugins/nec/packet_filter.py:250
+#: neutron/plugins/nec/packet_filter.py:249
#, python-format
msgid "Error occurred while disabling packet filter(s) for port %s"
msgstr ""
-#: neutron/plugins/nec/router_drivers.py:125
+#: neutron/plugins/nec/router_drivers.py:123
#, python-format
msgid "create_router() failed due to %s"
msgstr ""
-#: neutron/plugins/nec/router_drivers.py:154
+#: neutron/plugins/nec/router_drivers.py:152
#, python-format
msgid "_update_ofc_routes() failed due to %s"
msgstr ""
-#: neutron/plugins/nec/router_drivers.py:169
+#: neutron/plugins/nec/router_drivers.py:167
#, python-format
msgid "delete_router() failed due to %s"
msgstr ""
-#: neutron/plugins/nec/router_drivers.py:180
+#: neutron/plugins/nec/router_drivers.py:178
#, python-format
msgid ""
"RouterOpenFlowDriver.add_interface(): the requested port has no subnet. "
"add_interface() is skipped. router_id=%(id)s, port=%(port)s)"
msgstr ""
-#: neutron/plugins/nec/router_drivers.py:200
+#: neutron/plugins/nec/router_drivers.py:198
#, python-format
msgid "add_router_interface() failed due to %s"
msgstr ""
-#: neutron/plugins/nec/router_drivers.py:218
+#: neutron/plugins/nec/router_drivers.py:216
#, python-format
msgid "delete_router_interface() failed due to %s"
msgstr ""
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:53
+#: neutron/plugins/nec/agent/nec_neutron_agent.py:51
#, python-format
msgid "Update ports: added=%(added)s, removed=%(removed)s"
msgstr ""
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:76
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:51
+#: neutron/plugins/nec/agent/nec_neutron_agent.py:74
+#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:49
#, python-format
msgid "port_update received: %s"
msgstr ""
-#: neutron/plugins/nec/agent/nec_neutron_agent.py:220
+#: neutron/plugins/nec/agent/nec_neutron_agent.py:218
msgid "No port changed."
msgstr ""
-#: neutron/plugins/nec/common/config.py:35
+#: neutron/plugins/nec/common/config.py:34
msgid "Host to connect to."
msgstr ""
-#: neutron/plugins/nec/common/config.py:37
+#: neutron/plugins/nec/common/config.py:36
msgid "Base URL of OFC REST API. It is prepended to each API request."
msgstr ""
-#: neutron/plugins/nec/common/config.py:40
+#: neutron/plugins/nec/common/config.py:39
msgid "Port to connect to."
msgstr ""
-#: neutron/plugins/nec/common/config.py:42
+#: neutron/plugins/nec/common/config.py:41
msgid "Driver to use."
msgstr ""
-#: neutron/plugins/nec/common/config.py:44
+#: neutron/plugins/nec/common/config.py:43
msgid "Enable packet filter."
msgstr ""
-#: neutron/plugins/nec/common/config.py:46
+#: neutron/plugins/nec/common/config.py:45
msgid "Use SSL to connect."
msgstr ""
-#: neutron/plugins/nec/common/config.py:48
+#: neutron/plugins/nec/common/config.py:47
msgid "Location of key file."
msgstr ""
-#: neutron/plugins/nec/common/config.py:50
+#: neutron/plugins/nec/common/config.py:49
msgid "Location of certificate file."
msgstr ""
-#: neutron/plugins/nec/common/config.py:52
+#: neutron/plugins/nec/common/config.py:51
msgid "Disable SSL certificate verification."
msgstr ""
-#: neutron/plugins/nec/common/config.py:54
+#: neutron/plugins/nec/common/config.py:53
msgid ""
"Maximum attempts per OFC API request. NEC plugin retries API request to "
"OFC when OFC returns ServiceUnavailable (503). The value must be greater "
"than 0."
msgstr ""
-#: neutron/plugins/nec/common/config.py:63
+#: neutron/plugins/nec/common/config.py:62
msgid "Default router provider to use."
msgstr ""
-#: neutron/plugins/nec/common/config.py:66
+#: neutron/plugins/nec/common/config.py:65
msgid "List of enabled router providers."
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:20
+#: neutron/plugins/nec/common/exceptions.py:19
#, python-format
msgid "An OFC exception has occurred: %(reason)s"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:30
+#: neutron/plugins/nec/common/exceptions.py:29
#, python-format
msgid "The specified OFC resource (%(resource)s) is not found."
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:34
+#: neutron/plugins/nec/common/exceptions.py:33
#, python-format
msgid "An exception occurred in NECPluginV2 DB: %(reason)s"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:38
+#: neutron/plugins/nec/common/exceptions.py:37
#, python-format
msgid ""
"Neutron-OFC resource mapping for %(resource)s %(neutron_id)s is not "
"found. It may be deleted during processing."
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:44
+#: neutron/plugins/nec/common/exceptions.py:43
#, python-format
msgid "OFC returns Server Unavailable (503) (Retry-After=%(retry_after)s)"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:53
+#: neutron/plugins/nec/common/exceptions.py:52
#, python-format
msgid "PortInfo %(id)s could not be found"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:57
+#: neutron/plugins/nec/common/exceptions.py:56
msgid ""
"Invalid input for operation: datapath_id should be a hex string with at "
"most 8 bytes"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:63
+#: neutron/plugins/nec/common/exceptions.py:62
msgid "Invalid input for operation: port_no should be [0:65535]"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:68
+#: neutron/plugins/nec/common/exceptions.py:67
#, python-format
msgid "Router (provider=%(provider)s) does not support an external network"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:73
+#: neutron/plugins/nec/common/exceptions.py:72
#, python-format
msgid "Provider %(provider)s could not be found"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:77
+#: neutron/plugins/nec/common/exceptions.py:76
#, python-format
msgid "Cannot create more routers with provider=%(provider)s"
msgstr ""
-#: neutron/plugins/nec/common/exceptions.py:81
+#: neutron/plugins/nec/common/exceptions.py:80
#, python-format
msgid ""
"Provider of Router %(router_id)s is %(provider)s. This operation is "
"supported only for router provider %(expected_provider)s."
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:54
+#: neutron/plugins/nec/common/ofc_client.py:53
#, python-format
msgid "Operation on OFC failed: %(status)s%(msg)s"
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:78
+#: neutron/plugins/nec/common/ofc_client.py:77
#, python-format
msgid "Client request: %(host)s:%(port)s %(method)s %(action)s [%(body)s]"
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:87
+#: neutron/plugins/nec/common/ofc_client.py:86
#, python-format
msgid "OFC returns [%(status)s:%(data)s]"
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:104
+#: neutron/plugins/nec/common/ofc_client.py:103
#, python-format
msgid "OFC returns ServiceUnavailable (retry-after=%s)"
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:108
+#: neutron/plugins/nec/common/ofc_client.py:107
#, python-format
msgid "Specified resource %s does not exist on OFC "
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:112
+#: neutron/plugins/nec/common/ofc_client.py:111
#, python-format
msgid "Operation on OFC failed: status=%(status)s, detail=%(detail)s"
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:115
+#: neutron/plugins/nec/common/ofc_client.py:114
msgid "Operation on OFC failed"
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:124
+#: neutron/plugins/nec/common/ofc_client.py:123
#, python-format
msgid "Failed to connect OFC : %s"
msgstr ""
-#: neutron/plugins/nec/common/ofc_client.py:140
+#: neutron/plugins/nec/common/ofc_client.py:139
#, python-format
msgid "Waiting for %s seconds due to OFC Service_Unavailable."
msgstr ""
-#: neutron/plugins/nec/db/api.py:103
+#: neutron/plugins/nec/db/api.py:102
#, python-format
msgid "del_ofc_item(): NotFound item (resource=%(resource)s, id=%(id)s) "
msgstr ""
-#: neutron/plugins/nec/db/api.py:137
+#: neutron/plugins/nec/db/api.py:136
#, python-format
msgid "del_portinfo(): NotFound portinfo for port_id: %s"
msgstr ""
-#: neutron/plugins/nec/db/api.py:158
-#: neutron/plugins/openvswitch/ovs_db_v2.py:317
+#: neutron/plugins/nec/db/api.py:157
#, python-format
msgid "get_port_with_securitygroups() called:port_id=%s"
msgstr ""
@@ -10837,257 +10613,257 @@ msgstr ""
msgid "Add provider binding (router=%(router_id)s, provider=%(provider)s)"
msgstr ""
-#: neutron/plugins/nec/drivers/__init__.py:36
+#: neutron/plugins/nec/drivers/__init__.py:35
#, python-format
msgid "Loading OFC driver: %s"
msgstr ""
-#: neutron/plugins/nec/drivers/pfc.py:33
+#: neutron/plugins/nec/drivers/pfc.py:31
#, python-format
msgid "OFC %(resource)s ID has an invalid format: %(ofc_id)s"
msgstr ""
-#: neutron/plugins/nec/extensions/packetfilter.py:33
+#: neutron/plugins/nec/extensions/packetfilter.py:30
msgid "Number of packet_filters allowed per tenant, -1 for unlimited"
msgstr ""
-#: neutron/plugins/nec/extensions/packetfilter.py:40
+#: neutron/plugins/nec/extensions/packetfilter.py:37
#, python-format
msgid "PacketFilter %(id)s could not be found"
msgstr ""
-#: neutron/plugins/nec/extensions/packetfilter.py:44
+#: neutron/plugins/nec/extensions/packetfilter.py:41
#, python-format
msgid ""
"IP version %(version)s is not supported for %(field)s (%(value)s is "
"specified)"
msgstr ""
-#: neutron/plugins/nec/extensions/packetfilter.py:49
+#: neutron/plugins/nec/extensions/packetfilter.py:46
#, python-format
msgid "Packet Filter priority should be %(min)s-%(max)s (included)"
msgstr ""
-#: neutron/plugins/nec/extensions/packetfilter.py:53
+#: neutron/plugins/nec/extensions/packetfilter.py:50
#, python-format
msgid "%(field)s field cannot be updated"
msgstr ""
-#: neutron/plugins/nec/extensions/packetfilter.py:57
+#: neutron/plugins/nec/extensions/packetfilter.py:54
#, python-format
msgid ""
"The backend does not support duplicated priority. Priority %(priority)s "
"is in use"
msgstr ""
-#: neutron/plugins/nec/extensions/packetfilter.py:62
+#: neutron/plugins/nec/extensions/packetfilter.py:59
#, python-format
msgid ""
"Ether Type '%(eth_type)s' conflicts with protocol '%(protocol)s'. Update "
"or clear protocol before changing ether type."
msgstr ""
-#: neutron/plugins/nuage/plugin.py:109
+#: neutron/plugins/nuage/plugin.py:113
#, python-format
msgid "%(resource)s with id %(resource_id)s does not exist"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:118
+#: neutron/plugins/nuage/plugin.py:122
#, python-format
msgid ""
"Either %(resource)s %(req_resource)s not found or you dont have "
"credential to access it"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:124
+#: neutron/plugins/nuage/plugin.py:128
#, python-format
msgid ""
"More than one entry found for %(resource)s %(req_resource)s. Use id "
"instead"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:154
+#: neutron/plugins/nuage/plugin.py:158
#, python-format
msgid "Router for subnet %s not found "
msgstr ""
-#: neutron/plugins/nuage/plugin.py:271
+#: neutron/plugins/nuage/plugin.py:275
#, python-format
msgid "Subnet %s not found on VSD"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:416
+#: neutron/plugins/nuage/plugin.py:422
#, python-format
msgid "provider:network_type %s not supported in VSP"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:461
+#: neutron/plugins/nuage/plugin.py:469
msgid "External network with subnets can not be changed to non-external network"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:539
+#: neutron/plugins/nuage/plugin.py:530
msgid ""
"Either net_partition is not provided with subnet OR default net_partition"
" is not created at the start"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:556
+#: neutron/plugins/nuage/plugin.py:547
#, python-format
msgid "Only one subnet is allowed per Provider network %s"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:567
+#: neutron/plugins/nuage/plugin.py:558
#, python-format
msgid "Only one subnet is allowed per external network %s"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:697
+#: neutron/plugins/nuage/plugin.py:694
#, python-format
msgid ""
"Unable to complete operation on subnet %s.One or more ports have an IP "
"allocation from this subnet."
msgstr ""
-#: neutron/plugins/nuage/plugin.py:724
+#: neutron/plugins/nuage/plugin.py:721
#, python-format
msgid ""
"Router %s does not hold default zone OR domain in VSD. Router-IF add "
"failed"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:736
+#: neutron/plugins/nuage/plugin.py:733
#, python-format
msgid "Subnet %s does not hold Nuage VSD reference. Router-IF add failed"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:746
+#: neutron/plugins/nuage/plugin.py:743
#, python-format
msgid ""
"Subnet %(subnet)s and Router %(router)s belong to different net_partition"
" Router-IF add not permitted"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:757
+#: neutron/plugins/nuage/plugin.py:754
#, python-format
msgid "Subnet %s has one or more active VMs Router-IF add not permitted"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:809 neutron/plugins/nuage/plugin.py:814
-#: neutron/plugins/nuage/plugin.py:820
+#: neutron/plugins/nuage/plugin.py:806 neutron/plugins/nuage/plugin.py:811
+#: neutron/plugins/nuage/plugin.py:817
#, python-format
msgid "No router interface found for Router %s. Router-IF delete failed"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:836
+#: neutron/plugins/nuage/plugin.py:833
#, python-format
msgid "Subnet %s has one or more active VMs Router-IF delete not permitted"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:845
+#: neutron/plugins/nuage/plugin.py:842
#, python-format
msgid ""
"Router %s does not hold net_partition assoc on Nuage VSD. Router-IF "
"delete failed"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:886
+#: neutron/plugins/nuage/plugin.py:883
msgid ""
"Either net_partition is not provided with router OR default net_partition"
" is not created at the start"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:927
+#: neutron/plugins/nuage/plugin.py:924
msgid "for same subnet, multiple static routes not allowed"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:944
+#: neutron/plugins/nuage/plugin.py:941
#, python-format
msgid "Router %s does not hold net-partition assoc on VSD. extra-route failed"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:1061
+#: neutron/plugins/nuage/plugin.py:1057
#, python-format
msgid "One or more router still attached to net_partition %s."
msgstr ""
-#: neutron/plugins/nuage/plugin.py:1066
+#: neutron/plugins/nuage/plugin.py:1062
#, python-format
msgid "NetPartition with %s does not exist"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:1108
+#: neutron/plugins/nuage/plugin.py:1104
#, python-format
msgid "sharedresource %s not found on VSD"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:1115 neutron/plugins/nuage/plugin.py:1257
+#: neutron/plugins/nuage/plugin.py:1111 neutron/plugins/nuage/plugin.py:1261
#, python-format
msgid "router %s is not associated with any net-partition"
msgstr ""
-#: neutron/plugins/nuage/plugin.py:1148
+#: neutron/plugins/nuage/plugin.py:1144
msgid "Floating IP can not be associated to VM in different router context"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:22
+#: neutron/plugins/nuage/common/config.py:20
msgid "IP Address and Port of Nuage's VSD server"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:25
+#: neutron/plugins/nuage/common/config.py:23
msgid "Username and password for authentication"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:27
+#: neutron/plugins/nuage/common/config.py:25
msgid "Boolean for SSL connection with VSD server"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:29
+#: neutron/plugins/nuage/common/config.py:27
msgid "Nuage provided base uri to reach out to VSD"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:31
+#: neutron/plugins/nuage/common/config.py:29
msgid ""
"Organization name in which VSD will orchestrate network resources using "
"openstack"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:34
+#: neutron/plugins/nuage/common/config.py:32
msgid "Nuage provided uri for initial authorization to access VSD"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:38
+#: neutron/plugins/nuage/common/config.py:36
msgid ""
"Default Network partition in which VSD will orchestrate network resources"
" using openstack"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:42
+#: neutron/plugins/nuage/common/config.py:40
msgid "Per Net Partition quota of floating ips"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:47
+#: neutron/plugins/nuage/common/config.py:45
msgid "Nuage plugin will sync resources between openstack and VSD"
msgstr ""
-#: neutron/plugins/nuage/common/config.py:50
+#: neutron/plugins/nuage/common/config.py:48
msgid ""
"Sync interval in seconds between openstack and VSD. It defines how often "
"the synchronization is done. If not set, value of 0 is assumed and sync "
"will be performed only once, at the Neutron startup time."
msgstr ""
-#: neutron/plugins/nuage/common/exceptions.py:23
+#: neutron/plugins/nuage/common/exceptions.py:21
#, python-format
msgid "Nuage Plugin does not support this operation: %(msg)s"
msgstr ""
-#: neutron/plugins/nuage/common/exceptions.py:27
+#: neutron/plugins/nuage/common/exceptions.py:25
#, python-format
msgid "Bad request: %(msg)s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:988
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1486
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1489
#, python-format
msgid "Parsing bridge_mappings failed: %s."
msgstr ""
@@ -11103,7 +10879,7 @@ msgid "Invalid tunnel type specificed: %s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:1017
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1514
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1517
msgid "Tunneling cannot be enabled without a valid local_ip."
msgstr ""
@@ -11111,32 +10887,32 @@ msgstr ""
msgid "Number of seconds to retry acquiring an Open vSwitch datapath"
msgstr ""
-#: neutron/plugins/oneconvergence/plugin.py:238
+#: neutron/plugins/oneconvergence/plugin.py:236
msgid "Failed to create subnet, deleting it from neutron"
msgstr ""
-#: neutron/plugins/oneconvergence/plugin.py:302
+#: neutron/plugins/oneconvergence/plugin.py:300
#, python-format
msgid "Deleting newly created neutron port %s"
msgstr ""
-#: neutron/plugins/oneconvergence/plugin.py:375
+#: neutron/plugins/oneconvergence/plugin.py:373
msgid "Failed to create floatingip"
msgstr ""
-#: neutron/plugins/oneconvergence/plugin.py:414
+#: neutron/plugins/oneconvergence/plugin.py:412
msgid "Failed to create router"
msgstr ""
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:154
+#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:152
msgid "Port list is updated"
msgstr ""
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:161
+#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:159
msgid "AGENT looping....."
msgstr ""
-#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:173
+#: neutron/plugins/oneconvergence/agent/nvsd_neutron_agent.py:171
msgid "NVSD Agent initialized successfully, now running... "
msgstr ""
@@ -11211,274 +10987,193 @@ msgstr ""
msgid "Internal Server Error from NVSD controller: %(reason)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:55
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:53
#, python-format
msgid "Could not create a %(resource)s under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:59
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:57
#, python-format
msgid "Failed to %(method)s %(resource)s id=%(resource_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:65
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:63
#, python-format
msgid "Failed to %(method)s %(resource)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:110
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:108
#, python-format
msgid "Network %(id)s created under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:127
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:125
#, python-format
msgid "Network %(id)s updated under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:148
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:146
#, python-format
msgid "Network %(id)s deleted under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:161
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:159
#, python-format
msgid "Subnet %(id)s created under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:175
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:173
#, python-format
msgid "Subnet %(id)s deleted under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:191
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:189
#, python-format
msgid "Subnet %(id)s updated under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:223
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:221
#, python-format
msgid "Port %(id)s created under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:247
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:245
#, python-format
msgid "Port %(id)s updated under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:260
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:258
#, python-format
msgid "Port %(id)s deleted under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:282
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:280
#, python-format
msgid "Flatingip %(id)s created under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:300
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:298
#, python-format
msgid "Flatingip %(id)s updated under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:314
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:312
#, python-format
msgid "Flatingip %(id)s deleted under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:327
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:325
#, python-format
msgid "Router %(id)s created under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:343
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:341
#, python-format
msgid "Router %(id)s updated under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/nvsdlib.py:353
+#: neutron/plugins/oneconvergence/lib/nvsdlib.py:351
#, python-format
msgid "Router %(id)s deleted under tenant %(tenant_id)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:81
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:79
#, python-format
msgid "Unable to connect to NVSD controller. Exiting after %(retries)s attempts"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:90
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:88
#, python-format
msgid "Login Failed: %s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:91
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:89
#, python-format
msgid "Unable to establish connection with Controller %s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:93
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:91
msgid "Retrying after 1 second..."
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:97
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:95
#, python-format
msgid "Login Successful %(uri)s %(status)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:101
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:99
#, python-format
msgid "AuthToken = %s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:103
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:101
msgid "login failed"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:111
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:109
msgid "No Token, Re-login"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:127
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:125
#, python-format
msgid "request: %(method)s %(uri)s successful"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:134
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:132
#, python-format
msgid "request: Request failed from Controller side :%s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:139
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:137
#, python-format
msgid "Response is Null, Request timed out: %(method)s to %(uri)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:151
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:149
#, python-format
msgid "Request %(method)s %(uri)s body = %(body)s failed with status %(status)s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:155
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:153
#, python-format
msgid "%s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:159
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:157
#, python-format
msgid "%(method)s to %(url)s, unexpected response code: %(status)d"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:165
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:163
#, python-format
msgid "Request failed from Controller side with Status=%s"
msgstr ""
-#: neutron/plugins/oneconvergence/lib/plugin_helper.py:169
+#: neutron/plugins/oneconvergence/lib/plugin_helper.py:167
#, python-format
msgid "Success: %(method)s %(url)s status=%(status)s"
msgstr ""
-#: neutron/plugins/openvswitch/ovs_db_v2.py:210
-#, python-format
-msgid "Skipping unreasonable tunnel ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:229
-#, python-format
-msgid "Removing tunnel %s from pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:258
-#, python-format
-msgid "Reserving tunnel %s from pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:273
-#, python-format
-msgid "Reserving specific tunnel %s from pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:276
-#, python-format
-msgid "Reserving specific tunnel %s outside pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:299
-#, python-format
-msgid "Releasing tunnel %s outside pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:301
-#, python-format
-msgid "Releasing tunnel %s to pool"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:303
-#, python-format
-msgid "tunnel_id %s not found"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:375
-#, python-format
-msgid "Adding a tunnel endpoint for %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:391
-#, python-format
-msgid ""
-"Adding a tunnel endpoint failed due to a concurrenttransaction had been "
-"committed (%s attempts left)"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_db_v2.py:396
-msgid "Unable to generate a new tunnel id"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:309
-#, python-format
-msgid "Invalid tenant_network_type: %s. Server terminated!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:326
-#, python-format
-msgid "Tunneling disabled but tenant_network_type is '%s'. Server terminated!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:375
-#, python-format
-msgid "Invalid tunnel ID range: '%(range)s' - %(e)s. Server terminated!"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:379
-#, python-format
-msgid "Tunnel ID ranges: %s"
-msgstr ""
-
-#: neutron/plugins/openvswitch/ovs_neutron_plugin.py:434
-#, python-format
-msgid "%s networks are not enabled"
-msgstr ""
-
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:159
+#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:158
msgid "DVR: Failed to obtain local DVR Mac address"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:292
+#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:291
#, python-format
msgid "DVR: Duplicate DVR router interface detected for subnet %s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:300
+#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:299
#, python-format
msgid "DVR: Unable to retrieve subnet information for subnet_id %s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:459
+#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:458
#, python-format
msgid "Centralized-SNAT port %s already seen on "
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:461
+#: neutron/plugins/openvswitch/agent/ovs_dvr_neutron_agent.py:460
#, python-format
msgid "a different subnet %s"
msgstr ""
@@ -11490,180 +11185,180 @@ msgid ""
"error: %(error)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:305
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:557
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:308
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:560
#, python-format
msgid "Network %s not used on agent."
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:314
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:317
#, python-format
msgid "port_update message processed for port %s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:317
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:320
msgid "tunnel_update received"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:326
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:329
msgid "No tunnel_type specified, cannot create tunnels"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:329
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:332
#, python-format
msgid "tunnel_type %s not supported by agent"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:437
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:440
#, python-format
msgid "Action %s not supported"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:458
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:461
#, python-format
msgid "No local VLAN available for net-id=%s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:466
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:469
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:495
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:498
#, python-format
msgid ""
"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
"tunneling disabled"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:514
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:517
#, python-format
msgid ""
"Cannot provision flat network for net-id=%(net_uuid)s - no bridge for "
"physical_network %(physical_network)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:534
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:537
#, python-format
msgid ""
"Cannot provision VLAN network for net-id=%(net_uuid)s - no bridge for "
"physical_network %(physical_network)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:543
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:546
#, python-format
msgid ""
"Cannot provision unknown network type %(network_type)s for net-"
"id=%(net_uuid)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:560
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:563
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:601
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:604
#, python-format
msgid ""
"Cannot reclaim unknown network type %(network_type)s for net-"
"id=%(net_uuid)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:655
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:658
#, python-format
msgid "port_unbound(): net_uuid %s not in local_vlan_map"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:728
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:731
#, python-format
msgid "Adding %s to list of bridges."
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:749
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:752
msgid ""
"Failed to create OVS patch port. Cannot have tunneling enabled on this "
"agent, since this version of OVS does not support tunnels or patch ports."
" Agent terminated!"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:843
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:846
#, python-format
msgid ""
"Creating an interface named %(name)s exceeds the %(limit)d character "
"limitation. It was shortened to %(new_name)s to fit."
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:864
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:867
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:870
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:873
#, python-format
msgid ""
"Bridge %(bridge)s for physical network %(physical_network)s does not "
"exist. Agent terminated!"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:974
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:977
#, python-format
msgid "Port '%(port_name)s' has lost its vlan tag '%(vlan_tag)d'!"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1003
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1006
#, python-format
msgid "VIF port: %s has no ofport configured, and might not be able to transmit"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1013
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1016
#, python-format
msgid "No VIF port for port %s defined on agent."
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1026
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1029
#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:799
-#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1248
+#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1287
msgid "ofport should have a value that can be interpreted as an integer"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1029
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1032
#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:782
#: neutron/tests/unit/ofagent/test_ofa_neutron_agent.py:802
-#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1231
-#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1251
-#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1268
+#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1270
+#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1290
+#: neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py:1307
#, python-format
msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1094
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1097
#, python-format
msgid ""
"Port %s was not found on the integration bridge and will therefore not be"
" processed"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1117
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1120
#, python-format
msgid "Setting status for %s to UP"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1121
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1124
#, python-format
msgid "Setting status for %s to DOWN"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1124
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1127
#, python-format
msgid "Configuration for device %s completed."
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1143
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1146
#, python-format
msgid "Ancillary Port %s added"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1215
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1218
#, python-format
msgid ""
"process_network_ports - iteration:%(iter_num)d "
@@ -11672,116 +11367,116 @@ msgid ""
"%(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1231
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1234
#, python-format
msgid ""
"process_network_ports - iteration:%d - failure while retrieving port "
"details from server"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1238
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1241
#, python-format
msgid ""
"process_network_ports - iteration:%(iter_num)d -treat_devices_removed "
"completed in %(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1252
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1255
#, python-format
msgid ""
"process_ancillary_network_ports - iteration: %(iter_num)d - "
"treat_ancillary_devices_added completed in %(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1260
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1263
#, python-format
msgid ""
"process_ancillary_network_ports - iteration:%d - failure while retrieving"
" port details from server"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1268
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1271
#, python-format
msgid ""
"process_ancillary_network_ports - iteration: %(iter_num)d - "
"treat_ancillary_devices_removed completed in %(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1281
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1284
#, python-format
msgid "Unable to create tunnel port. Invalid remote IP: %s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1310
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1313
#, python-format
msgid "Unable to sync tunnel IP %(local_ip)s: %(e)s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1347
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1350
#, python-format
msgid "Agent rpc_loop - iteration:%d started"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1369
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1372
msgid "Agent tunnel out of sync with plugin!"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1373
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1376
msgid "Error while synchronizing tunnels"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1377
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1380
#, python-format
msgid ""
"Agent rpc_loop - iteration:%(iter_num)d - starting polling. "
"Elapsed:%(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1389
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1392
#, python-format
msgid ""
"Agent rpc_loop - iteration:%(iter_num)d - port information retrieved. "
"Elapsed:%(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1399
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1402
#, python-format
msgid "Starting to process devices in:%s"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1404
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1407
#, python-format
msgid ""
"Agent rpc_loop - iteration:%(iter_num)d -ports processed. "
"Elapsed:%(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1419
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1422
#, python-format
msgid ""
"Agent rpc_loop - iteration:%(iter_num)d -ancillary port info retrieved. "
"Elapsed:%(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1428
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1431
#, python-format
msgid ""
"Agent rpc_loop - iteration:%(iter_num)d - ancillary ports processed. "
"Elapsed:%(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1442
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1445
msgid "Error while processing VIF ports"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1449
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1452
#, python-format
msgid ""
"Agent rpc_loop - iteration:%(iter_num)d completed. Processed ports "
"statistics: %(port_stats)s. Elapsed:%(elapsed).3f"
msgstr ""
-#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1511
+#: neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:1514
#, python-format
msgid "Invalid tunnel type specified: %s"
msgstr ""
@@ -11811,54 +11506,36 @@ msgid "List of <physical_network>:<bridge>. Deprecated for ofagent."
msgstr ""
#: neutron/plugins/openvswitch/common/config.py:47
-msgid "Network type for tenant networks (local, vlan, gre, vxlan, or none)."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:51
-msgid "List of <physical_network>:<vlan_min>:<vlan_max> or <physical_network>."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:55
-msgid "List of <tun_min>:<tun_max>."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:57
-msgid ""
-"The type of tunnels to use when utilizing tunnels, either 'gre' or "
-"'vxlan'."
-msgstr ""
-
-#: neutron/plugins/openvswitch/common/config.py:60
msgid ""
"Use veths instead of patch ports to interconnect the integration bridge "
"to physical bridges."
msgstr ""
-#: neutron/plugins/openvswitch/common/config.py:70
+#: neutron/plugins/openvswitch/common/config.py:57
msgid "Minimize polling by monitoring ovsdb for interface changes."
msgstr ""
-#: neutron/plugins/openvswitch/common/config.py:74
+#: neutron/plugins/openvswitch/common/config.py:61
msgid ""
"The number of seconds to wait before respawning the ovsdb monitor after "
"losing communication with it."
msgstr ""
-#: neutron/plugins/openvswitch/common/config.py:77
+#: neutron/plugins/openvswitch/common/config.py:64
msgid "Network types supported by the agent (gre and/or vxlan)."
msgstr ""
-#: neutron/plugins/openvswitch/common/config.py:82
+#: neutron/plugins/openvswitch/common/config.py:69
msgid "MTU size of veth interfaces"
msgstr ""
-#: neutron/plugins/openvswitch/common/config.py:84
+#: neutron/plugins/openvswitch/common/config.py:71
msgid ""
"Use ML2 l2population mechanism driver to learn remote MAC and IPs and "
"improve tunnel scalability."
msgstr ""
-#: neutron/plugins/openvswitch/common/config.py:87
+#: neutron/plugins/openvswitch/common/config.py:74
msgid ""
"Enable local ARP responder if it is supported. Requires OVS 2.1 and ML2 "
"l2population driver. Allows the switch (when supporting an overlay) to "
@@ -11866,131 +11543,131 @@ msgid ""
"broadcast into the overlay."
msgstr ""
-#: neutron/plugins/openvswitch/common/config.py:93
+#: neutron/plugins/openvswitch/common/config.py:80
msgid ""
"Set or un-set the don't fragment (DF) bit on outgoing IP packet carrying "
"GRE/VXLAN tunnel."
msgstr ""
-#: neutron/plugins/openvswitch/common/config.py:96
+#: neutron/plugins/openvswitch/common/config.py:83
msgid "Make the l2 agent run in DVR mode."
msgstr ""
-#: neutron/plugins/plumgrid/common/exceptions.py:24
+#: neutron/plugins/plumgrid/common/exceptions.py:22
#, python-format
msgid "PLUMgrid Plugin Error: %(err_msg)s"
msgstr ""
-#: neutron/plugins/plumgrid/common/exceptions.py:28
+#: neutron/plugins/plumgrid/common/exceptions.py:26
#, python-format
msgid "Connection failed with PLUMgrid Director: %(err_msg)s"
msgstr ""
-#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:31
+#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:29
msgid "Python PLUMgrid Fake Library Started "
msgstr ""
-#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:36
+#: neutron/plugins/plumgrid/drivers/fake_plumlib.py:34
#, python-format
msgid "Fake Director: %s"
msgstr ""
-#: neutron/plugins/plumgrid/drivers/plumlib.py:37
+#: neutron/plugins/plumgrid/drivers/plumlib.py:35
msgid "Python PLUMgrid Library Started "
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:46
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:44
msgid "PLUMgrid Director server to connect to"
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:48
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:46
msgid "PLUMgrid Director server port to connect to"
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:50
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:48
msgid "PLUMgrid Director admin username"
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:52
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:50
msgid "PLUMgrid Director admin password"
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:54
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:52
msgid "PLUMgrid Director server timeout"
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:57
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:55
msgid "PLUMgrid Driver"
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:75
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:73
msgid "Neutron PLUMgrid Director: Starting Plugin"
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:93
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:91
#, python-format
msgid "Neutron PLUMgrid Director: %s"
msgstr ""
-#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:770
+#: neutron/plugins/plumgrid/plumgrid_plugin/plumgrid_plugin.py:768
msgid ""
"Networks with admin_state_up=False are not supported by PLUMgrid plugin "
"yet."
msgstr ""
-#: neutron/plugins/ryu/ryu_neutron_plugin.py:68
+#: neutron/plugins/ryu/ryu_neutron_plugin.py:67
#, python-format
msgid "get_ofp_rest_api: %s"
msgstr ""
-#: neutron/plugins/ryu/ryu_neutron_plugin.py:125
+#: neutron/plugins/ryu/ryu_neutron_plugin.py:124
msgid "Invalid configuration. check ryu.ini"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:95
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:94
#, python-format
msgid "Could not get IPv4 address from %(nic)s: %(cfg)s"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:161
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:160
#, python-format
msgid "External port %s"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:169
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:168
msgid "Get Ryu rest API address"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:216
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:215
msgid "Ryu rest API port isn't specified"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:217
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:216
#, python-format
msgid "Going to ofp controller mode %s"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:293
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:292
#, python-format
msgid "tunnel_ip %s"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:295
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:294
#, python-format
msgid "ovsdb_port %s"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:297
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:296
#, python-format
msgid "ovsdb_ip %s"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:303
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:302
#, python-format
msgid "Initialization failed: %s"
msgstr ""
-#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:306
+#: neutron/plugins/ryu/agent/ryu_neutron_agent.py:305
msgid ""
"Ryu initialization on the node is done. Agent initialized successfully, "
"now running..."
@@ -12054,42 +11731,42 @@ msgstr ""
msgid "Transaction retry exhausted (%d). Abandoned tunnel key allocation."
msgstr ""
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:46
+#: neutron/plugins/sriovnicagent/eswitch_manager.py:44
#, python-format
msgid "Failed to get devices for %s"
msgstr ""
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:48
+#: neutron/plugins/sriovnicagent/eswitch_manager.py:46
msgid "Device not found"
msgstr ""
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:62
+#: neutron/plugins/sriovnicagent/eswitch_manager.py:60
msgid "Device has no virtual functions"
msgstr ""
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:141
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:154
+#: neutron/plugins/sriovnicagent/eswitch_manager.py:139
+#: neutron/plugins/sriovnicagent/eswitch_manager.py:152
#, python-format
msgid "Cannot find vf index for pci slot %s"
msgstr ""
-#: neutron/plugins/sriovnicagent/eswitch_manager.py:279
+#: neutron/plugins/sriovnicagent/eswitch_manager.py:277
#, python-format
msgid "device pci mismatch: %(device_mac)s - %(pci_slot)s"
msgstr ""
-#: neutron/plugins/sriovnicagent/pci_lib.py:58
-#: neutron/plugins/sriovnicagent/pci_lib.py:81
-#: neutron/plugins/sriovnicagent/pci_lib.py:108
+#: neutron/plugins/sriovnicagent/pci_lib.py:56
+#: neutron/plugins/sriovnicagent/pci_lib.py:79
+#: neutron/plugins/sriovnicagent/pci_lib.py:106
msgid "Failed executing ip command"
msgstr ""
-#: neutron/plugins/sriovnicagent/pci_lib.py:129
+#: neutron/plugins/sriovnicagent/pci_lib.py:127
#, python-format
msgid "Cannot find vfs %(vfs)s in device %(dev_name)s"
msgstr ""
-#: neutron/plugins/sriovnicagent/pci_lib.py:145
+#: neutron/plugins/sriovnicagent/pci_lib.py:143
#, python-format
msgid "failed to parse vf link show line %(line)s: for %(device)s"
msgstr ""
@@ -12245,26 +11922,26 @@ msgid ""
"cluster"
msgstr ""
-#: neutron/plugins/vmware/api_client/base.py:150
+#: neutron/plugins/vmware/api_client/base.py:151
#, python-format
msgid "[%(rid)d] Connection returned in bad state, reconnecting to %(conn)s"
msgstr ""
-#: neutron/plugins/vmware/api_client/base.py:176
+#: neutron/plugins/vmware/api_client/base.py:173
#, python-format
msgid "[%(rid)d] Released connection %(conn)s. %(qsize)d connection(s) available."
msgstr ""
-#: neutron/plugins/vmware/api_client/base.py:186
+#: neutron/plugins/vmware/api_client/base.py:183
#, python-format
msgid "Login request for an invalid connection: '%s'"
msgstr ""
-#: neutron/plugins/vmware/api_client/base.py:197
+#: neutron/plugins/vmware/api_client/base.py:194
msgid "Waiting for auth to complete"
msgstr ""
-#: neutron/plugins/vmware/api_client/base.py:239
+#: neutron/plugins/vmware/api_client/base.py:236
#, python-format
msgid "Invalid conn_params value: '%s'"
msgstr ""
@@ -13527,103 +13204,71 @@ msgid ""
"for NSX communication errors."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:213
+#: neutron/plugins/vmware/plugins/base.py:212
#, python-format
msgid "Unable to process default l2 gw service:%s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:248
-#, python-format
-msgid "Created NSX router port:%s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:250
+#: neutron/plugins/vmware/plugins/base.py:249
#: neutron/plugins/vmware/plugins/service.py:439
#, python-format
msgid "Unable to create port on NSX logical router %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:253
+#: neutron/plugins/vmware/plugins/base.py:252
#, python-format
msgid ""
"Unable to create logical router port for neutron port id %(port_id)s on "
"router %(nsx_router_id)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:332
-#, python-format
-msgid "Attached %(att)s to NSX router port %(port)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:338
+#: neutron/plugins/vmware/plugins/base.py:337
#, python-format
msgid ""
"Unable to plug attachment in NSX logical router port %(r_port_id)s, "
"associated with Neutron %(q_port_id)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:344
+#: neutron/plugins/vmware/plugins/base.py:343
#, python-format
msgid ""
"Unable to plug attachment in router port %(r_port_id)s for neutron port "
"id %(q_port_id)s on router %(router_id)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:390
+#: neutron/plugins/vmware/plugins/base.py:389
msgid "An exception occurred while selecting logical switch for the port"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:430
+#: neutron/plugins/vmware/plugins/base.py:429
#, python-format
msgid ""
"An exception occurred while creating the neutron port %s on the NSX "
"plaform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:442
-#: neutron/plugins/vmware/plugins/base.py:494
-#: neutron/plugins/vmware/plugins/base.py:692
+#: neutron/plugins/vmware/plugins/base.py:441
+#: neutron/plugins/vmware/plugins/base.py:493
+#: neutron/plugins/vmware/plugins/base.py:691
#, python-format
msgid ""
"NSX plugin does not support regular VIF ports on external networks. Port "
"%s will be down."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:463
-#, python-format
-msgid ""
-"_nsx_create_port completed for port %(name)s on network %(network_id)s. "
-"The new port id is %(id)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:474
+#: neutron/plugins/vmware/plugins/base.py:473
#, python-format
msgid ""
"Concurrent network deletion detected; Back-end Port %(nsx_id)s creation "
"to be rolled back for Neutron port: %(neutron_id)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:486
-#, python-format
-msgid "NSX Port %s already gone"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:501
-#, python-format
-msgid "Port '%s' was already deleted on NSX platform"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:508
-#, python-format
-msgid "_nsx_delete_port completed for port %(port_id)s on network %(net_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:513
+#: neutron/plugins/vmware/plugins/base.py:512
#, python-format
msgid "Port %s not found in NSX"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:522
+#: neutron/plugins/vmware/plugins/base.py:521
#, python-format
msgid ""
"Neutron port %(port_id)s not found on NSX backend. Terminating delete "
@@ -13631,329 +13276,266 @@ msgid ""
"%(router_id)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:537
+#: neutron/plugins/vmware/plugins/base.py:536
#, python-format
msgid ""
"Ignoring exception as this means the peer for port '%s' has already been "
"deleted."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:549
+#: neutron/plugins/vmware/plugins/base.py:548
#, python-format
msgid ""
"It is not allowed to create router interface ports on external networks "
"as '%s'"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:574
-#, python-format
-msgid ""
-"_nsx_create_router_port completed for port %(name)s on network "
-"%(network_id)s. The new port id is %(id)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:587
+#: neutron/plugins/vmware/plugins/base.py:586
#, python-format
msgid ""
"device_id field must be populated in order to create an external gateway "
"port for network %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:597
+#: neutron/plugins/vmware/plugins/base.py:596
#, python-format
msgid "The gateway port for the NSX router %s was not found on the backend"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:638
-#, python-format
-msgid ""
-"_nsx_create_ext_gw_port completed on external network %(ext_net_id)s, "
-"attached to router:%(router_id)s. NSX port id is %(nsx_port_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:673
-#: neutron/plugins/vmware/plugins/base.py:1739
+#: neutron/plugins/vmware/plugins/base.py:672
+#: neutron/plugins/vmware/plugins/base.py:1748
#, python-format
msgid "Logical router resource %s not found on NSX platform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:677
-#: neutron/plugins/vmware/plugins/base.py:1743
+#: neutron/plugins/vmware/plugins/base.py:676
+#: neutron/plugins/vmware/plugins/base.py:1752
msgid "Unable to update logical routeron NSX Platform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:679
-#, python-format
-msgid ""
-"_nsx_delete_ext_gw_port completed on external network %(ext_net_id)s, "
-"attached to NSX router:%(router_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:721
-#, python-format
-msgid ""
-"_nsx_create_l2_gw_port completed for port %(name)s on network "
-"%(network_id)s. The new port id is %(id)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:765
+#: neutron/plugins/vmware/plugins/base.py:764
#, python-format
msgid "%s required"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:770
+#: neutron/plugins/vmware/plugins/base.py:769
msgid "Segmentation ID cannot be specified with flat network type"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:774
+#: neutron/plugins/vmware/plugins/base.py:773
msgid "Segmentation ID must be specified with vlan network type"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:778
-#: neutron/plugins/vmware/plugins/base.py:794
+#: neutron/plugins/vmware/plugins/base.py:777
+#: neutron/plugins/vmware/plugins/base.py:793
#, python-format
msgid "%(segmentation_id)s out of range (%(min_id)s through %(max_id)s)"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:800
+#: neutron/plugins/vmware/plugins/base.py:799
#, python-format
msgid "%(net_type_param)s %(net_type_value)s not supported"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:845
-#, python-format
-msgid "No switch has available ports (%d checked)"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:879
+#: neutron/plugins/vmware/plugins/base.py:882
#, python-format
msgid "Maximum number of logical ports reached for logical network %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:925
+#: neutron/plugins/vmware/plugins/base.py:928
#, python-format
msgid ""
"Network with admin_state_up=False are not yet supported by this plugin. "
"Ignoring setting for network %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1003
+#: neutron/plugins/vmware/plugins/base.py:1006
#, python-format
msgid "The following logical switches were not found on the NSX backend:%s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1040
+#: neutron/plugins/vmware/plugins/base.py:1043
msgid "admin_state_up=False networks are not supported."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1060
+#: neutron/plugins/vmware/plugins/base.py:1063
#, python-format
msgid "Unable to find NSX mappings for neutron network:%s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1067
+#: neutron/plugins/vmware/plugins/base.py:1070
#, python-format
msgid ""
"Logical switch update on NSX backend failed. Neutron network "
"id:%(net_id)s; NSX lswitch id:%(lswitch_id)s;Error:%(error)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1138
-#, python-format
-msgid "port created on NSX backend for tenant %(tenant_id)s: (%(id)s)"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1141
+#: neutron/plugins/vmware/plugins/base.py:1150
#, python-format
msgid "Logical switch for network %s was not found in NSX."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1152
+#: neutron/plugins/vmware/plugins/base.py:1161
msgid "Unable to create port or set port attachment in NSX."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1240
-#, python-format
-msgid "Updating port: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1275
+#: neutron/plugins/vmware/plugins/base.py:1284
#, python-format
msgid "Unable to update port id: %s."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1358
+#: neutron/plugins/vmware/plugins/base.py:1367
msgid ""
"Cannot create a distributed router with the NSX platform currently in "
"execution. Please, try without specifying the 'distributed' attribute."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1364
+#: neutron/plugins/vmware/plugins/base.py:1373
msgid "Unable to create logical router on NSX Platform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1375
+#: neutron/plugins/vmware/plugins/base.py:1384
#, python-format
msgid ""
"Unable to create L3GW port on logical router %(router_uuid)s. Verify "
"Default Layer-3 Gateway service %(def_l3_gw_svc)s id is correct"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1385
+#: neutron/plugins/vmware/plugins/base.py:1394
#, python-format
msgid "Unable to create router %s on NSX backend"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1414
-#: neutron/plugins/vmware/plugins/base.py:1499
+#: neutron/plugins/vmware/plugins/base.py:1423
+#: neutron/plugins/vmware/plugins/base.py:1508
#: neutron/plugins/vmware/plugins/service.py:201
#: neutron/plugins/vmware/plugins/service.py:1240
#, python-format
msgid "Network '%s' is not a valid external network"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1463
+#: neutron/plugins/vmware/plugins/base.py:1472
#, python-format
msgid "Failed to set gateway info for router being created:%s - removing router"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1466
+#: neutron/plugins/vmware/plugins/base.py:1475
#, python-format
msgid ""
"Create router failed while setting external gateway. Router:%s has been "
"removed from DB and backend"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1508
+#: neutron/plugins/vmware/plugins/base.py:1517
msgid ""
"'routes' cannot contain route '0.0.0.0/0', this must be updated through "
"the default gateway attribute"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1524
+#: neutron/plugins/vmware/plugins/base.py:1533
#, python-format
msgid "Logical router %s not found on NSX Platform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1528
+#: neutron/plugins/vmware/plugins/base.py:1537
msgid "Unable to update logical router on NSX Platform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1530
+#: neutron/plugins/vmware/plugins/base.py:1539
msgid ""
"Request cannot contain 'routes' with the NSX platform currently in "
"execution. Please, try without specifying the static routes."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1587
+#: neutron/plugins/vmware/plugins/base.py:1596
#, python-format
msgid "Logical router '%s' not found on NSX Platform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1591
+#: neutron/plugins/vmware/plugins/base.py:1600
#, python-format
msgid "Unable to delete logical router '%s' on NSX Platform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1601
+#: neutron/plugins/vmware/plugins/base.py:1610
#, python-format
msgid ""
"Unable to remove NSX mapping for Neutron router %(router_id)s because of "
"the following exception:%(d_exc)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1676
-#, python-format
-msgid ""
-"Add_router_interface completed for subnet:%(subnet_id)s and "
-"router:%(router_id)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1775
+#: neutron/plugins/vmware/plugins/base.py:1784
#, python-format
msgid ""
"An error occurred while removing NAT rules on the NSX platform for "
"floating ip:%s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1780
+#: neutron/plugins/vmware/plugins/base.py:1789
msgid "An incorrect number of matching NAT rules was found on the NSX platform"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1922
+#: neutron/plugins/vmware/plugins/base.py:1931
#, python-format
msgid ""
"An error occurred while creating NAT rules on the NSX platform for "
"floating ip:%(floating_ip)s mapped to internal ip:%(internal_ip)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1928
+#: neutron/plugins/vmware/plugins/base.py:1937
msgid "Failed to update NAT rules for floatingip update"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:1967
-#, python-format
-msgid "The port '%s' is not associated with floating IPs"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:1970
+#: neutron/plugins/vmware/plugins/base.py:1979
#, python-format
msgid "Nat rules not found in nsx for port: %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2010
+#: neutron/plugins/vmware/plugins/base.py:2019
#, python-format
msgid "Unable to create l2_gw_service for: %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2033
+#: neutron/plugins/vmware/plugins/base.py:2042
msgid ""
"Unable to remove gateway service from NSX plaform - the resource was not "
"found"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2062
+#: neutron/plugins/vmware/plugins/base.py:2071
#, python-format
msgid "Unable to update name on NSX backend for network gateway: %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2134
-#: neutron/plugins/vmware/plugins/base.py:2172
-#, python-format
-msgid ""
-"Neutron gateway device: %(neutron_id)s; NSX transport node identifier: "
-"%(nsx_id)s; Operational status: %(status)s."
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2269
+#: neutron/plugins/vmware/plugins/base.py:2278
#, python-format
msgid ""
"Removal of gateway device: %(neutron_id)s failed on NSX backend (NSX "
"id:%(nsx_id)s) because the NSX resource was not found"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2276
+#: neutron/plugins/vmware/plugins/base.py:2285
#, python-format
msgid ""
"Removal of gateway device: %(neutron_id)s failed on NSX backend (NSX "
"id:%(nsx_id)s). Neutron and NSX states have diverged."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2324
+#: neutron/plugins/vmware/plugins/base.py:2333
#, python-format
msgid ""
"Error while updating security profile %(uuid)s with name %(name)s: "
"%(error)s."
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2356
+#: neutron/plugins/vmware/plugins/base.py:2365
#, python-format
msgid ""
"The NSX security profile %(sec_profile_id)s, associated with the Neutron "
"security group %(sec_group_id)s was not found on the backend"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2364
+#: neutron/plugins/vmware/plugins/base.py:2373
#, python-format
msgid ""
"An exception occurred while removing the NSX security profile "
@@ -13961,34 +13543,16 @@ msgid ""
"%(sec_group_id)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2371
+#: neutron/plugins/vmware/plugins/base.py:2380
#, python-format
msgid "Unable to remove security group %s from backend"
msgstr ""
-#: neutron/plugins/vmware/plugins/base.py:2384
+#: neutron/plugins/vmware/plugins/base.py:2393
#, python-format
msgid "Port values not valid for protocol: %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/service.py:144
-#, python-format
-msgid "EDGE: router = %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:175
-msgid "EDGE: _vcns_create_ext_gw_port"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:184
-msgid "EDGE: _vcns_delete_ext_gw_port"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:339
-#, python-format
-msgid "VCNS: delete default gateway %s"
-msgstr ""
-
#: neutron/plugins/vmware/plugins/service.py:424
#, python-format
msgid "An exception occurred while creating a port on lswitch %s"
@@ -14064,10 +13628,6 @@ msgstr ""
msgid "Failed to create pool on vshield edge"
msgstr ""
-#: neutron/plugins/vmware/plugins/service.py:1223
-msgid "create_vip() called"
-msgstr ""
-
#: neutron/plugins/vmware/plugins/service.py:1231
#, python-format
msgid "router_id: %s is not an advanced router!"
@@ -14137,70 +13697,16 @@ msgid ""
"%(vpnservice_id)s on vShield Edge: %(edge_id)s"
msgstr ""
-#: neutron/plugins/vmware/plugins/service.py:1611
-msgid "create_vpnservice() called"
-msgstr ""
-
#: neutron/plugins/vmware/plugins/service.py:1619
#, python-format
msgid "a vpnservice is already associated with the router: %s"
msgstr ""
-#: neutron/plugins/vmware/plugins/service.py:1732
-#, python-format
-msgid "Start deploying %(edge_id)s for router %(name)s"
-msgstr ""
-
#: neutron/plugins/vmware/plugins/service.py:1756
#, python-format
msgid "Router %s not found"
msgstr ""
-#: neutron/plugins/vmware/plugins/service.py:1759
-#, python-format
-msgid "Successfully deployed %(edge_id)s for router %(name)s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1775
-#, python-format
-msgid "Failed to deploy Edge for router %s"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1791
-#, python-format
-msgid "interface_update_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1794
-#, python-format
-msgid "snat_create_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1797
-#, python-format
-msgid "snat_delete_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1800
-#, python-format
-msgid "dnat_create_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1803
-#, python-format
-msgid "dnat_delete_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1806
-#, python-format
-msgid "routes_update_result %d"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/service.py:1809
-#, python-format
-msgid "nat_update_result %d"
-msgstr ""
-
#: neutron/plugins/vmware/shell/commands.py:24
#, python-format
msgid ""
@@ -14236,251 +13742,168 @@ msgstr ""
msgid "Migration has been successful:\n"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:135
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:132
#, python-format
msgid ""
"VCNS: Failed to get edge status:\n"
"%s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:162
-#, python-format
-msgid "VCNS: start updating vnic %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:167
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:164
#, python-format
msgid ""
"VCNS: Failed to update vnic %(config)s:\n"
"%(response)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:173
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:170
#, python-format
msgid "VCNS: Failed to update vnic %d"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:181
-#, python-format
-msgid "VCNS: update vnic %(index)d: %(addr)s %(netmask)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:190
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:187
#, python-format
msgid "Vnic %d currently not supported"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:211
-#, python-format
-msgid "VCNS: start deploying edge %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:219
-#, python-format
-msgid "VCNS: deploying edge %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:224
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:221
#, python-format
msgid "VCNS: deploy edge failed for router %s."
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:243
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:240
#, python-format
msgid "VCNS: Edge %s status query failed."
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:248
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:245
#, python-format
msgid "VCNS: Unable to retrieve edge %(edge_id)s status. Retry %(retries)d."
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:255
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:252
#, python-format
msgid "VCNS: Unable to retrieve edge %s status. Abort."
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:259
-#, python-format
-msgid "VCNS: Edge %s status"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:266
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:263
#, python-format
msgid "VCNS: Failed to deploy edge %(edge_id)s for %(name)s, status %(status)d"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:273
-#, python-format
-msgid "VCNS: Edge %(edge_id)s deployed for router %(name)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:280
-#, python-format
-msgid "VCNS: start destroying edge %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:288
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:285
#, python-format
msgid ""
"VCNS: Failed to delete %(edge_id)s:\n"
"%(response)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:294
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:291
#, python-format
msgid "VCNS: Failed to delete %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:304
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:301
#, python-format
msgid ""
"VCNS: Failed to get edges:\n"
"%s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:382
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:379
#, python-format
msgid ""
"VCNS: Failed to get nat config:\n"
"%s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:389
-#, python-format
-msgid "VCNS: start creating nat rules: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:405
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:530
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:402
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:527
#, python-format
msgid ""
"VCNS: Failed to create snat rule:\n"
"%s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:413
-#, python-format
-msgid "VCNS: create snat rule %(src)s/%(translated)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:436
-#, python-format
-msgid "VCNS: start deleting %(type)s rules: %(addr)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:447
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:444
#, python-format
msgid ""
"VCNS: Failed to delete snat rule:\n"
"%s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:454
-#, python-format
-msgid "VCNS: delete snat rule %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:472
-#, python-format
-msgid "VCNS: create dnat rule %(dst)s/%(translated)s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:493
-#, python-format
-msgid "VCNS: delete dnat rule %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:517
-#, python-format
-msgid "VCNS: start updating nat rules: %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:538
-#, python-format
-msgid ""
-"VCNS: update nat rule\n"
-"SNAT:%(snat)s\n"
-"DNAT:%(dnat)s\n"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:576
-#, python-format
-msgid "VCNS: start updating routes for %s"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:600
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:597
#, python-format
msgid ""
"VCNS: Failed to update routes:\n"
"%s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:652
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:649
msgid "Failed to get service config"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:664
+#: neutron/plugins/vmware/vshield/edge_appliance_driver.py:661
msgid "Failed to enable loadbalancer service config"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:41
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:39
#, python-format
msgid "Invalid action value %s in a firewall rule"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:50
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:48
#, python-format
msgid "Invalid action value %s in a vshield firewall rule"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:190
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:188
#, python-format
msgid "Failed to get firewall with edge id: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:208
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:206
#, python-format
msgid "No rule id:%s found in the edge_firewall_binding"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:218
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:216
#, python-format
msgid "Failed to get firewall rule: %(rule_id)s with edge_id: %(edge_id)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:234
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:232
#, python-format
msgid "Failed to update firewall with edge_id: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:246
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:244
#, python-format
msgid "Failed to delete firewall with edge_id:%s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:260
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:258
#, python-format
msgid "Failed to update firewall rule: %(rule_id)s with edge_id: %(edge_id)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:273
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:271
#, python-format
msgid "Failed to delete firewall rule: %(rule_id)s with edge_id: %(edge_id)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:290
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:318
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:288
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:316
#, python-format
msgid "Failed to add firewall rule above: %(rule_id)s with edge_id: %(edge_id)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:329
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:327
#, python-format
msgid "Failed to append a firewall rulewith edge_id: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:350
+#: neutron/plugins/vmware/vshield/edge_firewall_driver.py:348
msgid "Can't execute insert rule operation without reference rule_id"
msgstr ""
@@ -14538,156 +13961,141 @@ msgstr ""
msgid "Failed to delete ipsec vpn configuration with edge_id: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:154
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:152
#, python-format
msgid "Invalid %(protocol)s persistence method: %(type)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:180
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:178
#, python-format
msgid "Failed to create app profile on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:191
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:189
#, python-format
msgid "Failed to create vip on vshield edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:209
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:207
#, python-format
msgid "vip_binding not found with id: %(id)s edge_id: %(edge_id)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:226
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:224
msgid "Failed to get vip on edge"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:243
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:241
#, python-format
msgid "Failed to update app profile on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:251
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:249
#, python-format
msgid "Failed to update vip on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:262
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:260
#, python-format
msgid "vip not found on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:265
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:263
#, python-format
msgid "Failed to delete vip on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:270
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:268
#, python-format
msgid "app profile not found on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:273
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:271
#, python-format
msgid "Failed to delete app profile on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:284
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:282
msgid "Failed to create pool"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:301
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:299
#, python-format
msgid "pool_binding not found with id: %(id)s edge_id: %(edge_id)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:311
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:309
msgid "Failed to get pool on edge"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:323
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:321
msgid "Failed to update pool"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:333
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:331
msgid "Failed to delete pool"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:343
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:341
#, python-format
msgid "Failed to create monitor on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:361
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:359
#, python-format
msgid "monitor_binding not found with id: %(id)s edge_id: %(edge_id)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:371
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:369
#, python-format
msgid "Failed to get monitor on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:388
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:386
#, python-format
msgid "Failed to update monitor on edge: %s"
msgstr ""
-#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:399
+#: neutron/plugins/vmware/vshield/edge_loadbalancer_driver.py:397
msgid "Failed to delete monitor"
msgstr ""
-#: neutron/plugins/vmware/vshield/vcns.py:54
-#, python-format
-msgid "VcnsApiHelper('%(method)s', '%(uri)s', '%(body)s')"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/vcns.py:62
-#, python-format
-msgid "Header: '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/vcns.py:63
-#, python-format
-msgid "Content: '%s'"
-msgstr ""
-
-#: neutron/plugins/vmware/vshield/common/exceptions.py:35
+#: neutron/plugins/vmware/vshield/common/exceptions.py:33
#, python-format
msgid "%(resource)s not found: %(msg)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/common/exceptions.py:39
+#: neutron/plugins/vmware/vshield/common/exceptions.py:37
#, python-format
msgid "An unknown exception %(status)s occurred: %(response)s."
msgstr ""
-#: neutron/plugins/vmware/vshield/common/exceptions.py:50
+#: neutron/plugins/vmware/vshield/common/exceptions.py:48
#, python-format
msgid "Resource %(uri)s has been redirected"
msgstr ""
-#: neutron/plugins/vmware/vshield/common/exceptions.py:54
+#: neutron/plugins/vmware/vshield/common/exceptions.py:52
#, python-format
msgid "Request %(uri)s is Bad, response %(response)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/common/exceptions.py:58
+#: neutron/plugins/vmware/vshield/common/exceptions.py:56
#, python-format
msgid "Forbidden: %(uri)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/common/exceptions.py:62
+#: neutron/plugins/vmware/vshield/common/exceptions.py:60
#, python-format
msgid "Resource %(uri)s not found"
msgstr ""
-#: neutron/plugins/vmware/vshield/common/exceptions.py:66
+#: neutron/plugins/vmware/vshield/common/exceptions.py:64
#, python-format
msgid "Media Type %(uri)s is not supported"
msgstr ""
-#: neutron/plugins/vmware/vshield/common/exceptions.py:70
+#: neutron/plugins/vmware/vshield/common/exceptions.py:68
#, python-format
msgid "Service Unavailable: %(uri)s"
msgstr ""
@@ -14719,12 +14127,6 @@ msgstr ""
msgid "Task %(task)s encountered exception in %(cb)s"
msgstr ""
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:194
-#: neutron/plugins/vmware/vshield/tasks/tasks.py:213
-#, python-format
-msgid "Task %(task)s return %(status)s"
-msgstr ""
-
#: neutron/plugins/vmware/vshield/tasks/tasks.py:296
msgid "Stopping TaskManager"
msgstr ""
@@ -14885,372 +14287,372 @@ msgstr ""
msgid "Default provider is not specified for service type %s"
msgstr ""
-#: neutron/services/firewall/fwaas_plugin.py:42
+#: neutron/services/firewall/fwaas_plugin.py:40
msgid "set_firewall_status() called"
msgstr ""
-#: neutron/services/firewall/fwaas_plugin.py:50
+#: neutron/services/firewall/fwaas_plugin.py:48
#, python-format
msgid "Firewall %(fw_id)s in PENDING_DELETE state, not changing to %(status)s"
msgstr ""
-#: neutron/services/firewall/fwaas_plugin.py:63
+#: neutron/services/firewall/fwaas_plugin.py:61
msgid "firewall_deleted() called"
msgstr ""
-#: neutron/services/firewall/fwaas_plugin.py:71
+#: neutron/services/firewall/fwaas_plugin.py:69
#, python-format
msgid "Firewall %(fw)s unexpectedly deleted by agent, status was %(status)s"
msgstr ""
-#: neutron/services/firewall/fwaas_plugin.py:79
+#: neutron/services/firewall/fwaas_plugin.py:77
msgid "get_firewalls_for_tenant() called"
msgstr ""
-#: neutron/services/firewall/fwaas_plugin.py:88
+#: neutron/services/firewall/fwaas_plugin.py:86
msgid "get_firewalls_for_tenant_without_rules() called"
msgstr ""
-#: neutron/services/firewall/fwaas_plugin.py:94
+#: neutron/services/firewall/fwaas_plugin.py:92
msgid "get_tenants_with_firewalls() called"
msgstr ""
-#: neutron/services/firewall/fwaas_plugin.py:139
+#: neutron/services/firewall/fwaas_plugin.py:137
#, python-format
msgid ""
"Exceeded allowed count of firewalls for tenant %(tenant_id)s. Only one "
"firewall is supported per tenant."
msgstr ""
-#: neutron/services/firewall/agents/firewall_agent_api.py:31
+#: neutron/services/firewall/agents/firewall_agent_api.py:27
msgid "Name of the FWaaS Driver"
msgstr ""
-#: neutron/services/firewall/agents/firewall_agent_api.py:35
+#: neutron/services/firewall/agents/firewall_agent_api.py:31
msgid "Enable FWaaS"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:43
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:39
msgid "Retrieve Firewall with rules from Plugin"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:51
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:47
msgid "Retrieve Tenants with Firewalls configured from Plugin"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:62
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:58
msgid "Initializing firewall agent"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:73
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:69
msgid ""
"FWaaS plugin is configured in the server side, but FWaaS is disabled in "
"L3-agent."
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:83
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:79
#, python-format
msgid "FWaaS Driver Loaded: '%s'"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:86
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:82
#, python-format
msgid "Error importing FWaaS device driver: %s"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:123
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:119
#, python-format
msgid "%(func_name)s from agent for fw: %(fwid)s"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:131
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:127
#, python-format
msgid "No Routers on tenant: %s"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:138
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:278
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:134
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:274
#, python-format
msgid "Apply fw on Router List: '%s'"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:151
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:147
#, python-format
msgid "Firewall Driver Error for %(func_name)s for fw: %(fwid)s"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:166
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:162
#, python-format
msgid "FWaaS RPC failure in %(func_name)s for fw: %(fwid)s"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:186
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:205
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:182
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:201
#, python-format
msgid "Firewall Driver Error on fw state %(fwmsg)s for fw: %(fwid)s"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:217
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:213
#, python-format
msgid "Process router add, router_id: '%s'"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:228
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:224
#, python-format
msgid "Process router add, fw_list: '%s'"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:245
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:241
#, python-format
msgid "FWaaS RPC info call failed for '%s'."
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:260
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:256
#, python-format
msgid "Tenants with Firewalls: '%s'"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:270
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:266
#, python-format
msgid "Router List: '%s'"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:272
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:268
#, python-format
msgid "fw_list: '%s'"
msgstr ""
-#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:289
+#: neutron/services/firewall/agents/l3reference/firewall_l3_agent.py:285
msgid "Failed fwaas process services sync"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:29
+#: neutron/services/firewall/agents/varmour/varmour_api.py:27
msgid "vArmour director ip"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:31
+#: neutron/services/firewall/agents/varmour/varmour_api.py:29
msgid "vArmour director port"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:33
+#: neutron/services/firewall/agents/varmour/varmour_api.py:31
msgid "vArmour director username"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:35
+#: neutron/services/firewall/agents/varmour/varmour_api.py:33
msgid "vArmour director password"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:45
+#: neutron/services/firewall/agents/varmour/varmour_api.py:43
msgid "An unknown exception."
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:59
+#: neutron/services/firewall/agents/varmour/varmour_api.py:57
msgid "Invalid login credential."
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:65
+#: neutron/services/firewall/agents/varmour/varmour_api.py:63
msgid "vArmourRestAPI: started"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:98
+#: neutron/services/firewall/agents/varmour/varmour_api.py:96
#, python-format
msgid "vArmourRestAPI: %(server)s %(port)s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:104
+#: neutron/services/firewall/agents/varmour/varmour_api.py:102
#, python-format
msgid "vArmourRestAPI Sending: %(method)s %(action)s %(headers)s %(body_data)s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:115
+#: neutron/services/firewall/agents/varmour/varmour_api.py:113
#, python-format
msgid "vArmourRestAPI Response: %(status)s %(resp_str)s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_api.py:123
+#: neutron/services/firewall/agents/varmour/varmour_api.py:121
msgid "vArmourRestAPI: Could not establish HTTP connection"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:50
+#: neutron/services/firewall/agents/varmour/varmour_router.py:47
msgid "vArmourL3NATAgent: __init__"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:64
+#: neutron/services/firewall/agents/varmour/varmour_router.py:61
#, python-format
msgid "_router_added: %s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:71
+#: neutron/services/firewall/agents/varmour/varmour_router.py:68
#, python-format
msgid "_router_removed: %s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:112
+#: neutron/services/firewall/agents/varmour/varmour_router.py:109
#, python-format
msgid "_va_unset_zone_interfaces: %s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:144
+#: neutron/services/firewall/agents/varmour/varmour_router.py:141
#, python-format
msgid "_va_set_interface_ip: %(pif)s %(cidr)s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:164
+#: neutron/services/firewall/agents/varmour/varmour_router.py:161
#, python-format
msgid "_va_config_trusted_zone: %s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:195
+#: neutron/services/firewall/agents/varmour/varmour_router.py:192
#, python-format
msgid "_va_config_untrusted_zone: %s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:210
+#: neutron/services/firewall/agents/varmour/varmour_router.py:207
#, python-format
msgid "_va_config_untrusted_zone: gw=%r"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:223
+#: neutron/services/firewall/agents/varmour/varmour_router.py:220
#, python-format
msgid "_va_config_router_snat_rules: %s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:255
+#: neutron/services/firewall/agents/varmour/varmour_router.py:252
#, python-format
msgid "_va_config_floating_ips: %s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:277
+#: neutron/services/firewall/agents/varmour/varmour_router.py:274
#, python-format
msgid "process_router: %s"
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:288
+#: neutron/services/firewall/agents/varmour/varmour_router.py:285
msgid "Unable to parse interface mapping."
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:291
+#: neutron/services/firewall/agents/varmour/varmour_router.py:288
msgid "Unable to read interface mapping."
msgstr ""
-#: neutron/services/firewall/agents/varmour/varmour_router.py:310
+#: neutron/services/firewall/agents/varmour/varmour_router.py:307
#, python-format
msgid "external_gateway_added: %s"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:51
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:49
msgid "Initializing fwaas iptables driver"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:54
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:52
#, python-format
msgid "Creating firewall %(fw_id)s for tenant %(tid)s)"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:63
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:61
#, python-format
msgid "Failed to create firewall: %s"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:92
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:90
#, python-format
msgid "Deleting firewall %(fw_id)s for tenant %(tid)s)"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:107
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:105
#, python-format
msgid "Failed to delete firewall: %s"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:111
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:109
#, python-format
msgid "Updating firewall %(fw_id)s for tenant %(tid)s)"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:120
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:118
#, python-format
msgid "Failed to update firewall: %s"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:124
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:122
#, python-format
msgid "Applying firewall %(fw_id)s for tenant %(tid)s)"
msgstr ""
-#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:145
+#: neutron/services/firewall/drivers/linux/iptables_fwaas.py:143
#, python-format
msgid "Failed to apply default policy on firewall: %s"
msgstr ""
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:28
+#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:26
msgid "Initializing fwaas vArmour driver"
msgstr ""
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:33
+#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:31
#, python-format
msgid "create_firewall (%s)"
msgstr ""
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:38
+#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:36
#, python-format
msgid "update_firewall (%s)"
msgstr ""
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:46
+#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:44
#, python-format
msgid "delete_firewall (%s)"
msgstr ""
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:51
+#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:49
#, python-format
msgid "apply_default_policy (%s)"
msgstr ""
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:61
+#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:59
#, python-format
msgid "Updating firewall (%s)"
msgstr ""
-#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:110
+#: neutron/services/firewall/drivers/varmour/varmour_fwaas.py:108
msgid "Unsupported IP version rule."
msgstr ""
-#: neutron/services/l3_router/l3_apic.py:60
+#: neutron/services/l3_router/l3_apic.py:57
msgid "L3 Router Service Plugin for basic L3 using the APIC"
msgstr ""
-#: neutron/services/l3_router/l3_arista.py:116
+#: neutron/services/l3_router/l3_arista.py:112
#, python-format
msgid "Error creating router on Arista HW router=%s "
msgstr ""
-#: neutron/services/l3_router/l3_arista.py:139
+#: neutron/services/l3_router/l3_arista.py:135
#, python-format
msgid "Error updating router on Arista HW router=%s "
msgstr ""
-#: neutron/services/l3_router/l3_arista.py:154
+#: neutron/services/l3_router/l3_arista.py:150
#, python-format
msgid "Error deleting router on Arista HW router %(r)s exception=%(e)s"
msgstr ""
-#: neutron/services/l3_router/l3_arista.py:200
+#: neutron/services/l3_router/l3_arista.py:196
#, python-format
msgid "Error Adding subnet %(subnet)s to router %(router_id)s on Arista HW"
msgstr ""
-#: neutron/services/l3_router/l3_arista.py:234
+#: neutron/services/l3_router/l3_arista.py:230
#, python-format
msgid ""
"Error removing interface %(interface)s from router %(router_id)s on "
"Arista HWException =(exc)s"
msgstr ""
-#: neutron/services/l3_router/l3_arista.py:249
+#: neutron/services/l3_router/l3_arista.py:245
msgid "Syncing Neutron Router DB <-> EOS"
msgstr ""
-#: neutron/services/l3_router/l3_arista.py:280
+#: neutron/services/l3_router/l3_arista.py:276
#, python-format
msgid "Error Adding interface %(subnet_id)s to router %(router_id)s on Arista HW"
msgstr ""
@@ -15312,226 +14714,226 @@ msgstr ""
msgid "Pool %(pool_id)s is scheduled to lbaas agent %(agent_id)s"
msgstr ""
-#: neutron/services/loadbalancer/plugin.py:80
+#: neutron/services/loadbalancer/plugin.py:78
#, python-format
msgid "Delete associated loadbalancer pools before removing providers %s"
msgstr ""
-#: neutron/services/loadbalancer/plugin.py:89
+#: neutron/services/loadbalancer/plugin.py:87
#, python-format
msgid "Error retrieving driver for provider %s"
msgstr ""
-#: neutron/services/loadbalancer/plugin.py:97
+#: neutron/services/loadbalancer/plugin.py:95
#, python-format
msgid "Error retrieving provider for pool %s"
msgstr ""
-#: neutron/services/loadbalancer/plugin.py:188
+#: neutron/services/loadbalancer/plugin.py:186
#, python-format
msgid "Failed to delete pool %s, putting it in ERROR state"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent.py:36
+#: neutron/services/loadbalancer/agent/agent.py:34
msgid "Seconds between periodic task runs"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:39
+#: neutron/services/loadbalancer/agent/agent_manager.py:37
msgid "Drivers used to manage loadbalancing devices"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:45
+#: neutron/services/loadbalancer/agent/agent_manager.py:43
#, python-format
msgid "Unknown device with pool_id %(pool_id)s"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:94
+#: neutron/services/loadbalancer/agent/agent_manager.py:92
#, python-format
msgid "Error importing loadbalancer device driver: %s"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:101
+#: neutron/services/loadbalancer/agent/agent_manager.py:99
#, python-format
msgid "Multiple device drivers with the same name found: %s"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:141
+#: neutron/services/loadbalancer/agent/agent_manager.py:139
#, python-format
msgid "Error updating statistics on pool %s"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:157
+#: neutron/services/loadbalancer/agent/agent_manager.py:155
msgid "Unable to retrieve ready devices"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:174
-#: neutron/services/loadbalancer/agent/agent_manager.py:239
+#: neutron/services/loadbalancer/agent/agent_manager.py:172
+#: neutron/services/loadbalancer/agent/agent_manager.py:237
#, python-format
msgid "No device driver on agent: %s."
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:184
+#: neutron/services/loadbalancer/agent/agent_manager.py:182
#, python-format
msgid "Unable to deploy instance for pool: %s"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:194
+#: neutron/services/loadbalancer/agent/agent_manager.py:192
#, python-format
msgid "Unable to destroy device for pool: %s"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:207
+#: neutron/services/loadbalancer/agent/agent_manager.py:205
#, python-format
msgid "%(operation)s %(obj)s %(id)s failed on device driver %(driver)s"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:333
+#: neutron/services/loadbalancer/agent/agent_manager.py:331
#, python-format
msgid "Destroying pool %s due to agent disabling"
msgstr ""
-#: neutron/services/loadbalancer/agent/agent_manager.py:336
+#: neutron/services/loadbalancer/agent/agent_manager.py:334
#, python-format
msgid "Agent_updated by server side %s!"
msgstr ""
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:40
+#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:38
msgid "Driver to use for scheduling pool to a default loadbalancer agent"
msgstr ""
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:48
+#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:46
msgid "Device driver for agent should be specified in plugin driver."
msgstr ""
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:72
+#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:70
#, python-format
msgid "Multiple lbaas agents found on host %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:152
+#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:150
#, python-format
msgid "Unknown object type: %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:163
+#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:161
#, python-format
msgid ""
"Cannot update status: %(obj_type)s %(obj_id)s not found in the DB, it was"
" probably deleted concurrently"
msgstr ""
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:186
+#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:184
#, python-format
msgid "Unable to find port %s to plug."
msgstr ""
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:210
-#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:227
+#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:208
+#: neutron/services/loadbalancer/drivers/common/agent_driver_base.py:225
#, python-format
msgid ""
"Unable to find port %s to unplug. This can occur when the Vip has been "
"deleted first."
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/config.py:32
+#: neutron/services/loadbalancer/drivers/embrane/config.py:30
msgid "Load Balancer image id (Embrane LB)"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/config.py:34
+#: neutron/services/loadbalancer/drivers/embrane/config.py:32
msgid "In band Security Zone id for LBs"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/config.py:36
+#: neutron/services/loadbalancer/drivers/embrane/config.py:34
msgid "Out of band Security Zone id for LBs"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/config.py:38
+#: neutron/services/loadbalancer/drivers/embrane/config.py:36
msgid "Management Security Zone id for LBs"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/config.py:40
+#: neutron/services/loadbalancer/drivers/embrane/config.py:38
msgid "Dummy user traffic Security Zone id for LBs"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/config.py:44
+#: neutron/services/loadbalancer/drivers/embrane/config.py:42
msgid "choose LB image flavor to use, accepted values: small, medium"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/config.py:47
+#: neutron/services/loadbalancer/drivers/embrane/config.py:45
msgid "resource synchronization interval in seconds"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:51
+#: neutron/services/loadbalancer/drivers/embrane/constants.py:49
#, python-format
msgid "%s, probably was cancelled through the heleos UI"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:58
+#: neutron/services/loadbalancer/drivers/embrane/constants.py:56
#, python-format
msgid ""
"Failed to delete the backend load balancer for reason %s. Please remove "
"it manually through the heleos UI"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/constants.py:61
+#: neutron/services/loadbalancer/drivers/embrane/constants.py:59
#, python-format
msgid ""
"No subnet is associated to member %s (required to identify the proper "
"load balancer port)"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/driver.py:87
+#: neutron/services/loadbalancer/drivers/embrane/driver.py:85
msgid "Connection limit is not supported by Embrane LB"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/driver.py:93
+#: neutron/services/loadbalancer/drivers/embrane/driver.py:91
#, python-format
msgid "Session persistence %s not supported by Embrane LBaaS"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/driver.py:131
+#: neutron/services/loadbalancer/drivers/embrane/driver.py:129
#, python-format
msgid "Subnet assigned to pool %s doesn't exist, backend port can't be created"
msgstr ""
-#: neutron/services/loadbalancer/drivers/embrane/agent/lb_operations.py:111
+#: neutron/services/loadbalancer/drivers/embrane/agent/lb_operations.py:109
#, python-format
msgid ""
"The load balancer %s had no physical representation, likely already "
"deleted"
msgstr ""
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:46
+#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:45
msgid "Location to store config and state files"
msgstr ""
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:53
+#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:52
msgid "The user group"
msgstr ""
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:59
+#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:58
msgid ""
"When delete and re-add the same vip, send this many gratuitous ARPs to "
"flush the ARP cache in the Router. Set it below or equal to 0 to disable "
"this feature."
msgstr ""
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:76
+#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:75
#, python-format
msgid "Error importing interface driver: %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:172
+#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:171
#, python-format
msgid "Stats socket not found for pool %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:214
+#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:213
#, python-format
msgid "Error while connecting to stats socket: %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:393
+#: neutron/services/loadbalancer/drivers/haproxy/namespace_driver.py:392
#, python-format
msgid "Unable to kill haproxy process: %s"
msgstr ""
@@ -15715,331 +15117,331 @@ msgstr ""
msgid "Removing SNAT port for subnet %s as this is the last pool using it..."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:62
+#: neutron/services/loadbalancer/drivers/radware/driver.py:60
msgid "IP address of vDirect server."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:64
+#: neutron/services/loadbalancer/drivers/radware/driver.py:62
msgid "IP address of secondary vDirect server."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:67
+#: neutron/services/loadbalancer/drivers/radware/driver.py:65
msgid "vDirect user name."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:70
+#: neutron/services/loadbalancer/drivers/radware/driver.py:68
msgid "vDirect user password."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:73
+#: neutron/services/loadbalancer/drivers/radware/driver.py:71
msgid "Service ADC type. Default: VA."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:76
+#: neutron/services/loadbalancer/drivers/radware/driver.py:74
msgid "Service ADC version."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:79
+#: neutron/services/loadbalancer/drivers/radware/driver.py:77
msgid "Enables or disables the Service HA pair. Default: False."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:83
+#: neutron/services/loadbalancer/drivers/radware/driver.py:81
msgid "Service throughput. Default: 1000."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:86
+#: neutron/services/loadbalancer/drivers/radware/driver.py:84
msgid "Service SSL throughput. Default: 100."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:89
+#: neutron/services/loadbalancer/drivers/radware/driver.py:87
msgid "Service compression throughput. Default: 100."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:92
+#: neutron/services/loadbalancer/drivers/radware/driver.py:90
msgid "Size of service cache. Default: 20."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:95
+#: neutron/services/loadbalancer/drivers/radware/driver.py:93
msgid "Name of l2_l3 workflow. Default: openstack_l2_l3."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:99
+#: neutron/services/loadbalancer/drivers/radware/driver.py:97
msgid "Name of l4 workflow. Default: openstack_l4."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:107
+#: neutron/services/loadbalancer/drivers/radware/driver.py:105
msgid "Parameter for l2_l3 workflow constructor."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:114
+#: neutron/services/loadbalancer/drivers/radware/driver.py:112
msgid "Parameter for l2_l3 workflow setup."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:117
+#: neutron/services/loadbalancer/drivers/radware/driver.py:115
msgid "List of actions that are not pushed to the completion queue."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:121
+#: neutron/services/loadbalancer/drivers/radware/driver.py:119
msgid "Name of the l4 workflow action. Default: BaseCreate."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:125
+#: neutron/services/loadbalancer/drivers/radware/driver.py:123
msgid "Resource pool IDs."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:128
+#: neutron/services/loadbalancer/drivers/radware/driver.py:126
msgid "A required VLAN for the interswitch link to use."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:131
+#: neutron/services/loadbalancer/drivers/radware/driver.py:129
msgid ""
"Enable or disable Alteon interswitch link for stateful session failover. "
"Default: False."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:232
+#: neutron/services/loadbalancer/drivers/radware/driver.py:230
#, python-format
msgid ""
"vip: %(vip)s, extended_vip: %(extended_vip)s, service_name: "
"%(service_name)s, "
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:266
+#: neutron/services/loadbalancer/drivers/radware/driver.py:264
#, python-format
msgid "Retrieved pip nport: %(port)r for vip: %(vip)s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:274
+#: neutron/services/loadbalancer/drivers/radware/driver.py:272
#, python-format
msgid "Found no pip nports associated with vip: %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:283
+#: neutron/services/loadbalancer/drivers/radware/driver.py:281
#, python-format
msgid "Failed to remove workflow %s. Going to set vip to ERROR status"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:297
+#: neutron/services/loadbalancer/drivers/radware/driver.py:295
#, python-format
msgid "pip nport id: %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:301
+#: neutron/services/loadbalancer/drivers/radware/driver.py:299
#, python-format
msgid "pip nport delete failed: %r"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:389
+#: neutron/services/loadbalancer/drivers/radware/driver.py:387
#, python-format
msgid ""
"_handle_pool_health_monitor. health_monitor = %(hm_id)s pool_id = "
"%(pool_id)s delete = %(delete)s vip_id = %(vip_id)s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:420
+#: neutron/services/loadbalancer/drivers/radware/driver.py:418
msgid "Starting operation completion handling thread"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:450
+#: neutron/services/loadbalancer/drivers/radware/driver.py:448
#, python-format
msgid "_update_workflow response: %s "
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:459
-#: neutron/services/loadbalancer/drivers/radware/driver.py:490
+#: neutron/services/loadbalancer/drivers/radware/driver.py:457
+#: neutron/services/loadbalancer/drivers/radware/driver.py:488
#, python-format
msgid "Pushing operation %s to the queue"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:467
+#: neutron/services/loadbalancer/drivers/radware/driver.py:465
#, python-format
msgid "Remove the workflow %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:475
+#: neutron/services/loadbalancer/drivers/radware/driver.py:473
#, python-format
msgid "Post-remove workflow function %r completed"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:479
+#: neutron/services/loadbalancer/drivers/radware/driver.py:477
#, python-format
msgid "Post-remove workflow function %r failed"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:596
+#: neutron/services/loadbalancer/drivers/radware/driver.py:594
#, python-format
msgid "create_workflow response: %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:650
+#: neutron/services/loadbalancer/drivers/radware/driver.py:648
#, python-format
msgid "Could not find or allocate IP address for subnet id %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:685
+#: neutron/services/loadbalancer/drivers/radware/driver.py:683
#, python-format
msgid ""
"vDirectRESTClient:init server=%(server)s, secondary "
"server=%(sec_server)s, port=%(port)d, ssl=%(ssl)r"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:691
+#: neutron/services/loadbalancer/drivers/radware/driver.py:689
#, python-format
msgid "Fliping servers. Current is: %(server)s, switching to %(secondary)s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:704
+#: neutron/services/loadbalancer/drivers/radware/driver.py:702
msgid ""
"REST client is not able to recover since only one vDirect server is "
"configured."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:712
+#: neutron/services/loadbalancer/drivers/radware/driver.py:710
#, python-format
msgid "vDirect server is not responding (%s)."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:716
+#: neutron/services/loadbalancer/drivers/radware/driver.py:714
#, python-format
msgid "vDirect server is not active (%s)."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:744
+#: neutron/services/loadbalancer/drivers/radware/driver.py:742
msgid "vdirectRESTClient: Could not establish HTTPS connection"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:751
+#: neutron/services/loadbalancer/drivers/radware/driver.py:749
msgid "vdirectRESTClient: Could not establish HTTP connection"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:768
+#: neutron/services/loadbalancer/drivers/radware/driver.py:766
#, python-format
msgid "vdirectRESTClient: %(action)s failure, %(e)r"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:836
+#: neutron/services/loadbalancer/drivers/radware/driver.py:834
#, python-format
msgid ""
"Operation %(oper)s is completed after %(sec_to_completion)d sec with "
"success status: %(success)s :"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:848
+#: neutron/services/loadbalancer/drivers/radware/driver.py:846
#, python-format
msgid "Operation %(operation)s failed. Reason: %(msg)s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:880
+#: neutron/services/loadbalancer/drivers/radware/driver.py:878
#, python-format
msgid "Operation %s is not completed yet.."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:895
+#: neutron/services/loadbalancer/drivers/radware/driver.py:893
msgid "Exception was thrown inside OperationCompletionHandler"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:904
+#: neutron/services/loadbalancer/drivers/radware/driver.py:902
#, python-format
msgid "Post-operation function %(func)r completed after operation %(oper)r"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:910
+#: neutron/services/loadbalancer/drivers/radware/driver.py:908
#, python-format
msgid "Post-operation function %(func)r failed after operation %(oper)r"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:951
+#: neutron/services/loadbalancer/drivers/radware/driver.py:949
#, python-format
msgid "_update: %s "
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/driver.py:991
+#: neutron/services/loadbalancer/drivers/radware/driver.py:989
#, python-format
msgid "_remove_object_from_db %s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:22
+#: neutron/services/loadbalancer/drivers/radware/exceptions.py:20
msgid "An unknown exception occurred in Radware LBaaS provider."
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:26
+#: neutron/services/loadbalancer/drivers/radware/exceptions.py:24
msgid ""
"vDirect user/password missing. Specify in configuration file, under "
"[radware] section"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:31
+#: neutron/services/loadbalancer/drivers/radware/exceptions.py:29
#, python-format
msgid ""
"Workflow %(workflow)s is missing on vDirect server. Upload missing "
"workflow"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:36
+#: neutron/services/loadbalancer/drivers/radware/exceptions.py:34
#, python-format
msgid ""
"REST request failed with status %(status)s. Reason: %(reason)s, "
"Description: %(description)s. Success status codes are %(success_codes)s"
msgstr ""
-#: neutron/services/loadbalancer/drivers/radware/exceptions.py:42
+#: neutron/services/loadbalancer/drivers/radware/exceptions.py:40
#, python-format
msgid "%(operation)s operation is not supported for %(entity)s."
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:70
+#: neutron/services/metering/agents/metering_agent.py:68
msgid "Metering driver"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:72
+#: neutron/services/metering/agents/metering_agent.py:70
msgid "Interval between two metering measures"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:74
+#: neutron/services/metering/agents/metering_agent.py:72
msgid "Interval between two metering reports"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:98
+#: neutron/services/metering/agents/metering_agent.py:96
#, python-format
msgid "Loading Metering driver %s"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:100
+#: neutron/services/metering/agents/metering_agent.py:98
msgid "A metering driver must be specified"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:115
+#: neutron/services/metering/agents/metering_agent.py:113
#, python-format
msgid "Send metering report: %s"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:179
+#: neutron/services/metering/agents/metering_agent.py:177
#, python-format
msgid "Driver %(driver)s does not implement %(func)s"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:183
+#: neutron/services/metering/agents/metering_agent.py:181
#, python-format
msgid "Driver %(driver)s:%(func)s runtime error"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:218
+#: neutron/services/metering/agents/metering_agent.py:216
msgid "Get router traffic counters"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:222
+#: neutron/services/metering/agents/metering_agent.py:220
msgid "Update metering rules from agent"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:227
+#: neutron/services/metering/agents/metering_agent.py:225
msgid "Creating a metering label from agent"
msgstr ""
-#: neutron/services/metering/agents/metering_agent.py:234
+#: neutron/services/metering/agents/metering_agent.py:232
msgid "Delete a metering label from agent"
msgstr ""
-#: neutron/services/metering/drivers/iptables/iptables_driver.py:93
+#: neutron/services/metering/drivers/iptables/iptables_driver.py:91
#, python-format
msgid "Loading interface driver %s"
msgstr ""
@@ -16048,352 +15450,87 @@ msgstr ""
msgid "The vpn device drivers Neutron will use"
msgstr ""
-#: neutron/services/vpn/plugin.py:46
-#, python-format
-msgid "VPN plugin using service driver: %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:89
-#, python-format
-msgid "RESPONSE: %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:102
-#, python-format
-msgid "%(method)s: Request for %(resource)s payload: %(payload)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:109
-#, python-format
-msgid "%(method)s Took %(time).2f seconds to process"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:115
-#, python-format
-msgid "%(method)s: Request timeout%(ssl)s (%(timeout).3f sec) for CSR(%(host)s)"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:124
-#, python-format
-msgid "%(method)s: Unable to connect to CSR(%(host)s)"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:128
-#, python-format
-msgid "%(method)s: Unexpected error for CSR (%(host)s): %(error)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:134
-#, python-format
-msgid "%(method)s: Completed [%(status)s]"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:149
-#, python-format
-msgid "%(auth)s with CSR %(host)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:156
-#, python-format
-msgid "Successfully authenticated with CSR %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:158
-#, python-format
-msgid "Failed authentication with CSR %(host)s [%(status)s]"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_csr_rest_client.py:193
-#, python-format
-msgid "%(method)s: Request timeout for CSR(%(host)s)"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:42
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:41
msgid "Status check interval for Cisco CSR IPSec connections"
msgstr ""
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:53
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:52
#, python-format
msgid "Cisco CSR failed to create %(resource)s (%(which)s)"
msgstr ""
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:56
#, python-format
msgid "Cisco CSR failed to change %(tunnel)s admin state to %(state)s"
msgstr ""
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:62
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:61
#, python-format
msgid ""
"Required %(resource)s attribute %(attr)s mapping for Cisco CSR is missing"
" in device driver"
msgstr ""
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:67
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:66
#, python-format
msgid ""
"Device driver does not have a mapping of '%(value)s for attribute "
"%(attr)s of %(resource)s"
msgstr ""
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:130
-#, python-format
-msgid "Handling VPN service update notification '%s'"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:152
-#, python-format
-msgid "Update: Existing connection %s changed"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:159
-#, python-format
-msgid "Update: Connection %s no longer admin down"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:165
-#, python-format
-msgid "Update: Connection %s forced to admin down"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:173
-#, python-format
-msgid "Update: Created new connection %s in admin down state"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:178
-#, python-format
-msgid "Update: Created new connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:189
-#, python-format
-msgid "Update: Existing VPN service %s detected"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:193
-#, python-format
-msgid "Update: New VPN service %s detected"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:204
-msgid "Update: Completed update processing"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:234
-#, python-format
-msgid "Mark: %(service)d VPN services and %(conn)d IPSec connections marked dirty"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:256
-#, python-format
-msgid ""
-"Sweep: Removed %(service)d dirty VPN service%(splural)s and %(conn)d "
-"dirty IPSec connection%(cplural)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:271
-#, python-format
-msgid "Report: Collecting status for IPSec connections on VPN service %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:277
-#, python-format
-msgid "Connection %s forced down"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:281
-#, python-format
-msgid "Connection %(conn)s reported %(status)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:286
-#, python-format
-msgid "Report: Adding info for IPSec connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:306
-#, python-format
-msgid "Report: Adding info for VPN service %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:328
-msgid "Report: Starting status report processing"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:330
-#, python-format
-msgid "Report: Collecting status for VPN service %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:336
-msgid "Sending status report update to plugin"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:338
-msgid "Report: Completed status report processing"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:622
-#, python-format
-msgid "Unable to create %(resource)s %(which)s: %(status)d"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:635
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:663
-#, python-format
-msgid "Internal error - '%s' is not defined"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:648
-#, python-format
-msgid "Unable to delete %(resource)s %(which)s: %(status)d"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:657
-#, python-format
-msgid "Performing rollback action %(action)s for resource %(resource)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:683
-#, python-format
-msgid "Creating IPSec connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:716
-#, python-format
-msgid "FAILED: Create of IPSec site-to-site connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:719
-#, python-format
-msgid "SUCCESS: Created IPSec site-to-site connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:728
-#, python-format
-msgid "Deleting IPSec connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:730
-#, python-format
-msgid "Unable to find connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:734
-#, python-format
-msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/cisco_ipsec.py:742
-#, python-format
-msgid "Unable to change %(tunnel)s admin state to %(state)s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/ipsec.py:46
+#: neutron/services/vpn/device_drivers/ipsec.py:47
msgid "Location to store ipsec server config files"
msgstr ""
-#: neutron/services/vpn/device_drivers/ipsec.py:49
+#: neutron/services/vpn/device_drivers/ipsec.py:50
msgid "Interval for checking ipsec status"
msgstr ""
-#: neutron/services/vpn/device_drivers/ipsec.py:59
+#: neutron/services/vpn/device_drivers/ipsec.py:60
msgid "Template file for ipsec configuration"
msgstr ""
-#: neutron/services/vpn/device_drivers/ipsec.py:65
+#: neutron/services/vpn/device_drivers/ipsec.py:66
msgid "Template file for ipsec secret configuration"
msgstr ""
-#: neutron/services/vpn/device_drivers/ipsec.py:247
-#, python-format
-msgid "Failed to enable vpn process on router %s"
-msgstr ""
-
-#: neutron/services/vpn/device_drivers/ipsec.py:258
-#, python-format
-msgid "Failed to disable vpn process on router %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/__init__.py:97
-#, python-format
-msgid "Notify agent at %(topic)s.%(host)s the message %(method)s %(args)s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:66
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:65
#, python-format
msgid "Unable to parse config files %s for Cisco CSR info"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:106
-#, python-format
-msgid "Ignoring Cisco CSR for subnet %s - REST management is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:46
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:45
#, python-format
msgid "Fatal - %(reason)s"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:80
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:79
#, python-format
msgid "No available Cisco CSR %(type)s IDs from %(min)d..%(max)d"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:135
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:134
#, python-format
msgid ""
"Database inconsistency between IPSec connection and Cisco CSR mapping "
"table (%s)"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:161
-#, python-format
-msgid "Reserved new CSR ID %(csr_id)d for %(policy)s ID %(policy_id)s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:188
-#, python-format
-msgid ""
-"Mappings for IPSec connection %(conn)s - tunnel=%(tunnel)s "
-"ike_policy=%(csr_ike)d ipsec_policy=%(csr_ipsec)d"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:197
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:196
#, python-format
msgid ""
"Existing entry for IPSec connection %s not found in Cisco CSR mapping "
"table"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:224
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:223
#, python-format
msgid ""
"Attempt to create duplicate entry in Cisco CSR mapping table for "
"connection %s"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:227
-#, python-format
-msgid ""
-"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
-"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_csr_db.py:239
-#, python-format
-msgid "Removed mapping for connection %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_ipsec.py:104
-#, python-format
-msgid ""
-"Notify agent at %(topic)s.%(host)s the message %(method)s %(args)s for "
-"router %(router)s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_validator.py:34
+#: neutron/services/vpn/service_drivers/cisco_validator.py:32
#, python-format
msgid ""
"Cisco CSR does not support %(resource)s attribute %(key)s with value "
@@ -16406,35 +15543,35 @@ msgid ""
"/proc/cmdline interface."
msgstr ""
-#: neutron/tests/unit/test_api_v2_resource.py:181
-#: neutron/tests/unit/test_api_v2_resource.py:251
+#: neutron/tests/unit/test_api_v2_resource.py:178
+#: neutron/tests/unit/test_api_v2_resource.py:248
msgid "Unmapped error"
msgstr ""
-#: neutron/tests/unit/test_api_v2_resource.py:320
+#: neutron/tests/unit/test_api_v2_resource.py:317
msgid ""
"The server has either erred or is incapable of performing the requested "
"operation."
msgstr ""
-#: neutron/tests/unit/bigswitch/fake_server.py:72
+#: neutron/tests/unit/bigswitch/fake_server.py:69
#, python-format
msgid ""
"Request: action=%(action)s, uri=%(uri)r, body=%(body)s, "
"headers=%(headers)s"
msgstr ""
-#: neutron/tests/unit/bigswitch/fake_server.py:124
+#: neutron/tests/unit/bigswitch/fake_server.py:121
#, python-format
msgid "No floating IPs in requesturi=%(uri)s, body=%(body)s"
msgstr ""
-#: neutron/tests/unit/bigswitch/fake_server.py:133
+#: neutron/tests/unit/bigswitch/fake_server.py:130
#, python-format
msgid "Expected floating IPs from multiple tenants.uri=%(uri)s, body=%(body)s"
msgstr ""
-#: neutron/tests/unit/bigswitch/fake_server.py:178
+#: neutron/tests/unit/bigswitch/fake_server.py:175
#, python-format
msgid "No host cert for %(server)s in cert %(cert)s"
msgstr ""
@@ -16474,165 +15611,165 @@ msgstr ""
msgid "Adds test attributes to core resources."
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:65
+#: neutron/tests/unit/nec/stub_ofc_driver.py:64
#, python-format
msgid "(create_tenant) OFC tenant %s already exists"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:77
+#: neutron/tests/unit/nec/stub_ofc_driver.py:76
#, python-format
msgid "(delete_tenant) OFC tenant %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:79
+#: neutron/tests/unit/nec/stub_ofc_driver.py:78
msgid "delete_tenant: SUCCEED"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:86
+#: neutron/tests/unit/nec/stub_ofc_driver.py:85
#, python-format
msgid "(create_network) OFC tenant %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:89
+#: neutron/tests/unit/nec/stub_ofc_driver.py:88
#, python-format
msgid "(create_network) OFC network %s already exists"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:100
+#: neutron/tests/unit/nec/stub_ofc_driver.py:99
#, python-format
msgid "(update_network) OFC network %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:104
+#: neutron/tests/unit/nec/stub_ofc_driver.py:103
msgid "update_network: SUCCEED"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:112
+#: neutron/tests/unit/nec/stub_ofc_driver.py:111
#, python-format
msgid "(delete_network) OFC network %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:114
+#: neutron/tests/unit/nec/stub_ofc_driver.py:113
msgid "delete_network: SUCCEED"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:121
+#: neutron/tests/unit/nec/stub_ofc_driver.py:120
#, python-format
msgid "(create_port) OFC network %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:124
+#: neutron/tests/unit/nec/stub_ofc_driver.py:123
#, python-format
msgid "(create_port) OFC port %s already exists"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:138
+#: neutron/tests/unit/nec/stub_ofc_driver.py:137
#, python-format
msgid "(delete_port) OFC port %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:140
+#: neutron/tests/unit/nec/stub_ofc_driver.py:139
msgid "delete_port: SUCCEED"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:173
+#: neutron/tests/unit/nec/stub_ofc_driver.py:172
#, python-format
msgid "(create_router) OFC tenant %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:176
+#: neutron/tests/unit/nec/stub_ofc_driver.py:175
#, python-format
msgid "(create_router) OFC router %s already exists"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:179
+#: neutron/tests/unit/nec/stub_ofc_driver.py:178
msgid "Operation on OFC is failed"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:193
-#: neutron/tests/unit/nec/stub_ofc_driver.py:283
+#: neutron/tests/unit/nec/stub_ofc_driver.py:192
+#: neutron/tests/unit/nec/stub_ofc_driver.py:282
#, python-format
msgid "(delete_router) OFC router %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:195
+#: neutron/tests/unit/nec/stub_ofc_driver.py:194
msgid "delete_router: SUCCEED"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:203
+#: neutron/tests/unit/nec/stub_ofc_driver.py:202
#, python-format
msgid "(add_router_interface) ip_address %s is not a valid format (a.b.c.d/N)."
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:208
+#: neutron/tests/unit/nec/stub_ofc_driver.py:207
#, python-format
msgid "(add_router_interface) OFC router %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:211
+#: neutron/tests/unit/nec/stub_ofc_driver.py:210
#, python-format
msgid "(add_router_interface) OFC network %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:218
+#: neutron/tests/unit/nec/stub_ofc_driver.py:217
#, python-format
msgid "add_router_interface: SUCCEED (if_id=%s)"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:226
-#: neutron/tests/unit/nec/stub_ofc_driver.py:243
+#: neutron/tests/unit/nec/stub_ofc_driver.py:225
+#: neutron/tests/unit/nec/stub_ofc_driver.py:242
#, python-format
msgid "(delete_router_interface) OFC router interface %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:235
+#: neutron/tests/unit/nec/stub_ofc_driver.py:234
msgid "update_router_route: SUCCEED"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:246
+#: neutron/tests/unit/nec/stub_ofc_driver.py:245
msgid "delete_router_interface: SUCCEED"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:256
+#: neutron/tests/unit/nec/stub_ofc_driver.py:255
#, python-format
msgid "(add_router_route) OFC router %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:261
+#: neutron/tests/unit/nec/stub_ofc_driver.py:260
#, python-format
msgid "(add_router_route) route to \"%s\" already exists"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:266
+#: neutron/tests/unit/nec/stub_ofc_driver.py:265
#, python-format
msgid "add_router_route: SUCCEED (route_id=%s)"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:275
+#: neutron/tests/unit/nec/stub_ofc_driver.py:274
#, python-format
msgid "(delete_router_route) OFC router route %s not found"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:277
+#: neutron/tests/unit/nec/stub_ofc_driver.py:276
msgid "delete_router_route: SUCCEED"
msgstr ""
-#: neutron/tests/unit/nec/stub_ofc_driver.py:290
+#: neutron/tests/unit/nec/stub_ofc_driver.py:289
#, python-format
msgid "list_router_routes: routes=%s"
msgstr ""
-#: neutron/tests/unit/nec/test_ofc_client.py:86
+#: neutron/tests/unit/nec/test_ofc_client.py:84
msgid "The specified OFC resource (/somewhere) is not found."
msgstr ""
-#: neutron/tests/unit/nec/test_ofc_client.py:90
-#: neutron/tests/unit/nec/test_ofc_client.py:96
-#: neutron/tests/unit/nec/test_ofc_client.py:105
+#: neutron/tests/unit/nec/test_ofc_client.py:88
+#: neutron/tests/unit/nec/test_ofc_client.py:94
+#: neutron/tests/unit/nec/test_ofc_client.py:103
msgid "An OFC exception has occurred: Operation on OFC failed"
msgstr ""
-#: neutron/tests/unit/nec/test_ofc_client.py:112
+#: neutron/tests/unit/nec/test_ofc_client.py:110
msgid "An OFC exception has occurred: Failed to connect OFC : "
msgstr ""
diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-error.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 3d75808b74..0000000000
--- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,265 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-08-26 11:11+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/"
-"neutron/language/pt_BR/)\n"
-"Language: pt_BR\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr ""
-"Retro compatibilidade não disponível para política deprecada %s. A política "
-"não será garantida"
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr "Erro de verificação de políticas enquanto chamando %s!"
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "Exceção original sendo descartada: %s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "Exceção não esperada ocorreu %d vez(es)... tentando novamente."
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "Erro durante %(full_task_name)s: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "Exceção durante limpeza de RPC."
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "Exceção não tratada"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr "Pulando faixa irracional do ID GRE %(tun_min)s:%(tun_max)s"
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr "Pulando faixa irracional do VXLAN VNI %(tun_min)s:%(tun_max)s"
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr "Erro no loop de eventos do agente"
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po
index 9c69d68753..d917fbebeb 100644
--- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-info.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-08-12 21:40+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/"
"neutron/language/pt_BR/)\n"
@@ -19,7 +19,7 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
@@ -27,11 +27,63 @@ msgstr ""
"Inserindo política: %(new_policy)s no lugar de política deprecada: "
"%(old_policy)s"
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "Extensão de grupo de segurança desativada."
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "Preparando filtros para dispositivos %s"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "Regra do grupo de segurança atualizada %r"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "Membro do grupo de segurança atualizado %r"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "Regra do provedor atualizada"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "Remover filtro de dispositivo para %r"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "Atualizar regras de firewall"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr "Nenhuma porta aqui para atualizar firewall"
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -56,6 +108,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Backdoor de Eventlet escutando na porta %(port)s pelo processo %(pid)d"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "Criado caminho de lock: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr ""
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -66,72 +133,77 @@ msgstr "Ignorando tarefa periódica %(task)s porque seu intervalo é negativo"
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "Ignorando tarefa periódica %(task)s porque ela está desativada"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "%s capturadas, saindo"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "Processo pai saiu inesperadamente, saindo"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
-msgstr ""
+msgstr "Filho capturado %s, terminando"
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Bifurcação muito rápida, suspendendo"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "Filho %d iniciado"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "Iniciando %d trabalhadores"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "%(pid)d filho eliminado pelo sinal %(sig)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "Filho %(pid)s encerrando com status %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "%s capturado, parando filhos"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
-msgstr ""
+msgstr "Espera requisitada depois que thread foi morta. Limpando."
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "Aguardando em %d filhos para sair"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr "%(type)s faixas de ID: %(range)s"
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -141,68 +213,55 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr "Agente fora de sincronização com o plug-in!"
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
-msgstr ""
+msgstr "Agente inicializado com êxito; em execução agora... "
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
-msgstr ""
+msgstr "Designando %(vlan_id)s como vlan local para net-id=%(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
+msgstr "Recuperando vlan = %(vlan_id)s a partir de net-id = %(net_uuid)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "port_unbound() net_uuid %s não em local_vlan_map"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
-msgstr ""
+msgstr "Mapeamento de rede física %(physical_network)s para a ponte %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -214,7 +273,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "Porta %(device)s atualizada. Detalhes: %(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
@@ -224,17 +283,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "Anexo %s removido"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "Túnel do agente fora de sincronização com o plug-in!"
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index ca8eab6f2c..0000000000
--- a/neutron/locale/pt_BR/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,159 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-07-18 21:01+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/"
-"neutron/language/pt_BR/)\n"
-"Language: pt_BR\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-"Encontrada regra deprecada: %s. Por favor considere atualizar seu arquivo de "
-"regras de políticas"
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-"Não foi possível encontrar o descritor de tipo de dados para o atributo %s"
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d fora da lista de filhos"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/sr/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/sr/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index 4eb04acc20..0000000000
--- a/neutron/locale/sr/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,157 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Serbian (http://www.transifex.com/projects/p/neutron/language/"
-"sr/)\n"
-"Language: sr\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d nije na mladjoj listi"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-critical.po b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-critical.po
deleted file mode 100644
index 0019923262..0000000000
--- a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-critical.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-# rajeshmalisettty <venkatarajesh.malisetty@gmail.com>, 2014
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-08-01 06:06+0000\n"
-"PO-Revision-Date: 2014-07-31 15:31+0000\n"
-"Last-Translator: rajeshmalisettty <venkatarajesh.malisetty@gmail.com>\n"
-"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/neutron/"
-"language/te_IN/)\n"
-"Language: te_IN\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
diff --git a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-error.po b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 4be8143f26..0000000000
--- a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,266 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-# rajeshmalisettty <venkatarajesh.malisetty@gmail.com>, 2014
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-08-12 21:24+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/neutron/"
-"language/te_IN/)\n"
-"Language: te_IN\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr "నిరాశపర్చింది విధానం %s కోసం అందుబాటులో వెనుకబడిన అనుకూలత. విధానం అమలు చేయబడదు"
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr "పాలసీ చెక్ లోపం %s కాల్ఐంది !"
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-"నోవా నోటిఫికేషన్లను ప్రారంభించి, కానీ novaclient ఇన్స్టాల్ కాలేదు. గాని డిసేబుల్ నోవా నోటిఫికేషన్లు లేదా "
-"python-novaclient ఇన్స్టాల్."
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "అసలు మినహాయింపు ఔటైన:%s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "ఊహించని మినహాయింపు%d సమయం (s) ఏర్పడింది ... ప్రయత్నించడానికి"
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "సమయంలో లోపం %(full_task_name)s: %(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "RPC క్లీనప్ సమయంలో మినహాయింపు."
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "నిర్వహించని మినహాయింపు"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-info.po b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-info.po
index d2ff5dd2fb..dbd824f2f2 100644
--- a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-info.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-08-17 05:19+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:35+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/neutron/"
"language/te_IN/)\n"
@@ -20,17 +20,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "చేర్చడం విధానం:%(new_policy)s నిరాశపర్చింది విధానం స్థానంలో :%(old_policy)s"
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -55,6 +107,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr ""
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr ""
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr ""
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -65,72 +132,77 @@ msgstr "దాని విరామం ప్రతికూల ఎందుక
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "అది అసాధ్యమని ఎందుకంటే ఆవర్తన పని %(task)s దాటవేయడం"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "%s క్యాచ్ నిష్క్రమించే"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "parrent ప్రక్రియ నిష్క్రమించే, అనుకోకుండా మరణించాడు,"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr "చైల్డ్ నిష్క్రమించే,%s క్యాచ్"
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Forking చాలా వేగంగా, పడుకుంది "
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "మొదలైంది పిల్లల%d"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "%d కార్మికులు ప్రారంభిస్తోంది"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "చైల్డ్ %(pid)d సిగ్నల్ ద్వారా హత్య %(sig)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "చైల్డ్ %(pid)s స్థితి తో నిష్క్రమించారు %(code)d "
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr " పిల్లలు ఆపటం %s దోరికిను "
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr "థ్రెడ్ మృతి తర్వాత అని వేచి. క్లీనింగ్ అప్."
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "%d పిల్లల వెయిటింగ్ నిష్క్రమణ"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -140,41 +212,28 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
@@ -229,11 +288,47 @@ msgstr ""
msgid "Agent tunnel out of sync with plugin!"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/te_IN/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index f017560b8e..0000000000
--- a/neutron/locale/te_IN/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,158 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-# rajeshmalisettty <venkatarajesh.malisetty@gmail.com>, 2014
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-07-23 14:51+0000\n"
-"Last-Translator: rajeshmalisettty <venkatarajesh.malisetty@gmail.com>\n"
-"Language-Team: Telugu (India) (http://www.transifex.com/projects/p/neutron/"
-"language/te_IN/)\n"
-"Language: te_IN\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-"చూపిస్తున్న డీప్రికేటెడ్ విధాన నియమం:%s. మీ విధానం ఆకృతీకరణ ఫైలు అప్గ్రేడ్ పరిగణలోకి ఆకృతీకరణ ఫైలు"
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr "%s యొక్క లక్షణం కోసం డేటా రకం సాధ్యం కాలేదు"
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d బాల జాబితా లేదు "
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/vi_VN/LC_MESSAGES/neutron-log-info.po b/neutron/locale/vi_VN/LC_MESSAGES/neutron-log-info.po
index cbe139653a..8565883626 100644
--- a/neutron/locale/vi_VN/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/vi_VN/LC_MESSAGES/neutron-log-info.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-07-18 20:49+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/projects/p/"
"neutron/language/vi_VN/)\n"
@@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet backdoor lắng nghe trên %(port)s đối với tiến trình %(pid)d"
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "Con đường khóa được tạo: %s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "Không thể loại bỏ tập tin %(file)s"
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -64,72 +131,77 @@ msgstr ""
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr ""
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "Bắt %s, thoát"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "Tiến trình cha bị chết đột ngột, thoát"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr "Tiến trình con bắt %s, thoát"
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "Tạo tiến trình con quá nhanh, nghỉ"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "Tiến trình con đã được khởi động %d "
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "Khởi động %d động cơ"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "Tiến trình con %(pid)d bị huỷ bởi tín hiệu %(sig)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "Tiến trình con %(pid)s đã thiaast với trạng thái %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "Bắt %s, đang dừng tiến trình con"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr "Chờ đợi được gọi sau khi luồng bị huỷ. Làm sạch."
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "Chờ đợi %d tiến trình con để thoát "
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -139,41 +211,28 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
@@ -228,11 +287,47 @@ msgstr ""
msgid "Agent tunnel out of sync with plugin!"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-error.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-error.po
deleted file mode 100644
index 3a542fad8e..0000000000
--- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-error.po
+++ /dev/null
@@ -1,263 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-15 06:11+0000\n"
-"PO-Revision-Date: 2014-07-21 17:03+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/neutron/"
-"language/zh_CN/)\n"
-"Language: zh_CN\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: neutron/policy.py:115
-#, python-format
-msgid ""
-"Backward compatibility unavailable for deprecated policy %s. The policy will "
-"not be enforced"
-msgstr "被废弃的策略%s不支持功能回退,这个策略将不再被使用"
-
-#: neutron/policy.py:280
-#, python-format
-msgid "Policy check error while calling %s!"
-msgstr ""
-
-#: neutron/agent/l3_ha_agent.py:136
-#, python-format
-msgid "Unable to process HA router %s without ha port"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:230
-#, python-format
-msgid ""
-"%(service)s for %(resource_type)s with uuid %(uuid)s not found. The process "
-"should not have died"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:250
-#, python-format
-msgid "respawning %(service)s for uuid %(uuid)s"
-msgstr ""
-
-#: neutron/agent/linux/external_process.py:256
-msgid "Exiting agent as programmed in check_child_processes_actions"
-msgstr ""
-
-#: neutron/cmd/sanity_check.py:58
-msgid ""
-"Nova notifications are enabled, but novaclient is not installed. Either "
-"disable nova notifications or install python-novaclient."
-msgstr ""
-
-#: neutron/openstack/common/excutils.py:76
-#, python-format
-msgid "Original exception being dropped: %s"
-msgstr "正在删除原始异常:%s"
-
-#: neutron/openstack/common/excutils.py:105
-#, python-format
-msgid "Unexpected exception occurred %d time(s)... retrying."
-msgstr "意外的异常已发生 %d 次...正在重试。"
-
-#: neutron/openstack/common/periodic_task.py:202
-#, python-format
-msgid "Error during %(full_task_name)s: %(e)s"
-msgstr "在 %(full_task_name)s 期间发生错误:%(e)s"
-
-#: neutron/openstack/common/service.py:188
-msgid "Exception during rpc cleanup."
-msgstr "在RPC清除期间发生异常。"
-
-#: neutron/openstack/common/service.py:277
-msgid "Unhandled exception"
-msgstr "存在未处理的异常"
-
-#: neutron/plugins/cisco/models/virt_phy_sw_v2.py:283
-#, python-format
-msgid "Unable to delete port '%(pname)s' on switch. Exception: %(exp)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_gre.py:80
-#, python-format
-msgid "Skipping unreasonable gre ID range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/type_vxlan.py:87
-#, python-format
-msgid "Skipping unreasonable VXLAN VNI range %(tun_min)s:%(tun_max)s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:112
-msgid "APIC service agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:207
-#, python-format
-msgid "No such interface (ignored): %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:257
-msgid "APIC service agent: exception in LLDP parsing"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:312
-#, python-format
-msgid "APIC service agent: can not get MACaddr for %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:328
-msgid "APIC host agent: failed in reporting state"
-msgstr ""
-
-#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:386
-msgid "Error in agent event loop"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:56
-#, python-format
-msgid "Cannot complete the sync between Neutron and VSD because of error:%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:102
-msgid "Agent terminated!: Failed to get a datapath."
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:121
-msgid "Agent terminated"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:158
-msgid "Agent failed to create agent config map"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:283
-msgid "Failed reporting state!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:449
-#, python-format
-msgid "No local VLAN available for net-id=%s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:464
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - "
-"tunneling disabled"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:475
-#, python-format
-msgid ""
-"Cannot provision %(network_type)s network for net-id=%(net_uuid)s - no "
-"bridge for physical_network %(physical_network)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:485
-#, python-format
-msgid ""
-"Cannot provision unknown network type %(network_type)s for net-id="
-"%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:523
-#, python-format
-msgid ""
-"Cannot reclaim unknown network type %(network_type)s for net-id=%(net_uuid)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:657
-#, python-format
-msgid ""
-"Bridge %(bridge)s for physical network %(physical_network)s does not exist. "
-"Agent terminated!"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:735
-msgid "ofport should have a value that can be interpreted as an integer"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:738
-#, python-format
-msgid "Failed to set-up %(type)s tunnel port to %(ip)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:916
-msgid "Error while synchronizing tunnels"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:956
-msgid "Error while processing VIF ports"
-msgstr ""
-
-#: neutron/plugins/vmware/plugins/base.py:2089
-#, python-format
-msgid ""
-"Rolling back database changes for gateway device %s because of an error in "
-"the NSX backend"
-msgstr ""
-
-#: neutron/scheduler/l3_agent_scheduler.py:281
-#, python-format
-msgid "Not enough candidates, a HA router needs at least %s agents"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:62
-#, python-format
-msgid "Config file parse error: %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:76
-#, python-format
-msgid "Ignoring Cisco CSR configuration entry - router IP %s is not valid"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:89
-#, python-format
-msgid "Ignoring Cisco CSR for router %(router)s - missing %(field)s setting"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:97
-#, python-format
-msgid ""
-"Ignoring Cisco CSR for router %s - timeout is not a floating point number"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:113
-#, python-format
-msgid "Ignoring Cisco CSR for router %s - local tunnel is not an IP address"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:119
-#, python-format
-msgid "Malformed interface name for Cisco CSR router entry - %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:155
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:202
-msgid "No routers found in INI file!"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:174
-#, python-format
-msgid "Unable to lookup router ID based on router's public IP (%s) in INI file"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:177
-#, python-format
-msgid "No matching routers on host %s"
-msgstr ""
-
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:211
-#, python-format
-msgid "Unable to find host for router %s"
-msgstr ""
diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po
index 32ebc2febf..010daf996d 100644
--- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-info.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-08-12 21:40+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:51+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/neutron/"
"language/zh_CN/)\n"
@@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr "在被废弃的策略:%(old_policy)s位置上插入策略:%(new_policy)s "
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "已禁用安全组扩展。"
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "正在为设备 %s 准备过滤器"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "已更新安全组规则 %r"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "已更新安全组成员 %r"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "已更新提供程序规则"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "请为 %r 除去设备过滤器"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "请刷新防火墙规则"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr "Eventlet为进程 %(pid)d 在后台监听 %(port)s "
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr "已创建锁路径:%s"
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr "移动文件%(file)s失败"
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -64,72 +131,77 @@ msgstr "正在跳过周期性任务 %(task)s,因为其时间间隔为负"
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "正在跳过周期性任务 %(task)s,因为它已禁用"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "捕获到 %s,正在退出"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "父进程已意外终止,正在退出"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr ""
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "派生速度太快,正在休眠"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "已启动子代 %d"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "正在启动 %d 工作程序"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "信号 %(sig)d 已终止子代 %(pid)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "子代 %(pid)s 已退出,状态为 %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "捕获到 %s,正在停止子代"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr ""
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "正在等待 %d 个子代退出"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -139,68 +211,55 @@ msgstr ""
msgid "Agent out of sync with plugin!"
msgstr "代理与插件不同步!"
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
-msgstr ""
+msgstr "代理已成功初始化,现在正在运行..."
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
-msgstr ""
+msgstr "对于网络标识 %(net_uuid)s,正在将 %(vlan_id)s 分配为本地 vlan"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
+msgstr "正在从网络标识 %(net_uuid)s 恢复 vlan %(vlan_id)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "port_unbound() net_uuid %s 未在 local_vlan_map 中"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
-msgstr ""
+msgstr "正在将物理网络 %(physical_network)s 映射至网桥 %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -212,7 +271,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "端口 %(device)s 已更新。详细信息:%(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
@@ -222,17 +281,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "已除去附件 %s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "代理隧道与插件不同步!"
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index a48532d58f..0000000000
--- a/neutron/locale/zh_CN/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/neutron/"
-"language/zh_CN/)\n"
-"Language: zh_CN\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "pid %d 没有在子代列表中"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po b/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po
index 78044b1fd6..535b7ae53f 100644
--- a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po
+++ b/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-info.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Neutron\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:10+0000\n"
-"PO-Revision-Date: 2014-07-18 20:49+0000\n"
+"POT-Creation-Date: 2014-10-22 06:19+0000\n"
+"PO-Revision-Date: 2014-10-21 10:35+0000\n"
"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/neutron/"
"language/zh_TW/)\n"
@@ -19,17 +19,69 @@ msgstr ""
"Generated-By: Babel 1.3\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: neutron/policy.py:106
+#: neutron/policy.py:110
#, python-format
msgid ""
"Inserting policy:%(new_policy)s in place of deprecated policy:%(old_policy)s"
msgstr ""
+#: neutron/agent/securitygroups_rpc.py:80
+msgid "Disabled security-group extension."
+msgstr "已停用安全群組延伸。"
+
+#: neutron/agent/securitygroups_rpc.py:82
+msgid "Disabled allowed-address-pairs extension."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:198
+#, python-format
+msgid ""
+"Skipping method %s as firewall is disabled or configured as "
+"NoopFirewallDriver."
+msgstr ""
+
+#: neutron/agent/securitygroups_rpc.py:209
+#, python-format
+msgid "Preparing filters for devices %s"
+msgstr "正在準備裝置 %s 的過濾器"
+
+#: neutron/agent/securitygroups_rpc.py:239
+#, python-format
+msgid "Security group rule updated %r"
+msgstr "安全群組規則已更新 %r"
+
+#: neutron/agent/securitygroups_rpc.py:246
+#, python-format
+msgid "Security group member updated %r"
+msgstr "安全群組成員已更新 %r"
+
+#: neutron/agent/securitygroups_rpc.py:268
+msgid "Provider rule updated"
+msgstr "已更新提供者規則"
+
+#: neutron/agent/securitygroups_rpc.py:280
+#, python-format
+msgid "Remove device filter for %r"
+msgstr "移除 %r 的裝置過濾器"
+
+#: neutron/agent/securitygroups_rpc.py:290
+msgid "Refresh firewall rules"
+msgstr "重新整理防火牆規則"
+
+#: neutron/agent/securitygroups_rpc.py:294
+msgid "No ports here to refresh firewall"
+msgstr ""
+
+#: neutron/agent/linux/ovs_lib.py:422
+#, python-format
+msgid "Port %(port_id)s not present in bridge %(br_name)s"
+msgstr ""
+
#: neutron/common/ipv6_utils.py:62
msgid "IPv6 is not enabled on this system."
msgstr ""
-#: neutron/db/l3_agentschedulers_db.py:82
+#: neutron/db/l3_agentschedulers_db.py:83
msgid ""
"Skipping period L3 agent status check because automatic router rescheduling "
"is disabled."
@@ -54,6 +106,21 @@ msgstr ""
msgid "%d probe(s) deleted"
msgstr ""
+#: neutron/openstack/common/eventlet_backdoor.py:140
+#, python-format
+msgid "Eventlet backdoor listening on %(port)s for process %(pid)d"
+msgstr ""
+
+#: neutron/openstack/common/lockutils.py:82
+#, python-format
+msgid "Created lock path: %s"
+msgstr ""
+
+#: neutron/openstack/common/lockutils.py:194
+#, python-format
+msgid "Failed to remove file %(file)s"
+msgstr ""
+
#: neutron/openstack/common/periodic_task.py:126
#, python-format
msgid "Skipping periodic task %(task)s because its interval is negative"
@@ -64,72 +131,77 @@ msgstr "正在跳過定期作業 %(task)s,因為其間隔為負數"
msgid "Skipping periodic task %(task)s because it is disabled"
msgstr "正在跳過定期作業 %(task)s,因為它已停用"
-#: neutron/openstack/common/service.py:176
+#: neutron/openstack/common/service.py:174
#, python-format
msgid "Caught %s, exiting"
msgstr "已捕捉到 %s,正在結束"
-#: neutron/openstack/common/service.py:240
+#: neutron/openstack/common/service.py:232
msgid "Parent process has died unexpectedly, exiting"
msgstr "母程序已非預期地當掉,正在結束"
-#: neutron/openstack/common/service.py:271
+#: neutron/openstack/common/service.py:263
#, python-format
msgid "Child caught %s, exiting"
msgstr ""
-#: neutron/openstack/common/service.py:310
+#: neutron/openstack/common/service.py:302
msgid "Forking too fast, sleeping"
msgstr "分岔太快,正在休眠"
-#: neutron/openstack/common/service.py:329
+#: neutron/openstack/common/service.py:321
#, python-format
msgid "Started child %d"
msgstr "已開始子行程 %d"
-#: neutron/openstack/common/service.py:339
+#: neutron/openstack/common/service.py:331
#, python-format
msgid "Starting %d workers"
msgstr "正在啟動 %d 個工作程式"
-#: neutron/openstack/common/service.py:356
+#: neutron/openstack/common/service.py:348
#, python-format
msgid "Child %(pid)d killed by signal %(sig)d"
msgstr "信號 %(sig)d 結束了子項 %(pid)d"
-#: neutron/openstack/common/service.py:360
+#: neutron/openstack/common/service.py:352
#, python-format
msgid "Child %(pid)s exited with status %(code)d"
msgstr "子項 %(pid)s 已結束,狀態為 %(code)d"
-#: neutron/openstack/common/service.py:399
+#: neutron/openstack/common/service.py:391
#, python-format
msgid "Caught %s, stopping children"
msgstr "已捕捉到 %s,正在停止子項"
-#: neutron/openstack/common/service.py:408
+#: neutron/openstack/common/service.py:400
msgid "Wait called after thread killed. Cleaning up."
msgstr ""
-#: neutron/openstack/common/service.py:424
+#: neutron/openstack/common/service.py:416
#, python-format
msgid "Waiting on %d children to exit"
msgstr "正在等待 %d 個子項結束"
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:80
+#: neutron/plugins/ml2/drivers/type_tunnel.py:79
+#, python-format
+msgid "%(type)s ID ranges: %(range)s"
+msgstr ""
+
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:78
msgid "APIC service agent starting ..."
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:97
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:95
msgid "APIC service agent started"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:191
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:189
#, python-format
msgid "APIC host agent: agent starting on %s"
msgstr ""
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:211
+#: neutron/plugins/ml2/drivers/cisco/apic/apic_topology.py:209
#, python-format
msgid "APIC host agent: started on %s"
msgstr ""
@@ -137,70 +209,57 @@ msgstr ""
#: neutron/plugins/mlnx/agent/eswitch_neutron_agent.py:379
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:907
msgid "Agent out of sync with plugin!"
-msgstr ""
+msgstr "代理程式與外掛程式不同步!"
-#: neutron/plugins/nuage/syncmanager.py:47
+#: neutron/plugins/nuage/syncmanager.py:46
msgid "Starting the sync between Neutron and VSD"
msgstr ""
-#: neutron/plugins/nuage/syncmanager.py:60
+#: neutron/plugins/nuage/syncmanager.py:59
msgid "Sync between Neutron and VSD completed successfully"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:137
+#: neutron/plugins/ofagent/agent/arp_lib.py:142
msgid "No bridge is set"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:140
+#: neutron/plugins/ofagent/agent/arp_lib.py:145
#, python-format
msgid "Unknown bridge %(dpid)s ours %(ours)s"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:147
-#, python-format
-msgid "packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:152
+#: neutron/plugins/ofagent/agent/arp_lib.py:163
msgid "drop non tenant packet"
msgstr ""
-#: neutron/plugins/ofagent/agent/arp_lib.py:157
-msgid "drop non-ethernet packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:162
-msgid "drop non-arp packet"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/arp_lib.py:171
+#: neutron/plugins/ofagent/agent/arp_lib.py:182
#, python-format
msgid "unknown network %s"
msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:165
msgid "Agent initialized successfully, now running... "
-msgstr ""
+msgstr "已順利地起始設定代理程式,現正在執行中..."
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:452
#, python-format
msgid "Assigning %(vlan_id)s as local vlan for net-id=%(net_uuid)s"
-msgstr ""
+msgstr "正在將 %(vlan_id)s 指派為 net-id = %(net_uuid)s 的本端 VLAN"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:502
#, python-format
msgid "Reclaiming vlan = %(vlan_id)s from net-id = %(net_uuid)s"
-msgstr ""
+msgstr "正在從 net-id = %(net_uuid)s 收回 VLAN = %(vlan_id)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:570
#, python-format
msgid "port_unbound() net_uuid %s not in local_vlan_map"
-msgstr ""
+msgstr "port_unbound() net_uuid %s 不在 local_vlan_map 中"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:651
#, python-format
msgid "Mapping physical network %(physical_network)s to bridge %(bridge)s"
-msgstr ""
+msgstr "正在將實體網路 %(physical_network)s 對映到橋接器 %(bridge)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:785
#, python-format
@@ -212,7 +271,7 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:799
#, python-format
msgid "Port %(device)s updated. Details: %(details)s"
-msgstr ""
+msgstr "已更新埠 %(device)s。詳細資料:%(details)s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:818
#, python-format
@@ -222,17 +281,53 @@ msgstr ""
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:829
#, python-format
msgid "Attachment %s removed"
-msgstr ""
+msgstr "已移除連接裝置 %s"
#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:912
msgid "Agent tunnel out of sync with plugin!"
+msgstr "代理程式通道與外掛程式不同步!"
+
+#: neutron/services/vpn/plugin.py:45
+#, python-format
+msgid "VPN plugin using service driver: %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:335
+msgid "Sending status report update to plugin"
msgstr ""
-#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:57
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:715
+#, python-format
+msgid "FAILED: Create of IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:718
+#, python-format
+msgid "SUCCESS: Created IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/device_drivers/cisco_ipsec.py:733
+#, python-format
+msgid "SUCCESS: Deleted IPSec site-to-site connection %s"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_cfg_loader.py:56
#, python-format
msgid "Scanning config files %s for Cisco CSR configurations"
msgstr ""
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:226
+#, python-format
+msgid ""
+"Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d using IKE policy ID "
+"%(ike_id)d and IPSec policy ID %(ipsec_id)d"
+msgstr ""
+
+#: neutron/services/vpn/service_drivers/cisco_csr_db.py:238
+#, python-format
+msgid "Removed mapping for connection %s"
+msgstr ""
+
#: neutron/tests/unit/vmware/apiclient/test_api_eventlet_request.py:63
#, python-format
msgid "spawned: %d"
diff --git a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-warning.po b/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-warning.po
deleted file mode 100644
index 9ce2cc65c0..0000000000
--- a/neutron/locale/zh_TW/LC_MESSAGES/neutron-log-warning.po
+++ /dev/null
@@ -1,156 +0,0 @@
-# Translations template for neutron.
-# Copyright (C) 2014 ORGANIZATION
-# This file is distributed under the same license as the neutron project.
-#
-# Translators:
-msgid ""
-msgstr ""
-"Project-Id-Version: Neutron\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2014-09-14 06:11+0000\n"
-"PO-Revision-Date: 2014-06-30 19:27+0000\n"
-"Last-Translator: openstackjenkins <jenkins@openstack.org>\n"
-"Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/neutron/"
-"language/zh_TW/)\n"
-"Language: zh_TW\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 1.3\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: neutron/policy.py:94
-#, python-format
-msgid ""
-"Found deprecated policy rule:%s. Please consider upgrading your policy "
-"configuration file"
-msgstr ""
-
-#: neutron/policy.py:137
-#, python-format
-msgid "Unable to find data type descriptor for attribute %s"
-msgstr ""
-
-#: neutron/agent/securitygroups_rpc.py:183
-msgid ""
-"security_group_info_for_devices rpc call not supported by the server, "
-"falling back to old security_group_rules_for_devices which scales worse."
-msgstr ""
-
-#: neutron/agent/linux/keepalived.py:358
-msgid ""
-"A previous instance of keepalived seems to be dead, unable to restart it, a "
-"new instance will be spawned"
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:105
-msgid ""
-"Time since last L3 agent reschedule check has exceeded the interval between "
-"checks. Waiting before check to allow agents to send a heartbeat in case "
-"there was a clock adjustment."
-msgstr ""
-
-#: neutron/db/l3_agentschedulers_db.py:127
-#, python-format
-msgid ""
-"Rescheduling router %(router)s from agent %(agent)s because the agent did "
-"not report to the server in the last %(dead_time)s seconds."
-msgstr ""
-
-#: neutron/db/l3_hamode_db.py:404
-#, python-format
-msgid "The router %(router_id)s is bound multiple times on the agent %(host)s"
-msgstr ""
-
-#: neutron/openstack/common/service.py:364
-#, python-format
-msgid "pid %d not in child list"
-msgstr "PID %d 不在子項清單中"
-
-#: neutron/plugins/ml2/drivers/type_tunnel.py:143
-#, python-format
-msgid "%(type)s tunnel %(id)s not found"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:68
-#, python-format
-msgid "Create network postcommit failed for network %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:78
-#, python-format
-msgid "Create subnet postcommit failed for subnet %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:91
-#, python-format
-msgid "Create port postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/ml2/drivers/cisco/apic/apic_sync.py:110
-#, python-format
-msgid "Add interface postcommit failed for port %s"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:299
-#, python-format
-msgid "Subnet %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:317
-#, python-format
-msgid "Router %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:329
-#, python-format
-msgid ""
-"Route with destination %(dest)s and nexthop %(hop)s not found in neutron for "
-"sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:343
-#, python-format
-msgid "Security group %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:354
-#, python-format
-msgid "Security group rule %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:364
-#, python-format
-msgid "Floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:376
-#, python-format
-msgid "IP allocation for floating ip %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:387
-#, python-format
-msgid "Net-partition %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/nuage/syncmanager.py:397
-#, python-format
-msgid "VM port %s not found in neutron for sync"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:290
-#, python-format
-msgid "Unable to create tunnel port. Invalid remote IP: %s"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:713
-#, python-format
-msgid ""
-"VIF port: %s has no ofport configured, and might not be able to transmit"
-msgstr ""
-
-#: neutron/plugins/ofagent/agent/ofa_neutron_agent.py:820
-#, python-format
-msgid "Device %s not defined on plugin"
-msgstr ""
diff --git a/neutron/notifiers/nova.py b/neutron/notifiers/nova.py
index aa4f1b53e1..2b2bab63d1 100644
--- a/neutron/notifiers/nova.py
+++ b/neutron/notifiers/nova.py
@@ -41,12 +41,16 @@ class Notifier(object):
def __init__(self):
# TODO(arosen): we need to cache the endpoints and figure out
# how to deal with different regions here....
- bypass_url = "%s/%s" % (cfg.CONF.nova_url,
- cfg.CONF.nova_admin_tenant_id)
+ if cfg.CONF.nova_admin_tenant_id:
+ bypass_url = "%s/%s" % (cfg.CONF.nova_url,
+ cfg.CONF.nova_admin_tenant_id)
+ else:
+ bypass_url = None
+
self.nclient = nclient.Client(
username=cfg.CONF.nova_admin_username,
api_key=cfg.CONF.nova_admin_password,
- project_id=None,
+ project_id=cfg.CONF.nova_admin_tenant_name,
tenant_id=cfg.CONF.nova_admin_tenant_id,
auth_url=cfg.CONF.nova_admin_auth_url,
cacert=cfg.CONF.nova_ca_certificates_file,
diff --git a/neutron/openstack/common/__init__.py b/neutron/openstack/common/__init__.py
index d1223eaf76..e69de29bb2 100644
--- a/neutron/openstack/common/__init__.py
+++ b/neutron/openstack/common/__init__.py
@@ -1,17 +0,0 @@
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-import six
-
-
-six.add_move(six.MovedModule('mox', 'mox', 'mox3.mox'))
diff --git a/neutron/openstack/common/_i18n.py b/neutron/openstack/common/_i18n.py
new file mode 100644
index 0000000000..50a92b19d1
--- /dev/null
+++ b/neutron/openstack/common/_i18n.py
@@ -0,0 +1,40 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""oslo.i18n integration module.
+
+See http://docs.openstack.org/developer/oslo.i18n/usage.html
+
+"""
+
+import oslo.i18n
+
+
+# NOTE(dhellmann): This reference to o-s-l-o will be replaced by the
+# application name when this module is synced into the separate
+# repository. It is OK to have more than one translation function
+# using the same domain, since there will still only be one message
+# catalog.
+_translators = oslo.i18n.TranslatorFactory(domain='neutron')
+
+# The primary translation function using the well-known name "_"
+_ = _translators.primary
+
+# Translators for log levels.
+#
+# The abbreviated names are meant to reflect the usual use of a short
+# name like '_'. The "L" is for "log" and the other letter comes from
+# the level.
+_LI = _translators.log_info
+_LW = _translators.log_warning
+_LE = _translators.log_error
+_LC = _translators.log_critical
diff --git a/neutron/openstack/common/cache/_backends/memory.py b/neutron/openstack/common/cache/_backends/memory.py
index d6f5249fec..5c02cfc402 100644
--- a/neutron/openstack/common/cache/_backends/memory.py
+++ b/neutron/openstack/common/cache/_backends/memory.py
@@ -14,9 +14,10 @@
import collections
+from oslo.utils import timeutils
+
from neutron.openstack.common.cache import backends
from neutron.openstack.common import lockutils
-from neutron.openstack.common import timeutils
class MemoryBackend(backends.BaseCache):
@@ -147,7 +148,7 @@ class MemoryBackend(backends.BaseCache):
try:
# NOTE(flaper87): Keys with ttl == 0
# don't exist in the _keys_expires dict
- self._keys_expires[value[0]].remove(value[1])
+ self._keys_expires[value[0]].remove(key)
except (KeyError, ValueError):
pass
diff --git a/neutron/openstack/common/cache/backends.py b/neutron/openstack/common/cache/backends.py
index 2fa4aaeb27..1bea8912a0 100644
--- a/neutron/openstack/common/cache/backends.py
+++ b/neutron/openstack/common/cache/backends.py
@@ -26,9 +26,9 @@ class BaseCache(object):
:params parsed_url: Parsed url object.
:params options: A dictionary with configuration parameters
- for the cache. For example:
- - default_ttl: An integer defining the default ttl
- for keys.
+ for the cache. For example:
+
+ - default_ttl: An integer defining the default ttl for keys.
"""
def __init__(self, parsed_url, options=None):
@@ -43,20 +43,17 @@ class BaseCache(object):
def set(self, key, value, ttl, not_exists=False):
"""Sets or updates a cache entry
- NOTE: Thread-safety is required and has to be
- guaranteed by the backend implementation.
+ .. note:: Thread-safety is required and has to be guaranteed by the
+ backend implementation.
:params key: Item key as string.
:type key: `unicode string`
- :params value: Value to assign to the key. This
- can be anything that is handled
- by the current backend.
- :params ttl: Key's timeout in seconds. 0 means
- no timeout.
+ :params value: Value to assign to the key. This can be anything that
+ is handled by the current backend.
+ :params ttl: Key's timeout in seconds. 0 means no timeout.
:type ttl: int
- :params not_exists: If True, the key will be set
- if it doesn't exist. Otherwise,
- it'll always be set.
+ :params not_exists: If True, the key will be set if it doesn't exist.
+ Otherwise, it'll always be set.
:type not_exists: bool
:returns: True if the operation succeeds, False otherwise.
@@ -74,9 +71,8 @@ class BaseCache(object):
:params key: Item key as string.
:type key: `unicode string`
- :params value: Value to assign to the key. This
- can be anything that is handled
- by the current backend.
+ :params value: Value to assign to the key. This can be anything that
+ is handled by the current backend.
"""
try:
return self[key]
@@ -91,15 +87,14 @@ class BaseCache(object):
def get(self, key, default=None):
"""Gets one item from the cache
- NOTE: Thread-safety is required and it has to be
- guaranteed by the backend implementation.
+ .. note:: Thread-safety is required and it has to be guaranteed
+ by the backend implementation.
- :params key: Key for the item to retrieve
- from the cache.
+ :params key: Key for the item to retrieve from the cache.
:params default: The default value to return.
- :returns: `key`'s value in the cache if it exists,
- otherwise `default` should be returned.
+ :returns: `key`'s value in the cache if it exists, otherwise
+ `default` should be returned.
"""
return self._get(key, default)
@@ -115,8 +110,8 @@ class BaseCache(object):
def __delitem__(self, key):
"""Removes an item from cache.
- NOTE: Thread-safety is required and it has to be
- guaranteed by the backend implementation.
+ .. note:: Thread-safety is required and it has to be guaranteed by
+ the backend implementation.
:params key: The key to remove.
@@ -130,8 +125,8 @@ class BaseCache(object):
def clear(self):
"""Removes all items from the cache.
- NOTE: Thread-safety is required and it has to be
- guaranteed by the backend implementation.
+ .. note:: Thread-safety is required and it has to be guaranteed by
+ the backend implementation.
"""
return self._clear()
@@ -143,9 +138,8 @@ class BaseCache(object):
"""Increments the value for a key
:params key: The key for the value to be incremented
- :params delta: Number of units by which to increment
- the value. Pass a negative number to
- decrement the value.
+ :params delta: Number of units by which to increment the value.
+ Pass a negative number to decrement the value.
:returns: The new value
"""
@@ -158,10 +152,8 @@ class BaseCache(object):
def append_tail(self, key, tail):
"""Appends `tail` to `key`'s value.
- :params key: The key of the value to which
- `tail` should be appended.
- :params tail: The list of values to append to the
- original.
+ :params key: The key of the value to which `tail` should be appended.
+ :params tail: The list of values to append to the original.
:returns: The new value
"""
@@ -181,10 +173,8 @@ class BaseCache(object):
def append(self, key, value):
"""Appends `value` to `key`'s value.
- :params key: The key of the value to which
- `tail` should be appended.
- :params value: The value to append to the
- original.
+ :params key: The key of the value to which `tail` should be appended.
+ :params value: The value to append to the original.
:returns: The new value
"""
@@ -196,8 +186,7 @@ class BaseCache(object):
:params key: The key to verify.
- :returns: True if the key exists,
- otherwise False.
+ :returns: True if the key exists, otherwise False.
"""
@abc.abstractmethod
@@ -209,9 +198,8 @@ class BaseCache(object):
"""Gets keys' value from cache
:params keys: List of keys to retrieve.
- :params default: The default value to return
- for each key that is not in
- the cache.
+ :params default: The default value to return for each key that is not
+ in the cache.
:returns: A generator of (key, value)
"""
@@ -227,13 +215,12 @@ class BaseCache(object):
def set_many(self, data, ttl=None):
"""Puts several items into the cache at once
- Depending on the backend, this operation may or may
- not be efficient. The default implementation calls
- set for each (key, value) pair passed, other backends
- support set_many operations as part of their protocols.
+ Depending on the backend, this operation may or may not be efficient.
+ The default implementation calls set for each (key, value) pair
+ passed, other backends support set_many operations as part of their
+ protocols.
- :params data: A dictionary like {key: val} to store
- in the cache.
+ :params data: A dictionary like {key: val} to store in the cache.
:params ttl: Key's timeout in seconds.
"""
diff --git a/neutron/openstack/common/cache/cache.py b/neutron/openstack/common/cache/cache.py
index 1247787a28..70c4545def 100644
--- a/neutron/openstack/common/cache/cache.py
+++ b/neutron/openstack/common/cache/cache.py
@@ -24,7 +24,7 @@ from six.moves.urllib import parse
from stevedore import driver
-def _get_olso_configs():
+def _get_oslo_configs():
"""Returns the oslo.config options to register."""
# NOTE(flaper87): Oslo config should be
# optional. Instead of doing try / except
@@ -45,7 +45,7 @@ def register_oslo_configs(conf):
:params conf: Config object.
:type conf: `cfg.ConfigOptions`
"""
- conf.register_opts(_get_olso_configs())
+ conf.register_opts(_get_oslo_configs())
def get_cache(url='memory://'):
diff --git a/neutron/openstack/common/eventlet_backdoor.py b/neutron/openstack/common/eventlet_backdoor.py
index b55b0ceb3b..850fdd4697 100644
--- a/neutron/openstack/common/eventlet_backdoor.py
+++ b/neutron/openstack/common/eventlet_backdoor.py
@@ -29,7 +29,7 @@ import eventlet.backdoor
import greenlet
from oslo.config import cfg
-from neutron.openstack.common.gettextutils import _
+from neutron.openstack.common._i18n import _LI
from neutron.openstack.common import log as logging
help_for_backdoor_port = (
@@ -41,7 +41,6 @@ help_for_backdoor_port = (
"chosen port is displayed in the service's log file.")
eventlet_backdoor_opts = [
cfg.StrOpt('backdoor_port',
- default=None,
help="Enable eventlet backdoor. %s" % help_for_backdoor_port)
]
@@ -137,8 +136,10 @@ def initialize_if_enabled():
# In the case of backdoor port being zero, a port number is assigned by
# listen(). In any case, pull the port number out here.
port = sock.getsockname()[1]
- LOG.info(_('Eventlet backdoor listening on %(port)s for process %(pid)d') %
- {'port': port, 'pid': os.getpid()})
+ LOG.info(
+ _LI('Eventlet backdoor listening on %(port)s for process %(pid)d') %
+ {'port': port, 'pid': os.getpid()}
+ )
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock,
locals=backdoor_locals)
return port
diff --git a/neutron/openstack/common/fileutils.py b/neutron/openstack/common/fileutils.py
index 704af09623..f91fc32388 100644
--- a/neutron/openstack/common/fileutils.py
+++ b/neutron/openstack/common/fileutils.py
@@ -13,14 +13,13 @@
# License for the specific language governing permissions and limitations
# under the License.
-
import contextlib
import errno
import os
import tempfile
-from neutron.openstack.common import excutils
-from neutron.openstack.common.gettextutils import _
+from oslo.utils import excutils
+
from neutron.openstack.common import log as logging
LOG = logging.getLogger(__name__)
@@ -52,15 +51,15 @@ def read_cached_file(filename, force_reload=False):
"""
global _FILE_CACHE
- if force_reload and filename in _FILE_CACHE:
- del _FILE_CACHE[filename]
+ if force_reload:
+ delete_cached_file(filename)
reloaded = False
mtime = os.path.getmtime(filename)
cache_info = _FILE_CACHE.setdefault(filename, {})
if not cache_info or mtime > cache_info.get('mtime', 0):
- LOG.debug(_("Reloading cached file %s") % filename)
+ LOG.debug("Reloading cached file %s" % filename)
with open(filename) as fap:
cache_info['data'] = fap.read()
cache_info['mtime'] = mtime
@@ -68,6 +67,17 @@ def read_cached_file(filename, force_reload=False):
return (reloaded, cache_info['data'])
+def delete_cached_file(filename):
+ """Delete cached file if present.
+
+ :param filename: filename to delete
+ """
+ global _FILE_CACHE
+
+ if filename in _FILE_CACHE:
+ del _FILE_CACHE[filename]
+
+
def delete_if_exists(path, remove=os.unlink):
"""Delete a file, but ignore file not found error.
@@ -101,13 +111,13 @@ def remove_path_on_error(path, remove=delete_if_exists):
def file_open(*args, **kwargs):
"""Open file
- see built-in file() documentation for more details
+ see built-in open() documentation for more details
Note: The reason this is kept in a separate module is to easily
be able to provide a stub module that doesn't alter system
state at all (for unit tests)
"""
- return file(*args, **kwargs)
+ return open(*args, **kwargs)
def write_to_tempfile(content, path=None, suffix='', prefix='tmp'):
diff --git a/neutron/openstack/common/lockutils.py b/neutron/openstack/common/lockutils.py
index f0c5cb13c3..996a810bb6 100644
--- a/neutron/openstack/common/lockutils.py
+++ b/neutron/openstack/common/lockutils.py
@@ -13,10 +13,10 @@
# License for the specific language governing permissions and limitations
# under the License.
-
import contextlib
import errno
import functools
+import logging
import os
import shutil
import subprocess
@@ -29,9 +29,7 @@ import weakref
from oslo.config import cfg
from neutron.openstack.common import fileutils
-from neutron.openstack.common.gettextutils import _
-from neutron.openstack.common import local
-from neutron.openstack.common import log as logging
+from neutron.openstack.common._i18n import _, _LE, _LI
LOG = logging.getLogger(__name__)
@@ -39,10 +37,10 @@ LOG = logging.getLogger(__name__)
util_opts = [
cfg.BoolOpt('disable_process_locking', default=False,
- help='Whether to disable inter-process locks'),
+ help='Enables or disables inter-process locks.'),
cfg.StrOpt('lock_path',
default=os.environ.get("NEUTRON_LOCK_PATH"),
- help=('Directory to use for lock files.'))
+ help='Directory to use for lock files.')
]
@@ -54,7 +52,7 @@ def set_defaults(lock_path):
cfg.set_defaults(util_opts, lock_path=lock_path)
-class _InterProcessLock(object):
+class _FileLock(object):
"""Lock implementation which allows multiple locks, working around
issues like bugs.debian.org/cgi-bin/bugreport.cgi?bug=632857 and does
not require any cleanup. Since the lock is always held on a file
@@ -76,7 +74,13 @@ class _InterProcessLock(object):
self.lockfile = None
self.fname = name
- def __enter__(self):
+ def acquire(self):
+ basedir = os.path.dirname(self.fname)
+
+ if not os.path.exists(basedir):
+ fileutils.ensure_tree(basedir)
+ LOG.info(_LI('Created lock path: %s'), basedir)
+
self.lockfile = open(self.fname, 'w')
while True:
@@ -86,23 +90,39 @@ class _InterProcessLock(object):
# Also upon reading the MSDN docs for locking(), it seems
# to have a laughable 10 attempts "blocking" mechanism.
self.trylock()
- return self
+ LOG.debug('Got file lock "%s"', self.fname)
+ return True
except IOError as e:
if e.errno in (errno.EACCES, errno.EAGAIN):
# external locks synchronise things like iptables
# updates - give it some time to prevent busy spinning
time.sleep(0.01)
else:
- raise
+ raise threading.ThreadError(_("Unable to acquire lock on"
+ " `%(filename)s` due to"
+ " %(exception)s") %
+ {'filename': self.fname,
+ 'exception': e})
- def __exit__(self, exc_type, exc_val, exc_tb):
+ def __enter__(self):
+ self.acquire()
+ return self
+
+ def release(self):
try:
self.unlock()
self.lockfile.close()
+ LOG.debug('Released file lock "%s"', self.fname)
except IOError:
- LOG.exception(_("Could not release the acquired lock `%s`"),
+ LOG.exception(_LE("Could not release the acquired lock `%s`"),
self.fname)
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.release()
+
+ def exists(self):
+ return os.path.exists(self.fname)
+
def trylock(self):
raise NotImplementedError()
@@ -110,7 +130,7 @@ class _InterProcessLock(object):
raise NotImplementedError()
-class _WindowsLock(_InterProcessLock):
+class _WindowsLock(_FileLock):
def trylock(self):
msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_NBLCK, 1)
@@ -118,7 +138,7 @@ class _WindowsLock(_InterProcessLock):
msvcrt.locking(self.lockfile.fileno(), msvcrt.LK_UNLCK, 1)
-class _PosixLock(_InterProcessLock):
+class _FcntlLock(_FileLock):
def trylock(self):
fcntl.lockf(self.lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
@@ -131,12 +151,63 @@ if os.name == 'nt':
InterProcessLock = _WindowsLock
else:
import fcntl
- InterProcessLock = _PosixLock
+ InterProcessLock = _FcntlLock
_semaphores = weakref.WeakValueDictionary()
_semaphores_lock = threading.Lock()
+def _get_lock_path(name, lock_file_prefix, lock_path=None):
+ # NOTE(mikal): the lock name cannot contain directory
+ # separators
+ name = name.replace(os.sep, '_')
+ if lock_file_prefix:
+ sep = '' if lock_file_prefix.endswith('-') else '-'
+ name = '%s%s%s' % (lock_file_prefix, sep, name)
+
+ local_lock_path = lock_path or CONF.lock_path
+
+ if not local_lock_path:
+ raise cfg.RequiredOptError('lock_path')
+
+ return os.path.join(local_lock_path, name)
+
+
+def external_lock(name, lock_file_prefix=None, lock_path=None):
+ LOG.debug('Attempting to grab external lock "%(lock)s"',
+ {'lock': name})
+
+ lock_file_path = _get_lock_path(name, lock_file_prefix, lock_path)
+
+ return InterProcessLock(lock_file_path)
+
+
+def remove_external_lock_file(name, lock_file_prefix=None):
+ """Remove an external lock file when it's not used anymore
+ This will be helpful when we have a lot of lock files
+ """
+ with internal_lock(name):
+ lock_file_path = _get_lock_path(name, lock_file_prefix)
+ try:
+ os.remove(lock_file_path)
+ except OSError:
+ LOG.info(_LI('Failed to remove file %(file)s'),
+ {'file': lock_file_path})
+
+
+def internal_lock(name):
+ with _semaphores_lock:
+ try:
+ sem = _semaphores[name]
+ LOG.debug('Using existing semaphore "%s"', name)
+ except KeyError:
+ sem = threading.Semaphore()
+ _semaphores[name] = sem
+ LOG.debug('Created new semaphore "%s"', name)
+
+ return sem
+
+
@contextlib.contextmanager
def lock(name, lock_file_prefix=None, external=False, lock_path=None):
"""Context based lock
@@ -152,67 +223,19 @@ def lock(name, lock_file_prefix=None, external=False, lock_path=None):
should work across multiple processes. This means that if two different
workers both run a method decorated with @synchronized('mylock',
external=True), only one of them will execute at a time.
-
- :param lock_path: The lock_path keyword argument is used to specify a
- special location for external lock files to live. If nothing is set, then
- CONF.lock_path is used as a default.
"""
- with _semaphores_lock:
- try:
- sem = _semaphores[name]
- except KeyError:
- sem = threading.Semaphore()
- _semaphores[name] = sem
-
- with sem:
- LOG.debug(_('Got semaphore "%(lock)s"'), {'lock': name})
-
- # NOTE(mikal): I know this looks odd
- if not hasattr(local.strong_store, 'locks_held'):
- local.strong_store.locks_held = []
- local.strong_store.locks_held.append(name)
-
+ int_lock = internal_lock(name)
+ with int_lock:
+ LOG.debug('Acquired semaphore "%(lock)s"', {'lock': name})
try:
if external and not CONF.disable_process_locking:
- LOG.debug(_('Attempting to grab file lock "%(lock)s"'),
- {'lock': name})
-
- # We need a copy of lock_path because it is non-local
- local_lock_path = lock_path or CONF.lock_path
- if not local_lock_path:
- raise cfg.RequiredOptError('lock_path')
-
- if not os.path.exists(local_lock_path):
- fileutils.ensure_tree(local_lock_path)
- LOG.info(_('Created lock path: %s'), local_lock_path)
-
- def add_prefix(name, prefix):
- if not prefix:
- return name
- sep = '' if prefix.endswith('-') else '-'
- return '%s%s%s' % (prefix, sep, name)
-
- # NOTE(mikal): the lock name cannot contain directory
- # separators
- lock_file_name = add_prefix(name.replace(os.sep, '_'),
- lock_file_prefix)
-
- lock_file_path = os.path.join(local_lock_path, lock_file_name)
-
- try:
- lock = InterProcessLock(lock_file_path)
- with lock as lock:
- LOG.debug(_('Got file lock "%(lock)s" at %(path)s'),
- {'lock': name, 'path': lock_file_path})
- yield lock
- finally:
- LOG.debug(_('Released file lock "%(lock)s" at %(path)s'),
- {'lock': name, 'path': lock_file_path})
+ ext_lock = external_lock(name, lock_file_prefix, lock_path)
+ with ext_lock:
+ yield ext_lock
else:
- yield sem
-
+ yield int_lock
finally:
- local.strong_store.locks_held.remove(name)
+ LOG.debug('Releasing semaphore "%(lock)s"', {'lock': name})
def synchronized(name, lock_file_prefix=None, external=False, lock_path=None):
@@ -244,11 +267,11 @@ def synchronized(name, lock_file_prefix=None, external=False, lock_path=None):
def inner(*args, **kwargs):
try:
with lock(name, lock_file_prefix, external, lock_path):
- LOG.debug(_('Got semaphore / lock "%(function)s"'),
+ LOG.debug('Got semaphore / lock "%(function)s"',
{'function': f.__name__})
return f(*args, **kwargs)
finally:
- LOG.debug(_('Semaphore / lock released "%(function)s"'),
+ LOG.debug('Semaphore / lock released "%(function)s"',
{'function': f.__name__})
return inner
return wrap
diff --git a/neutron/openstack/common/log.py b/neutron/openstack/common/log.py
index d767b898f2..6d8ca69c35 100644
--- a/neutron/openstack/common/log.py
+++ b/neutron/openstack/common/log.py
@@ -33,42 +33,24 @@ import logging
import logging.config
import logging.handlers
import os
-import re
+import socket
import sys
import traceback
from oslo.config import cfg
+from oslo.serialization import jsonutils
+from oslo.utils import importutils
import six
from six import moves
-from neutron.openstack.common.gettextutils import _
-from neutron.openstack.common import importutils
-from neutron.openstack.common import jsonutils
+_PY26 = sys.version_info[0:2] == (2, 6)
+
+from neutron.openstack.common._i18n import _
from neutron.openstack.common import local
_DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
-_SANITIZE_KEYS = ['adminPass', 'admin_pass', 'password', 'admin_password']
-
-# NOTE(ldbragst): Let's build a list of regex objects using the list of
-# _SANITIZE_KEYS we already have. This way, we only have to add the new key
-# to the list of _SANITIZE_KEYS and we can generate regular expressions
-# for XML and JSON automatically.
-_SANITIZE_PATTERNS = []
-_FORMAT_PATTERNS = [r'(%(key)s\s*[=]\s*[\"\']).*?([\"\'])',
- r'(<%(key)s>).*?(</%(key)s>)',
- r'([\"\']%(key)s[\"\']\s*:\s*[\"\']).*?([\"\'])',
- r'([\'"].*?%(key)s[\'"]\s*:\s*u?[\'"]).*?([\'"])',
- r'([\'"].*?%(key)s[\'"]\s*,\s*\'--?[A-z]+\'\s*,\s*u?[\'"])'
- '.*?([\'"])',
- r'(%(key)s\s*--?[A-z]+\s*).*?([\s])']
-
-for key in _SANITIZE_KEYS:
- for pattern in _FORMAT_PATTERNS:
- reg_ex = re.compile(pattern % {'key': key}, re.DOTALL)
- _SANITIZE_PATTERNS.append(reg_ex)
-
common_cli_opts = [
cfg.BoolOpt('debug',
@@ -138,6 +120,14 @@ generic_log_opts = [
help='Log output to standard error.')
]
+DEFAULT_LOG_LEVELS = ['amqp=WARN', 'amqplib=WARN', 'boto=WARN',
+ 'qpid=WARN', 'sqlalchemy=WARN', 'suds=INFO',
+ 'oslo.messaging=INFO', 'iso8601=WARN',
+ 'requests.packages.urllib3.connectionpool=WARN',
+ 'urllib3.connectionpool=WARN', 'websocket=WARN',
+ "keystonemiddleware=WARN", "routes.middleware=WARN",
+ "stevedore=WARN"]
+
log_opts = [
cfg.StrOpt('logging_context_format_string',
default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
@@ -156,17 +146,7 @@ log_opts = [
'%(instance)s',
help='Prefix each line of exception output with this format.'),
cfg.ListOpt('default_log_levels',
- default=[
- 'amqp=WARN',
- 'amqplib=WARN',
- 'boto=WARN',
- 'qpid=WARN',
- 'sqlalchemy=WARN',
- 'suds=INFO',
- 'oslo.messaging=INFO',
- 'iso8601=WARN',
- 'requests.packages.urllib3.connectionpool=WARN'
- ],
+ default=DEFAULT_LOG_LEVELS,
help='List of logger=LEVEL pairs.'),
cfg.BoolOpt('publish_errors',
default=False,
@@ -181,11 +161,11 @@ log_opts = [
cfg.StrOpt('instance_format',
default='[instance: %(uuid)s] ',
help='The format for an instance that is passed with the log '
- 'message. '),
+ 'message.'),
cfg.StrOpt('instance_uuid_format',
default='[instance: %(uuid)s] ',
help='The format for an instance UUID that is passed with the '
- 'log message. '),
+ 'log message.'),
]
CONF = cfg.CONF
@@ -244,45 +224,20 @@ def _get_log_file_path(binary=None):
return None
-def mask_password(message, secret="***"):
- """Replace password with 'secret' in message.
-
- :param message: The string which includes security information.
- :param secret: value with which to replace passwords.
- :returns: The unicode value of message with the password fields masked.
-
- For example:
-
- >>> mask_password("'adminPass' : 'aaaaa'")
- "'adminPass' : '***'"
- >>> mask_password("'admin_pass' : 'aaaaa'")
- "'admin_pass' : '***'"
- >>> mask_password('"password" : "aaaaa"')
- '"password" : "***"'
- >>> mask_password("'original_password' : 'aaaaa'")
- "'original_password' : '***'"
- >>> mask_password("u'original_password' : u'aaaaa'")
- "u'original_password' : u'***'"
- """
- message = six.text_type(message)
-
- # NOTE(ldbragst): Check to see if anything in message contains any key
- # specified in _SANITIZE_KEYS, if not then just return the message since
- # we don't have to mask any passwords.
- if not any(key in message for key in _SANITIZE_KEYS):
- return message
-
- secret = r'\g<1>' + secret + r'\g<2>'
- for pattern in _SANITIZE_PATTERNS:
- message = re.sub(pattern, secret, message)
- return message
-
-
class BaseLoggerAdapter(logging.LoggerAdapter):
def audit(self, msg, *args, **kwargs):
self.log(logging.AUDIT, msg, *args, **kwargs)
+ def isEnabledFor(self, level):
+ if _PY26:
+ # This method was added in python 2.7 (and it does the exact
+ # same logic, so we need to do the exact same logic so that
+ # python 2.6 has this capability as well).
+ return self.logger.isEnabledFor(level)
+ else:
+ return super(BaseLoggerAdapter, self).isEnabledFor(level)
+
class LazyAdapter(BaseLoggerAdapter):
def __init__(self, name='unknown', version='unknown'):
@@ -295,6 +250,11 @@ class LazyAdapter(BaseLoggerAdapter):
def logger(self):
if not self._logger:
self._logger = getLogger(self.name, self.version)
+ if six.PY3:
+ # In Python 3, the code fails because the 'manager' attribute
+ # cannot be found when using a LoggerAdapter as the
+ # underlying logger. Work around this issue.
+ self._logger.manager = self._logger.logger.manager
return self._logger
@@ -340,11 +300,10 @@ class ContextAdapter(BaseLoggerAdapter):
self.warn(stdmsg, *args, **kwargs)
def process(self, msg, kwargs):
- # NOTE(mrodden): catch any Message/other object and
- # coerce to unicode before they can get
- # to the python logging and possibly
- # cause string encoding trouble
- if not isinstance(msg, six.string_types):
+ # NOTE(jecarey): If msg is not unicode, coerce it into unicode
+ # before it can get to the python logging and
+ # possibly cause string encoding trouble
+ if not isinstance(msg, six.text_type):
msg = six.text_type(msg)
if 'extra' not in kwargs:
@@ -448,7 +407,7 @@ def _load_log_config(log_config_append):
try:
logging.config.fileConfig(log_config_append,
disable_existing_loggers=False)
- except moves.configparser.Error as exc:
+ except (moves.configparser.Error, KeyError) as exc:
raise LogConfigError(log_config_append, six.text_type(exc))
@@ -461,9 +420,20 @@ def setup(product_name, version='unknown'):
sys.excepthook = _create_logging_excepthook(product_name)
-def set_defaults(logging_context_format_string):
- cfg.set_defaults(
- log_opts, logging_context_format_string=logging_context_format_string)
+def set_defaults(logging_context_format_string=None,
+ default_log_levels=None):
+ # Just in case the caller is not setting the
+ # default_log_level. This is insurance because
+ # we introduced the default_log_level parameter
+ # later in a backwards in-compatible change
+ if default_log_levels is not None:
+ cfg.set_defaults(
+ log_opts,
+ default_log_levels=default_log_levels)
+ if logging_context_format_string is not None:
+ cfg.set_defaults(
+ log_opts,
+ logging_context_format_string=logging_context_format_string)
def _find_facility_from_conf():
@@ -512,18 +482,6 @@ def _setup_logging_from_conf(project, version):
for handler in log_root.handlers:
log_root.removeHandler(handler)
- if CONF.use_syslog:
- facility = _find_facility_from_conf()
- # TODO(bogdando) use the format provided by RFCSysLogHandler
- # after existing syslog format deprecation in J
- if CONF.use_syslog_rfc_format:
- syslog = RFCSysLogHandler(address='/dev/log',
- facility=facility)
- else:
- syslog = logging.handlers.SysLogHandler(address='/dev/log',
- facility=facility)
- log_root.addHandler(syslog)
-
logpath = _get_log_file_path()
if logpath:
filelog = logging.handlers.WatchedFileHandler(logpath)
@@ -582,6 +540,20 @@ def _setup_logging_from_conf(project, version):
else:
logger.setLevel(level_name)
+ if CONF.use_syslog:
+ try:
+ facility = _find_facility_from_conf()
+ # TODO(bogdando) use the format provided by RFCSysLogHandler
+ # after existing syslog format deprecation in J
+ if CONF.use_syslog_rfc_format:
+ syslog = RFCSysLogHandler(facility=facility)
+ else:
+ syslog = logging.handlers.SysLogHandler(facility=facility)
+ log_root.addHandler(syslog)
+ except socket.error:
+ log_root.error('Unable to add syslog handler. Verify that syslog '
+ 'is running.')
+
_loggers = {}
@@ -651,6 +623,12 @@ class ContextFormatter(logging.Formatter):
def format(self, record):
"""Uses contextstring if request_id is set, otherwise default."""
+ # NOTE(jecarey): If msg is not unicode, coerce it into unicode
+ # before it can get to the python logging and
+ # possibly cause string encoding trouble
+ if not isinstance(record.msg, six.text_type):
+ record.msg = six.text_type(record.msg)
+
# store project info
record.project = self.project
record.version = self.version
diff --git a/neutron/openstack/common/loopingcall.py b/neutron/openstack/common/loopingcall.py
index e588c8309b..1d3bf7fcaa 100644
--- a/neutron/openstack/common/loopingcall.py
+++ b/neutron/openstack/common/loopingcall.py
@@ -16,31 +16,36 @@
# under the License.
import sys
+import time
from eventlet import event
from eventlet import greenthread
-from neutron.openstack.common.gettextutils import _
+from neutron.openstack.common._i18n import _LE, _LW
from neutron.openstack.common import log as logging
-from neutron.openstack.common import timeutils
LOG = logging.getLogger(__name__)
+# NOTE(zyluo): This lambda function was declared to avoid mocking collisions
+# with time.time() called in the standard logging module
+# during unittests.
+_ts = lambda: time.time()
+
class LoopingCallDone(Exception):
- """Exception to break out and stop a LoopingCall.
+ """Exception to break out and stop a LoopingCallBase.
- The poll-function passed to LoopingCall can raise this exception to
+ The poll-function passed to LoopingCallBase can raise this exception to
break out of the loop normally. This is somewhat analogous to
StopIteration.
An optional return-value can be included as the argument to the exception;
- this return-value will be returned by LoopingCall.wait()
+ this return-value will be returned by LoopingCallBase.wait()
"""
def __init__(self, retvalue=True):
- """:param retvalue: Value that LoopingCall.wait() should return."""
+ """:param retvalue: Value that LoopingCallBase.wait() should return."""
self.retvalue = retvalue
@@ -72,21 +77,22 @@ class FixedIntervalLoopingCall(LoopingCallBase):
try:
while self._running:
- start = timeutils.utcnow()
+ start = _ts()
self.f(*self.args, **self.kw)
- end = timeutils.utcnow()
+ end = _ts()
if not self._running:
break
- delay = interval - timeutils.delta_seconds(start, end)
- if delay <= 0:
- LOG.warn(_('task run outlasted interval by %s sec') %
- -delay)
- greenthread.sleep(delay if delay > 0 else 0)
+ delay = end - start - interval
+ if delay > 0:
+ LOG.warn(_LW('task %(func_name)s run outlasted '
+ 'interval by %(delay).2f sec'),
+ {'func_name': repr(self.f), 'delay': delay})
+ greenthread.sleep(-delay if delay < 0 else 0)
except LoopingCallDone as e:
self.stop()
done.send(e.retvalue)
except Exception:
- LOG.exception(_('in fixed duration looping call'))
+ LOG.exception(_LE('in fixed duration looping call'))
done.send_exception(*sys.exc_info())
return
else:
@@ -98,11 +104,6 @@ class FixedIntervalLoopingCall(LoopingCallBase):
return self.done
-# TODO(mikal): this class name is deprecated in Havana and should be removed
-# in the I release
-LoopingCall = FixedIntervalLoopingCall
-
-
class DynamicLoopingCall(LoopingCallBase):
"""A looping call which sleeps until the next known event.
@@ -126,14 +127,15 @@ class DynamicLoopingCall(LoopingCallBase):
if periodic_interval_max is not None:
idle = min(idle, periodic_interval_max)
- LOG.debug(_('Dynamic looping call sleeping for %.02f '
- 'seconds'), idle)
+ LOG.debug('Dynamic looping call %(func_name)s sleeping '
+ 'for %(idle).02f seconds',
+ {'func_name': repr(self.f), 'idle': idle})
greenthread.sleep(idle)
except LoopingCallDone as e:
self.stop()
done.send(e.retvalue)
except Exception:
- LOG.exception(_('in dynamic looping call'))
+ LOG.exception(_LE('in dynamic looping call'))
done.send_exception(*sys.exc_info())
return
else:
diff --git a/neutron/openstack/common/service.py b/neutron/openstack/common/service.py
index 79ae9bc5d0..b71a7843ba 100644
--- a/neutron/openstack/common/service.py
+++ b/neutron/openstack/common/service.py
@@ -38,14 +38,12 @@ from eventlet import event
from oslo.config import cfg
from neutron.openstack.common import eventlet_backdoor
-from neutron.openstack.common.gettextutils import _LE, _LI, _LW
-from neutron.openstack.common import importutils
+from neutron.openstack.common._i18n import _LE, _LI, _LW
from neutron.openstack.common import log as logging
from neutron.openstack.common import systemd
from neutron.openstack.common import threadgroup
-rpc = importutils.try_import('neutron.openstack.common.rpc')
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
@@ -180,12 +178,6 @@ class ServiceLauncher(Launcher):
status = exc.code
finally:
self.stop()
- if rpc:
- try:
- rpc.cleanup()
- except Exception:
- # We're shutting down, so it doesn't matter at this point.
- LOG.exception(_LE('Exception during rpc cleanup.'))
return status, signo
diff --git a/neutron/openstack/common/sslutils.py b/neutron/openstack/common/sslutils.py
deleted file mode 100644
index 1d07937949..0000000000
--- a/neutron/openstack/common/sslutils.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright 2013 IBM Corp.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-import os
-import ssl
-
-from oslo.config import cfg
-
-from neutron.openstack.common.gettextutils import _
-
-
-ssl_opts = [
- cfg.StrOpt('ca_file',
- default=None,
- help="CA certificate file to use to verify "
- "connecting clients"),
- cfg.StrOpt('cert_file',
- default=None,
- help="Certificate file to use when starting "
- "the server securely"),
- cfg.StrOpt('key_file',
- default=None,
- help="Private key file to use when starting "
- "the server securely"),
-]
-
-
-CONF = cfg.CONF
-CONF.register_opts(ssl_opts, "ssl")
-
-
-def is_enabled():
- cert_file = CONF.ssl.cert_file
- key_file = CONF.ssl.key_file
- ca_file = CONF.ssl.ca_file
- use_ssl = cert_file or key_file
-
- if cert_file and not os.path.exists(cert_file):
- raise RuntimeError(_("Unable to find cert_file : %s") % cert_file)
-
- if ca_file and not os.path.exists(ca_file):
- raise RuntimeError(_("Unable to find ca_file : %s") % ca_file)
-
- if key_file and not os.path.exists(key_file):
- raise RuntimeError(_("Unable to find key_file : %s") % key_file)
-
- if use_ssl and (not cert_file or not key_file):
- raise RuntimeError(_("When running server in SSL mode, you must "
- "specify both a cert_file and key_file "
- "option value in your configuration file"))
-
- return use_ssl
-
-
-def wrap(sock):
- ssl_kwargs = {
- 'server_side': True,
- 'certfile': CONF.ssl.cert_file,
- 'keyfile': CONF.ssl.key_file,
- 'cert_reqs': ssl.CERT_NONE,
- }
-
- if CONF.ssl.ca_file:
- ssl_kwargs['ca_certs'] = CONF.ssl.ca_file
- ssl_kwargs['cert_reqs'] = ssl.CERT_REQUIRED
-
- return ssl.wrap_socket(sock, **ssl_kwargs)
-
-
-_SSL_PROTOCOLS = {
- "tlsv1": ssl.PROTOCOL_TLSv1,
- "sslv23": ssl.PROTOCOL_SSLv23,
- "sslv3": ssl.PROTOCOL_SSLv3
-}
-
-try:
- _SSL_PROTOCOLS["sslv2"] = ssl.PROTOCOL_SSLv2
-except AttributeError:
- pass
-
-
-def validate_ssl_version(version):
- key = version.lower()
- try:
- return _SSL_PROTOCOLS[key]
- except KeyError:
- raise RuntimeError(_("Invalid SSL version : %s") % version)
diff --git a/neutron/openstack/common/systemd.py b/neutron/openstack/common/systemd.py
index cc02caba3e..b9a0df97e2 100644
--- a/neutron/openstack/common/systemd.py
+++ b/neutron/openstack/common/systemd.py
@@ -50,14 +50,16 @@ def _sd_notify(unset_env, msg):
def notify():
"""Send notification to Systemd that service is ready.
+
For details see
- http://www.freedesktop.org/software/systemd/man/sd_notify.html
+ http://www.freedesktop.org/software/systemd/man/sd_notify.html
"""
_sd_notify(False, 'READY=1')
def notify_once():
"""Send notification once to Systemd that service is ready.
+
Systemd sets NOTIFY_SOCKET environment variable with the name of the
socket listening for notifications from services.
This method removes the NOTIFY_SOCKET environment variable to ensure
diff --git a/neutron/openstack/common/threadgroup.py b/neutron/openstack/common/threadgroup.py
index 5cfd59c94d..ecf0d4bbed 100644
--- a/neutron/openstack/common/threadgroup.py
+++ b/neutron/openstack/common/threadgroup.py
@@ -11,10 +11,10 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
+import threading
import eventlet
from eventlet import greenpool
-from eventlet import greenthread
from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall
@@ -51,7 +51,7 @@ class Thread(object):
class ThreadGroup(object):
- """The point of the ThreadGroup classis to:
+ """The point of the ThreadGroup class is to:
* keep track of timers and greenthreads (making it easier to stop them
when need be).
@@ -85,8 +85,8 @@ class ThreadGroup(object):
def thread_done(self, thread):
self.threads.remove(thread)
- def stop(self):
- current = greenthread.getcurrent()
+ def _stop_threads(self):
+ current = threading.current_thread()
# Iterate over a copy of self.threads so thread_done doesn't
# modify the list while we're iterating
@@ -99,6 +99,7 @@ class ThreadGroup(object):
except Exception as ex:
LOG.exception(ex)
+ def stop_timers(self):
for x in self.timers:
try:
x.stop()
@@ -106,6 +107,23 @@ class ThreadGroup(object):
LOG.exception(ex)
self.timers = []
+ def stop(self, graceful=False):
+ """stop function has the option of graceful=True/False.
+
+ * In case of graceful=True, wait for all threads to be finished.
+ Never kill threads.
+ * In case of graceful=False, kill threads immediately.
+ """
+ self.stop_timers()
+ if graceful:
+ # In case of graceful=True, wait for all threads to be
+ # finished, never kill threads
+ self.wait()
+ else:
+ # In case of graceful=False(Default), kill threads
+ # immediately
+ self._stop_threads()
+
def wait(self):
for x in self.timers:
try:
@@ -114,7 +132,7 @@ class ThreadGroup(object):
pass
except Exception as ex:
LOG.exception(ex)
- current = greenthread.getcurrent()
+ current = threading.current_thread()
# Iterate over a copy of self.threads so thread_done doesn't
# modify the list while we're iterating
diff --git a/neutron/openstack/common/versionutils.py b/neutron/openstack/common/versionutils.py
deleted file mode 100644
index 04472a8671..0000000000
--- a/neutron/openstack/common/versionutils.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-"""
-Helpers for comparing version strings.
-"""
-
-import functools
-import pkg_resources
-
-from neutron.openstack.common.gettextutils import _
-from neutron.openstack.common import log as logging
-
-
-LOG = logging.getLogger(__name__)
-
-
-class deprecated(object):
- """A decorator to mark callables as deprecated.
-
- This decorator logs a deprecation message when the callable it decorates is
- used. The message will include the release where the callable was
- deprecated, the release where it may be removed and possibly an optional
- replacement.
-
- Examples:
-
- 1. Specifying the required deprecated release
-
- >>> @deprecated(as_of=deprecated.ICEHOUSE)
- ... def a(): pass
-
- 2. Specifying a replacement:
-
- >>> @deprecated(as_of=deprecated.ICEHOUSE, in_favor_of='f()')
- ... def b(): pass
-
- 3. Specifying the release where the functionality may be removed:
-
- >>> @deprecated(as_of=deprecated.ICEHOUSE, remove_in=+1)
- ... def c(): pass
-
- """
-
- FOLSOM = 'F'
- GRIZZLY = 'G'
- HAVANA = 'H'
- ICEHOUSE = 'I'
-
- _RELEASES = {
- 'F': 'Folsom',
- 'G': 'Grizzly',
- 'H': 'Havana',
- 'I': 'Icehouse',
- }
-
- _deprecated_msg_with_alternative = _(
- '%(what)s is deprecated as of %(as_of)s in favor of '
- '%(in_favor_of)s and may be removed in %(remove_in)s.')
-
- _deprecated_msg_no_alternative = _(
- '%(what)s is deprecated as of %(as_of)s and may be '
- 'removed in %(remove_in)s. It will not be superseded.')
-
- def __init__(self, as_of, in_favor_of=None, remove_in=2, what=None):
- """Initialize decorator
-
- :param as_of: the release deprecating the callable. Constants
- are define in this class for convenience.
- :param in_favor_of: the replacement for the callable (optional)
- :param remove_in: an integer specifying how many releases to wait
- before removing (default: 2)
- :param what: name of the thing being deprecated (default: the
- callable's name)
-
- """
- self.as_of = as_of
- self.in_favor_of = in_favor_of
- self.remove_in = remove_in
- self.what = what
-
- def __call__(self, func):
- if not self.what:
- self.what = func.__name__ + '()'
-
- @functools.wraps(func)
- def wrapped(*args, **kwargs):
- msg, details = self._build_message()
- LOG.deprecated(msg, details)
- return func(*args, **kwargs)
- return wrapped
-
- def _get_safe_to_remove_release(self, release):
- # TODO(dstanek): this method will have to be reimplemented once
- # when we get to the X release because once we get to the Y
- # release, what is Y+2?
- new_release = chr(ord(release) + self.remove_in)
- if new_release in self._RELEASES:
- return self._RELEASES[new_release]
- else:
- return new_release
-
- def _build_message(self):
- details = dict(what=self.what,
- as_of=self._RELEASES[self.as_of],
- remove_in=self._get_safe_to_remove_release(self.as_of))
-
- if self.in_favor_of:
- details['in_favor_of'] = self.in_favor_of
- msg = self._deprecated_msg_with_alternative
- else:
- msg = self._deprecated_msg_no_alternative
- return msg, details
-
-
-def is_compatible(requested_version, current_version, same_major=True):
- """Determine whether `requested_version` is satisfied by
- `current_version`; in other words, `current_version` is >=
- `requested_version`.
-
- :param requested_version: version to check for compatibility
- :param current_version: version to check against
- :param same_major: if True, the major version must be identical between
- `requested_version` and `current_version`. This is used when a
- major-version difference indicates incompatibility between the two
- versions. Since this is the common-case in practice, the default is
- True.
- :returns: True if compatible, False if not
- """
- requested_parts = pkg_resources.parse_version(requested_version)
- current_parts = pkg_resources.parse_version(current_version)
-
- if same_major and (requested_parts[0] != current_parts[0]):
- return False
-
- return current_parts >= requested_parts
diff --git a/neutron/plugins/bigswitch/__init__.py b/neutron/plugins/bigswitch/__init__.py
index 131b31cc30..e69de29bb2 100644
--- a/neutron/plugins/bigswitch/__init__.py
+++ b/neutron/plugins/bigswitch/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 Big Switch Networks, Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-#
diff --git a/neutron/plugins/bigswitch/db/__init__.py b/neutron/plugins/bigswitch/db/__init__.py
index 70cb8a3531..e69de29bb2 100644
--- a/neutron/plugins/bigswitch/db/__init__.py
+++ b/neutron/plugins/bigswitch/db/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Big Switch Networks, Inc.
-# All Rights Reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/bigswitch/extensions/__init__.py b/neutron/plugins/bigswitch/extensions/__init__.py
index 70cb8a3531..e69de29bb2 100644
--- a/neutron/plugins/bigswitch/extensions/__init__.py
+++ b/neutron/plugins/bigswitch/extensions/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Big Switch Networks, Inc.
-# All Rights Reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/bigswitch/plugin.py b/neutron/plugins/bigswitch/plugin.py
index 3c35033f9f..e2e051d751 100644
--- a/neutron/plugins/bigswitch/plugin.py
+++ b/neutron/plugins/bigswitch/plugin.py
@@ -112,7 +112,7 @@ class AgentNotifierApi(n_rpc.RpcProxy,
class SecurityGroupServerRpcMixin(sg_db_rpc.SecurityGroupServerRpcMixin):
def get_port_from_device(self, device):
- port_id = re.sub(r"^tap", "", device)
+ port_id = re.sub(r"^%s" % const.TAP_DEVICE_PREFIX, "", device)
port = self.get_port_and_sgs(port_id)
if port:
port['device'] = device
diff --git a/neutron/plugins/bigswitch/servermanager.py b/neutron/plugins/bigswitch/servermanager.py
index 6fdbec36a6..5adb02d5a6 100644
--- a/neutron/plugins/bigswitch/servermanager.py
+++ b/neutron/plugins/bigswitch/servermanager.py
@@ -447,8 +447,6 @@ class ServerPool(object):
if not self.get_topo_function:
raise cfg.Error(_('Server requires synchronization, '
'but no topology function was defined.'))
- # The hash was incorrect so it needs to be removed
- hash_handler.put_hash('')
data = self.get_topo_function(**self.get_topo_function_args)
active_server.rest_call('PUT', TOPOLOGY_PATH, data,
timeout=None)
@@ -639,8 +637,9 @@ class HTTPSConnectionWithValidation(httplib.HTTPSConnection):
if self.combined_cert:
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file,
cert_reqs=ssl.CERT_REQUIRED,
- ca_certs=self.combined_cert)
+ ca_certs=self.combined_cert,
+ ssl_version=ssl.PROTOCOL_TLSv1)
else:
- self.sock = ssl.wrap_socket(sock, self.key_file,
- self.cert_file,
- cert_reqs=ssl.CERT_NONE)
+ self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file,
+ cert_reqs=ssl.CERT_NONE,
+ ssl_version=ssl.PROTOCOL_TLSv1)
diff --git a/neutron/plugins/bigswitch/tests/__init__.py b/neutron/plugins/bigswitch/tests/__init__.py
index 131b31cc30..e69de29bb2 100644
--- a/neutron/plugins/bigswitch/tests/__init__.py
+++ b/neutron/plugins/bigswitch/tests/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 Big Switch Networks, Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-#
diff --git a/neutron/plugins/brocade/NeutronPlugin.py b/neutron/plugins/brocade/NeutronPlugin.py
index 1d8dc37ef1..9b0b308de2 100644
--- a/neutron/plugins/brocade/NeutronPlugin.py
+++ b/neutron/plugins/brocade/NeutronPlugin.py
@@ -54,7 +54,6 @@ LOG = logging.getLogger(__name__)
PLUGIN_VERSION = 0.88
AGENT_OWNER_PREFIX = "network:"
NOS_DRIVER = 'neutron.plugins.brocade.nos.nosdriver.NOSdriver'
-TAP_PREFIX_LEN = 3
SWITCH_OPTS = [cfg.StrOpt('address', default='',
help=_('The address of the host to SSH to')),
@@ -91,7 +90,8 @@ class BridgeRpcCallbacks(n_rpc.RpcCallback):
device = kwargs.get('device')
LOG.debug(_("Device %(device)s details requested from %(agent_id)s"),
{'device': device, 'agent_id': agent_id})
- port = brocade_db.get_port(rpc_context, device[TAP_PREFIX_LEN:])
+ port = brocade_db.get_port(rpc_context,
+ device[len(q_const.TAP_DEVICE_PREFIX):])
if port:
entry = {'device': device,
'vlan_id': port.vlan_id,
@@ -151,7 +151,7 @@ class SecurityGroupServerRpcMixin(sg_db_rpc.SecurityGroupServerRpcMixin):
# Doing what other plugins are doing
session = db.get_session()
port = brocade_db.get_port_from_device(
- session, device[TAP_PREFIX_LEN:])
+ session, device[len(q_const.TAP_DEVICE_PREFIX):])
# TODO(shiv): need to extend the db model to include device owners
# make it appears that the device owner is of type network
diff --git a/neutron/plugins/brocade/__init__.py b/neutron/plugins/brocade/__init__.py
index ac50764575..e69de29bb2 100644
--- a/neutron/plugins/brocade/__init__.py
+++ b/neutron/plugins/brocade/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Brocade Communications System, Inc.
-# All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/brocade/db/__init__.py b/neutron/plugins/brocade/db/__init__.py
index ac50764575..e69de29bb2 100644
--- a/neutron/plugins/brocade/db/__init__.py
+++ b/neutron/plugins/brocade/db/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Brocade Communications System, Inc.
-# All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/brocade/nos/__init__.py b/neutron/plugins/brocade/nos/__init__.py
index 7f85d6b4fc..e69de29bb2 100644
--- a/neutron/plugins/brocade/nos/__init__.py
+++ b/neutron/plugins/brocade/nos/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 Brocade Communications Systems, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/cisco/__init__.py b/neutron/plugins/cisco/__init__.py
index 54aa18193d..e69de29bb2 100644
--- a/neutron/plugins/cisco/__init__.py
+++ b/neutron/plugins/cisco/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2011 Cisco Systems, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/cisco/cfg_agent/cfg_agent.py b/neutron/plugins/cisco/cfg_agent/cfg_agent.py
index d3d9eefb48..7512dee8ae 100644
--- a/neutron/plugins/cisco/cfg_agent/cfg_agent.py
+++ b/neutron/plugins/cisco/cfg_agent/cfg_agent.py
@@ -127,20 +127,20 @@ class CiscoCfgAgent(manager.Manager):
self.devmgr_rpc = CiscoDeviceManagementApi(topics.L3PLUGIN, host)
def _initialize_service_helpers(self, host):
- svc_helper_class = self.conf.routing_svc_helper_class
+ svc_helper_class = self.conf.cfg_agent.routing_svc_helper_class
try:
self.routing_service_helper = importutils.import_object(
svc_helper_class, host, self.conf, self)
except ImportError as e:
LOG.warn(_("Error in loading routing service helper. Class "
"specified is %(class)s. Reason:%(reason)s"),
- {'class': self.conf.routing_svc_helper_class,
+ {'class': self.conf.cfg_agent.routing_svc_helper_class,
'reason': e})
self.routing_service_helper = None
def _start_periodic_tasks(self):
self.loop = loopingcall.FixedIntervalLoopingCall(self.process_services)
- self.loop.start(interval=self.conf.rpc_loop_interval)
+ self.loop.start(interval=self.conf.cfg_agent.rpc_loop_interval)
def after_start(self):
LOG.info(_("Cisco cfg agent started"))
@@ -334,7 +334,7 @@ class CiscoCfgAgentWithStateReport(CiscoCfgAgent):
def main(manager='neutron.plugins.cisco.cfg_agent.'
'cfg_agent.CiscoCfgAgentWithStateReport'):
conf = cfg.CONF
- conf.register_opts(CiscoCfgAgent.OPTS)
+ conf.register_opts(CiscoCfgAgent.OPTS, "cfg_agent")
config.register_agent_state_opts_helper(conf)
config.register_root_helper(conf)
conf.register_opts(interface.OPTS)
diff --git a/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py b/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py
index 95d80b7cac..9993ddb379 100644
--- a/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py
+++ b/neutron/plugins/cisco/cfg_agent/device_drivers/csr1kv/csr1kv_routing_driver.py
@@ -55,7 +55,7 @@ class CSR1kvRoutingDriver(devicedriver_api.RoutingDriverBase):
if credentials:
self._csr_user = credentials['username']
self._csr_password = credentials['password']
- self._timeout = cfg.CONF.device_connection_timeout
+ self._timeout = cfg.CONF.cfg_agent.device_connection_timeout
self._csr_conn = None
self._intfs_enabled = False
except KeyError as e:
diff --git a/neutron/plugins/cisco/cfg_agent/device_status.py b/neutron/plugins/cisco/cfg_agent/device_status.py
index ff389fbc62..5bd9fc8af2 100644
--- a/neutron/plugins/cisco/cfg_agent/device_status.py
+++ b/neutron/plugins/cisco/cfg_agent/device_status.py
@@ -33,7 +33,7 @@ STATUS_OPTS = [
"or high load when the device may not be responding.")),
]
-cfg.CONF.register_opts(STATUS_OPTS)
+cfg.CONF.register_opts(STATUS_OPTS, "cfg_agent")
def _is_pingable(ip):
@@ -76,7 +76,7 @@ class DeviceStatus(object):
def get_backlogged_hosting_devices_info(self):
wait_time = datetime.timedelta(
- seconds=cfg.CONF.hosting_device_dead_timeout)
+ seconds=cfg.CONF.cfg_agent.hosting_device_dead_timeout)
resp = []
for hd_id in self.backlog_hosting_devices:
hd = self.backlog_hosting_devices[hd_id]['hd']
@@ -158,13 +158,14 @@ class DeviceStatus(object):
'ip': hd['management_ip_address']})
if timeutils.is_older_than(
hd['backlog_insertion_ts'],
- cfg.CONF.hosting_device_dead_timeout):
+ cfg.CONF.cfg_agent.hosting_device_dead_timeout):
LOG.debug("Hosting device: %(hd_id)s @ %(ip)s hasn't "
"been reachable for the last %(time)d seconds. "
"Marking it dead.",
{'hd_id': hd_id,
'ip': hd['management_ip_address'],
- 'time': cfg.CONF.hosting_device_dead_timeout})
+ 'time': cfg.CONF.cfg_agent.
+ hosting_device_dead_timeout})
response_dict['dead'].append(hd_id)
hd.pop('backlog_insertion_ts', None)
del self.backlog_hosting_devices[hd_id]
diff --git a/neutron/plugins/cisco/common/__init__.py b/neutron/plugins/cisco/common/__init__.py
index 54aa18193d..e69de29bb2 100644
--- a/neutron/plugins/cisco/common/__init__.py
+++ b/neutron/plugins/cisco/common/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2011 Cisco Systems, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/cisco/db/__init__.py b/neutron/plugins/cisco/db/__init__.py
index 54aa18193d..e69de29bb2 100644
--- a/neutron/plugins/cisco/db/__init__.py
+++ b/neutron/plugins/cisco/db/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2011 Cisco Systems, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/cisco/db/l3/device_handling_db.py b/neutron/plugins/cisco/db/l3/device_handling_db.py
index a283489918..4e5deccd70 100644
--- a/neutron/plugins/cisco/db/l3/device_handling_db.py
+++ b/neutron/plugins/cisco/db/l3/device_handling_db.py
@@ -187,30 +187,30 @@ class DeviceHandlingMixin(object):
return cls._mgmt_sec_grp_id
@classmethod
- def get_hosting_device_driver(self):
+ def get_hosting_device_driver(cls):
"""Returns device driver."""
- if self._hosting_device_driver:
- return self._hosting_device_driver
+ if cls._hosting_device_driver:
+ return cls._hosting_device_driver
else:
try:
- self._hosting_device_driver = importutils.import_object(
+ cls._hosting_device_driver = importutils.import_object(
cfg.CONF.hosting_devices.csr1kv_device_driver)
except (ImportError, TypeError, n_exc.NeutronException):
LOG.exception(_('Error loading hosting device driver'))
- return self._hosting_device_driver
+ return cls._hosting_device_driver
@classmethod
- def get_hosting_device_plugging_driver(self):
+ def get_hosting_device_plugging_driver(cls):
"""Returns plugging driver."""
- if self._plugging_driver:
- return self._plugging_driver
+ if cls._plugging_driver:
+ return cls._plugging_driver
else:
try:
- self._plugging_driver = importutils.import_object(
+ cls._plugging_driver = importutils.import_object(
cfg.CONF.hosting_devices.csr1kv_plugging_driver)
except (ImportError, TypeError, n_exc.NeutronException):
LOG.exception(_('Error loading plugging driver'))
- return self._plugging_driver
+ return cls._plugging_driver
def get_hosting_devices_qry(self, context, hosting_device_ids,
load_agent=True):
@@ -432,7 +432,7 @@ class DeviceHandlingMixin(object):
with context.session.begin(subtransactions=True):
hd_db = l3_models.HostingDevice(
id=hd.get('id') or uuidutils.generate_uuid(),
- complementary_id = hd.get('complementary_id'),
+ complementary_id=hd.get('complementary_id'),
tenant_id=tenant_id,
device_id=hd.get('device_id'),
admin_state_up=hd.get('admin_state_up', True),
diff --git a/neutron/plugins/cisco/db/n1kv_db_v2.py b/neutron/plugins/cisco/db/n1kv_db_v2.py
index d694b23676..d753d1cbc2 100644
--- a/neutron/plugins/cisco/db/n1kv_db_v2.py
+++ b/neutron/plugins/cisco/db/n1kv_db_v2.py
@@ -943,9 +943,9 @@ def update_profile_binding(db_session, profile_id, tenants, profile_type):
profile_id=profile_id, profile_type=profile_type).delete()
new_tenants_set = set(tenants)
for tenant_id in new_tenants_set:
- tenant = n1kv_models_v2.ProfileBinding(profile_type = profile_type,
- tenant_id = tenant_id,
- profile_id = profile_id)
+ tenant = n1kv_models_v2.ProfileBinding(profile_type=profile_type,
+ tenant_id=tenant_id,
+ profile_id=profile_id)
db_session.add(tenant)
@@ -957,14 +957,22 @@ def _get_profile_bindings(db_session, profile_type=None):
If profile type is None, return profile-tenant binding for all
profile types.
"""
- LOG.debug(_("_get_profile_bindings()"))
if profile_type:
- profile_bindings = (db_session.query(n1kv_models_v2.ProfileBinding).
- filter_by(profile_type=profile_type))
- return profile_bindings
+ return (db_session.query(n1kv_models_v2.ProfileBinding).
+ filter_by(profile_type=profile_type))
return db_session.query(n1kv_models_v2.ProfileBinding)
+def _get_profile_bindings_by_uuid(db_session, profile_id):
+ """
+ Retrieve a list of profile bindings.
+
+ Get all profile-tenant bindings based on profile UUID.
+ """
+ return (db_session.query(n1kv_models_v2.ProfileBinding).
+ filter_by(profile_id=profile_id))
+
+
class NetworkProfile_db_mixin(object):
"""Network Profile Mixin."""
@@ -1099,8 +1107,10 @@ class NetworkProfile_db_mixin(object):
original_net_p = get_network_profile(context.session, id)
# Update network profile to tenant id binding.
if context.is_admin and c_const.ADD_TENANTS in p:
- if context.tenant_id not in p[c_const.ADD_TENANTS]:
- p[c_const.ADD_TENANTS].append(context.tenant_id)
+ profile_bindings = _get_profile_bindings_by_uuid(context.session,
+ profile_id=id)
+ for bindings in profile_bindings:
+ p[c_const.ADD_TENANTS].append(bindings.tenant_id)
update_profile_binding(context.session, id,
p[c_const.ADD_TENANTS], c_const.NETWORK)
is_updated = True
diff --git a/neutron/plugins/cisco/extensions/__init__.py b/neutron/plugins/cisco/extensions/__init__.py
index 0318309e57..e69de29bb2 100644
--- a/neutron/plugins/cisco/extensions/__init__.py
+++ b/neutron/plugins/cisco/extensions/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/cisco/extensions/qos.py b/neutron/plugins/cisco/extensions/qos.py
index 5d6cb7b607..db642f1d4b 100644
--- a/neutron/plugins/cisco/extensions/qos.py
+++ b/neutron/plugins/cisco/extensions/qos.py
@@ -94,7 +94,7 @@ class QosController(common.NeutronController, wsgi.Controller):
result = [builder.build(qos, is_detail)['qos'] for qos in qoss]
return dict(qoss=result)
- # pylint: disable-msg=E1101
+ # pylint: disable=no-member
def show(self, request, tenant_id, id):
"""Returns qos details for the given qos id."""
try:
diff --git a/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py b/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py
index ffda751c28..5cd6a1eac9 100644
--- a/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py
+++ b/neutron/plugins/cisco/l3/plugging_drivers/n1kv_trunking_driver.py
@@ -316,7 +316,7 @@ class N1kvTrunkingPlugDriver(plug.PluginSidePluggingDriver):
except exception_type:
resource_ids.remove(item_id)
except n_exc.NeutronException as e:
- LOG.error(_('Failed to delete %(resource_name) %(net_id)s '
+ LOG.error(_('Failed to delete %(resource_name)s %(net_id)s '
'for service vm due to %(err)s'),
{'resource_name': name, 'net_id': item_id, 'err': e})
diff --git a/neutron/plugins/cisco/models/__init__.py b/neutron/plugins/cisco/models/__init__.py
index 54aa18193d..e69de29bb2 100644
--- a/neutron/plugins/cisco/models/__init__.py
+++ b/neutron/plugins/cisco/models/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2011 Cisco Systems, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/cisco/n1kv/__init__.py b/neutron/plugins/cisco/n1kv/__init__.py
index 73c4997f21..e69de29bb2 100644
--- a/neutron/plugins/cisco/n1kv/__init__.py
+++ b/neutron/plugins/cisco/n1kv/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 Cisco Systems, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py b/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py
index 236822d217..6e2629adab 100644
--- a/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py
+++ b/neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py
@@ -838,8 +838,7 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
"""
Send delete port request to VSM.
- Delete the port on the VSM. If it is the last port on the VM Network,
- delete the VM Network.
+ Delete the port on the VSM.
:param context: neutron api request context
:param port: port object which is to be deleted
:param vm_network: VM network object with which the port is associated
@@ -847,8 +846,6 @@ class N1kvNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
LOG.debug(_('_send_delete_port_request: %s'), port['id'])
n1kvclient = n1kv_client.Client()
n1kvclient.delete_n1kv_port(vm_network['name'], port['id'])
- if vm_network['port_count'] == 0:
- n1kvclient.delete_vm_network(vm_network['name'])
def _get_segmentation_id(self, context, id):
"""
diff --git a/neutron/plugins/common/__init__.py b/neutron/plugins/common/__init__.py
index b706747cf8..e69de29bb2 100644
--- a/neutron/plugins/common/__init__.py
+++ b/neutron/plugins/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/embrane/__init__.py b/neutron/plugins/embrane/__init__.py
index 5627edf2c9..e69de29bb2 100644
--- a/neutron/plugins/embrane/__init__.py
+++ b/neutron/plugins/embrane/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Embrane, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/embrane/agent/__init__.py b/neutron/plugins/embrane/agent/__init__.py
index 5627edf2c9..e69de29bb2 100644
--- a/neutron/plugins/embrane/agent/__init__.py
+++ b/neutron/plugins/embrane/agent/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Embrane, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/embrane/agent/operations/__init__.py b/neutron/plugins/embrane/agent/operations/__init__.py
index 5627edf2c9..e69de29bb2 100644
--- a/neutron/plugins/embrane/agent/operations/__init__.py
+++ b/neutron/plugins/embrane/agent/operations/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Embrane, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/embrane/common/__init__.py b/neutron/plugins/embrane/common/__init__.py
index 5627edf2c9..e69de29bb2 100644
--- a/neutron/plugins/embrane/common/__init__.py
+++ b/neutron/plugins/embrane/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Embrane, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/embrane/l2base/__init__.py b/neutron/plugins/embrane/l2base/__init__.py
index 5627edf2c9..e69de29bb2 100644
--- a/neutron/plugins/embrane/l2base/__init__.py
+++ b/neutron/plugins/embrane/l2base/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Embrane, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/embrane/l2base/fake/__init__.py b/neutron/plugins/embrane/l2base/fake/__init__.py
index 5627edf2c9..e69de29bb2 100644
--- a/neutron/plugins/embrane/l2base/fake/__init__.py
+++ b/neutron/plugins/embrane/l2base/fake/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Embrane, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/embrane/plugins/__init__.py b/neutron/plugins/embrane/plugins/__init__.py
index 5627edf2c9..e69de29bb2 100644
--- a/neutron/plugins/embrane/plugins/__init__.py
+++ b/neutron/plugins/embrane/plugins/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Embrane, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/hyperv/__init__.py b/neutron/plugins/hyperv/__init__.py
index 0089853d72..e69de29bb2 100644
--- a/neutron/plugins/hyperv/__init__.py
+++ b/neutron/plugins/hyperv/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Cloudbase Solutions SRL
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/hyperv/agent/__init__.py b/neutron/plugins/hyperv/agent/__init__.py
index 0089853d72..e69de29bb2 100644
--- a/neutron/plugins/hyperv/agent/__init__.py
+++ b/neutron/plugins/hyperv/agent/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Cloudbase Solutions SRL
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/hyperv/common/__init__.py b/neutron/plugins/hyperv/common/__init__.py
index 0089853d72..e69de29bb2 100644
--- a/neutron/plugins/hyperv/common/__init__.py
+++ b/neutron/plugins/hyperv/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Cloudbase Solutions SRL
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/linuxbridge/README b/neutron/plugins/linuxbridge/README
index 9f7f5d7c5a..89eb5ece63 100644
--- a/neutron/plugins/linuxbridge/README
+++ b/neutron/plugins/linuxbridge/README
@@ -1,128 +1,7 @@
# -- Background
-The Neutron Linux Bridge plugin is a plugin that allows you to manage
-connectivity between VMs on hosts that are capable of running a Linux Bridge.
-
-The Neutron Linux Bridge plugin consists of three components:
-
-1) The plugin itself: The plugin uses a database backend (mysql for
- now) to store configuration and mappings that are used by the
- agent. The mysql server runs on a central server (often the same
- host as nova itself).
-
-2) The neutron service host which will be running neutron. This can
- be run on the server running nova.
-
-3) An agent which runs on the host and communicates with the host operating
- system. The agent gathers the configuration and mappings from
- the mysql database running on the neutron host.
-
-The sections below describe how to configure and run the neutron
-service with the Linux Bridge plugin.
-
-# -- Python library dependencies
-
- Make sure you have the following package(s) installed on neutron server
- host as well as any hosts which run the agent:
- bridge-utils
- python-mysqldb
- sqlite3
-
-# -- Nova configuration (controller node)
-
-1) Ensure that the neutron network manager is configured in the
- nova.conf on the node that will be running nova-network.
-
-network_manager=nova.network.neutron.manager.NeutronManager
-
-# -- Nova configuration (compute node(s))
-
-1) Configure the vif driver, and libvirt/vif type
-
-connection_type=libvirt
-libvirt_type=qemu
-libvirt_vif_type=ethernet
-libvirt_vif_driver=nova.virt.libvirt.vif.NeutronLinuxBridgeVIFDriver
-linuxnet_interface_driver=nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver
-
-2) If you want a DHCP server to be run for the VMs to acquire IPs,
- add the following flag to your nova.conf file:
-
-neutron_use_dhcp=true
-
-(Note: For more details on how to work with Neutron using Nova, i.e. how to create networks and such,
- please refer to the top level Neutron README which points to the relevant documentation.)
-
-# -- Neutron configuration
-
-Make the Linux Bridge plugin the current neutron plugin
-
-- edit neutron.conf and change the core_plugin
-
-core_plugin = neutron.plugins.linuxbridge.lb_neutron_plugin.LinuxBridgePluginV2
-
-# -- Database config.
-
-(Note: The plugin ships with a default SQLite in-memory database configuration,
- and can be used to run tests without performing the suggested DB config below.)
-
-The Linux Bridge neutron plugin requires access to a mysql database in order
-to store configuration and mappings that will be used by the agent. Here is
-how to set up the database on the host that you will be running the neutron
-service on.
-
-MySQL should be installed on the host, and all plugins and clients
-must be configured with access to the database.
-
-To prep mysql, run:
-
-$ mysql -u root -p -e "create database neutron_linux_bridge"
-
-# log in to mysql service
-$ mysql -u root -p
-# The Linux Bridge Neutron agent running on each compute node must be able to
-# make a mysql connection back to the main database server.
-mysql> GRANT USAGE ON *.* to root@'yourremotehost' IDENTIFIED BY 'newpassword';
-# force update of authorization changes
-mysql> FLUSH PRIVILEGES;
-
-(Note: If the remote connection fails to MySQL, you might need to add the IP address,
- and/or fully-qualified hostname, and/or unqualified hostname in the above GRANT sql
- command. Also, you might need to specify "ALL" instead of "USAGE".)
-
-# -- Plugin configuration
-
-- Edit the configuration file:
- etc/neutron/plugins/linuxbridge/linuxbridge_conf.ini
- Make sure it matches your mysql configuration. This file must be updated
- with the addresses and credentials to access the database.
-
- Note: debug and logging information should be updated in etc/neutron.conf
-
- Note: When running the tests, set the connection type to sqlite, and when
- actually running the server set it to mysql. At any given time, only one
- of these should be active in the conf file (you can comment out the other).
-
-- On the neutron server, network_vlan_ranges must be configured in
- linuxbridge_conf.ini to specify the names of the physical networks
- managed by the linuxbridge plugin, along with the ranges of VLAN IDs
- available on each physical network for allocation to virtual
- networks. An entry of the form
- "<physical_network>:<vlan_min>:<vlan_max>" specifies a VLAN range on
- the named physical network. An entry of the form
- "<physical_network>" specifies a named network without making a
- range of VLANs available for allocation. Networks specified using
- either form are available for adminstrators to create provider flat
- networks and provider VLANs. Multiple VLAN ranges can be specified
- for the same physical network.
-
- The following example linuxbridge_conf.ini entry shows three
- physical networks that can be used to create provider networks, with
- ranges of VLANs available for allocation on two of them:
-
- [VLANS]
- network_vlan_ranges = physnet1:1000:2999,physnet1:3000:3999,physnet2,physnet3:1:4094
-
+The Neutron Linux Bridge plugin has removed from the tree in Juno. You must
+migrate to ML2 using the script in: neutron/db/migration/migrate_to_ml2.py
# -- Agent configuration
diff --git a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py
index ac586a9cd7..8011c0d4bd 100755
--- a/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py
+++ b/neutron/plugins/linuxbridge/agent/linuxbridge_neutron_agent.py
@@ -50,7 +50,6 @@ from neutron.plugins.linuxbridge.common import constants as lconst
LOG = logging.getLogger(__name__)
BRIDGE_NAME_PREFIX = "brq"
-TAP_INTERFACE_PREFIX = "tap"
BRIDGE_FS = "/sys/devices/virtual/net/"
BRIDGE_NAME_PLACEHOLDER = "bridge_name"
BRIDGE_INTERFACES_FS = BRIDGE_FS + BRIDGE_NAME_PLACEHOLDER + "/brif/"
@@ -109,7 +108,7 @@ class LinuxBridgeManager:
if not interface_id:
LOG.warning(_("Invalid Interface ID, will lead to incorrect "
"tap device name"))
- tap_device_name = TAP_INTERFACE_PREFIX + interface_id[0:11]
+ tap_device_name = constants.TAP_DEVICE_PREFIX + interface_id[0:11]
return tap_device_name
def get_vxlan_device_name(self, segmentation_id):
@@ -141,7 +140,7 @@ class LinuxBridgeManager:
try:
if_list = os.listdir(bridge_interface_path)
return len([interface for interface in if_list if
- interface.startswith(TAP_INTERFACE_PREFIX)])
+ interface.startswith(constants.TAP_DEVICE_PREFIX)])
except OSError:
return 0
@@ -509,7 +508,7 @@ class LinuxBridgeManager:
def get_tap_devices(self):
devices = set()
for device in os.listdir(BRIDGE_FS):
- if device.startswith(TAP_INTERFACE_PREFIX):
+ if device.startswith(constants.TAP_DEVICE_PREFIX):
devices.add(device)
return devices
diff --git a/neutron/plugins/linuxbridge/common/__init__.py b/neutron/plugins/linuxbridge/common/__init__.py
index 1f20c6bd46..e69de29bb2 100644
--- a/neutron/plugins/linuxbridge/common/__init__.py
+++ b/neutron/plugins/linuxbridge/common/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 Cisco Systems, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/linuxbridge/db/__init__.py b/neutron/plugins/linuxbridge/db/__init__.py
index 1f20c6bd46..e69de29bb2 100644
--- a/neutron/plugins/linuxbridge/db/__init__.py
+++ b/neutron/plugins/linuxbridge/db/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 Cisco Systems, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/linuxbridge/db/l2network_db_v2.py b/neutron/plugins/linuxbridge/db/l2network_db_v2.py
deleted file mode 100644
index 416bd2f593..0000000000
--- a/neutron/plugins/linuxbridge/db/l2network_db_v2.py
+++ /dev/null
@@ -1,238 +0,0 @@
-# Copyright (c) 2012 OpenStack Foundation.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from six import moves
-from sqlalchemy.orm import exc
-
-from neutron.common import exceptions as n_exc
-import neutron.db.api as db
-from neutron.db import models_v2
-from neutron.db import securitygroups_db as sg_db
-from neutron import manager
-from neutron.openstack.common import log as logging
-from neutron.plugins.linuxbridge.common import config # noqa
-from neutron.plugins.linuxbridge.common import constants
-from neutron.plugins.linuxbridge.db import l2network_models_v2
-
-LOG = logging.getLogger(__name__)
-
-
-def sync_network_states(network_vlan_ranges):
- """Synchronize network_states table with current configured VLAN ranges."""
-
- session = db.get_session()
- with session.begin():
- # get existing allocations for all physical networks
- allocations = dict()
- states = (session.query(l2network_models_v2.NetworkState).
- all())
- for state in states:
- if state.physical_network not in allocations:
- allocations[state.physical_network] = set()
- allocations[state.physical_network].add(state)
-
- # process vlan ranges for each configured physical network
- for physical_network, vlan_ranges in network_vlan_ranges.iteritems():
- # determine current configured allocatable vlans for this
- # physical network
- vlan_ids = set()
- for vlan_range in vlan_ranges:
- vlan_ids |= set(moves.xrange(vlan_range[0], vlan_range[1] + 1))
-
- # remove from table unallocated vlans not currently allocatable
- if physical_network in allocations:
- for state in allocations[physical_network]:
- try:
- # see if vlan is allocatable
- vlan_ids.remove(state.vlan_id)
- except KeyError:
- # it's not allocatable, so check if its allocated
- if not state.allocated:
- # it's not, so remove it from table
- LOG.debug(_("Removing vlan %(vlan_id)s on "
- "physical network %(physical_network)s"
- " from pool"),
- {'vlan_id': state.vlan_id,
- 'physical_network': physical_network})
- session.delete(state)
- del allocations[physical_network]
-
- # add missing allocatable vlans to table
- for vlan_id in sorted(vlan_ids):
- state = l2network_models_v2.NetworkState(physical_network,
- vlan_id)
- session.add(state)
-
- # remove from table unallocated vlans for any unconfigured physical
- # networks
- for states in allocations.itervalues():
- for state in states:
- if not state.allocated:
- LOG.debug(_("Removing vlan %(vlan_id)s on physical "
- "network %(physical_network)s"
- " from pool"),
- {'vlan_id': state.vlan_id,
- 'physical_network': state.physical_network})
- session.delete(state)
-
-
-def get_network_state(physical_network, vlan_id):
- """Get state of specified network."""
-
- session = db.get_session()
- try:
- state = (session.query(l2network_models_v2.NetworkState).
- filter_by(physical_network=physical_network,
- vlan_id=vlan_id).
- one())
- return state
- except exc.NoResultFound:
- return None
-
-
-def reserve_network(session):
- with session.begin(subtransactions=True):
- state = (session.query(l2network_models_v2.NetworkState).
- filter_by(allocated=False).
- with_lockmode('update').
- first())
- if not state:
- raise n_exc.NoNetworkAvailable()
- LOG.debug(_("Reserving vlan %(vlan_id)s on physical network "
- "%(physical_network)s from pool"),
- {'vlan_id': state.vlan_id,
- 'physical_network': state.physical_network})
- state.allocated = True
- return (state.physical_network, state.vlan_id)
-
-
-def reserve_specific_network(session, physical_network, vlan_id):
- with session.begin(subtransactions=True):
- try:
- state = (session.query(l2network_models_v2.NetworkState).
- filter_by(physical_network=physical_network,
- vlan_id=vlan_id).
- with_lockmode('update').
- one())
- if state.allocated:
- if vlan_id == constants.FLAT_VLAN_ID:
- raise n_exc.FlatNetworkInUse(
- physical_network=physical_network)
- else:
- raise n_exc.VlanIdInUse(vlan_id=vlan_id,
- physical_network=physical_network)
- LOG.debug(_("Reserving specific vlan %(vlan_id)s on physical "
- "network %(physical_network)s from pool"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
- state.allocated = True
- except exc.NoResultFound:
- LOG.debug(_("Reserving specific vlan %(vlan_id)s on physical "
- "network %(physical_network)s outside pool"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
- state = l2network_models_v2.NetworkState(physical_network, vlan_id)
- state.allocated = True
- session.add(state)
-
-
-def release_network(session, physical_network, vlan_id, network_vlan_ranges):
- with session.begin(subtransactions=True):
- try:
- state = (session.query(l2network_models_v2.NetworkState).
- filter_by(physical_network=physical_network,
- vlan_id=vlan_id).
- with_lockmode('update').
- one())
- state.allocated = False
- inside = False
- for vlan_range in network_vlan_ranges.get(physical_network, []):
- if vlan_id >= vlan_range[0] and vlan_id <= vlan_range[1]:
- inside = True
- break
- if inside:
- LOG.debug(_("Releasing vlan %(vlan_id)s on physical network "
- "%(physical_network)s to pool"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
- else:
- LOG.debug(_("Releasing vlan %(vlan_id)s on physical network "
- "%(physical_network)s outside pool"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
- session.delete(state)
- except exc.NoResultFound:
- LOG.warning(_("vlan_id %(vlan_id)s on physical network "
- "%(physical_network)s not found"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
-
-
-def add_network_binding(session, network_id, physical_network, vlan_id):
- with session.begin(subtransactions=True):
- binding = l2network_models_v2.NetworkBinding(network_id,
- physical_network, vlan_id)
- session.add(binding)
-
-
-def get_network_binding(session, network_id):
- try:
- binding = (session.query(l2network_models_v2.NetworkBinding).
- filter_by(network_id=network_id).
- one())
- return binding
- except exc.NoResultFound:
- return
-
-
-def get_port_from_device(device):
- """Get port from database."""
- LOG.debug(_("get_port_from_device() called"))
- session = db.get_session()
- sg_binding_port = sg_db.SecurityGroupPortBinding.port_id
-
- query = session.query(models_v2.Port,
- sg_db.SecurityGroupPortBinding.security_group_id)
- query = query.outerjoin(sg_db.SecurityGroupPortBinding,
- models_v2.Port.id == sg_binding_port)
- query = query.filter(models_v2.Port.id.startswith(device))
- port_and_sgs = query.all()
- if not port_and_sgs:
- return
- port = port_and_sgs[0][0]
- plugin = manager.NeutronManager.get_plugin()
- port_dict = plugin._make_port_dict(port)
- port_dict['security_groups'] = []
- for port_in_db, sg_id in port_and_sgs:
- if sg_id:
- port_dict['security_groups'].append(sg_id)
- port_dict['security_group_rules'] = []
- port_dict['security_group_source_groups'] = []
- port_dict['fixed_ips'] = [ip['ip_address']
- for ip in port['fixed_ips']]
- return port_dict
-
-
-def set_port_status(port_id, status):
- """Set the port status."""
- LOG.debug(_("set_port_status as %s called"), status)
- session = db.get_session()
- try:
- port = session.query(models_v2.Port).filter_by(id=port_id).one()
- port['status'] = status
- session.merge(port)
- session.flush()
- except exc.NoResultFound:
- raise n_exc.PortNotFound(port_id=port_id)
diff --git a/neutron/plugins/linuxbridge/lb_neutron_plugin.py b/neutron/plugins/linuxbridge/lb_neutron_plugin.py
deleted file mode 100644
index 2319f8da96..0000000000
--- a/neutron/plugins/linuxbridge/lb_neutron_plugin.py
+++ /dev/null
@@ -1,546 +0,0 @@
-# Copyright (c) 2012 OpenStack Foundation.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import sys
-
-from oslo.config import cfg
-
-from neutron.agent import securitygroups_rpc as sg_rpc
-from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api
-from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api
-from neutron.api.rpc.handlers import dhcp_rpc
-from neutron.api.rpc.handlers import l3_rpc
-from neutron.api.rpc.handlers import securitygroups_rpc
-from neutron.api.v2 import attributes
-from neutron.common import constants as q_const
-from neutron.common import exceptions as n_exc
-from neutron.common import rpc as n_rpc
-from neutron.common import topics
-from neutron.common import utils
-from neutron.db import agents_db
-from neutron.db import agentschedulers_db
-from neutron.db import api as db_api
-from neutron.db import db_base_plugin_v2
-from neutron.db import external_net_db
-from neutron.db import extraroute_db
-from neutron.db import l3_agentschedulers_db
-from neutron.db import l3_gwmode_db
-from neutron.db import portbindings_db
-from neutron.db import quota_db # noqa
-from neutron.db import securitygroups_rpc_base as sg_db_rpc
-from neutron.extensions import portbindings
-from neutron.extensions import providernet as provider
-from neutron import manager
-from neutron.openstack.common import importutils
-from neutron.openstack.common import log as logging
-from neutron.plugins.common import constants as svc_constants
-from neutron.plugins.common import utils as plugin_utils
-from neutron.plugins.linuxbridge.common import constants
-from neutron.plugins.linuxbridge.db import l2network_db_v2 as db
-
-
-LOG = logging.getLogger(__name__)
-
-# Device names start with "tap"
-TAP_PREFIX_LEN = 3
-
-
-class LinuxBridgeRpcCallbacks(n_rpc.RpcCallback):
-
- # history
- # 1.1 Support Security Group RPC
- # 1.2 Support get_devices_details_list
- RPC_API_VERSION = '1.2'
-
- def get_device_details(self, rpc_context, **kwargs):
- """Agent requests device details."""
- agent_id = kwargs.get('agent_id')
- device = kwargs.get('device')
- LOG.debug(_("Device %(device)s details requested from %(agent_id)s"),
- {'device': device, 'agent_id': agent_id})
- plugin = manager.NeutronManager.get_plugin()
- port = plugin.get_port_from_device(device)
- if port:
- binding = db.get_network_binding(db_api.get_session(),
- port['network_id'])
- (network_type,
- segmentation_id) = constants.interpret_vlan_id(binding.vlan_id)
- entry = {'device': device,
- 'network_type': network_type,
- 'physical_network': binding.physical_network,
- 'segmentation_id': segmentation_id,
- 'network_id': port['network_id'],
- 'port_id': port['id'],
- 'admin_state_up': port['admin_state_up']}
- if cfg.CONF.AGENT.rpc_support_old_agents:
- entry['vlan_id'] = binding.vlan_id
- new_status = (q_const.PORT_STATUS_ACTIVE if port['admin_state_up']
- else q_const.PORT_STATUS_DOWN)
- if port['status'] != new_status:
- db.set_port_status(port['id'], new_status)
- else:
- entry = {'device': device}
- LOG.debug(_("%s can not be found in database"), device)
- return entry
-
- def get_devices_details_list(self, rpc_context, **kwargs):
- return [
- self.get_device_details(
- rpc_context,
- device=device,
- **kwargs
- )
- for device in kwargs.pop('devices', [])
- ]
-
- def update_device_down(self, rpc_context, **kwargs):
- """Device no longer exists on agent."""
- # TODO(garyk) - live migration and port status
- agent_id = kwargs.get('agent_id')
- device = kwargs.get('device')
- host = kwargs.get('host')
- LOG.debug(_("Device %(device)s no longer exists on %(agent_id)s"),
- {'device': device, 'agent_id': agent_id})
- plugin = manager.NeutronManager.get_plugin()
- port = plugin.get_port_from_device(device)
- if port:
- entry = {'device': device,
- 'exists': True}
- if (host and not
- plugin.get_port_host(rpc_context, port['id']) == host):
- LOG.debug(_("Device %(device)s not bound to the"
- " agent host %(host)s"),
- {'device': device, 'host': host})
- elif port['status'] != q_const.PORT_STATUS_DOWN:
- # Set port status to DOWN
- db.set_port_status(port['id'], q_const.PORT_STATUS_DOWN)
- else:
- entry = {'device': device,
- 'exists': False}
- LOG.debug(_("%s can not be found in database"), device)
- return entry
-
- def update_device_up(self, rpc_context, **kwargs):
- """Device is up on agent."""
- agent_id = kwargs.get('agent_id')
- device = kwargs.get('device')
- host = kwargs.get('host')
- LOG.debug(_("Device %(device)s up on %(agent_id)s"),
- {'device': device, 'agent_id': agent_id})
- plugin = manager.NeutronManager.get_plugin()
- port = plugin.get_port_from_device(device)
- if port:
- if (host and
- not plugin.get_port_host(rpc_context, port['id']) == host):
- LOG.debug(_("Device %(device)s not bound to the"
- " agent host %(host)s"),
- {'device': device, 'host': host})
- return
- elif port['status'] != q_const.PORT_STATUS_ACTIVE:
- db.set_port_status(port['id'],
- q_const.PORT_STATUS_ACTIVE)
- else:
- LOG.debug(_("%s can not be found in database"), device)
-
-
-class AgentNotifierApi(n_rpc.RpcProxy,
- sg_rpc.SecurityGroupAgentRpcApiMixin):
- '''Agent side of the linux bridge rpc API.
-
- API version history:
- 1.0 - Initial version.
- 1.1 - Added get_active_networks_info, create_dhcp_port,
- and update_dhcp_port methods.
-
-
- '''
-
- BASE_RPC_API_VERSION = '1.1'
-
- def __init__(self, topic):
- super(AgentNotifierApi, self).__init__(
- topic=topic, default_version=self.BASE_RPC_API_VERSION)
- self.topic = topic
- self.topic_network_delete = topics.get_topic_name(topic,
- topics.NETWORK,
- topics.DELETE)
- self.topic_port_update = topics.get_topic_name(topic,
- topics.PORT,
- topics.UPDATE)
-
- def network_delete(self, context, network_id):
- self.fanout_cast(context,
- self.make_msg('network_delete',
- network_id=network_id),
- topic=self.topic_network_delete)
-
- def port_update(self, context, port, physical_network, vlan_id):
- network_type, segmentation_id = constants.interpret_vlan_id(vlan_id)
- kwargs = {'port': port,
- 'network_type': network_type,
- 'physical_network': physical_network,
- 'segmentation_id': segmentation_id}
- if cfg.CONF.AGENT.rpc_support_old_agents:
- kwargs['vlan_id'] = vlan_id
- msg = self.make_msg('port_update', **kwargs)
- self.fanout_cast(context, msg,
- topic=self.topic_port_update)
-
-
-class LinuxBridgePluginV2(db_base_plugin_v2.NeutronDbPluginV2,
- external_net_db.External_net_db_mixin,
- extraroute_db.ExtraRoute_db_mixin,
- l3_gwmode_db.L3_NAT_db_mixin,
- sg_db_rpc.SecurityGroupServerRpcMixin,
- l3_agentschedulers_db.L3AgentSchedulerDbMixin,
- agentschedulers_db.DhcpAgentSchedulerDbMixin,
- portbindings_db.PortBindingMixin):
- """Implement the Neutron abstractions using Linux bridging.
-
- A new VLAN is created for each network. An agent is relied upon
- to perform the actual Linux bridge configuration on each host.
-
- The provider extension is also supported. As discussed in
- https://bugs.launchpad.net/neutron/+bug/1023156, this class could
- be simplified, and filtering on extended attributes could be
- handled, by adding support for extended attributes to the
- NeutronDbPluginV2 base class. When that occurs, this class should
- be updated to take advantage of it.
-
- The port binding extension enables an external application relay
- information to and from the plugin.
- """
-
- # This attribute specifies whether the plugin supports or not
- # bulk/pagination/sorting operations. Name mangling is used in
- # order to ensure it is qualified by class
- __native_bulk_support = True
- __native_pagination_support = True
- __native_sorting_support = True
-
- _supported_extension_aliases = ["provider", "external-net", "router",
- "ext-gw-mode", "binding", "quotas",
- "security-group", "agent", "extraroute",
- "l3_agent_scheduler",
- "dhcp_agent_scheduler"]
-
- @property
- def supported_extension_aliases(self):
- if not hasattr(self, '_aliases'):
- aliases = self._supported_extension_aliases[:]
- sg_rpc.disable_security_group_extension_by_config(aliases)
- self._aliases = aliases
- return self._aliases
-
- def __init__(self):
- super(LinuxBridgePluginV2, self).__init__()
- self.base_binding_dict = {
- portbindings.VIF_TYPE: portbindings.VIF_TYPE_BRIDGE,
- portbindings.VIF_DETAILS: {
- # TODO(rkukura): Replace with new VIF security details
- portbindings.CAP_PORT_FILTER:
- 'security-group' in self.supported_extension_aliases}}
- self._parse_network_vlan_ranges()
- db.sync_network_states(self.network_vlan_ranges)
- self.tenant_network_type = cfg.CONF.VLANS.tenant_network_type
- if self.tenant_network_type not in [svc_constants.TYPE_LOCAL,
- svc_constants.TYPE_VLAN,
- svc_constants.TYPE_NONE]:
- LOG.error(_("Invalid tenant_network_type: %s. "
- "Service terminated!"),
- self.tenant_network_type)
- sys.exit(1)
- self._setup_rpc()
- self.network_scheduler = importutils.import_object(
- cfg.CONF.network_scheduler_driver
- )
- self.router_scheduler = importutils.import_object(
- cfg.CONF.router_scheduler_driver
- )
- LOG.debug(_("Linux Bridge Plugin initialization complete"))
-
- def _setup_rpc(self):
- # RPC support
- self.service_topics = {svc_constants.CORE: topics.PLUGIN,
- svc_constants.L3_ROUTER_NAT: topics.L3PLUGIN}
- self.conn = n_rpc.create_connection(new=True)
- self.endpoints = [LinuxBridgeRpcCallbacks(),
- securitygroups_rpc.SecurityGroupServerRpcCallback(),
- dhcp_rpc.DhcpRpcCallback(),
- l3_rpc.L3RpcCallback(),
- agents_db.AgentExtRpcCallback()]
- for svc_topic in self.service_topics.values():
- self.conn.create_consumer(svc_topic, self.endpoints, fanout=False)
- # Consume from all consumers in threads
- self.conn.consume_in_threads()
- self.notifier = AgentNotifierApi(topics.AGENT)
- self.agent_notifiers[q_const.AGENT_TYPE_DHCP] = (
- dhcp_rpc_agent_api.DhcpAgentNotifyAPI()
- )
- self.agent_notifiers[q_const.AGENT_TYPE_L3] = (
- l3_rpc_agent_api.L3AgentNotifyAPI()
- )
-
- def _parse_network_vlan_ranges(self):
- try:
- self.network_vlan_ranges = plugin_utils.parse_network_vlan_ranges(
- cfg.CONF.VLANS.network_vlan_ranges)
- except Exception as ex:
- LOG.error(_("%s. Agent terminated!"), ex)
- sys.exit(1)
- LOG.info(_("Network VLAN ranges: %s"), self.network_vlan_ranges)
-
- def _add_network_vlan_range(self, physical_network, vlan_min, vlan_max):
- self._add_network(physical_network)
- self.network_vlan_ranges[physical_network].append((vlan_min, vlan_max))
-
- def _add_network(self, physical_network):
- if physical_network not in self.network_vlan_ranges:
- self.network_vlan_ranges[physical_network] = []
-
- def _extend_network_dict_provider(self, context, network):
- binding = db.get_network_binding(context.session, network['id'])
- if binding.vlan_id == constants.FLAT_VLAN_ID:
- network[provider.NETWORK_TYPE] = svc_constants.TYPE_FLAT
- network[provider.PHYSICAL_NETWORK] = binding.physical_network
- network[provider.SEGMENTATION_ID] = None
- elif binding.vlan_id == constants.LOCAL_VLAN_ID:
- network[provider.NETWORK_TYPE] = svc_constants.TYPE_LOCAL
- network[provider.PHYSICAL_NETWORK] = None
- network[provider.SEGMENTATION_ID] = None
- else:
- network[provider.NETWORK_TYPE] = svc_constants.TYPE_VLAN
- network[provider.PHYSICAL_NETWORK] = binding.physical_network
- network[provider.SEGMENTATION_ID] = binding.vlan_id
-
- def _process_provider_create(self, context, attrs):
- network_type = attrs.get(provider.NETWORK_TYPE)
- physical_network = attrs.get(provider.PHYSICAL_NETWORK)
- segmentation_id = attrs.get(provider.SEGMENTATION_ID)
-
- network_type_set = attributes.is_attr_set(network_type)
- physical_network_set = attributes.is_attr_set(physical_network)
- segmentation_id_set = attributes.is_attr_set(segmentation_id)
-
- if not (network_type_set or physical_network_set or
- segmentation_id_set):
- return (None, None, None)
-
- if not network_type_set:
- msg = _("provider:network_type required")
- raise n_exc.InvalidInput(error_message=msg)
- elif network_type == svc_constants.TYPE_FLAT:
- if segmentation_id_set:
- msg = _("provider:segmentation_id specified for flat network")
- raise n_exc.InvalidInput(error_message=msg)
- else:
- segmentation_id = constants.FLAT_VLAN_ID
- elif network_type == svc_constants.TYPE_VLAN:
- if not segmentation_id_set:
- msg = _("provider:segmentation_id required")
- raise n_exc.InvalidInput(error_message=msg)
- if not utils.is_valid_vlan_tag(segmentation_id):
- msg = (_("provider:segmentation_id out of range "
- "(%(min_id)s through %(max_id)s)") %
- {'min_id': q_const.MIN_VLAN_TAG,
- 'max_id': q_const.MAX_VLAN_TAG})
- raise n_exc.InvalidInput(error_message=msg)
- elif network_type == svc_constants.TYPE_LOCAL:
- if physical_network_set:
- msg = _("provider:physical_network specified for local "
- "network")
- raise n_exc.InvalidInput(error_message=msg)
- else:
- physical_network = None
- if segmentation_id_set:
- msg = _("provider:segmentation_id specified for local "
- "network")
- raise n_exc.InvalidInput(error_message=msg)
- else:
- segmentation_id = constants.LOCAL_VLAN_ID
- else:
- msg = _("provider:network_type %s not supported") % network_type
- raise n_exc.InvalidInput(error_message=msg)
-
- if network_type in [svc_constants.TYPE_VLAN, svc_constants.TYPE_FLAT]:
- if physical_network_set:
- if physical_network not in self.network_vlan_ranges:
- msg = (_("Unknown provider:physical_network %s") %
- physical_network)
- raise n_exc.InvalidInput(error_message=msg)
- elif 'default' in self.network_vlan_ranges:
- physical_network = 'default'
- else:
- msg = _("provider:physical_network required")
- raise n_exc.InvalidInput(error_message=msg)
-
- return (network_type, physical_network, segmentation_id)
-
- def create_network(self, context, network):
- (network_type, physical_network,
- vlan_id) = self._process_provider_create(context,
- network['network'])
-
- session = context.session
- with session.begin(subtransactions=True):
- #set up default security groups
- tenant_id = self._get_tenant_id_for_create(
- context, network['network'])
- self._ensure_default_security_group(context, tenant_id)
-
- if not network_type:
- # tenant network
- network_type = self.tenant_network_type
- if network_type == svc_constants.TYPE_NONE:
- raise n_exc.TenantNetworksDisabled()
- elif network_type == svc_constants.TYPE_VLAN:
- physical_network, vlan_id = db.reserve_network(session)
- else: # TYPE_LOCAL
- vlan_id = constants.LOCAL_VLAN_ID
- else:
- # provider network
- if network_type in [svc_constants.TYPE_VLAN,
- svc_constants.TYPE_FLAT]:
- db.reserve_specific_network(session, physical_network,
- vlan_id)
- # no reservation needed for TYPE_LOCAL
- net = super(LinuxBridgePluginV2, self).create_network(context,
- network)
- db.add_network_binding(session, net['id'],
- physical_network, vlan_id)
- self._process_l3_create(context, net, network['network'])
- self._extend_network_dict_provider(context, net)
- # note - exception will rollback entire transaction
- return net
-
- def update_network(self, context, id, network):
- provider._raise_if_updates_provider_attributes(network['network'])
-
- session = context.session
- with session.begin(subtransactions=True):
- net = super(LinuxBridgePluginV2, self).update_network(context, id,
- network)
- self._process_l3_update(context, net, network['network'])
- self._extend_network_dict_provider(context, net)
- return net
-
- def delete_network(self, context, id):
- session = context.session
- with session.begin(subtransactions=True):
- binding = db.get_network_binding(session, id)
- self._process_l3_delete(context, id)
- super(LinuxBridgePluginV2, self).delete_network(context, id)
- if binding.vlan_id != constants.LOCAL_VLAN_ID:
- db.release_network(session, binding.physical_network,
- binding.vlan_id, self.network_vlan_ranges)
- # the network_binding record is deleted via cascade from
- # the network record, so explicit removal is not necessary
- self.notifier.network_delete(context, id)
-
- def get_network(self, context, id, fields=None):
- session = context.session
- with session.begin(subtransactions=True):
- net = super(LinuxBridgePluginV2, self).get_network(context,
- id, None)
- self._extend_network_dict_provider(context, net)
- return self._fields(net, fields)
-
- def get_networks(self, context, filters=None, fields=None,
- sorts=None, limit=None, marker=None, page_reverse=False):
- session = context.session
- with session.begin(subtransactions=True):
- nets = super(LinuxBridgePluginV2,
- self).get_networks(context, filters, None, sorts,
- limit, marker, page_reverse)
- for net in nets:
- self._extend_network_dict_provider(context, net)
-
- return [self._fields(net, fields) for net in nets]
-
- def create_port(self, context, port):
- session = context.session
- port_data = port['port']
- with session.begin(subtransactions=True):
- self._ensure_default_security_group_on_port(context, port)
- sgids = self._get_security_groups_on_port(context, port)
- # Set port status as 'DOWN'. This will be updated by agent
- port['port']['status'] = q_const.PORT_STATUS_DOWN
-
- port = super(LinuxBridgePluginV2,
- self).create_port(context, port)
- self._process_portbindings_create_and_update(context,
- port_data,
- port)
- self._process_port_create_security_group(
- context, port, sgids)
- self.notify_security_groups_member_updated(context, port)
- return port
-
- def update_port(self, context, id, port):
- original_port = self.get_port(context, id)
- session = context.session
- need_port_update_notify = False
-
- with session.begin(subtransactions=True):
- updated_port = super(LinuxBridgePluginV2, self).update_port(
- context, id, port)
- self._process_portbindings_create_and_update(context,
- port['port'],
- updated_port)
- need_port_update_notify = self.update_security_group_on_port(
- context, id, port, original_port, updated_port)
-
- need_port_update_notify |= self.is_security_group_member_updated(
- context, original_port, updated_port)
-
- if original_port['admin_state_up'] != updated_port['admin_state_up']:
- need_port_update_notify = True
-
- if need_port_update_notify:
- self._notify_port_updated(context, updated_port)
- return updated_port
-
- def delete_port(self, context, id, l3_port_check=True):
-
- # if needed, check to see if this is a port owned by
- # and l3-router. If so, we should prevent deletion.
- if l3_port_check:
- self.prevent_l3_port_deletion(context, id)
-
- session = context.session
- with session.begin(subtransactions=True):
- router_ids = self.disassociate_floatingips(
- context, id, do_notify=False)
- port = self.get_port(context, id)
- self._delete_port_security_group_bindings(context, id)
- super(LinuxBridgePluginV2, self).delete_port(context, id)
-
- # now that we've left db transaction, we are safe to notify
- self.notify_routers_updated(context, router_ids)
- self.notify_security_groups_member_updated(context, port)
-
- def _notify_port_updated(self, context, port):
- binding = db.get_network_binding(context.session,
- port['network_id'])
- self.notifier.port_update(context, port,
- binding.physical_network,
- binding.vlan_id)
-
- @classmethod
- def get_port_from_device(cls, device):
- port = db.get_port_from_device(device[TAP_PREFIX_LEN:])
- if port:
- port['device'] = device
- return port
diff --git a/neutron/plugins/metaplugin/__init__.py b/neutron/plugins/metaplugin/__init__.py
index 65685178bf..e69de29bb2 100644
--- a/neutron/plugins/metaplugin/__init__.py
+++ b/neutron/plugins/metaplugin/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/metaplugin/common/__init__.py b/neutron/plugins/metaplugin/common/__init__.py
index 65685178bf..e69de29bb2 100644
--- a/neutron/plugins/metaplugin/common/__init__.py
+++ b/neutron/plugins/metaplugin/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/midonet/__init__.py b/neutron/plugins/midonet/__init__.py
index e2cc2a75b7..e69de29bb2 100644
--- a/neutron/plugins/midonet/__init__.py
+++ b/neutron/plugins/midonet/__init__.py
@@ -1,15 +0,0 @@
-# Copyright (C) 2012 Midokura Japan K.K.
-# Copyright (C) 2013 Midokura PTE LTD
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/midonet/agent/__init__.py b/neutron/plugins/midonet/agent/__init__.py
index cf581856dd..e69de29bb2 100644
--- a/neutron/plugins/midonet/agent/__init__.py
+++ b/neutron/plugins/midonet/agent/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (C) 2013 Midokura PTE LTD
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/midonet/common/__init__.py b/neutron/plugins/midonet/common/__init__.py
index cf581856dd..e69de29bb2 100644
--- a/neutron/plugins/midonet/common/__init__.py
+++ b/neutron/plugins/midonet/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (C) 2013 Midokura PTE LTD
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/midonet/midonet_lib.py b/neutron/plugins/midonet/midonet_lib.py
index a733eb0574..60dac24250 100644
--- a/neutron/plugins/midonet/midonet_lib.py
+++ b/neutron/plugins/midonet/midonet_lib.py
@@ -212,7 +212,8 @@ class MidoClient:
raise MidonetApiException(
msg=_("Tried to delete non-existent DHCP"))
for dhcp in dhcp_subnets:
- if dhcp.get_subnet_prefix() == net_addr:
+ if (dhcp.get_subnet_prefix() == net_addr and
+ dhcp.get_subnet_length() == str(net_len)):
dhcp.delete()
break
diff --git a/neutron/plugins/ml2/__init__.py b/neutron/plugins/ml2/__init__.py
index 788cea1f70..e69de29bb2 100644
--- a/neutron/plugins/ml2/__init__.py
+++ b/neutron/plugins/ml2/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/ml2/common/__init__.py b/neutron/plugins/ml2/common/__init__.py
index 788cea1f70..e69de29bb2 100644
--- a/neutron/plugins/ml2/common/__init__.py
+++ b/neutron/plugins/ml2/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/ml2/db.py b/neutron/plugins/ml2/db.py
index d8caa9384a..37e91bc791 100644
--- a/neutron/plugins/ml2/db.py
+++ b/neutron/plugins/ml2/db.py
@@ -39,7 +39,8 @@ def _make_segment_dict(record):
api.SEGMENTATION_ID: record.segmentation_id}
-def add_network_segment(session, network_id, segment, is_dynamic=False):
+def add_network_segment(session, network_id, segment, segment_index=0,
+ is_dynamic=False):
with session.begin(subtransactions=True):
record = models.NetworkSegment(
id=uuidutils.generate_uuid(),
@@ -47,6 +48,7 @@ def add_network_segment(session, network_id, segment, is_dynamic=False):
network_type=segment.get(api.NETWORK_TYPE),
physical_network=segment.get(api.PHYSICAL_NETWORK),
segmentation_id=segment.get(api.SEGMENTATION_ID),
+ segment_index=segment_index,
is_dynamic=is_dynamic
)
session.add(record)
@@ -61,7 +63,8 @@ def add_network_segment(session, network_id, segment, is_dynamic=False):
def get_network_segments(session, network_id, filter_dynamic=False):
with session.begin(subtransactions=True):
query = (session.query(models.NetworkSegment).
- filter_by(network_id=network_id))
+ filter_by(network_id=network_id).
+ order_by(models.NetworkSegment.segment_index))
if filter_dynamic is not None:
query = query.filter_by(is_dynamic=filter_dynamic)
records = query.all()
diff --git a/neutron/plugins/ml2/drivers/__init__.py b/neutron/plugins/ml2/drivers/__init__.py
index 788cea1f70..e69de29bb2 100644
--- a/neutron/plugins/ml2/drivers/__init__.py
+++ b/neutron/plugins/ml2/drivers/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/ml2/drivers/arista/__init__.py b/neutron/plugins/ml2/drivers/arista/__init__.py
index 788cea1f70..e69de29bb2 100644
--- a/neutron/plugins/ml2/drivers/arista/__init__.py
+++ b/neutron/plugins/ml2/drivers/arista/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py b/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py
index aac24410f0..0d3190eddc 100644
--- a/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py
+++ b/neutron/plugins/ml2/drivers/arista/arista_l3_driver.py
@@ -33,6 +33,8 @@ VIRTUAL_ROUTER_MAC = '00:11:22:33:44:55'
IPV4_BITS = 32
IPV6_BITS = 128
+# This string-format-at-a-distance confuses pylint :(
+# pylint: disable=too-many-format-args
router_in_vrf = {
'router': {'create': ['vrf definition {0}',
'rd {1}',
@@ -247,16 +249,38 @@ class AristaL3Driver(object):
rdm = str(int(hashlib.sha256(router_name).hexdigest(),
16) % 6553)
+ mlag_peer_failed = False
for s in self._servers:
- self.create_router_on_eos(router_name, rdm, s)
+ try:
+ self.create_router_on_eos(router_name, rdm, s)
+ mlag_peer_failed = False
+ except Exception:
+ if self.mlag_configured and not mlag_peer_failed:
+ mlag_peer_failed = True
+ else:
+ msg = (_('Failed to create router %s on EOS') %
+ router_name)
+ LOG.exception(msg)
+ raise arista_exc.AristaServicePluginRpcError(msg=msg)
def delete_router(self, context, tenant_id, router_id, router):
"""Deletes a router from Arista Switch."""
if router:
+ router_name = self._arista_router_name(tenant_id, router['name'])
+ mlag_peer_failed = False
for s in self._servers:
- self.delete_router_from_eos(self._arista_router_name(
- tenant_id, router['name']), s)
+ try:
+ self.delete_router_from_eos(router_name, s)
+ mlag_peer_failed = False
+ except Exception:
+ if self.mlag_configured and not mlag_peer_failed:
+ mlag_peer_failed = True
+ else:
+ msg = (_('Failed to create router %s on EOS') %
+ router_name)
+ LOG.exception(msg)
+ raise arista_exc.AristaServicePluginRpcError(msg=msg)
def update_router(self, context, router_id, original_router, new_router):
"""Updates a router which is already created on Arista Switch.
@@ -279,15 +303,27 @@ class AristaL3Driver(object):
if self.mlag_configured:
# For MLAG, we send a specific IP address as opposed to cidr
# For now, we are using x.x.x.253 and x.x.x.254 as virtual IP
+ mlag_peer_failed = False
for i, server in enumerate(self._servers):
#get appropriate virtual IP address for this router
router_ip = self._get_router_ip(cidr, i,
router_info['ip_version'])
- self.add_interface_to_router(router_info['seg_id'],
- router_name,
- router_info['gip'],
- router_ip, subnet_mask,
- server)
+ try:
+ self.add_interface_to_router(router_info['seg_id'],
+ router_name,
+ router_info['gip'],
+ router_ip, subnet_mask,
+ server)
+ mlag_peer_failed = False
+ except Exception:
+ if not mlag_peer_failed:
+ mlag_peer_failed = True
+ else:
+ msg = (_('Failed to add interface to router '
+ '%s on EOS') % router_name)
+ LOG.exception(msg)
+ raise arista_exc.AristaServicePluginRpcError(
+ msg=msg)
else:
for s in self._servers:
@@ -304,9 +340,21 @@ class AristaL3Driver(object):
if router_info:
router_name = self._arista_router_name(router_info['tenant_id'],
router_info['name'])
+ mlag_peer_failed = False
for s in self._servers:
- self.delete_interface_from_router(router_info['seg_id'],
- router_name, s)
+ try:
+ self.delete_interface_from_router(router_info['seg_id'],
+ router_name, s)
+ if self.mlag_configured:
+ mlag_peer_failed = False
+ except Exception:
+ if self.mlag_configured and not mlag_peer_failed:
+ mlag_peer_failed = True
+ else:
+ msg = (_('Failed to add interface to router '
+ '%s on EOS') % router_name)
+ LOG.exception(msg)
+ raise arista_exc.AristaServicePluginRpcError(msg=msg)
def _run_openstack_l3_cmds(self, commands, server):
"""Execute/sends a CAPI (Command API) command to EOS.
diff --git a/neutron/plugins/ml2/drivers/l2pop/__init__.py b/neutron/plugins/ml2/drivers/l2pop/__init__.py
index e82932559d..e69de29bb2 100644
--- a/neutron/plugins/ml2/drivers/l2pop/__init__.py
+++ b/neutron/plugins/ml2/drivers/l2pop/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/ml2/drivers/l2pop/mech_driver.py b/neutron/plugins/ml2/drivers/l2pop/mech_driver.py
index a98a27fd7d..c85acb1c73 100644
--- a/neutron/plugins/ml2/drivers/l2pop/mech_driver.py
+++ b/neutron/plugins/ml2/drivers/l2pop/mech_driver.py
@@ -38,32 +38,18 @@ class L2populationMechanismDriver(api.MechanismDriver,
LOG.debug(_("Experimental L2 population driver"))
self.rpc_ctx = n_context.get_admin_context_without_session()
self.migrated_ports = {}
- self.remove_fdb_entries = {}
def _get_port_fdb_entries(self, port):
return [[port['mac_address'],
ip['ip_address']] for ip in port['fixed_ips']]
- def delete_port_precommit(self, context):
- port = context.current
- agent_host = context.host
-
- if port['id'] not in self.remove_fdb_entries:
- self.remove_fdb_entries[port['id']] = {}
-
- self.remove_fdb_entries[port['id']][agent_host] = (
- self._update_port_down(context, port, agent_host, 1))
-
def delete_port_postcommit(self, context):
port = context.current
agent_host = context.host
- if port['id'] in self.remove_fdb_entries:
- for agent_host in list(self.remove_fdb_entries[port['id']]):
- self.L2populationAgentNotify.remove_fdb_entries(
- self.rpc_ctx,
- self.remove_fdb_entries[port['id']][agent_host])
- self.remove_fdb_entries[port['id']].pop(agent_host, 0)
- self.remove_fdb_entries.pop(port['id'], 0)
+
+ fdb_entries = self._update_port_down(context, port, agent_host)
+ self.L2populationAgentNotify.remove_fdb_entries(self.rpc_ctx,
+ fdb_entries)
def _get_diff_ips(self, orig, port):
orig_ips = set([ip['ip_address'] for ip in orig['fixed_ips']])
@@ -260,8 +246,7 @@ class L2populationMechanismDriver(api.MechanismDriver,
self.L2populationAgentNotify.add_fdb_entries(self.rpc_ctx,
other_fdb_entries)
- def _update_port_down(self, context, port, agent_host,
- agent_active_ports_count_for_flooding=0):
+ def _update_port_down(self, context, port, agent_host):
port_infos = self._get_port_infos(context, port, agent_host)
if not port_infos:
return
@@ -277,7 +262,7 @@ class L2populationMechanismDriver(api.MechanismDriver,
{'segment_id': segment['segmentation_id'],
'network_type': segment['network_type'],
'ports': {agent_ip: []}}}
- if agent_active_ports == agent_active_ports_count_for_flooding:
+ if agent_active_ports == 0:
# Agent is removing its last activated port in this network,
# other agents needs to be notified to delete their flooding entry.
other_fdb_entries[network_id]['ports'][agent_ip].append(
diff --git a/neutron/plugins/ml2/drivers/mechanism_odl.py b/neutron/plugins/ml2/drivers/mechanism_odl.py
index 18b12a65a6..05ca33bb7f 100644
--- a/neutron/plugins/ml2/drivers/mechanism_odl.py
+++ b/neutron/plugins/ml2/drivers/mechanism_odl.py
@@ -30,11 +30,8 @@ from neutron.plugins.ml2 import driver_api as api
LOG = log.getLogger(__name__)
-ODL_NETWORK = 'network'
ODL_NETWORKS = 'networks'
-ODL_SUBNET = 'subnet'
ODL_SUBNETS = 'subnets'
-ODL_PORT = 'port'
ODL_PORTS = 'ports'
odl_opts = [
@@ -97,11 +94,10 @@ class JsessionId(requests.auth.AuthBase):
r = requests.get(self.url, auth=(self.username, self.password))
r.raise_for_status()
except requests.exceptions.HTTPError as e:
- raise OpendaylightAuthError(msg=_("Failed to authenticate with "
- "OpenDaylight: %s") % e)
+ raise OpendaylightAuthError(msg="Failed to authenticate with "
+ "OpenDaylight: %s" % e)
except requests.exceptions.Timeout as e:
- raise OpendaylightAuthError(msg=_("Authentication Timed"
- " Out: %s") % e)
+ raise OpendaylightAuthError(msg="Authentication Timed Out: %s" % e)
jsessionid = r.cookies.get('JSESSIONID')
jsessionidsso = r.cookies.get('JSESSIONIDSSO')
@@ -179,24 +175,26 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
else:
self.sync_single_resource(operation, object_type, context)
- def filter_create_network_attributes(self, network, context, dbcontext):
+ @staticmethod
+ def filter_create_network_attributes(network, context):
"""Filter out network attributes not required for a create."""
try_del(network, ['status', 'subnets'])
- def filter_create_subnet_attributes(self, subnet, context, dbcontext):
+ @staticmethod
+ def filter_create_subnet_attributes(subnet, context):
"""Filter out subnet attributes not required for a create."""
pass
- def filter_create_port_attributes(self, port, context, dbcontext):
+ @classmethod
+ def filter_create_port_attributes(cls, port, context):
"""Filter out port attributes not required for a create."""
- self.add_security_groups(context, dbcontext, port)
+ cls.add_security_groups(port, context)
# TODO(kmestery): Converting to uppercase due to ODL bug
# https://bugs.opendaylight.org/show_bug.cgi?id=477
port['mac_address'] = port['mac_address'].upper()
try_del(port, ['status'])
- def sync_resources(self, resource_name, collection_name, resources,
- context, dbcontext, attr_filter):
+ def sync_resources(self, collection_name, context):
"""Sync objects from Neutron over to OpenDaylight.
This will handle syncing networks, subnets, and ports from Neutron to
@@ -204,6 +202,9 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
valid for create API operations.
"""
to_be_synced = []
+ dbcontext = context._plugin_context
+ obj_getter = getattr(context._plugin, 'get_%s' % collection_name)
+ resources = obj_getter(dbcontext)
for resource in resources:
try:
urlpath = collection_name + '/' + resource['id']
@@ -211,11 +212,12 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
except requests.exceptions.HTTPError as e:
with excutils.save_and_reraise_exception() as ctx:
if e.response.status_code == requests.codes.not_found:
- attr_filter(resource, context, dbcontext)
+ attr_filter = self.create_object_map[collection_name]
+ attr_filter(resource, context)
to_be_synced.append(resource)
ctx.reraise = False
-
- key = resource_name if len(to_be_synced) == 1 else collection_name
+ key = collection_name[:-1] if len(to_be_synced) == 1 else (
+ collection_name)
# 400 errors are returned if an object exists, which we ignore.
self.sendjson('post', collection_name, {key: to_be_synced},
@@ -230,45 +232,28 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
"""
if not self.out_of_sync:
return
- dbcontext = context._plugin_context
- networks = context._plugin.get_networks(dbcontext)
- subnets = context._plugin.get_subnets(dbcontext)
- ports = context._plugin.get_ports(dbcontext)
-
- self.sync_resources(ODL_NETWORK, ODL_NETWORKS, networks,
- context, dbcontext,
- self.filter_create_network_attributes)
- self.sync_resources(ODL_SUBNET, ODL_SUBNETS, subnets,
- context, dbcontext,
- self.filter_create_subnet_attributes)
- self.sync_resources(ODL_PORT, ODL_PORTS, ports,
- context, dbcontext,
- self.filter_create_port_attributes)
+ for collection_name in [ODL_NETWORKS, ODL_SUBNETS, ODL_PORTS]:
+ self.sync_resources(collection_name, context)
self.out_of_sync = False
- def filter_update_network_attributes(self, network, context, dbcontext):
+ @staticmethod
+ def filter_update_network_attributes(network, context):
"""Filter out network attributes for an update operation."""
try_del(network, ['id', 'status', 'subnets', 'tenant_id'])
- def filter_update_subnet_attributes(self, subnet, context, dbcontext):
+ @staticmethod
+ def filter_update_subnet_attributes(subnet, context):
"""Filter out subnet attributes for an update operation."""
try_del(subnet, ['id', 'network_id', 'ip_version', 'cidr',
'allocation_pools', 'tenant_id'])
- def filter_update_port_attributes(self, port, context, dbcontext):
+ @classmethod
+ def filter_update_port_attributes(cls, port, context):
"""Filter out port attributes for an update operation."""
- self.add_security_groups(context, dbcontext, port)
+ cls.add_security_groups(port, context)
try_del(port, ['network_id', 'id', 'status', 'mac_address',
'tenant_id', 'fixed_ips'])
- create_object_map = {ODL_NETWORKS: filter_create_network_attributes,
- ODL_SUBNETS: filter_create_subnet_attributes,
- ODL_PORTS: filter_create_port_attributes}
-
- update_object_map = {ODL_NETWORKS: filter_update_network_attributes,
- ODL_SUBNETS: filter_update_subnet_attributes,
- ODL_PORTS: filter_update_port_attributes}
-
def sync_single_resource(self, operation, object_type, context):
"""Sync over a single resource from Neutron to OpenDaylight.
@@ -290,7 +275,7 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
method = 'put'
attr_filter = self.update_object_map[object_type]
resource = context.current.copy()
- attr_filter(self, resource, context, context._plugin_context)
+ attr_filter(resource, context)
# 400 errors are returned if an object exists, which we ignore.
self.sendjson(method, urlpath, {object_type[:-1]: resource},
[requests.codes.bad_request])
@@ -298,20 +283,21 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
with excutils.save_and_reraise_exception():
self.out_of_sync = True
- def add_security_groups(self, context, dbcontext, port):
+ @staticmethod
+ def add_security_groups(port, context):
"""Populate the 'security_groups' field with entire records."""
+ dbcontext = context._plugin_context
groups = [context._plugin.get_security_group(dbcontext, sg)
for sg in port['security_groups']]
port['security_groups'] = groups
def sendjson(self, method, urlpath, obj, ignorecodes=[]):
"""Send json to the OpenDaylight controller."""
-
headers = {'Content-Type': 'application/json'}
data = jsonutils.dumps(obj, indent=2) if obj else None
url = '/'.join([self.url, urlpath])
- LOG.debug(_('ODL-----> sending URL (%s) <-----ODL') % url)
- LOG.debug(_('ODL-----> sending JSON (%s) <-----ODL') % obj)
+ LOG.debug("Sending METHOD (%(method)s) URL (%(url)s) JSON (%(obj)s)",
+ {'method': method, 'url': url, 'obj': obj})
r = requests.request(method, url=url,
headers=headers, data=data,
auth=self.auth, timeout=self.timeout)
@@ -322,8 +308,8 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
r.raise_for_status()
def bind_port(self, context):
- LOG.debug(_("Attempting to bind port %(port)s on "
- "network %(network)s"),
+ LOG.debug("Attempting to bind port %(port)s on "
+ "network %(network)s",
{'port': context.current['id'],
'network': context.network.current['id']})
for segment in context.network.network_segments:
@@ -332,12 +318,12 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
self.vif_type,
self.vif_details,
status=n_const.PORT_STATUS_ACTIVE)
- LOG.debug(_("Bound using segment: %s"), segment)
+ LOG.debug("Bound using segment: %s", segment)
return
else:
- LOG.debug(_("Refusing to bind port for segment ID %(id)s, "
- "segment %(seg)s, phys net %(physnet)s, and "
- "network type %(nettype)s"),
+ LOG.debug("Refusing to bind port for segment ID %(id)s, "
+ "segment %(seg)s, phys net %(physnet)s, and "
+ "network type %(nettype)s",
{'id': segment[api.ID],
'seg': segment[api.SEGMENTATION_ID],
'physnet': segment[api.PHYSICAL_NETWORK],
@@ -352,3 +338,14 @@ class OpenDaylightMechanismDriver(api.MechanismDriver):
network_type = segment[api.NETWORK_TYPE]
return network_type in [constants.TYPE_LOCAL, constants.TYPE_GRE,
constants.TYPE_VXLAN, constants.TYPE_VLAN]
+
+
+OpenDaylightMechanismDriver.create_object_map = {
+ ODL_NETWORKS: OpenDaylightMechanismDriver.filter_create_network_attributes,
+ ODL_SUBNETS: OpenDaylightMechanismDriver.filter_create_subnet_attributes,
+ ODL_PORTS: OpenDaylightMechanismDriver.filter_create_port_attributes}
+
+OpenDaylightMechanismDriver.update_object_map = {
+ ODL_NETWORKS: OpenDaylightMechanismDriver.filter_update_network_attributes,
+ ODL_SUBNETS: OpenDaylightMechanismDriver.filter_update_subnet_attributes,
+ ODL_PORTS: OpenDaylightMechanismDriver.filter_update_port_attributes}
diff --git a/neutron/plugins/ml2/managers.py b/neutron/plugins/ml2/managers.py
index 9c6c6fc514..8700934fe6 100644
--- a/neutron/plugins/ml2/managers.py
+++ b/neutron/plugins/ml2/managers.py
@@ -152,10 +152,11 @@ class TypeManager(stevedore.named.NamedExtensionManager):
with session.begin(subtransactions=True):
network_id = network['id']
if segments:
- for segment in segments:
+ for segment_index, segment in enumerate(segments):
segment = self.reserve_provider_segment(
session, segment)
- db.add_network_segment(session, network_id, segment)
+ db.add_network_segment(session, network_id,
+ segment, segment_index)
else:
segment = self.allocate_tenant_segment(session)
db.add_network_segment(session, network_id, segment)
diff --git a/neutron/plugins/ml2/models.py b/neutron/plugins/ml2/models.py
index 80ae1bbb6a..350c34e4f7 100644
--- a/neutron/plugins/ml2/models.py
+++ b/neutron/plugins/ml2/models.py
@@ -41,6 +41,7 @@ class NetworkSegment(model_base.BASEV2, models_v2.HasId):
segmentation_id = sa.Column(sa.Integer)
is_dynamic = sa.Column(sa.Boolean, default=False, nullable=False,
server_default=sa.sql.false())
+ segment_index = sa.Column(sa.Integer, nullable=False, server_default='0')
class PortBinding(model_base.BASEV2):
diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py
index 8547d18d8f..5b9a7eb05b 100644
--- a/neutron/plugins/ml2/plugin.py
+++ b/neutron/plugins/ml2/plugin.py
@@ -45,6 +45,7 @@ from neutron.db import quota_db # noqa
from neutron.db import securitygroups_rpc_base as sg_db_rpc
from neutron.extensions import allowedaddresspairs as addr_pair
from neutron.extensions import extra_dhcp_opt as edo_ext
+from neutron.extensions import l3agentscheduler
from neutron.extensions import portbindings
from neutron.extensions import providernet as provider
from neutron import manager
@@ -72,9 +73,6 @@ MAX_BIND_TRIES = 10
# providernet.py?
TYPE_MULTI_SEGMENT = 'multi-segment'
-TAP_DEVICE_PREFIX = 'tap'
-TAP_DEVICE_PREFIX_LENGTH = 3
-
class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
dvr_mac_db.DVRDbMixin,
@@ -159,7 +157,27 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
# TODO(rkukura): Implement filtering.
return nets
- def _process_port_binding(self, mech_context, context, attrs):
+ def _notify_l3_agent_new_port(self, context, port):
+ if not port:
+ return
+
+ # Whenever a DVR serviceable port comes up on a
+ # node, it has to be communicated to the L3 Plugin
+ # and agent for creating the respective namespaces.
+ if (utils.is_dvr_serviced(port['device_owner'])):
+ l3plugin = manager.NeutronManager.get_service_plugins().get(
+ service_constants.L3_ROUTER_NAT)
+ if (utils.is_extension_supported(
+ l3plugin, const.L3_DISTRIBUTED_EXT_ALIAS)):
+ l3plugin.dvr_update_router_addvm(context, port)
+
+ def _get_host_port_if_changed(self, mech_context, attrs):
+ binding = mech_context._binding
+ host = attrs and attrs.get(portbindings.HOST_ID)
+ if (attributes.is_attr_set(host) and binding.host != host):
+ return mech_context.current
+
+ def _process_port_binding(self, mech_context, attrs):
binding = mech_context._binding
port = mech_context.current
changes = False
@@ -169,15 +187,6 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
binding.host != host):
binding.host = host
changes = True
- # Whenever a DVR serviceable port comes up on a
- # node, it has to be communicated to the L3 Plugin
- # and agent for creating the respective namespaces.
- if (utils.is_dvr_serviced(port['device_owner'])):
- l3plugin = manager.NeutronManager.get_service_plugins().get(
- service_constants.L3_ROUTER_NAT)
- if (utils.is_extension_supported(
- l3plugin, const.L3_DISTRIBUTED_EXT_ALIAS)):
- l3plugin.dvr_update_router_addvm(context, port)
vnic_type = attrs and attrs.get(portbindings.VNIC_TYPE)
if (attributes.is_attr_set(vnic_type) and
@@ -572,9 +581,15 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
# to prevent deadlock waiting to acquire a DB lock
# held by another thread in the same process, leading
# to 'lock wait timeout' errors.
+ #
+ # Process L3 first, since, depending on the L3 plugin, it may
+ # involve locking the db-access semaphore, sending RPC
+ # notifications, and/or calling delete_port on this plugin.
+ # Additionally, a rollback may not be enough to undo the
+ # deletion of a floating IP with certain L3 backends.
+ self._process_l3_delete(context, id)
with contextlib.nested(lockutils.lock('db-access'),
session.begin(subtransactions=True)):
- self._process_l3_delete(context, id)
# Get ports to auto-delete.
ports = (session.query(models_v2.Port).
enable_eagerloads(False).
@@ -770,7 +785,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
binding = db.add_port_binding(session, result['id'])
mech_context = driver_context.PortContext(self, context, result,
network, binding)
- self._process_port_binding(mech_context, context, attrs)
+ new_host_port = self._get_host_port_if_changed(mech_context, attrs)
+ self._process_port_binding(mech_context, attrs)
result[addr_pair.ADDRESS_PAIRS] = (
self._process_create_allowed_address_pairs(
@@ -780,6 +796,9 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
dhcp_opts)
self.mechanism_manager.create_port_precommit(mech_context)
+ # Notification must be sent after the above transaction is complete
+ self._notify_l3_agent_new_port(context, new_host_port)
+
try:
self.mechanism_manager.create_port_postcommit(mech_context)
except ml2_exc.MechanismDriverError:
@@ -834,10 +853,14 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
mech_context = driver_context.PortContext(
self, context, updated_port, network, binding,
original_port=original_port)
+ new_host_port = self._get_host_port_if_changed(mech_context, attrs)
need_port_update_notify |= self._process_port_binding(
- mech_context, context, attrs)
+ mech_context, attrs)
self.mechanism_manager.update_port_precommit(mech_context)
+ # Notification must be sent after the above transaction is complete
+ self._notify_l3_agent_new_port(context, new_host_port)
+
# TODO(apech) - handle errors raised by update_port, potentially
# by re-calling update_port with the previous attributes. For
# now the error is propogated to the caller, which is expected to
@@ -967,45 +990,51 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
port = self._make_port_dict(port_db)
network = self.get_network(context, port['network_id'])
- mech_context = None
- if port['device_owner'] == const.DEVICE_OWNER_DVR_INTERFACE:
+ bound_mech_contexts = []
+ device_owner = port['device_owner']
+ if device_owner == const.DEVICE_OWNER_DVR_INTERFACE:
bindings = db.get_dvr_port_bindings(context.session, id)
for bind in bindings:
mech_context = driver_context.DvrPortContext(
self, context, port, network, bind)
self.mechanism_manager.delete_port_precommit(mech_context)
+ bound_mech_contexts.append(mech_context)
else:
mech_context = driver_context.PortContext(self, context, port,
network, binding)
- if "compute:" in port['device_owner'] and is_dvr_enabled:
- router_info = l3plugin.dvr_deletens_if_no_vm(context, id)
- removed_routers += router_info
+ if is_dvr_enabled and utils.is_dvr_serviced(device_owner):
+ removed_routers = l3plugin.dvr_deletens_if_no_port(
+ context, id)
self.mechanism_manager.delete_port_precommit(mech_context)
+ bound_mech_contexts.append(mech_context)
self._delete_port_security_group_bindings(context, id)
if l3plugin:
router_ids = l3plugin.disassociate_floatingips(
context, id, do_notify=False)
- if is_dvr_enabled:
- l3plugin.dvr_vmarp_table_update(context, id, "del")
LOG.debug("Calling delete_port for %(port_id)s owned by %(owner)s"
- % {"port_id": id, "owner": port['device_owner']})
+ % {"port_id": id, "owner": device_owner})
super(Ml2Plugin, self).delete_port(context, id)
# now that we've left db transaction, we are safe to notify
if l3plugin:
+ if is_dvr_enabled:
+ l3plugin.dvr_vmarp_table_update(context, port, "del")
l3plugin.notify_routers_updated(context, router_ids)
for router in removed_routers:
- l3plugin.remove_router_from_l3_agent(
- context, router['agent_id'], router['router_id'])
-
+ try:
+ l3plugin.remove_router_from_l3_agent(
+ context, router['agent_id'], router['router_id'])
+ except l3agentscheduler.RouterNotHostedByL3Agent:
+ # router may have been removed by another process
+ LOG.debug("Router %(id)s not hosted by L3 agent %(agent)s",
+ {'id': router['router_id'],
+ 'agent': router['agent_id']})
try:
- # for both normal and DVR Interface ports, only one invocation of
- # delete_port_postcommit. We use gather/scatter technique for DVR
- # interface ports, where the bindings are gathered in
- # delete_port_precommit() call earlier and scattered as l2pop
- # rules to cloud nodes in delete_port_postcommit() here
- if mech_context:
+ # Note that DVR Interface ports will have bindings on
+ # multiple hosts, and so will have multiple mech_contexts,
+ # while other ports typically have just one.
+ for mech_context in bound_mech_contexts:
self.mechanism_manager.delete_port_postcommit(mech_context)
except ml2_exc.MechanismDriverError:
# TODO(apech) - One or more mechanism driver failed to
@@ -1138,8 +1167,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
# REVISIT(rkukura): Consider calling into MechanismDrivers to
# process device names, or having MechanismDrivers supply list
# of device prefixes to strip.
- if device.startswith(TAP_DEVICE_PREFIX):
- return device[TAP_DEVICE_PREFIX_LENGTH:]
+ if device.startswith(const.TAP_DEVICE_PREFIX):
+ return device[len(const.TAP_DEVICE_PREFIX):]
else:
# REVISIT(irenab): Consider calling into bound MD to
# handle the get_device_details RPC, then remove the 'else' clause
diff --git a/neutron/plugins/ml2/rpc.py b/neutron/plugins/ml2/rpc.py
index d9cb07efd4..d962c1d228 100644
--- a/neutron/plugins/ml2/rpc.py
+++ b/neutron/plugins/ml2/rpc.py
@@ -165,7 +165,8 @@ class RpcCallbacks(n_rpc.RpcCallback,
utils.is_extension_supported(l3plugin,
q_const.L3_DISTRIBUTED_EXT_ALIAS)):
try:
- l3plugin.dvr_vmarp_table_update(rpc_context, port_id, "add")
+ port = plugin._get_port(rpc_context, port_id)
+ l3plugin.dvr_vmarp_table_update(rpc_context, port, "add")
except exceptions.PortNotFound:
LOG.debug('Port %s not found during ARP update', port_id)
diff --git a/neutron/plugins/mlnx/__init__.py b/neutron/plugins/mlnx/__init__.py
index 7182ac4147..e69de29bb2 100644
--- a/neutron/plugins/mlnx/__init__.py
+++ b/neutron/plugins/mlnx/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Mellanox Technologies, Ltd
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
diff --git a/neutron/plugins/mlnx/agent/__init__.py b/neutron/plugins/mlnx/agent/__init__.py
index 7182ac4147..e69de29bb2 100644
--- a/neutron/plugins/mlnx/agent/__init__.py
+++ b/neutron/plugins/mlnx/agent/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Mellanox Technologies, Ltd
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
diff --git a/neutron/plugins/mlnx/common/__init__.py b/neutron/plugins/mlnx/common/__init__.py
index 7182ac4147..e69de29bb2 100644
--- a/neutron/plugins/mlnx/common/__init__.py
+++ b/neutron/plugins/mlnx/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Mellanox Technologies, Ltd
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
diff --git a/neutron/plugins/mlnx/common/comm_utils.py b/neutron/plugins/mlnx/common/comm_utils.py
index 834b5a2cb1..f426908f28 100644
--- a/neutron/plugins/mlnx/common/comm_utils.py
+++ b/neutron/plugins/mlnx/common/comm_utils.py
@@ -35,7 +35,6 @@ class RetryDecorator(object):
:param retries: number of times to try before giving up
:raises: exceptionToCheck
"""
- sleep_fn = time.sleep
def __init__(self, exceptionToCheck,
interval=cfg.CONF.ESWITCH.request_timeout / 1000,
@@ -56,7 +55,7 @@ class RetryDecorator(object):
except self.exc:
LOG.debug(_("Request timeout - call again after "
"%s seconds"), sleep_interval)
- RetryDecorator.sleep_fn(sleep_interval)
+ time.sleep(sleep_interval)
num_of_iter -= 1
sleep_interval *= self.backoff_rate
diff --git a/neutron/plugins/mlnx/db/__init__.py b/neutron/plugins/mlnx/db/__init__.py
index 7182ac4147..e69de29bb2 100644
--- a/neutron/plugins/mlnx/db/__init__.py
+++ b/neutron/plugins/mlnx/db/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Mellanox Technologies, Ltd
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
diff --git a/neutron/plugins/mlnx/mlnx_plugin.py b/neutron/plugins/mlnx/mlnx_plugin.py
index 0a8ed5b761..155b85d972 100644
--- a/neutron/plugins/mlnx/mlnx_plugin.py
+++ b/neutron/plugins/mlnx/mlnx_plugin.py
@@ -52,9 +52,6 @@ from neutron.plugins.mlnx import rpc_callbacks
LOG = logging.getLogger(__name__)
-#to be compatible with Linux Bridge Agent on Network Node
-TAP_PREFIX_LEN = 3
-
class MellanoxEswitchPlugin(db_base_plugin_v2.NeutronDbPluginV2,
external_net_db.External_net_db_mixin,
@@ -529,7 +526,8 @@ class MellanoxEswitchPlugin(db_base_plugin_v2.NeutronDbPluginV2,
services get device either by linux bridge plugin
device name convention or by mac address
"""
- port = db.get_port_from_device(device[TAP_PREFIX_LEN:])
+ port = db.get_port_from_device(
+ device[len(q_const.TAP_DEVICE_PREFIX):])
if port:
port['device'] = device
else:
diff --git a/neutron/plugins/nec/__init__.py b/neutron/plugins/nec/__init__.py
index cff1fb258c..e69de29bb2 100644
--- a/neutron/plugins/nec/__init__.py
+++ b/neutron/plugins/nec/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 NEC Corporation. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/nec/agent/__init__.py b/neutron/plugins/nec/agent/__init__.py
index cff1fb258c..e69de29bb2 100644
--- a/neutron/plugins/nec/agent/__init__.py
+++ b/neutron/plugins/nec/agent/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 NEC Corporation. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/nec/common/__init__.py b/neutron/plugins/nec/common/__init__.py
index cff1fb258c..e69de29bb2 100644
--- a/neutron/plugins/nec/common/__init__.py
+++ b/neutron/plugins/nec/common/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 NEC Corporation. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/nec/db/__init__.py b/neutron/plugins/nec/db/__init__.py
index cff1fb258c..e69de29bb2 100644
--- a/neutron/plugins/nec/db/__init__.py
+++ b/neutron/plugins/nec/db/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 NEC Corporation. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/nec/extensions/__init__.py b/neutron/plugins/nec/extensions/__init__.py
index cff1fb258c..e69de29bb2 100644
--- a/neutron/plugins/nec/extensions/__init__.py
+++ b/neutron/plugins/nec/extensions/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 NEC Corporation. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/nuage/nuage_models.py b/neutron/plugins/nuage/nuage_models.py
index 5d30dbcb06..59c773951f 100644
--- a/neutron/plugins/nuage/nuage_models.py
+++ b/neutron/plugins/nuage/nuage_models.py
@@ -14,6 +14,7 @@
# under the License.
import sqlalchemy as sa
+from sqlalchemy import orm
from neutron.db import model_base
from neutron.db import models_v2
@@ -49,6 +50,11 @@ class ProviderNetBinding(model_base.BASEV2):
physical_network = sa.Column(sa.String(64), nullable=False)
vlan_id = sa.Column(sa.Integer, nullable=False)
+ network = orm.relationship(
+ models_v2.Network,
+ backref=orm.backref("pnetbinding", lazy='joined',
+ uselist=False, cascade='delete'))
+
class SubnetL2Domain(model_base.BASEV2):
__tablename__ = 'nuage_subnet_l2dom_mapping'
diff --git a/neutron/plugins/nuage/nuagedb.py b/neutron/plugins/nuage/nuagedb.py
index 1fc261371d..1a3210bc23 100644
--- a/neutron/plugins/nuage/nuagedb.py
+++ b/neutron/plugins/nuage/nuagedb.py
@@ -203,6 +203,7 @@ def add_network_binding(session, network_id, network_type, physical_network,
physical_network=physical_network,
vlan_id=vlan_id)
session.add(binding)
+ return binding
def get_network_binding(session, network_id):
diff --git a/neutron/plugins/nuage/plugin.py b/neutron/plugins/nuage/plugin.py
index cd8c9e2d25..995a8fa8d3 100644
--- a/neutron/plugins/nuage/plugin.py
+++ b/neutron/plugins/nuage/plugin.py
@@ -78,6 +78,9 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2,
self.syncmanager = syncmanager.SyncManager(self.nuageclient)
self._synchronization_thread()
+ db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
+ attributes.NETWORKS, ['_extend_network_dict_provider_nuage'])
+
def nuageclient_init(self):
server = cfg.CONF.RESTPROXY.server
serverauth = cfg.CONF.RESTPROXY.serverauth
@@ -392,8 +395,9 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2,
subnets = self.get_subnets(context, filters=filters)
return bool(routers or subnets)
- def _extend_network_dict_provider(self, context, network):
- binding = nuagedb.get_network_binding(context.session, network['id'])
+ def _extend_network_dict_provider_nuage(self, network, net_db,
+ net_binding=None):
+ binding = net_db.pnetbinding if net_db else net_binding
if binding:
network[pnet.NETWORK_TYPE] = binding.network_type
network[pnet.PHYSICAL_NETWORK] = binding.physical_network
@@ -432,6 +436,7 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2,
return network_type, physical_network, segmentation_id
def create_network(self, context, network):
+ binding = None
(network_type, physical_network,
vlan_id) = self._process_provider_create(context,
network['network'])
@@ -444,10 +449,11 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2,
network)
self._process_l3_create(context, net, network['network'])
if network_type == 'vlan':
- nuagedb.add_network_binding(context.session, net['id'],
+ binding = nuagedb.add_network_binding(context.session,
+ net['id'],
network_type,
physical_network, vlan_id)
- self._extend_network_dict_provider(context, net)
+ self._extend_network_dict_provider_nuage(net, None, binding)
return net
def _validate_update_network(self, context, id, network):
@@ -473,23 +479,6 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2,
raise n_exc.NetworkInUse(net_id=id)
return (is_external_set, subnet)
- def get_network(self, context, net_id, fields=None):
- net = super(NuagePlugin, self).get_network(context,
- net_id,
- None)
- self._extend_network_dict_provider(context, net)
- return self._fields(net, fields)
-
- def get_networks(self, context, filters=None, fields=None,
- sorts=None, limit=None, marker=None, page_reverse=False):
- nets = super(NuagePlugin,
- self).get_networks(context, filters, None, sorts,
- limit, marker, page_reverse)
- for net in nets:
- self._extend_network_dict_provider(context, net)
-
- return [self._fields(net, fields) for net in nets]
-
def update_network(self, context, id, network):
pnet._raise_if_updates_provider_attributes(network['network'])
with context.session.begin(subtransactions=True):
@@ -998,8 +987,7 @@ class NuagePlugin(db_base_plugin_v2.NeutronDbPluginV2,
super(NuagePlugin, self).delete_router(context, id)
- nuage_zone = self.nuageclient.get_zone_by_routerid(id)
- if nuage_zone and not self._check_router_subnet_for_tenant(
+ if not self._check_router_subnet_for_tenant(
context, neutron_router['tenant_id']):
user_id, group_id = self.nuageclient.get_usergroup(
neutron_router['tenant_id'],
diff --git a/neutron/plugins/ofagent/agent/arp_lib.py b/neutron/plugins/ofagent/agent/arp_lib.py
index c83e943528..c6ceea71a2 100644
--- a/neutron/plugins/ofagent/agent/arp_lib.py
+++ b/neutron/plugins/ofagent/agent/arp_lib.py
@@ -120,7 +120,12 @@ class ArpLib(object):
@log.log
def del_arp_table_entry(self, network, ip):
- del self._arp_tbl[network][ip]
+ if network not in self._arp_tbl:
+ LOG.debug("removal of unknown network %s", network)
+ return
+ if self._arp_tbl[network].pop(ip, None) is None:
+ LOG.debug("removal of unknown ip %s", ip)
+ return
if not self._arp_tbl[network]:
del self._arp_tbl[network]
@@ -143,10 +148,16 @@ class ArpLib(object):
ofp = datapath.ofproto
port = msg.match['in_port']
metadata = msg.match.get('metadata')
- pkt = packet.Packet(msg.data)
- LOG.info(_LI("packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s"),
- {'dpid': dpid_lib.dpid_to_str(datapath.id),
- 'port': port, 'pkt': pkt})
+ # NOTE(yamamoto): Ryu packet library can raise various exceptions
+ # on a corrupted packet.
+ try:
+ pkt = packet.Packet(msg.data)
+ except Exception as e:
+ LOG.debug("Unparsable packet: got exception %s", e)
+ return
+ LOG.debug("packet-in dpid %(dpid)s in_port %(port)s pkt %(pkt)s",
+ {'dpid': dpid_lib.dpid_to_str(datapath.id),
+ 'port': port, 'pkt': pkt})
if metadata is None:
LOG.info(_LI("drop non tenant packet"))
@@ -154,12 +165,12 @@ class ArpLib(object):
network = metadata & meta.NETWORK_MASK
pkt_ethernet = pkt.get_protocol(ethernet.ethernet)
if not pkt_ethernet:
- LOG.info(_LI("drop non-ethernet packet"))
+ LOG.debug("drop non-ethernet packet")
return
pkt_vlan = pkt.get_protocol(vlan.vlan)
pkt_arp = pkt.get_protocol(arp.arp)
if not pkt_arp:
- LOG.info(_LI("drop non-arp packet"))
+ LOG.debug("drop non-arp packet")
return
arptbl = self._arp_tbl.get(network)
diff --git a/neutron/plugins/ofagent/agent/ports.py b/neutron/plugins/ofagent/agent/ports.py
index 4389b79574..218dc5ecee 100644
--- a/neutron/plugins/ofagent/agent/ports.py
+++ b/neutron/plugins/ofagent/agent/ports.py
@@ -14,6 +14,8 @@
# License for the specific language governing permissions and limitations
# under the License.
+from neutron.common import constants as n_const
+
class OFPort(object):
def __init__(self, port_name, ofport):
@@ -28,7 +30,7 @@ class OFPort(object):
PORT_NAME_LEN = 14
PORT_NAME_PREFIXES = [
- "tap", # common cases, including ovs_use_veth=True
+ n_const.TAP_DEVICE_PREFIX, # common cases, including ovs_use_veth=True
"qvo", # nova hybrid interface driver
"qr-", # l3-agent INTERNAL_DEV_PREFIX (ovs_use_veth=False)
"qg-", # l3-agent EXTERNAL_DEV_PREFIX (ovs_use_veth=False)
@@ -61,7 +63,7 @@ def get_normalized_port_name(interface_id):
use "tap" prefix throughout the agent and plugin for simplicity.
Some care should be taken when talking to the switch.
"""
- return ("tap" + interface_id)[0:PORT_NAME_LEN]
+ return (n_const.TAP_DEVICE_PREFIX + interface_id)[0:PORT_NAME_LEN]
def _normalize_port_name(name):
@@ -71,7 +73,7 @@ def _normalize_port_name(name):
"""
for pref in PORT_NAME_PREFIXES:
if name.startswith(pref):
- return "tap" + name[len(pref):]
+ return n_const.TAP_DEVICE_PREFIX + name[len(pref):]
return name
diff --git a/neutron/plugins/openvswitch/README b/neutron/plugins/openvswitch/README
index b8991ad0a2..005aca36fd 100644
--- a/neutron/plugins/openvswitch/README
+++ b/neutron/plugins/openvswitch/README
@@ -1,6 +1,4 @@
-The Open vSwitch (OVS) Neutron plugin is a simple plugin to manage OVS
-features using a local agent running on each hypervisor.
+The Open vSwitch (OVS) Neutron plugin has been removed and replaced by ML2. You
+must run the migration manually to upgrade to Juno.
-For details on how to configure and use the plugin, see:
-
-http://openvswitch.org/openstack/documentation/
+See neutron/db/migration/migrate_to_ml2.py
diff --git a/neutron/plugins/openvswitch/common/__init__.py b/neutron/plugins/openvswitch/common/__init__.py
index 8ac9340e9f..e69de29bb2 100644
--- a/neutron/plugins/openvswitch/common/__init__.py
+++ b/neutron/plugins/openvswitch/common/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/openvswitch/common/config.py b/neutron/plugins/openvswitch/common/config.py
index d9e0454839..03e4d884ff 100644
--- a/neutron/plugins/openvswitch/common/config.py
+++ b/neutron/plugins/openvswitch/common/config.py
@@ -43,19 +43,6 @@ ovs_opts = [
default=DEFAULT_BRIDGE_MAPPINGS,
help=_("List of <physical_network>:<bridge>. "
"Deprecated for ofagent.")),
- cfg.StrOpt('tenant_network_type', default='local',
- help=_("Network type for tenant networks "
- "(local, vlan, gre, vxlan, or none).")),
- cfg.ListOpt('network_vlan_ranges',
- default=DEFAULT_VLAN_RANGES,
- help=_("List of <physical_network>:<vlan_min>:<vlan_max> "
- "or <physical_network>.")),
- cfg.ListOpt('tunnel_id_ranges',
- default=DEFAULT_TUNNEL_RANGES,
- help=_("List of <tun_min>:<tun_max>.")),
- cfg.StrOpt('tunnel_type', default='',
- help=_("The type of tunnels to use when utilizing tunnels, "
- "either 'gre' or 'vxlan'.")),
cfg.BoolOpt('use_veth_interconnection', default=False,
help=_("Use veths instead of patch ports to interconnect the "
"integration bridge to physical bridges.")),
diff --git a/neutron/plugins/openvswitch/ovs_db_v2.py b/neutron/plugins/openvswitch/ovs_db_v2.py
deleted file mode 100644
index c9820ce3bb..0000000000
--- a/neutron/plugins/openvswitch/ovs_db_v2.py
+++ /dev/null
@@ -1,396 +0,0 @@
-# Copyright 2011 VMware, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-from oslo.db import exception as db_exc
-from six import moves
-from sqlalchemy import func
-from sqlalchemy.orm import exc
-
-from neutron.common import exceptions as n_exc
-import neutron.db.api as db
-from neutron.db import models_v2
-from neutron.db import securitygroups_db as sg_db
-from neutron.extensions import securitygroup as ext_sg
-from neutron import manager
-from neutron.openstack.common import log as logging
-from neutron.plugins.openvswitch.common import constants
-from neutron.plugins.openvswitch import ovs_models_v2
-
-LOG = logging.getLogger(__name__)
-
-
-def get_network_binding(session, network_id):
- session = session or db.get_session()
- try:
- binding = (session.query(ovs_models_v2.NetworkBinding).
- filter_by(network_id=network_id).
- one())
- return binding
- except exc.NoResultFound:
- return
-
-
-def add_network_binding(session, network_id, network_type,
- physical_network, segmentation_id):
- with session.begin(subtransactions=True):
- binding = ovs_models_v2.NetworkBinding(network_id, network_type,
- physical_network,
- segmentation_id)
- session.add(binding)
- return binding
-
-
-def sync_vlan_allocations(network_vlan_ranges):
- """Synchronize vlan_allocations table with configured VLAN ranges."""
-
- session = db.get_session()
- with session.begin():
- # get existing allocations for all physical networks
- allocations = dict()
- allocs = (session.query(ovs_models_v2.VlanAllocation).
- all())
- for alloc in allocs:
- if alloc.physical_network not in allocations:
- allocations[alloc.physical_network] = set()
- allocations[alloc.physical_network].add(alloc)
-
- # process vlan ranges for each configured physical network
- for physical_network, vlan_ranges in network_vlan_ranges.iteritems():
- # determine current configured allocatable vlans for this
- # physical network
- vlan_ids = set()
- for vlan_range in vlan_ranges:
- vlan_ids |= set(moves.xrange(vlan_range[0], vlan_range[1] + 1))
-
- # remove from table unallocated vlans not currently allocatable
- if physical_network in allocations:
- for alloc in allocations[physical_network]:
- try:
- # see if vlan is allocatable
- vlan_ids.remove(alloc.vlan_id)
- except KeyError:
- # it's not allocatable, so check if its allocated
- if not alloc.allocated:
- # it's not, so remove it from table
- LOG.debug(_("Removing vlan %(vlan_id)s on "
- "physical network "
- "%(physical_network)s from pool"),
- {'vlan_id': alloc.vlan_id,
- 'physical_network': physical_network})
- session.delete(alloc)
- del allocations[physical_network]
-
- # add missing allocatable vlans to table
- for vlan_id in sorted(vlan_ids):
- alloc = ovs_models_v2.VlanAllocation(physical_network, vlan_id)
- session.add(alloc)
-
- # remove from table unallocated vlans for any unconfigured physical
- # networks
- for allocs in allocations.itervalues():
- for alloc in allocs:
- if not alloc.allocated:
- LOG.debug(_("Removing vlan %(vlan_id)s on physical "
- "network %(physical_network)s from pool"),
- {'vlan_id': alloc.vlan_id,
- 'physical_network': alloc.physical_network})
- session.delete(alloc)
-
-
-def get_vlan_allocation(physical_network, vlan_id):
- session = db.get_session()
- try:
- alloc = (session.query(ovs_models_v2.VlanAllocation).
- filter_by(physical_network=physical_network,
- vlan_id=vlan_id).
- one())
- return alloc
- except exc.NoResultFound:
- return
-
-
-def reserve_vlan(session):
- with session.begin(subtransactions=True):
- alloc = (session.query(ovs_models_v2.VlanAllocation).
- filter_by(allocated=False).
- with_lockmode('update').
- first())
- if alloc:
- LOG.debug(_("Reserving vlan %(vlan_id)s on physical network "
- "%(physical_network)s from pool"),
- {'vlan_id': alloc.vlan_id,
- 'physical_network': alloc.physical_network})
- alloc.allocated = True
- return (alloc.physical_network, alloc.vlan_id)
- raise n_exc.NoNetworkAvailable()
-
-
-def reserve_specific_vlan(session, physical_network, vlan_id):
- with session.begin(subtransactions=True):
- try:
- alloc = (session.query(ovs_models_v2.VlanAllocation).
- filter_by(physical_network=physical_network,
- vlan_id=vlan_id).
- with_lockmode('update').
- one())
- if alloc.allocated:
- if vlan_id == constants.FLAT_VLAN_ID:
- raise n_exc.FlatNetworkInUse(
- physical_network=physical_network)
- else:
- raise n_exc.VlanIdInUse(vlan_id=vlan_id,
- physical_network=physical_network)
- LOG.debug(_("Reserving specific vlan %(vlan_id)s on physical "
- "network %(physical_network)s from pool"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
- alloc.allocated = True
- except exc.NoResultFound:
- LOG.debug(_("Reserving specific vlan %(vlan_id)s on physical "
- "network %(physical_network)s outside pool"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
- alloc = ovs_models_v2.VlanAllocation(physical_network, vlan_id)
- alloc.allocated = True
- session.add(alloc)
-
-
-def release_vlan(session, physical_network, vlan_id, network_vlan_ranges):
- with session.begin(subtransactions=True):
- try:
- alloc = (session.query(ovs_models_v2.VlanAllocation).
- filter_by(physical_network=physical_network,
- vlan_id=vlan_id).
- with_lockmode('update').
- one())
- alloc.allocated = False
- inside = False
- for vlan_range in network_vlan_ranges.get(physical_network, []):
- if vlan_id >= vlan_range[0] and vlan_id <= vlan_range[1]:
- inside = True
- break
- if not inside:
- session.delete(alloc)
- LOG.debug(_("Releasing vlan %(vlan_id)s on physical network "
- "%(physical_network)s outside pool"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
- else:
- LOG.debug(_("Releasing vlan %(vlan_id)s on physical network "
- "%(physical_network)s to pool"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
- except exc.NoResultFound:
- LOG.warning(_("vlan_id %(vlan_id)s on physical network "
- "%(physical_network)s not found"),
- {'vlan_id': vlan_id,
- 'physical_network': physical_network})
-
-
-def sync_tunnel_allocations(tunnel_id_ranges):
- """Synchronize tunnel_allocations table with configured tunnel ranges."""
-
- # determine current configured allocatable tunnels
- tunnel_ids = set()
- for tunnel_id_range in tunnel_id_ranges:
- tun_min, tun_max = tunnel_id_range
- if tun_max + 1 - tun_min > 1000000:
- LOG.error(_("Skipping unreasonable tunnel ID range "
- "%(tun_min)s:%(tun_max)s"),
- {'tun_min': tun_min, 'tun_max': tun_max})
- else:
- tunnel_ids |= set(moves.xrange(tun_min, tun_max + 1))
-
- session = db.get_session()
- with session.begin():
- # remove from table unallocated tunnels not currently allocatable
- allocs = (session.query(ovs_models_v2.TunnelAllocation).
- all())
- for alloc in allocs:
- try:
- # see if tunnel is allocatable
- tunnel_ids.remove(alloc.tunnel_id)
- except KeyError:
- # it's not allocatable, so check if its allocated
- if not alloc.allocated:
- # it's not, so remove it from table
- LOG.debug(_("Removing tunnel %s from pool"),
- alloc.tunnel_id)
- session.delete(alloc)
-
- # add missing allocatable tunnels to table
- for tunnel_id in sorted(tunnel_ids):
- alloc = ovs_models_v2.TunnelAllocation(tunnel_id)
- session.add(alloc)
-
-
-def get_tunnel_allocation(tunnel_id):
- session = db.get_session()
- try:
- alloc = (session.query(ovs_models_v2.TunnelAllocation).
- filter_by(tunnel_id=tunnel_id).
- with_lockmode('update').
- one())
- return alloc
- except exc.NoResultFound:
- return
-
-
-def reserve_tunnel(session):
- with session.begin(subtransactions=True):
- alloc = (session.query(ovs_models_v2.TunnelAllocation).
- filter_by(allocated=False).
- with_lockmode('update').
- first())
- if alloc:
- LOG.debug(_("Reserving tunnel %s from pool"), alloc.tunnel_id)
- alloc.allocated = True
- return alloc.tunnel_id
- raise n_exc.NoNetworkAvailable()
-
-
-def reserve_specific_tunnel(session, tunnel_id):
- with session.begin(subtransactions=True):
- try:
- alloc = (session.query(ovs_models_v2.TunnelAllocation).
- filter_by(tunnel_id=tunnel_id).
- with_lockmode('update').
- one())
- if alloc.allocated:
- raise n_exc.TunnelIdInUse(tunnel_id=tunnel_id)
- LOG.debug(_("Reserving specific tunnel %s from pool"), tunnel_id)
- alloc.allocated = True
- except exc.NoResultFound:
- LOG.debug(_("Reserving specific tunnel %s outside pool"),
- tunnel_id)
- alloc = ovs_models_v2.TunnelAllocation(tunnel_id)
- alloc.allocated = True
- session.add(alloc)
-
-
-def release_tunnel(session, tunnel_id, tunnel_id_ranges):
- with session.begin(subtransactions=True):
- try:
- alloc = (session.query(ovs_models_v2.TunnelAllocation).
- filter_by(tunnel_id=tunnel_id).
- with_lockmode('update').
- one())
- alloc.allocated = False
- inside = False
- for tunnel_id_range in tunnel_id_ranges:
- if (tunnel_id >= tunnel_id_range[0]
- and tunnel_id <= tunnel_id_range[1]):
- inside = True
- break
- if not inside:
- session.delete(alloc)
- LOG.debug(_("Releasing tunnel %s outside pool"), tunnel_id)
- else:
- LOG.debug(_("Releasing tunnel %s to pool"), tunnel_id)
- except exc.NoResultFound:
- LOG.warning(_("tunnel_id %s not found"), tunnel_id)
-
-
-def get_port(port_id):
- session = db.get_session()
- try:
- port = session.query(models_v2.Port).filter_by(id=port_id).one()
- except exc.NoResultFound:
- port = None
- return port
-
-
-def get_port_from_device(port_id):
- """Get port from database."""
- LOG.debug(_("get_port_with_securitygroups() called:port_id=%s"), port_id)
- session = db.get_session()
- sg_binding_port = sg_db.SecurityGroupPortBinding.port_id
-
- query = session.query(models_v2.Port,
- sg_db.SecurityGroupPortBinding.security_group_id)
- query = query.outerjoin(sg_db.SecurityGroupPortBinding,
- models_v2.Port.id == sg_binding_port)
- query = query.filter(models_v2.Port.id == port_id)
- port_and_sgs = query.all()
- if not port_and_sgs:
- return None
- port = port_and_sgs[0][0]
- plugin = manager.NeutronManager.get_plugin()
- port_dict = plugin._make_port_dict(port)
- port_dict[ext_sg.SECURITYGROUPS] = [
- sg_id for port_, sg_id in port_and_sgs if sg_id]
- port_dict['security_group_rules'] = []
- port_dict['security_group_source_groups'] = []
- port_dict['fixed_ips'] = [ip['ip_address']
- for ip in port['fixed_ips']]
- return port_dict
-
-
-def set_port_status(port_id, status):
- session = db.get_session()
- try:
- port = session.query(models_v2.Port).filter_by(id=port_id).one()
- port['status'] = status
- session.merge(port)
- session.flush()
- except exc.NoResultFound:
- raise n_exc.PortNotFound(port_id=port_id)
-
-
-def get_tunnel_endpoints():
- session = db.get_session()
-
- tunnels = session.query(ovs_models_v2.TunnelEndpoint)
- return [{'id': tunnel.id,
- 'ip_address': tunnel.ip_address} for tunnel in tunnels]
-
-
-def _generate_tunnel_id(session):
- max_tunnel_id = session.query(
- func.max(ovs_models_v2.TunnelEndpoint.id)).scalar() or 0
- return max_tunnel_id + 1
-
-
-def add_tunnel_endpoint(ip, max_retries=10):
- """Return the endpoint of the given IP address or generate a new one."""
-
- # NOTE(rpodolyaka): generation of a new tunnel endpoint must be put into a
- # repeatedly executed transactional block to ensure it
- # doesn't conflict with any other concurrently executed
- # DB transactions in spite of the specified transactions
- # isolation level value
- for i in moves.xrange(max_retries):
- LOG.debug(_('Adding a tunnel endpoint for %s'), ip)
- try:
- session = db.get_session()
- with session.begin(subtransactions=True):
- tunnel = (session.query(ovs_models_v2.TunnelEndpoint).
- filter_by(ip_address=ip).with_lockmode('update').
- first())
-
- if tunnel is None:
- tunnel_id = _generate_tunnel_id(session)
- tunnel = ovs_models_v2.TunnelEndpoint(ip, tunnel_id)
- session.add(tunnel)
-
- return tunnel
- except db_exc.DBDuplicateEntry:
- # a concurrent transaction has been committed, try again
- LOG.debug(_('Adding a tunnel endpoint failed due to a concurrent'
- 'transaction had been committed (%s attempts left)'),
- max_retries - (i + 1))
-
- raise n_exc.NeutronException(
- message=_('Unable to generate a new tunnel id'))
diff --git a/neutron/plugins/openvswitch/ovs_neutron_plugin.py b/neutron/plugins/openvswitch/ovs_neutron_plugin.py
deleted file mode 100644
index 7dad9b66d9..0000000000
--- a/neutron/plugins/openvswitch/ovs_neutron_plugin.py
+++ /dev/null
@@ -1,651 +0,0 @@
-# Copyright 2011 VMware, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-import sys
-
-from oslo.config import cfg
-
-from neutron.agent import securitygroups_rpc as sg_rpc
-from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api
-from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api
-from neutron.api.rpc.handlers import dhcp_rpc
-from neutron.api.rpc.handlers import l3_rpc
-from neutron.api.rpc.handlers import securitygroups_rpc
-from neutron.api.v2 import attributes
-from neutron.common import constants as q_const
-from neutron.common import exceptions as n_exc
-from neutron.common import rpc as n_rpc
-from neutron.common import topics
-from neutron.common import utils
-from neutron.db import agents_db
-from neutron.db import agentschedulers_db
-from neutron.db import allowedaddresspairs_db as addr_pair_db
-from neutron.db import db_base_plugin_v2
-from neutron.db import external_net_db
-from neutron.db import extradhcpopt_db
-from neutron.db import extraroute_db
-from neutron.db import l3_agentschedulers_db
-from neutron.db import l3_gwmode_db
-from neutron.db import portbindings_db
-from neutron.db import quota_db # noqa
-from neutron.db import securitygroups_rpc_base as sg_db_rpc
-from neutron.extensions import allowedaddresspairs as addr_pair
-from neutron.extensions import extra_dhcp_opt as edo_ext
-from neutron.extensions import portbindings
-from neutron.extensions import providernet as provider
-from neutron.extensions import securitygroup as ext_sg
-from neutron import manager
-from neutron.openstack.common import importutils
-from neutron.openstack.common import log as logging
-from neutron.plugins.common import constants as svc_constants
-from neutron.plugins.common import utils as plugin_utils
-from neutron.plugins.openvswitch.common import config # noqa
-from neutron.plugins.openvswitch.common import constants
-from neutron.plugins.openvswitch import ovs_db_v2
-
-
-LOG = logging.getLogger(__name__)
-
-
-class OVSRpcCallbacks(n_rpc.RpcCallback):
-
- # history
- # 1.0 Initial version
- # 1.1 Support Security Group RPC
- # 1.2 Support get_devices_details_list
-
- RPC_API_VERSION = '1.2'
-
- def __init__(self, notifier, tunnel_type):
- super(OVSRpcCallbacks, self).__init__()
- self.notifier = notifier
- self.tunnel_type = tunnel_type
-
- def get_device_details(self, rpc_context, **kwargs):
- """Agent requests device details."""
- agent_id = kwargs.get('agent_id')
- device = kwargs.get('device')
- LOG.debug(_("Device %(device)s details requested from %(agent_id)s"),
- {'device': device, 'agent_id': agent_id})
- port = ovs_db_v2.get_port(device)
- if port:
- binding = ovs_db_v2.get_network_binding(None, port['network_id'])
- entry = {'device': device,
- 'network_id': port['network_id'],
- 'port_id': port['id'],
- 'admin_state_up': port['admin_state_up'],
- 'network_type': binding.network_type,
- 'segmentation_id': binding.segmentation_id,
- 'physical_network': binding.physical_network}
- new_status = (q_const.PORT_STATUS_ACTIVE if port['admin_state_up']
- else q_const.PORT_STATUS_DOWN)
- if port['status'] != new_status:
- ovs_db_v2.set_port_status(port['id'], new_status)
- else:
- entry = {'device': device}
- LOG.debug(_("%s can not be found in database"), device)
- return entry
-
- def get_devices_details_list(self, rpc_context, **kwargs):
- return [
- self.get_device_details(
- rpc_context,
- device=device,
- **kwargs
- )
- for device in kwargs.pop('devices', [])
- ]
-
- def update_device_down(self, rpc_context, **kwargs):
- """Device no longer exists on agent."""
- agent_id = kwargs.get('agent_id')
- device = kwargs.get('device')
- host = kwargs.get('host')
- port = ovs_db_v2.get_port(device)
- LOG.debug(_("Device %(device)s no longer exists on %(agent_id)s"),
- {'device': device, 'agent_id': agent_id})
- if port:
- entry = {'device': device,
- 'exists': True}
- plugin = manager.NeutronManager.get_plugin()
- if (host and
- not plugin.get_port_host(rpc_context, port['id']) == host):
- LOG.debug(_("Device %(device)s not bound to the"
- " agent host %(host)s"),
- {'device': device, 'host': host})
- elif port['status'] != q_const.PORT_STATUS_DOWN:
- # Set port status to DOWN
- ovs_db_v2.set_port_status(port['id'],
- q_const.PORT_STATUS_DOWN)
- else:
- entry = {'device': device,
- 'exists': False}
- LOG.debug(_("%s can not be found in database"), device)
- return entry
-
- def update_device_up(self, rpc_context, **kwargs):
- """Device is up on agent."""
- agent_id = kwargs.get('agent_id')
- device = kwargs.get('device')
- host = kwargs.get('host')
- port = ovs_db_v2.get_port(device)
- LOG.debug(_("Device %(device)s up on %(agent_id)s"),
- {'device': device, 'agent_id': agent_id})
- plugin = manager.NeutronManager.get_plugin()
- if port:
- if (host and
- not plugin.get_port_host(rpc_context, port['id']) == host):
- LOG.debug(_("Device %(device)s not bound to the"
- " agent host %(host)s"),
- {'device': device, 'host': host})
- return
- elif port['status'] != q_const.PORT_STATUS_ACTIVE:
- ovs_db_v2.set_port_status(port['id'],
- q_const.PORT_STATUS_ACTIVE)
- else:
- LOG.debug(_("%s can not be found in database"), device)
-
- def tunnel_sync(self, rpc_context, **kwargs):
- """Update new tunnel.
-
- Updates the datbase with the tunnel IP. All listening agents will also
- be notified about the new tunnel IP.
- """
- tunnel_ip = kwargs.get('tunnel_ip')
- # Update the database with the IP
- tunnel = ovs_db_v2.add_tunnel_endpoint(tunnel_ip)
- tunnels = ovs_db_v2.get_tunnel_endpoints()
- entry = dict()
- entry['tunnels'] = tunnels
- # Notify all other listening agents
- self.notifier.tunnel_update(rpc_context, tunnel.ip_address,
- tunnel.id, self.tunnel_type)
- # Return the list of tunnels IP's to the agent
- return entry
-
-
-class SecurityGroupServerRpcMixin(sg_db_rpc.SecurityGroupServerRpcMixin):
-
- @classmethod
- def get_port_from_device(cls, device):
- port = ovs_db_v2.get_port_from_device(device)
- if port:
- port['device'] = device
- return port
-
-
-class AgentNotifierApi(n_rpc.RpcProxy,
- sg_rpc.SecurityGroupAgentRpcApiMixin):
- '''Agent side of the openvswitch rpc API.
-
- API version history:
- 1.0 - Initial version.
-
- '''
-
- BASE_RPC_API_VERSION = '1.0'
-
- def __init__(self, topic):
- super(AgentNotifierApi, self).__init__(
- topic=topic, default_version=self.BASE_RPC_API_VERSION)
- self.topic_network_delete = topics.get_topic_name(topic,
- topics.NETWORK,
- topics.DELETE)
- self.topic_port_update = topics.get_topic_name(topic,
- topics.PORT,
- topics.UPDATE)
- self.topic_tunnel_update = topics.get_topic_name(topic,
- constants.TUNNEL,
- topics.UPDATE)
-
- def network_delete(self, context, network_id):
- self.fanout_cast(context,
- self.make_msg('network_delete',
- network_id=network_id),
- topic=self.topic_network_delete)
-
- def port_update(self, context, port, network_type, segmentation_id,
- physical_network):
- self.fanout_cast(context,
- self.make_msg('port_update',
- port=port,
- network_type=network_type,
- segmentation_id=segmentation_id,
- physical_network=physical_network),
- topic=self.topic_port_update)
-
- def tunnel_update(self, context, tunnel_ip, tunnel_id, tunnel_type):
- self.fanout_cast(context,
- self.make_msg('tunnel_update',
- tunnel_ip=tunnel_ip,
- tunnel_id=tunnel_id,
- tunnel_type=tunnel_type),
- topic=self.topic_tunnel_update)
-
-
-class OVSNeutronPluginV2(db_base_plugin_v2.NeutronDbPluginV2,
- external_net_db.External_net_db_mixin,
- extraroute_db.ExtraRoute_db_mixin,
- l3_gwmode_db.L3_NAT_db_mixin,
- SecurityGroupServerRpcMixin,
- l3_agentschedulers_db.L3AgentSchedulerDbMixin,
- agentschedulers_db.DhcpAgentSchedulerDbMixin,
- portbindings_db.PortBindingMixin,
- extradhcpopt_db.ExtraDhcpOptMixin,
- addr_pair_db.AllowedAddressPairsMixin):
-
- """Implement the Neutron abstractions using Open vSwitch.
-
- Depending on whether tunneling is enabled, either a GRE, VXLAN tunnel or
- a new VLAN is created for each network. An agent is relied upon to
- perform the actual OVS configuration on each host.
-
- The provider extension is also supported. As discussed in
- https://bugs.launchpad.net/neutron/+bug/1023156, this class could
- be simplified, and filtering on extended attributes could be
- handled, by adding support for extended attributes to the
- NeutronDbPluginV2 base class. When that occurs, this class should
- be updated to take advantage of it.
-
- The port binding extension enables an external application relay
- information to and from the plugin.
- """
-
- # This attribute specifies whether the plugin supports or not
- # bulk/pagination/sorting operations. Name mangling is used in
- # order to ensure it is qualified by class
- __native_bulk_support = True
- __native_pagination_support = True
- __native_sorting_support = True
-
- _supported_extension_aliases = ["provider", "external-net", "router",
- "ext-gw-mode", "binding", "quotas",
- "security-group", "agent", "extraroute",
- "l3_agent_scheduler",
- "dhcp_agent_scheduler",
- "extra_dhcp_opt",
- "allowed-address-pairs"]
-
- @property
- def supported_extension_aliases(self):
- if not hasattr(self, '_aliases'):
- aliases = self._supported_extension_aliases[:]
- sg_rpc.disable_security_group_extension_by_config(aliases)
- self._aliases = aliases
- return self._aliases
-
- db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
- attributes.NETWORKS, ['_extend_network_dict_provider_ovs'])
-
- def __init__(self, configfile=None):
- super(OVSNeutronPluginV2, self).__init__()
- self.base_binding_dict = {
- portbindings.VIF_TYPE: portbindings.VIF_TYPE_OVS,
- portbindings.VIF_DETAILS: {
- # TODO(rkukura): Replace with new VIF security details
- portbindings.CAP_PORT_FILTER:
- 'security-group' in self.supported_extension_aliases,
- portbindings.OVS_HYBRID_PLUG: True}}
- self._parse_network_vlan_ranges()
- ovs_db_v2.sync_vlan_allocations(self.network_vlan_ranges)
- self.tenant_network_type = cfg.CONF.OVS.tenant_network_type
- if self.tenant_network_type not in [svc_constants.TYPE_LOCAL,
- svc_constants.TYPE_VLAN,
- svc_constants.TYPE_GRE,
- svc_constants.TYPE_VXLAN,
- svc_constants.TYPE_NONE]:
- LOG.error(_("Invalid tenant_network_type: %s. "
- "Server terminated!"),
- self.tenant_network_type)
- sys.exit(1)
- self.enable_tunneling = cfg.CONF.OVS.enable_tunneling
- self.tunnel_type = None
- if self.enable_tunneling:
- self.tunnel_type = (cfg.CONF.OVS.tunnel_type or
- svc_constants.TYPE_GRE)
- elif cfg.CONF.OVS.tunnel_type:
- self.tunnel_type = cfg.CONF.OVS.tunnel_type
- self.enable_tunneling = True
- self.tunnel_id_ranges = []
- if self.enable_tunneling:
- self._parse_tunnel_id_ranges()
- ovs_db_v2.sync_tunnel_allocations(self.tunnel_id_ranges)
- elif self.tenant_network_type in constants.TUNNEL_NETWORK_TYPES:
- LOG.error(_("Tunneling disabled but tenant_network_type is '%s'. "
- "Server terminated!"), self.tenant_network_type)
- sys.exit(1)
- self.setup_rpc()
- self.network_scheduler = importutils.import_object(
- cfg.CONF.network_scheduler_driver
- )
- self.router_scheduler = importutils.import_object(
- cfg.CONF.router_scheduler_driver
- )
-
- def setup_rpc(self):
- # RPC support
- self.service_topics = {svc_constants.CORE: topics.PLUGIN,
- svc_constants.L3_ROUTER_NAT: topics.L3PLUGIN}
- self.conn = n_rpc.create_connection(new=True)
- self.notifier = AgentNotifierApi(topics.AGENT)
- self.agent_notifiers[q_const.AGENT_TYPE_DHCP] = (
- dhcp_rpc_agent_api.DhcpAgentNotifyAPI()
- )
- self.agent_notifiers[q_const.AGENT_TYPE_L3] = (
- l3_rpc_agent_api.L3AgentNotifyAPI()
- )
- self.endpoints = [OVSRpcCallbacks(self.notifier, self.tunnel_type),
- securitygroups_rpc.SecurityGroupServerRpcCallback(),
- dhcp_rpc.DhcpRpcCallback(),
- l3_rpc.L3RpcCallback(),
- agents_db.AgentExtRpcCallback()]
- for svc_topic in self.service_topics.values():
- self.conn.create_consumer(svc_topic, self.endpoints, fanout=False)
- # Consume from all consumers in threads
- self.conn.consume_in_threads()
-
- def _parse_network_vlan_ranges(self):
- try:
- self.network_vlan_ranges = plugin_utils.parse_network_vlan_ranges(
- cfg.CONF.OVS.network_vlan_ranges)
- except Exception as ex:
- LOG.error(_("%s. Server terminated!"), ex)
- sys.exit(1)
- LOG.info(_("Network VLAN ranges: %s"), self.network_vlan_ranges)
-
- def _parse_tunnel_id_ranges(self):
- for entry in cfg.CONF.OVS.tunnel_id_ranges:
- entry = entry.strip()
- try:
- tun_min, tun_max = entry.split(':')
- self.tunnel_id_ranges.append((int(tun_min), int(tun_max)))
- except ValueError as ex:
- LOG.error(_("Invalid tunnel ID range: "
- "'%(range)s' - %(e)s. Server terminated!"),
- {'range': entry, 'e': ex})
- sys.exit(1)
- LOG.info(_("Tunnel ID ranges: %s"), self.tunnel_id_ranges)
-
- def _extend_network_dict_provider_ovs(self, network, net_db,
- net_binding=None):
- # this method used in two cases: when binding is provided explicitly
- # and when it is a part of db model object
- binding = net_db.binding if net_db else net_binding
- network[provider.NETWORK_TYPE] = binding.network_type
- if binding.network_type in constants.TUNNEL_NETWORK_TYPES:
- network[provider.PHYSICAL_NETWORK] = None
- network[provider.SEGMENTATION_ID] = binding.segmentation_id
- elif binding.network_type == svc_constants.TYPE_FLAT:
- network[provider.PHYSICAL_NETWORK] = binding.physical_network
- network[provider.SEGMENTATION_ID] = None
- elif binding.network_type == svc_constants.TYPE_VLAN:
- network[provider.PHYSICAL_NETWORK] = binding.physical_network
- network[provider.SEGMENTATION_ID] = binding.segmentation_id
- elif binding.network_type == svc_constants.TYPE_LOCAL:
- network[provider.PHYSICAL_NETWORK] = None
- network[provider.SEGMENTATION_ID] = None
-
- def _process_provider_create(self, context, attrs):
- network_type = attrs.get(provider.NETWORK_TYPE)
- physical_network = attrs.get(provider.PHYSICAL_NETWORK)
- segmentation_id = attrs.get(provider.SEGMENTATION_ID)
-
- network_type_set = attributes.is_attr_set(network_type)
- physical_network_set = attributes.is_attr_set(physical_network)
- segmentation_id_set = attributes.is_attr_set(segmentation_id)
-
- if not (network_type_set or physical_network_set or
- segmentation_id_set):
- return (None, None, None)
-
- if not network_type_set:
- msg = _("provider:network_type required")
- raise n_exc.InvalidInput(error_message=msg)
- elif network_type == svc_constants.TYPE_FLAT:
- if segmentation_id_set:
- msg = _("provider:segmentation_id specified for flat network")
- raise n_exc.InvalidInput(error_message=msg)
- else:
- segmentation_id = constants.FLAT_VLAN_ID
- elif network_type == svc_constants.TYPE_VLAN:
- if not segmentation_id_set:
- msg = _("provider:segmentation_id required")
- raise n_exc.InvalidInput(error_message=msg)
- if not utils.is_valid_vlan_tag(segmentation_id):
- msg = (_("provider:segmentation_id out of range "
- "(%(min_id)s through %(max_id)s)") %
- {'min_id': q_const.MIN_VLAN_TAG,
- 'max_id': q_const.MAX_VLAN_TAG})
- raise n_exc.InvalidInput(error_message=msg)
- elif network_type in constants.TUNNEL_NETWORK_TYPES:
- if not self.enable_tunneling:
- msg = _("%s networks are not enabled") % network_type
- raise n_exc.InvalidInput(error_message=msg)
- if physical_network_set:
- msg = _("provider:physical_network specified for %s "
- "network") % network_type
- raise n_exc.InvalidInput(error_message=msg)
- else:
- physical_network = None
- if not segmentation_id_set:
- msg = _("provider:segmentation_id required")
- raise n_exc.InvalidInput(error_message=msg)
- elif network_type == svc_constants.TYPE_LOCAL:
- if physical_network_set:
- msg = _("provider:physical_network specified for local "
- "network")
- raise n_exc.InvalidInput(error_message=msg)
- else:
- physical_network = None
- if segmentation_id_set:
- msg = _("provider:segmentation_id specified for local "
- "network")
- raise n_exc.InvalidInput(error_message=msg)
- else:
- segmentation_id = None
- else:
- msg = _("provider:network_type %s not supported") % network_type
- raise n_exc.InvalidInput(error_message=msg)
-
- if network_type in [svc_constants.TYPE_VLAN, svc_constants.TYPE_FLAT]:
- if physical_network_set:
- if physical_network not in self.network_vlan_ranges:
- msg = _("Unknown provider:physical_network "
- "%s") % physical_network
- raise n_exc.InvalidInput(error_message=msg)
- elif 'default' in self.network_vlan_ranges:
- physical_network = 'default'
- else:
- msg = _("provider:physical_network required")
- raise n_exc.InvalidInput(error_message=msg)
-
- return (network_type, physical_network, segmentation_id)
-
- def create_network(self, context, network):
- (network_type, physical_network,
- segmentation_id) = self._process_provider_create(context,
- network['network'])
-
- session = context.session
- #set up default security groups
- tenant_id = self._get_tenant_id_for_create(
- context, network['network'])
- self._ensure_default_security_group(context, tenant_id)
-
- with session.begin(subtransactions=True):
- if not network_type:
- # tenant network
- network_type = self.tenant_network_type
- if network_type == svc_constants.TYPE_NONE:
- raise n_exc.TenantNetworksDisabled()
- elif network_type == svc_constants.TYPE_VLAN:
- (physical_network,
- segmentation_id) = ovs_db_v2.reserve_vlan(session)
- elif network_type in constants.TUNNEL_NETWORK_TYPES:
- segmentation_id = ovs_db_v2.reserve_tunnel(session)
- # no reservation needed for TYPE_LOCAL
- else:
- # provider network
- if network_type in [svc_constants.TYPE_VLAN,
- svc_constants.TYPE_FLAT]:
- ovs_db_v2.reserve_specific_vlan(session, physical_network,
- segmentation_id)
- elif network_type in constants.TUNNEL_NETWORK_TYPES:
- ovs_db_v2.reserve_specific_tunnel(session, segmentation_id)
- # no reservation needed for TYPE_LOCAL
- net = super(OVSNeutronPluginV2, self).create_network(context,
- network)
- binding = ovs_db_v2.add_network_binding(session, net['id'],
- network_type,
- physical_network,
- segmentation_id)
-
- self._process_l3_create(context, net, network['network'])
- # passing None as db model to use binding object
- self._extend_network_dict_provider_ovs(net, None, binding)
- # note - exception will rollback entire transaction
- LOG.debug(_("Created network: %s"), net['id'])
- return net
-
- def update_network(self, context, id, network):
- provider._raise_if_updates_provider_attributes(network['network'])
-
- session = context.session
- with session.begin(subtransactions=True):
- net = super(OVSNeutronPluginV2, self).update_network(context, id,
- network)
- self._process_l3_update(context, net, network['network'])
- return net
-
- def delete_network(self, context, id):
- session = context.session
- with session.begin(subtransactions=True):
- binding = ovs_db_v2.get_network_binding(session, id)
- self._process_l3_delete(context, id)
- super(OVSNeutronPluginV2, self).delete_network(context, id)
- if binding.network_type in constants.TUNNEL_NETWORK_TYPES:
- ovs_db_v2.release_tunnel(session, binding.segmentation_id,
- self.tunnel_id_ranges)
- elif binding.network_type in [svc_constants.TYPE_VLAN,
- svc_constants.TYPE_FLAT]:
- ovs_db_v2.release_vlan(session, binding.physical_network,
- binding.segmentation_id,
- self.network_vlan_ranges)
- # the network_binding record is deleted via cascade from
- # the network record, so explicit removal is not necessary
- self.notifier.network_delete(context, id)
-
- def get_network(self, context, id, fields=None):
- session = context.session
- with session.begin(subtransactions=True):
- net = super(OVSNeutronPluginV2, self).get_network(context,
- id, None)
- return self._fields(net, fields)
-
- def get_networks(self, context, filters=None, fields=None,
- sorts=None,
- limit=None, marker=None, page_reverse=False):
- session = context.session
- with session.begin(subtransactions=True):
- nets = super(OVSNeutronPluginV2,
- self).get_networks(context, filters, None, sorts,
- limit, marker, page_reverse)
-
- return [self._fields(net, fields) for net in nets]
-
- def create_port(self, context, port):
- # Set port status as 'DOWN'. This will be updated by agent
- port['port']['status'] = q_const.PORT_STATUS_DOWN
- port_data = port['port']
- session = context.session
- with session.begin(subtransactions=True):
- self._ensure_default_security_group_on_port(context, port)
- sgids = self._get_security_groups_on_port(context, port)
- dhcp_opts = port['port'].get(edo_ext.EXTRADHCPOPTS, [])
- port = super(OVSNeutronPluginV2, self).create_port(context, port)
- self._process_portbindings_create_and_update(context,
- port_data, port)
- self._process_port_create_security_group(context, port, sgids)
- self._process_port_create_extra_dhcp_opts(context, port,
- dhcp_opts)
- port[addr_pair.ADDRESS_PAIRS] = (
- self._process_create_allowed_address_pairs(
- context, port,
- port_data.get(addr_pair.ADDRESS_PAIRS)))
- self.notify_security_groups_member_updated(context, port)
- return port
-
- def update_port(self, context, id, port):
- session = context.session
- need_port_update_notify = False
- with session.begin(subtransactions=True):
- original_port = super(OVSNeutronPluginV2, self).get_port(
- context, id)
- updated_port = super(OVSNeutronPluginV2, self).update_port(
- context, id, port)
- if addr_pair.ADDRESS_PAIRS in port['port']:
- need_port_update_notify |= (
- self.update_address_pairs_on_port(context, id, port,
- original_port,
- updated_port))
- need_port_update_notify |= self.update_security_group_on_port(
- context, id, port, original_port, updated_port)
- self._process_portbindings_create_and_update(context,
- port['port'],
- updated_port)
- need_port_update_notify |= self._update_extra_dhcp_opts_on_port(
- context, id, port, updated_port)
-
- secgrp_member_updated = self.is_security_group_member_updated(
- context, original_port, updated_port)
- need_port_update_notify |= secgrp_member_updated
- if original_port['admin_state_up'] != updated_port['admin_state_up']:
- need_port_update_notify = True
-
- if need_port_update_notify:
- binding = ovs_db_v2.get_network_binding(None,
- updated_port['network_id'])
- self.notifier.port_update(context, updated_port,
- binding.network_type,
- binding.segmentation_id,
- binding.physical_network)
-
- if secgrp_member_updated:
- old_set = set(original_port.get(ext_sg.SECURITYGROUPS))
- new_set = set(updated_port.get(ext_sg.SECURITYGROUPS))
- self.notifier.security_groups_member_updated(
- context,
- old_set ^ new_set)
-
- return updated_port
-
- def delete_port(self, context, id, l3_port_check=True):
-
- # if needed, check to see if this is a port owned by
- # and l3-router. If so, we should prevent deletion.
- if l3_port_check:
- self.prevent_l3_port_deletion(context, id)
-
- session = context.session
- with session.begin(subtransactions=True):
- router_ids = self.disassociate_floatingips(
- context, id, do_notify=False)
- port = self.get_port(context, id)
- self._delete_port_security_group_bindings(context, id)
- super(OVSNeutronPluginV2, self).delete_port(context, id)
-
- # now that we've left db transaction, we are safe to notify
- self.notify_routers_updated(context, router_ids)
- self.notify_security_groups_member_updated(context, port)
diff --git a/neutron/plugins/plumgrid/__init__.py b/neutron/plugins/plumgrid/__init__.py
index f34feeeec9..e69de29bb2 100644
--- a/neutron/plugins/plumgrid/__init__.py
+++ b/neutron/plugins/plumgrid/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 PLUMgrid, Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/plumgrid/common/__init__.py b/neutron/plugins/plumgrid/common/__init__.py
index f34feeeec9..e69de29bb2 100644
--- a/neutron/plugins/plumgrid/common/__init__.py
+++ b/neutron/plugins/plumgrid/common/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 PLUMgrid, Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/plumgrid/drivers/__init__.py b/neutron/plugins/plumgrid/drivers/__init__.py
index f34feeeec9..e69de29bb2 100644
--- a/neutron/plugins/plumgrid/drivers/__init__.py
+++ b/neutron/plugins/plumgrid/drivers/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 PLUMgrid, Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py b/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py
index f34feeeec9..e69de29bb2 100644
--- a/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py
+++ b/neutron/plugins/plumgrid/plumgrid_plugin/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 PLUMgrid, Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/ryu/common/__init__.py b/neutron/plugins/ryu/common/__init__.py
index 8ac9340e9f..e69de29bb2 100644
--- a/neutron/plugins/ryu/common/__init__.py
+++ b/neutron/plugins/ryu/common/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/vmware/api_client/base.py b/neutron/plugins/vmware/api_client/base.py
index e8998b5cdc..31a3657e1c 100644
--- a/neutron/plugins/vmware/api_client/base.py
+++ b/neutron/plugins/vmware/api_client/base.py
@@ -145,6 +145,7 @@ class ApiClientBase(object):
elif hasattr(http_conn, "no_release"):
return
+ priority = http_conn.priority
if bad_state:
# Reconnect to provider.
LOG.warn(_("[%(rid)d] Connection returned in bad state, "
@@ -152,8 +153,6 @@ class ApiClientBase(object):
{'rid': rid,
'conn': api_client.ctrl_conn_to_str(http_conn)})
http_conn = self._create_connection(*self._conn_params(http_conn))
- priority = self._next_conn_priority
- self._next_conn_priority += 1
elif service_unavail:
# http_conn returned a service unaviable response, put other
# connections to the same controller at end of priority queue,
@@ -169,8 +168,6 @@ class ApiClientBase(object):
# put http_conn at end of queue also
priority = self._next_conn_priority
self._next_conn_priority += 1
- else:
- priority = http_conn.priority
self._conn_pool.put((priority, http_conn))
LOG.debug(_("[%(rid)d] Released connection %(conn)s. %(qsize)d "
diff --git a/neutron/plugins/vmware/common/utils.py b/neutron/plugins/vmware/common/utils.py
index fb21e55e69..fd5f2fc295 100644
--- a/neutron/plugins/vmware/common/utils.py
+++ b/neutron/plugins/vmware/common/utils.py
@@ -40,7 +40,7 @@ def get_tags(**kwargs):
tags = ([dict(tag=value, scope=key)
for key, value in kwargs.iteritems()])
tags.append({"tag": NEUTRON_VERSION, "scope": "quantum"})
- return tags
+ return sorted(tags)
def device_id_to_vm_id(device_id, obfuscate=False):
diff --git a/neutron/plugins/vmware/dhcp_meta/__init__.py b/neutron/plugins/vmware/dhcp_meta/__init__.py
index 75afea8bff..e69de29bb2 100644
--- a/neutron/plugins/vmware/dhcp_meta/__init__.py
+++ b/neutron/plugins/vmware/dhcp_meta/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 VMware, Inc.
-# All Rights Reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/vmware/extensions/distributedrouter.py b/neutron/plugins/vmware/extensions/distributedrouter.py
deleted file mode 100644
index 0ec4af439a..0000000000
--- a/neutron/plugins/vmware/extensions/distributedrouter.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2013 VMware, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-# TODO(armando-migliaccio): This is deprecated in Juno, and
-# to be removed in Kilo.
-
-from neutron.extensions import dvr
-
-
-class Distributedrouter(dvr.Dvr):
- """(Deprecated) Extension class supporting distributed router."""
-
- @classmethod
- def get_name(cls):
- return "Distributed Router"
-
- @classmethod
- def get_alias(cls):
- return "dist-router"
-
- @classmethod
- def get_description(cls):
- return ("Enables configuration of NSX "
- "Distributed routers (Deprecated).")
-
- @classmethod
- def get_namespace(cls):
- return "http://docs.openstack.org/ext/dist-router/api/v1.0"
diff --git a/neutron/plugins/vmware/nsxlib/l2gateway.py b/neutron/plugins/vmware/nsxlib/l2gateway.py
index f5a6e3053b..0848ed591f 100644
--- a/neutron/plugins/vmware/nsxlib/l2gateway.py
+++ b/neutron/plugins/vmware/nsxlib/l2gateway.py
@@ -149,7 +149,7 @@ def create_gateway_device(cluster, tenant_id, display_name, neutron_id,
try:
return nsxlib.do_request(
HTTP_POST, nsxlib._build_uri_path(TRANSPORTNODE_RESOURCE),
- jsonutils.dumps(body), cluster=cluster)
+ jsonutils.dumps(body, sort_keys=True), cluster=cluster)
except api_exc.InvalidSecurityCertificate:
raise nsx_exc.InvalidSecurityCertificate()
@@ -166,7 +166,7 @@ def update_gateway_device(cluster, gateway_id, tenant_id,
HTTP_PUT,
nsxlib._build_uri_path(TRANSPORTNODE_RESOURCE,
resource_id=gateway_id),
- jsonutils.dumps(body), cluster=cluster)
+ jsonutils.dumps(body, sort_keys=True), cluster=cluster)
except api_exc.InvalidSecurityCertificate:
raise nsx_exc.InvalidSecurityCertificate()
diff --git a/neutron/plugins/vmware/plugins/base.py b/neutron/plugins/vmware/plugins/base.py
index 6dbf8ae356..c6a629a6af 100644
--- a/neutron/plugins/vmware/plugins/base.py
+++ b/neutron/plugins/vmware/plugins/base.py
@@ -103,7 +103,6 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
supported_extension_aliases = ["allowed-address-pairs",
"binding",
"dvr",
- "dist-router",
"ext-gw-mode",
"extraroute",
"mac-learning",
@@ -245,7 +244,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
port_data.get('id', 'fake'), port_data.get('name', 'fake'),
port_data.get('admin_state_up', True), ip_addresses,
port_data.get('mac_address'))
- LOG.debug(_("Created NSX router port:%s"), lrouter_port['uuid'])
+ LOG.debug("Created NSX router port:%s", lrouter_port['uuid'])
except api_exc.NsxApiException:
LOG.exception(_("Unable to create port on NSX logical router %s"),
nsx_router_id)
@@ -329,7 +328,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
attachment,
attachment_type,
attachment_vlan)
- LOG.debug(_("Attached %(att)s to NSX router port %(port)s"),
+ LOG.debug("Attached %(att)s to NSX router port %(port)s",
{'att': attachment, 'port': nsx_router_port_id})
except api_exc.NsxApiException:
# Must remove NSX logical port
@@ -460,9 +459,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
switchlib.plug_vif_interface(
self.cluster, selected_lswitch['uuid'],
lport['uuid'], "VifAttachment", port_data['id'])
- LOG.debug(_("_nsx_create_port completed for port %(name)s "
- "on network %(network_id)s. The new port id is "
- "%(id)s."), port_data)
+ LOG.debug("_nsx_create_port completed for port %(name)s "
+ "on network %(network_id)s. The new port id is "
+ "%(id)s.", port_data)
except (api_exc.NsxApiException, n_exc.NeutronException):
self._handle_create_port_exception(
context, port_data['id'],
@@ -483,7 +482,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
selected_lswitch['uuid'],
lport['uuid'])
except n_exc.NotFound:
- LOG.debug(_("NSX Port %s already gone"), lport['uuid'])
+ LOG.debug("NSX Port %s already gone", lport['uuid'])
def _nsx_delete_port(self, context, port_data):
# FIXME(salvatore-orlando): On the NSX platform we do not really have
@@ -498,15 +497,15 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
nsx_switch_id, nsx_port_id = nsx_utils.get_nsx_switch_and_port_id(
context.session, self.cluster, port_data['id'])
if not nsx_port_id:
- LOG.debug(_("Port '%s' was already deleted on NSX platform"), id)
+ LOG.debug("Port '%s' was already deleted on NSX platform", id)
return
# TODO(bgh): if this is a bridged network and the lswitch we just got
# back will have zero ports after the delete we should garbage collect
# the lswitch.
try:
switchlib.delete_port(self.cluster, nsx_switch_id, nsx_port_id)
- LOG.debug(_("_nsx_delete_port completed for port %(port_id)s "
- "on network %(net_id)s"),
+ LOG.debug("_nsx_delete_port completed for port %(port_id)s "
+ "on network %(net_id)s",
{'port_id': port_data['id'],
'net_id': port_data['network_id']})
except n_exc.NotFound:
@@ -571,9 +570,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
nsx_db.add_neutron_nsx_port_mapping(
context.session, port_data['id'],
selected_lswitch['uuid'], ls_port['uuid'])
- LOG.debug(_("_nsx_create_router_port completed for port "
- "%(name)s on network %(network_id)s. The new "
- "port id is %(id)s."),
+ LOG.debug("_nsx_create_router_port completed for port "
+ "%(name)s on network %(network_id)s. The new "
+ "port id is %(id)s.",
port_data)
except (api_exc.NsxApiException, n_exc.NeutronException):
self._handle_create_port_exception(
@@ -635,9 +634,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
physical_network,
ext_network[pnet.SEGMENTATION_ID])
- LOG.debug(_("_nsx_create_ext_gw_port completed on external network "
- "%(ext_net_id)s, attached to router:%(router_id)s. "
- "NSX port id is %(nsx_port_id)s"),
+ LOG.debug("_nsx_create_ext_gw_port completed on external network "
+ "%(ext_net_id)s, attached to router:%(router_id)s. "
+ "NSX port id is %(nsx_port_id)s",
{'ext_net_id': port_data['network_id'],
'router_id': nsx_router_id,
'nsx_port_id': lr_port['uuid']})
@@ -676,8 +675,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
raise nsx_exc.NsxPluginException(
err_msg=_("Unable to update logical router"
"on NSX Platform"))
- LOG.debug(_("_nsx_delete_ext_gw_port completed on external network "
- "%(ext_net_id)s, attached to NSX router:%(router_id)s"),
+ LOG.debug("_nsx_delete_ext_gw_port completed on external network "
+ "%(ext_net_id)s, attached to NSX router:%(router_id)s",
{'ext_net_id': port_data['network_id'],
'router_id': nsx_router_id})
@@ -718,9 +717,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
switchlib.delete_port(self.cluster,
selected_lswitch['uuid'],
lport['uuid'])
- LOG.debug(_("_nsx_create_l2_gw_port completed for port %(name)s "
- "on network %(network_id)s. The new port id "
- "is %(id)s."), port_data)
+ LOG.debug("_nsx_create_l2_gw_port completed for port %(name)s "
+ "on network %(network_id)s. The new port id "
+ "is %(id)s.", port_data)
def _nsx_create_fip_port(self, context, port_data):
# As we do not create ports for floating IPs in NSX,
@@ -846,7 +845,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
['lport_count'] < max_ports)].pop(0)
except IndexError:
# Too bad, no switch available
- LOG.debug(_("No switch has available ports (%d checked)"),
+ LOG.debug("No switch has available ports (%d checked)",
len(lswitches))
if allow_extra_lswitches:
# The 'main' logical switch is either the only one available
@@ -1145,8 +1144,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
port_data['device_owner'],
self._port_drivers['create']['default'])
port_create_func(context, port_data)
- LOG.debug(_("port created on NSX backend for tenant "
- "%(tenant_id)s: (%(id)s)"), port_data)
+ LOG.debug("port created on NSX backend for tenant "
+ "%(tenant_id)s: (%(id)s)", port_data)
except n_exc.NotFound:
LOG.warning(_("Logical switch for network %s was not "
"found in NSX."), port_data['network_id'])
@@ -1247,7 +1246,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
self._delete_port_queue_mapping(context, ret_port['id'])
self._process_port_queue_mapping(context, ret_port,
port_queue_id)
- LOG.debug(_("Updating port: %s"), port)
+ LOG.debug("Updating port: %s", port)
nsx_switch_id, nsx_port_id = nsx_utils.get_nsx_switch_and_port_id(
context.session, self.cluster, id)
# Convert Neutron security groups identifiers into NSX security
@@ -1683,8 +1682,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
# if needed.
self.handle_router_metadata_access(
context, router_id, interface=router_iface_info)
- LOG.debug(_("Add_router_interface completed for subnet:%(subnet_id)s "
- "and router:%(router_id)s"),
+ LOG.debug("Add_router_interface completed for subnet:%(subnet_id)s "
+ "and router:%(router_id)s",
{'subnet_id': subnet_id, 'router_id': router_id})
return router_iface_info
@@ -1974,7 +1973,7 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
min_num_rules_expected=1)
self._remove_floatingip_address(context, fip_db)
except sa_exc.NoResultFound:
- LOG.debug(_("The port '%s' is not associated with floating IPs"),
+ LOG.debug("The port '%s' is not associated with floating IPs",
port_id)
except n_exc.NotFound:
LOG.warning(_("Nat rules not found in nsx for port: %s"), id)
@@ -2141,9 +2140,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
query.update({'status': device_status,
'nsx_id': nsx_res['uuid']},
synchronize_session=False)
- LOG.debug(_("Neutron gateway device: %(neutron_id)s; "
- "NSX transport node identifier: %(nsx_id)s; "
- "Operational status: %(status)s."),
+ LOG.debug("Neutron gateway device: %(neutron_id)s; "
+ "NSX transport node identifier: %(nsx_id)s; "
+ "Operational status: %(status)s.",
{'neutron_id': neutron_id,
'nsx_id': nsx_res['uuid'],
'status': device_status})
@@ -2179,9 +2178,9 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
networkgw_db.NetworkGatewayDevice.id == neutron_id)
query.update({'status': device_status},
synchronize_session=False)
- LOG.debug(_("Neutron gateway device: %(neutron_id)s; "
- "NSX transport node identifier: %(nsx_id)s; "
- "Operational status: %(status)s."),
+ LOG.debug("Neutron gateway device: %(neutron_id)s; "
+ "NSX transport node identifier: %(nsx_id)s; "
+ "Operational status: %(status)s.",
{'neutron_id': neutron_id,
'nsx_id': nsx_id,
'status': device_status})
diff --git a/neutron/plugins/vmware/plugins/service.py b/neutron/plugins/vmware/plugins/service.py
index 1f5e503b61..d7e32e2f22 100644
--- a/neutron/plugins/vmware/plugins/service.py
+++ b/neutron/plugins/vmware/plugins/service.py
@@ -141,7 +141,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
return self._router_type[router_id]
router = self._get_router(context, router_id)
- LOG.debug(_("EDGE: router = %s"), router)
+ LOG.debug("EDGE: router = %s", router)
if router['extra_attributes']['service_router']:
router_type = ROUTER_TYPE_ADVANCED
else:
@@ -172,7 +172,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
# NOP for Edge because currently the port will be create internally
# by VSM
- LOG.debug(_("EDGE: _vcns_create_ext_gw_port"))
+ LOG.debug("EDGE: _vcns_create_ext_gw_port")
def _vcns_delete_ext_gw_port(self, context, port_data):
router_id = port_data['device_id']
@@ -181,7 +181,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
return
# NOP for Edge
- LOG.debug(_("EDGE: _vcns_delete_ext_gw_port"))
+ LOG.debug("EDGE: _vcns_delete_ext_gw_port")
def _get_external_attachment_info(self, context, router):
gw_port = router.gw_port
@@ -336,7 +336,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
if new_ext_net_id != org_ext_net_id and orgnexthop:
# network changed, need to remove default gateway before vnic
# can be configured
- LOG.debug(_("VCNS: delete default gateway %s"), orgnexthop)
+ LOG.debug("VCNS: delete default gateway %s", orgnexthop)
self._vcns_update_static_routes(context,
router=router,
edge_id=binding['edge_id'],
@@ -904,7 +904,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
self.vcns_driver.delete_firewall(context, edge_id)
def create_firewall(self, context, firewall):
- LOG.debug(_("create_firewall() called"))
+ LOG.debug("create_firewall() called")
router_id = firewall['firewall'].get(vcns_const.ROUTER_ID)
if not router_id:
msg = _("router_id is not provided!")
@@ -938,7 +938,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
return fw
def update_firewall(self, context, id, firewall):
- LOG.debug(_("update_firewall() called"))
+ LOG.debug("update_firewall() called")
self._ensure_firewall_update_allowed(context, id)
service_router_binding = self._get_resource_router_id_binding(
context, firewall_db.Firewall, resource_id=id)
@@ -964,7 +964,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
return fw
def delete_firewall(self, context, id):
- LOG.debug(_("delete_firewall() called"))
+ LOG.debug("delete_firewall() called")
self._firewall_set_status(
context, id, service_constants.PENDING_DELETE)
service_router_binding = self._get_resource_router_id_binding(
@@ -1000,7 +1000,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
return fws
def update_firewall_rule(self, context, id, firewall_rule):
- LOG.debug(_("update_firewall_rule() called"))
+ LOG.debug("update_firewall_rule() called")
self._ensure_update_or_delete_firewall_rule(context, id)
fwr_pre = self.get_firewall_rule(context, id)
fwr = super(NsxAdvancedPlugin, self).update_firewall_rule(
@@ -1026,7 +1026,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
return fwr
def update_firewall_policy(self, context, id, firewall_policy):
- LOG.debug(_("update_firewall_policy() called"))
+ LOG.debug("update_firewall_policy() called")
self._ensure_firewall_policy_update_allowed(context, id)
firewall_rules_pre = self._make_firewall_rule_list_by_policy_id(
context, id)
@@ -1053,7 +1053,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
return fwp
def insert_rule(self, context, id, rule_info):
- LOG.debug(_("insert_rule() called"))
+ LOG.debug("insert_rule() called")
self._ensure_firewall_policy_update_allowed(context, id)
fwp = super(NsxAdvancedPlugin, self).insert_rule(
context, id, rule_info)
@@ -1082,7 +1082,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
return fwp
def remove_rule(self, context, id, rule_info):
- LOG.debug(_("remove_rule() called"))
+ LOG.debug("remove_rule() called")
self._ensure_firewall_policy_update_allowed(context, id)
fwp = super(NsxAdvancedPlugin, self).remove_rule(
context, id, rule_info)
@@ -1220,7 +1220,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
self.vcns_driver.update_pool(context, edge_id, pool, members)
def create_vip(self, context, vip):
- LOG.debug(_("create_vip() called"))
+ LOG.debug("create_vip() called")
router_id = vip['vip'].get(vcns_const.ROUTER_ID)
if not router_id:
msg = _("router_id is not provided!")
@@ -1608,7 +1608,7 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin,
LOG.exception(msg)
def create_vpnservice(self, context, vpnservice):
- LOG.debug(_("create_vpnservice() called"))
+ LOG.debug("create_vpnservice() called")
router_id = vpnservice['vpnservice'].get('router_id')
if not self._is_advanced_service_router(context, router_id):
msg = _("router_id:%s is not an advanced router!") % router_id
@@ -1729,7 +1729,7 @@ class VcnsCallbacks(object):
neutron_router_id = jobdata['neutron_router_id']
name = task.userdata['router_name']
if edge_id:
- LOG.debug(_("Start deploying %(edge_id)s for router %(name)s"), {
+ LOG.debug("Start deploying %(edge_id)s for router %(name)s", {
'edge_id': edge_id,
'name': name})
vcns_db.update_vcns_router_binding(
@@ -1756,10 +1756,10 @@ class VcnsCallbacks(object):
LOG.exception(_("Router %s not found"), lrouter['uuid'])
if task.status == tasks_const.TaskStatus.COMPLETED:
- LOG.debug(_("Successfully deployed %(edge_id)s for "
- "router %(name)s"), {
- 'edge_id': task.userdata['edge_id'],
- 'name': name})
+ LOG.debug("Successfully deployed %(edge_id)s for "
+ "router %(name)s", {
+ 'edge_id': task.userdata['edge_id'],
+ 'name': name})
if (router_db and
router_db['status'] == service_constants.PENDING_CREATE):
router_db['status'] = service_constants.ACTIVE
@@ -1772,7 +1772,7 @@ class VcnsCallbacks(object):
context.session, neutron_router_id,
status=service_constants.ACTIVE)
else:
- LOG.debug(_("Failed to deploy Edge for router %s"), name)
+ LOG.debug("Failed to deploy Edge for router %s", name)
if router_db:
router_db['status'] = service_constants.ERROR
vcns_db.update_vcns_router_binding(
@@ -1788,25 +1788,25 @@ class VcnsCallbacks(object):
router_id)
def interface_update_result(self, task):
- LOG.debug(_("interface_update_result %d"), task.status)
+ LOG.debug("interface_update_result %d", task.status)
def snat_create_result(self, task):
- LOG.debug(_("snat_create_result %d"), task.status)
+ LOG.debug("snat_create_result %d", task.status)
def snat_delete_result(self, task):
- LOG.debug(_("snat_delete_result %d"), task.status)
+ LOG.debug("snat_delete_result %d", task.status)
def dnat_create_result(self, task):
- LOG.debug(_("dnat_create_result %d"), task.status)
+ LOG.debug("dnat_create_result %d", task.status)
def dnat_delete_result(self, task):
- LOG.debug(_("dnat_delete_result %d"), task.status)
+ LOG.debug("dnat_delete_result %d", task.status)
def routes_update_result(self, task):
- LOG.debug(_("routes_update_result %d"), task.status)
+ LOG.debug("routes_update_result %d", task.status)
def nat_update_result(self, task):
- LOG.debug(_("nat_update_result %d"), task.status)
+ LOG.debug("nat_update_result %d", task.status)
def _process_base_create_lswitch_args(*args, **kwargs):
diff --git a/neutron/plugins/vmware/vshield/__init__.py b/neutron/plugins/vmware/vshield/__init__.py
index db5f20ea93..e69de29bb2 100644
--- a/neutron/plugins/vmware/vshield/__init__.py
+++ b/neutron/plugins/vmware/vshield/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 VMware, Inc
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/plugins/vmware/vshield/edge_appliance_driver.py b/neutron/plugins/vmware/vshield/edge_appliance_driver.py
index 5b71b09723..700b989190 100644
--- a/neutron/plugins/vmware/vshield/edge_appliance_driver.py
+++ b/neutron/plugins/vmware/vshield/edge_appliance_driver.py
@@ -16,9 +16,7 @@ from neutron.openstack.common import excutils
from neutron.openstack.common import jsonutils
from neutron.openstack.common import log as logging
from neutron.plugins.vmware.common import utils
-from neutron.plugins.vmware.vshield.common import (
- constants as vcns_const)
-from neutron.plugins.vmware.vshield.common import constants as common_constants
+from neutron.plugins.vmware.vshield.common import constants as vcns_const
from neutron.plugins.vmware.vshield.common import exceptions
from neutron.plugins.vmware.vshield.tasks import constants
from neutron.plugins.vmware.vshield.tasks import tasks
@@ -108,11 +106,11 @@ class EdgeApplianceDriver(object):
def _edge_status_to_level(self, status):
if status == 'GREEN':
- status_level = common_constants.RouterStatus.ROUTER_STATUS_ACTIVE
+ status_level = vcns_const.RouterStatus.ROUTER_STATUS_ACTIVE
elif status in ('GREY', 'YELLOW'):
- status_level = common_constants.RouterStatus.ROUTER_STATUS_DOWN
+ status_level = vcns_const.RouterStatus.ROUTER_STATUS_DOWN
else:
- status_level = common_constants.RouterStatus.ROUTER_STATUS_ERROR
+ status_level = vcns_const.RouterStatus.ROUTER_STATUS_ERROR
return status_level
def _enable_loadbalancer(self, edge):
@@ -131,13 +129,13 @@ class EdgeApplianceDriver(object):
except exceptions.VcnsApiException as e:
LOG.exception(_("VCNS: Failed to get edge status:\n%s"),
e.response)
- status_level = common_constants.RouterStatus.ROUTER_STATUS_ERROR
+ status_level = vcns_const.RouterStatus.ROUTER_STATUS_ERROR
try:
desc = jsonutils.loads(e.response)
if desc.get('errorCode') == (
vcns_const.VCNS_ERROR_CODE_EDGE_NOT_RUNNING):
status_level = (
- common_constants.RouterStatus.ROUTER_STATUS_DOWN)
+ vcns_const.RouterStatus.ROUTER_STATUS_DOWN)
except ValueError:
LOG.exception(e.response)
@@ -156,7 +154,7 @@ class EdgeApplianceDriver(object):
def _update_interface(self, task):
edge_id = task.userdata['edge_id']
config = task.userdata['config']
- LOG.debug(_("VCNS: start updating vnic %s"), config)
+ LOG.debug("VCNS: start updating vnic %s", config)
try:
self.vcns.update_interface(edge_id, config)
except exceptions.VcnsApiException as e:
@@ -175,7 +173,7 @@ class EdgeApplianceDriver(object):
def update_interface(self, router_id, edge_id, index, network,
address=None, netmask=None, secondary=None,
jobdata=None):
- LOG.debug(_("VCNS: update vnic %(index)d: %(addr)s %(netmask)s"), {
+ LOG.debug("VCNS: update vnic %(index)d: %(addr)s %(netmask)s", {
'index': index, 'addr': address, 'netmask': netmask})
if index == vcns_const.EXTERNAL_VNIC_INDEX:
name = vcns_const.EXTERNAL_VNIC_NAME
@@ -205,7 +203,7 @@ class EdgeApplianceDriver(object):
def _deploy_edge(self, task):
userdata = task.userdata
name = userdata['router_name']
- LOG.debug(_("VCNS: start deploying edge %s"), name)
+ LOG.debug("VCNS: start deploying edge %s", name)
request = userdata['request']
try:
header = self.vcns.deploy_edge(request)[0]
@@ -213,7 +211,7 @@ class EdgeApplianceDriver(object):
job_id = objuri[objuri.rfind("/") + 1:]
response = self.vcns.get_edge_id(job_id)[1]
edge_id = response['edgeId']
- LOG.debug(_("VCNS: deploying edge %s"), edge_id)
+ LOG.debug("VCNS: deploying edge %s", edge_id)
userdata['edge_id'] = edge_id
status = constants.TaskStatus.PENDING
except exceptions.VcnsApiException:
@@ -253,7 +251,7 @@ class EdgeApplianceDriver(object):
"Abort.") % edge_id
LOG.exception(msg)
status = constants.TaskStatus.ERROR
- LOG.debug(_("VCNS: Edge %s status"), edge_id)
+ LOG.debug("VCNS: Edge %s status", edge_id)
return status
def _result_edge(self, task):
@@ -267,14 +265,14 @@ class EdgeApplianceDriver(object):
'status': task.status
})
else:
- LOG.debug(_("VCNS: Edge %(edge_id)s deployed for "
- "router %(name)s"), {
- 'edge_id': edge_id, 'name': router_name
- })
+ LOG.debug("VCNS: Edge %(edge_id)s deployed for "
+ "router %(name)s", {
+ 'edge_id': edge_id, 'name': router_name
+ })
def _delete_edge(self, task):
edge_id = task.userdata['edge_id']
- LOG.debug(_("VCNS: start destroying edge %s"), edge_id)
+ LOG.debug("VCNS: start destroying edge %s", edge_id)
status = constants.TaskStatus.COMPLETED
if edge_id:
try:
@@ -383,7 +381,7 @@ class EdgeApplianceDriver(object):
# TODO(fank): use POST for optimization
# return rule_id for future reference
rule = task.userdata['rule']
- LOG.debug(_("VCNS: start creating nat rules: %s"), rule)
+ LOG.debug("VCNS: start creating nat rules: %s", rule)
edge_id = task.userdata['edge_id']
nat = self.get_nat_config(edge_id)
location = task.userdata['location']
@@ -407,7 +405,7 @@ class EdgeApplianceDriver(object):
def create_snat_rule(self, router_id, edge_id, src, translated,
jobdata=None, location=None):
- LOG.debug(_("VCNS: create snat rule %(src)s/%(translated)s"), {
+ LOG.debug("VCNS: create snat rule %(src)s/%(translated)s", {
'src': src, 'translated': translated})
snat_rule = self._assemble_nat_rule("snat", src, translated)
userdata = {
@@ -430,7 +428,7 @@ class EdgeApplianceDriver(object):
edge_id = task.userdata['edge_id']
address = task.userdata['address']
addrtype = task.userdata['addrtype']
- LOG.debug(_("VCNS: start deleting %(type)s rules: %(addr)s"), {
+ LOG.debug("VCNS: start deleting %(type)s rules: %(addr)s", {
'type': addrtype, 'addr': address})
nat = self.get_nat_config(edge_id)
del nat['version']
@@ -448,7 +446,7 @@ class EdgeApplianceDriver(object):
return status
def delete_snat_rule(self, router_id, edge_id, src, jobdata=None):
- LOG.debug(_("VCNS: delete snat rule %s"), src)
+ LOG.debug("VCNS: delete snat rule %s", src)
userdata = {
'edge_id': edge_id,
'address': src,
@@ -466,7 +464,7 @@ class EdgeApplianceDriver(object):
jobdata=None, location=None):
# TODO(fank): use POST for optimization
# return rule_id for future reference
- LOG.debug(_("VCNS: create dnat rule %(dst)s/%(translated)s"), {
+ LOG.debug("VCNS: create dnat rule %(dst)s/%(translated)s", {
'dst': dst, 'translated': translated})
dnat_rule = self._assemble_nat_rule(
"dnat", dst, translated)
@@ -487,7 +485,7 @@ class EdgeApplianceDriver(object):
def delete_dnat_rule(self, router_id, edge_id, translated,
jobdata=None):
# TODO(fank): pass in rule_id for optimization
- LOG.debug(_("VCNS: delete dnat rule %s"), translated)
+ LOG.debug("VCNS: delete dnat rule %s", translated)
userdata = {
'edge_id': edge_id,
'address': translated,
@@ -511,7 +509,7 @@ class EdgeApplianceDriver(object):
return constants.TaskStatus.ABORT
rules = task.userdata['rules']
- LOG.debug(_("VCNS: start updating nat rules: %s"), rules)
+ LOG.debug("VCNS: start updating nat rules: %s", rules)
nat = {
'featureType': 'nat',
@@ -532,10 +530,10 @@ class EdgeApplianceDriver(object):
def update_nat_rules(self, router_id, edge_id, snats, dnats,
jobdata=None):
- LOG.debug(_("VCNS: update nat rule\n"
- "SNAT:%(snat)s\n"
- "DNAT:%(dnat)s\n"), {
- 'snat': snats, 'dnat': dnats})
+ LOG.debug("VCNS: update nat rule\n"
+ "SNAT:%(snat)s\n"
+ "DNAT:%(dnat)s\n", {
+ 'snat': snats, 'dnat': dnats})
nat_rules = []
for dnat in dnats:
@@ -570,7 +568,7 @@ class EdgeApplianceDriver(object):
return constants.TaskStatus.ABORT
gateway = task.userdata['gateway']
routes = task.userdata['routes']
- LOG.debug(_("VCNS: start updating routes for %s"), edge_id)
+ LOG.debug("VCNS: start updating routes for %s", edge_id)
static_routes = []
for route in routes:
static_routes.append({
diff --git a/neutron/plugins/vmware/vshield/tasks/tasks.py b/neutron/plugins/vmware/vshield/tasks/tasks.py
index 7037c430dd..424736f71e 100644
--- a/neutron/plugins/vmware/vshield/tasks/tasks.py
+++ b/neutron/plugins/vmware/vshield/tasks/tasks.py
@@ -191,7 +191,7 @@ class TaskManager():
LOG.exception(msg)
status = constants.TaskStatus.ERROR
- LOG.debug(_("Task %(task)s return %(status)s"), {
+ LOG.debug("Task %(task)s return %(status)s", {
'task': str(task),
'status': status})
@@ -210,7 +210,7 @@ class TaskManager():
'cb': str(task._result_callback)}
LOG.exception(msg)
- LOG.debug(_("Task %(task)s return %(status)s"),
+ LOG.debug("Task %(task)s return %(status)s",
{'task': str(task), 'status': task.status})
task._finished()
diff --git a/neutron/plugins/vmware/vshield/vcns.py b/neutron/plugins/vmware/vshield/vcns.py
index ec3923c3a6..6c2835ea23 100644
--- a/neutron/plugins/vmware/vshield/vcns.py
+++ b/neutron/plugins/vmware/vshield/vcns.py
@@ -49,7 +49,7 @@ class Vcns(object):
password, 'json')
def do_request(self, method, uri, params=None, format='json', **kwargs):
- LOG.debug(_("VcnsApiHelper('%(method)s', '%(uri)s', '%(body)s')"), {
+ LOG.debug("VcnsApiHelper('%(method)s', '%(uri)s', '%(body)s')", {
'method': method,
'uri': uri,
'body': jsonutils.dumps(params)})
@@ -57,8 +57,8 @@ class Vcns(object):
header, content = self.jsonapi_client.request(method, uri, params)
else:
header, content = self.xmlapi_client.request(method, uri, params)
- LOG.debug(_("Header: '%s'"), header)
- LOG.debug(_("Content: '%s'"), content)
+ LOG.debug("Header: '%s'", header)
+ LOG.debug("Content: '%s'", content)
if content == '':
return header, {}
if kwargs.get('decode', True):
diff --git a/neutron/policy.py b/neutron/policy.py
index 562ee03630..4a521617eb 100644
--- a/neutron/policy.py
+++ b/neutron/policy.py
@@ -16,22 +16,26 @@
"""
Policy engine for neutron. Largely copied from nova.
"""
+
+import collections
import itertools
+import logging
import re
from oslo.config import cfg
from neutron.api.v2 import attributes
+from neutron.common import constants as const
from neutron.common import exceptions
import neutron.common.utils as utils
from neutron.openstack.common import excutils
from neutron.openstack.common.gettextutils import _LE, _LI, _LW
from neutron.openstack.common import importutils
-from neutron.openstack.common import log as logging
+from neutron.openstack.common import log
from neutron.openstack.common import policy
-LOG = logging.getLogger(__name__)
+LOG = log.getLogger(__name__)
_POLICY_PATH = None
_POLICY_CACHE = {}
ADMIN_CTX_POLICY = 'context_is_admin'
@@ -118,14 +122,28 @@ def _set_rules(data):
policy.set_rules(policies)
-def _is_attribute_explicitly_set(attribute_name, resource, target):
- """Verify that an attribute is present and has a non-default value."""
+def _is_attribute_explicitly_set(attribute_name, resource, target, action):
+ """Verify that an attribute is present and is explicitly set."""
+ if 'update' in action:
+ # In the case of update, the function should not pay attention to a
+ # default value of an attribute, but check whether it was explicitly
+ # marked as being updated instead.
+ return (attribute_name in target[const.ATTRIBUTES_TO_UPDATE] and
+ target[attribute_name] is not attributes.ATTR_NOT_SPECIFIED)
return ('default' in resource[attribute_name] and
attribute_name in target and
target[attribute_name] is not attributes.ATTR_NOT_SPECIFIED and
target[attribute_name] != resource[attribute_name]['default'])
+def _should_validate_sub_attributes(attribute, sub_attr):
+ """Verify that sub-attributes are iterable and should be validated."""
+ validate = attribute.get('validate')
+ return (validate and isinstance(sub_attr, collections.Iterable) and
+ any([k.startswith('type:dict') and
+ v for (k, v) in validate.iteritems()]))
+
+
def _build_subattr_match_rule(attr_name, attr, action, target):
"""Create the rule to match for sub-attribute policy checks."""
# TODO(salv-orlando): Instead of relying on validator info, introduce
@@ -151,6 +169,16 @@ def _build_subattr_match_rule(attr_name, attr, action, target):
return policy.AndCheck(sub_attr_rules)
+def _process_rules_list(rules, match_rule):
+ """Recursively walk a policy rule to extract a list of match entries."""
+ if isinstance(match_rule, policy.RuleCheck):
+ rules.append(match_rule.match)
+ elif isinstance(match_rule, policy.AndCheck):
+ for rule in match_rule.rules:
+ _process_rules_list(rules, rule)
+ return rules
+
+
def _build_match_rule(action, target):
"""Create the rule to match for a given action.
@@ -173,21 +201,24 @@ def _build_match_rule(action, target):
for attribute_name in res_map[resource]:
if _is_attribute_explicitly_set(attribute_name,
res_map[resource],
- target):
+ target, action):
attribute = res_map[resource][attribute_name]
if 'enforce_policy' in attribute:
attr_rule = policy.RuleCheck('rule', '%s:%s' %
(action, attribute_name))
- # Build match entries for sub-attributes, if present
- validate = attribute.get('validate')
- if (validate and any([k.startswith('type:dict') and v
- for (k, v) in
- validate.iteritems()])):
+ # Build match entries for sub-attributes
+ if _should_validate_sub_attributes(
+ attribute, target[attribute_name]):
attr_rule = policy.AndCheck(
[attr_rule, _build_subattr_match_rule(
attribute_name, attribute,
action, target)])
match_rule = policy.AndCheck([match_rule, attr_rule])
+ # Check that the logger has a DEBUG log level
+ if (cfg.CONF.debug and LOG.logger.level == logging.NOTSET or
+ LOG.logger.level == logging.DEBUG):
+ rules = _process_rules_list([], match_rule)
+ LOG.debug("Enforcing rules: %s", rules)
return match_rule
diff --git a/neutron/scheduler/__init__.py b/neutron/scheduler/__init__.py
index e82932559d..e69de29bb2 100644
--- a/neutron/scheduler/__init__.py
+++ b/neutron/scheduler/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/service.py b/neutron/service.py
index 820364f7c1..eb48687cb3 100644
--- a/neutron/service.py
+++ b/neutron/service.py
@@ -40,7 +40,7 @@ service_opts = [
help=_('Seconds between running periodic tasks')),
cfg.IntOpt('api_workers',
default=0,
- help=_('Number of separate worker processes for service')),
+ help=_('Number of separate API worker processes for service')),
cfg.IntOpt('rpc_workers',
default=0,
help=_('Number of RPC worker processes for service')),
diff --git a/neutron/services/__init__.py b/neutron/services/__init__.py
index b706747cf8..e69de29bb2 100644
--- a/neutron/services/__init__.py
+++ b/neutron/services/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/firewall/__init__.py b/neutron/services/firewall/__init__.py
index a6a8955d8b..e69de29bb2 100644
--- a/neutron/services/firewall/__init__.py
+++ b/neutron/services/firewall/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/firewall/agents/__init__.py b/neutron/services/firewall/agents/__init__.py
index a6a8955d8b..e69de29bb2 100644
--- a/neutron/services/firewall/agents/__init__.py
+++ b/neutron/services/firewall/agents/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/firewall/agents/l3reference/__init__.py b/neutron/services/firewall/agents/l3reference/__init__.py
index a6a8955d8b..e69de29bb2 100644
--- a/neutron/services/firewall/agents/l3reference/__init__.py
+++ b/neutron/services/firewall/agents/l3reference/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/firewall/agents/varmour/__init__.py b/neutron/services/firewall/agents/varmour/__init__.py
index a6a8955d8b..e69de29bb2 100755
--- a/neutron/services/firewall/agents/varmour/__init__.py
+++ b/neutron/services/firewall/agents/varmour/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/firewall/drivers/__init__.py b/neutron/services/firewall/drivers/__init__.py
index a6a8955d8b..e69de29bb2 100644
--- a/neutron/services/firewall/drivers/__init__.py
+++ b/neutron/services/firewall/drivers/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/firewall/drivers/linux/__init__.py b/neutron/services/firewall/drivers/linux/__init__.py
index a6a8955d8b..e69de29bb2 100644
--- a/neutron/services/firewall/drivers/linux/__init__.py
+++ b/neutron/services/firewall/drivers/linux/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/firewall/drivers/varmour/__init__.py b/neutron/services/firewall/drivers/varmour/__init__.py
index a6a8955d8b..e69de29bb2 100755
--- a/neutron/services/firewall/drivers/varmour/__init__.py
+++ b/neutron/services/firewall/drivers/varmour/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/l3_router/__init__.py b/neutron/services/l3_router/__init__.py
index e82932559d..e69de29bb2 100644
--- a/neutron/services/l3_router/__init__.py
+++ b/neutron/services/l3_router/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/l3_router/brocade/l3_router_plugin.py b/neutron/services/l3_router/brocade/l3_router_plugin.py
index 56428c8c2f..1826b83a6a 100644
--- a/neutron/services/l3_router/brocade/l3_router_plugin.py
+++ b/neutron/services/l3_router/brocade/l3_router_plugin.py
@@ -101,15 +101,13 @@ class BrocadeSVIPlugin(router.L3RouterPlugin):
""" delete a vrf on NOS device."""
router = super(BrocadeSVIPlugin, self).get_router(context, router_id)
super(BrocadeSVIPlugin, self).delete_router(context, router_id)
- try:
- switch = self._switch
- self._driver.delete_router(switch['address'],
- switch['username'],
- switch['password'],
- switch['rbridge_id'],
- str(router['id']))
- except Exception:
- excutils.save_and_reraise_exception()
+
+ switch = self._switch
+ self._driver.delete_router(switch['address'],
+ switch['username'],
+ switch['password'],
+ switch['rbridge_id'],
+ str(router['id']))
def add_router_interface(self, context, router_id, interface_info):
"""creates svi on NOS device and assigns ip addres to SVI."""
diff --git a/neutron/services/l3_router/l3_arista.py b/neutron/services/l3_router/l3_arista.py
index 2c6cf9cc70..89fc98b37e 100644
--- a/neutron/services/l3_router/l3_arista.py
+++ b/neutron/services/l3_router/l3_arista.py
@@ -32,8 +32,7 @@ from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging
from neutron.plugins.common import constants
from neutron.plugins.ml2.driver_context import NetworkContext # noqa
-from neutron.plugins.ml2.drivers.arista.arista_l3_driver import AristaL3Driver # noqa
-from neutron.plugins.ml2.drivers.arista.arista_l3_driver import NeutronNets # noqa
+from neutron.plugins.ml2.drivers.arista import arista_l3_driver
LOG = logging.getLogger(__name__)
@@ -54,8 +53,8 @@ class AristaL3ServicePlugin(db_base_plugin_v2.NeutronDbPluginV2,
def __init__(self, driver=None):
- self.driver = driver or AristaL3Driver()
- self.ndb = NeutronNets()
+ self.driver = driver or arista_l3_driver.AristaL3Driver()
+ self.ndb = arista_l3_driver.NeutronNets()
self.setup_rpc()
self.sync_timeout = cfg.CONF.l3_arista.l3_sync_interval
self.sync_lock = threading.Lock()
diff --git a/neutron/services/loadbalancer/__init__.py b/neutron/services/loadbalancer/__init__.py
index a6a8955d8b..e69de29bb2 100644
--- a/neutron/services/loadbalancer/__init__.py
+++ b/neutron/services/loadbalancer/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/loadbalancer/drivers/__init__.py b/neutron/services/loadbalancer/drivers/__init__.py
index 69bb9f6323..e69de29bb2 100644
--- a/neutron/services/loadbalancer/drivers/__init__.py
+++ b/neutron/services/loadbalancer/drivers/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 New Dream Network, LLC (DreamHost)
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/loadbalancer/drivers/haproxy/__init__.py b/neutron/services/loadbalancer/drivers/haproxy/__init__.py
index 69bb9f6323..e69de29bb2 100644
--- a/neutron/services/loadbalancer/drivers/haproxy/__init__.py
+++ b/neutron/services/loadbalancer/drivers/haproxy/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 New Dream Network, LLC (DreamHost)
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/loadbalancer/drivers/radware/__init__.py b/neutron/services/loadbalancer/drivers/radware/__init__.py
index 762b3f3336..e69de29bb2 100644
--- a/neutron/services/loadbalancer/drivers/radware/__init__.py
+++ b/neutron/services/loadbalancer/drivers/radware/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 Radware LLC (Radware)
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/metering/__init__.py b/neutron/services/metering/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/services/metering/__init__.py
+++ b/neutron/services/metering/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/metering/agents/__init__.py b/neutron/services/metering/agents/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/services/metering/agents/__init__.py
+++ b/neutron/services/metering/agents/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/metering/drivers/__init__.py b/neutron/services/metering/drivers/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/services/metering/drivers/__init__.py
+++ b/neutron/services/metering/drivers/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/metering/drivers/iptables/__init__.py b/neutron/services/metering/drivers/iptables/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/services/metering/drivers/iptables/__init__.py
+++ b/neutron/services/metering/drivers/iptables/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/metering/drivers/noop/__init__.py b/neutron/services/metering/drivers/noop/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/services/metering/drivers/noop/__init__.py
+++ b/neutron/services/metering/drivers/noop/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/vpn/__init__.py b/neutron/services/vpn/__init__.py
index f560154933..e69de29bb2 100644
--- a/neutron/services/vpn/__init__.py
+++ b/neutron/services/vpn/__init__.py
@@ -1,14 +0,0 @@
-# (c) Copyright 2013 Hewlett-Packard Development Company, L.P.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/vpn/agent.py b/neutron/services/vpn/agent.py
index 284e02aacd..6f67ccf1f0 100644
--- a/neutron/services/vpn/agent.py
+++ b/neutron/services/vpn/agent.py
@@ -130,15 +130,15 @@ class VPNAgent(l3_agent.L3NATAgentWithStateReport):
for device in self.devices:
device.destroy_router(router_id)
- def _process_routers(self, routers, all_routers=False):
+ def _process_router_if_compatible(self, router):
"""Router sync event.
This method overwrites parent class method.
- :param routers: list of routers
+ :param router: a router
"""
- super(VPNAgent, self)._process_routers(routers, all_routers)
+ super(VPNAgent, self)._process_router_if_compatible(router)
for device in self.devices:
- device.sync(self.context, routers)
+ device.sync(self.context, [router])
def main():
diff --git a/neutron/services/vpn/common/__init__.py b/neutron/services/vpn/common/__init__.py
index 46d9c1bed8..e69de29bb2 100644
--- a/neutron/services/vpn/common/__init__.py
+++ b/neutron/services/vpn/common/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013, Nachi Ueno, NTT I3, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py b/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py
index 04241b743c..8ddefb1f15 100644
--- a/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py
+++ b/neutron/services/vpn/device_drivers/cisco_csr_rest_client.py
@@ -19,6 +19,7 @@ import requests
from requests import exceptions as r_exc
from neutron.openstack.common import jsonutils
+from neutron.openstack.common.gettextutils import _LE, _LW
from neutron.openstack.common import log as logging
@@ -84,7 +85,7 @@ class CsrRestClient(object):
and 'detail' fields).
"""
if method in ('POST', 'GET') and self.status == requests.codes.OK:
- LOG.debug(_('RESPONSE: %s'), response.json())
+ LOG.debug('RESPONSE: %s', response.json())
return response.json()
if method == 'POST' and self.status == requests.codes.CREATED:
return response.headers.get('location', '')
@@ -97,21 +98,21 @@ class CsrRestClient(object):
def _request(self, method, url, **kwargs):
"""Perform REST request and save response info."""
try:
- LOG.debug(_("%(method)s: Request for %(resource)s payload: "
- "%(payload)s"),
+ LOG.debug("%(method)s: Request for %(resource)s payload: "
+ "%(payload)s",
{'method': method.upper(), 'resource': url,
'payload': kwargs.get('data')})
start_time = time.time()
response = self.session.request(method, url, verify=False,
timeout=self.timeout, **kwargs)
- LOG.debug(_("%(method)s Took %(time).2f seconds to process"),
+ LOG.debug("%(method)s Took %(time).2f seconds to process",
{'method': method.upper(),
'time': time.time() - start_time})
except (r_exc.Timeout, r_exc.SSLError) as te:
# Should never see SSLError, unless requests package is old (<2.0)
timeout_val = 0.0 if self.timeout is None else self.timeout
- LOG.warning(_("%(method)s: Request timeout%(ssl)s "
- "(%(timeout).3f sec) for CSR(%(host)s)"),
+ LOG.warning(_LW("%(method)s: Request timeout%(ssl)s "
+ "(%(timeout).3f sec) for CSR(%(host)s)"),
{'method': method,
'timeout': timeout_val,
'ssl': '(SSLError)'
@@ -119,17 +120,18 @@ class CsrRestClient(object):
'host': self.host})
self.status = requests.codes.REQUEST_TIMEOUT
except r_exc.ConnectionError:
- LOG.exception(_("%(method)s: Unable to connect to CSR(%(host)s)"),
+ LOG.exception(_LE("%(method)s: Unable to connect to "
+ "CSR(%(host)s)"),
{'method': method, 'host': self.host})
self.status = requests.codes.NOT_FOUND
except Exception as e:
- LOG.error(_("%(method)s: Unexpected error for CSR (%(host)s): "
- "%(error)s"),
+ LOG.error(_LE("%(method)s: Unexpected error for CSR (%(host)s): "
+ "%(error)s"),
{'method': method, 'host': self.host, 'error': e})
self.status = requests.codes.INTERNAL_SERVER_ERROR
else:
self.status = response.status_code
- LOG.debug(_("%(method)s: Completed [%(status)s]"),
+ LOG.debug("%(method)s: Completed [%(status)s]",
{'method': method, 'status': self.status})
return self._response_info_for(response, method)
@@ -144,16 +146,16 @@ class CsrRestClient(object):
headers = {'Content-Length': '0',
'Accept': 'application/json'}
headers.update(HEADER_CONTENT_TYPE_JSON)
- LOG.debug(_("%(auth)s with CSR %(host)s"),
+ LOG.debug("%(auth)s with CSR %(host)s",
{'auth': 'Authenticating' if self.token is None
else 'Reauthenticating', 'host': self.host})
self.token = None
response = self._request("POST", url, headers=headers, auth=self.auth)
if response:
self.token = response['token-id']
- LOG.debug(_("Successfully authenticated with CSR %s"), self.host)
+ LOG.debug("Successfully authenticated with CSR %s", self.host)
return True
- LOG.error(_("Failed authentication with CSR %(host)s [%(status)s]"),
+ LOG.error(_LE("Failed authentication with CSR %(host)s [%(status)s]"),
{'host': self.host, 'status': self.status})
def _do_request(self, method, resource, payload=None, more_headers=None,
@@ -188,7 +190,7 @@ class CsrRestClient(object):
headers=headers)
if self.status != requests.codes.REQUEST_TIMEOUT:
return response
- LOG.error(_("%(method)s: Request timeout for CSR(%(host)s)"),
+ LOG.error(_LE("%(method)s: Request timeout for CSR(%(host)s)"),
{'method': method, 'host': self.host})
def get_request(self, resource, full_url=False):
diff --git a/neutron/services/vpn/device_drivers/cisco_ipsec.py b/neutron/services/vpn/device_drivers/cisco_ipsec.py
index b024f333aa..0eb3871d18 100644
--- a/neutron/services/vpn/device_drivers/cisco_ipsec.py
+++ b/neutron/services/vpn/device_drivers/cisco_ipsec.py
@@ -23,6 +23,7 @@ import six
from neutron.common import exceptions
from neutron.common import rpc as n_rpc
from neutron import context as ctx
+from neutron.openstack.common.gettextutils import _LE, _LI, _LW
from neutron.openstack.common import lockutils
from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall
@@ -125,7 +126,7 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
def vpnservice_updated(self, context, **kwargs):
"""Handle VPNaaS service driver change notifications."""
- LOG.debug(_("Handling VPN service update notification '%s'"),
+ LOG.debug("Handling VPN service update notification '%s'",
kwargs.get('reason', ''))
self.sync(context, [])
@@ -147,20 +148,20 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
ipsec_conn = vpn_service.conn_state[conn_id]
config_changed = ipsec_conn.check_for_changes(conn_data)
if config_changed:
- LOG.debug(_("Update: Existing connection %s changed"), conn_id)
+ LOG.debug("Update: Existing connection %s changed", conn_id)
ipsec_conn.delete_ipsec_site_connection(context, conn_id)
ipsec_conn.create_ipsec_site_connection(context, conn_data)
ipsec_conn.conn_info = conn_data
if ipsec_conn.forced_down:
if vpn_service.is_admin_up and conn_is_admin_up:
- LOG.debug(_("Update: Connection %s no longer admin down"),
+ LOG.debug("Update: Connection %s no longer admin down",
conn_id)
ipsec_conn.set_admin_state(is_up=True)
ipsec_conn.forced_down = False
else:
if not vpn_service.is_admin_up or not conn_is_admin_up:
- LOG.debug(_("Update: Connection %s forced to admin down"),
+ LOG.debug("Update: Connection %s forced to admin down",
conn_id)
ipsec_conn.set_admin_state(is_up=False)
ipsec_conn.forced_down = True
@@ -168,12 +169,12 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
ipsec_conn = vpn_service.create_connection(conn_data)
ipsec_conn.create_ipsec_site_connection(context, conn_data)
if not vpn_service.is_admin_up or not conn_is_admin_up:
- LOG.debug(_("Update: Created new connection %s in admin down "
- "state"), conn_id)
+ LOG.debug("Update: Created new connection %s in admin down "
+ "state", conn_id)
ipsec_conn.set_admin_state(is_up=False)
ipsec_conn.forced_down = True
else:
- LOG.debug(_("Update: Created new connection %s"), conn_id)
+ LOG.debug("Update: Created new connection %s", conn_id)
ipsec_conn.is_dirty = False
ipsec_conn.last_status = conn_data['status']
@@ -184,11 +185,11 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
"""Handle notification for a single VPN Service and its connections."""
vpn_service_id = service_data['id']
if vpn_service_id in self.service_state:
- LOG.debug(_("Update: Existing VPN service %s detected"),
+ LOG.debug("Update: Existing VPN service %s detected",
vpn_service_id)
vpn_service = self.service_state[vpn_service_id]
else:
- LOG.debug(_("Update: New VPN service %s detected"), vpn_service_id)
+ LOG.debug("Update: New VPN service %s detected", vpn_service_id)
vpn_service = self.create_vpn_service(service_data)
if not vpn_service:
return
@@ -199,7 +200,7 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
vpn_service.is_admin_up = service_data[u'admin_state_up']
for conn_data in service_data['ipsec_conns']:
self.update_connection(context, vpn_service_id, conn_data)
- LOG.debug(_("Update: Completed update processing"))
+ LOG.debug("Update: Completed update processing")
return vpn_service
def update_all_services_and_connections(self, context):
@@ -229,9 +230,9 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
for conn_id in service_state.conn_state:
service_state.conn_state[conn_id].is_dirty = True
connection_count += 1
- LOG.debug(_("Mark: %(service)d VPN services and %(conn)d IPSec "
- "connections marked dirty"), {'service': service_count,
- 'conn': connection_count})
+ LOG.debug("Mark: %(service)d VPN services and %(conn)d IPSec "
+ "connections marked dirty", {'service': service_count,
+ 'conn': connection_count})
def remove_unknown_connections(self, context):
"""Remove connections that are not known by service driver."""
@@ -251,8 +252,8 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
del self.service_state[vpn_service_id]
elif dirty:
self.connections_removed = True
- LOG.debug(_("Sweep: Removed %(service)d dirty VPN service%(splural)s "
- "and %(conn)d dirty IPSec connection%(cplural)s"),
+ LOG.debug("Sweep: Removed %(service)d dirty VPN service%(splural)s "
+ "and %(conn)d dirty IPSec connection%(cplural)s",
{'service': service_count, 'conn': connection_count,
'splural': 's'[service_count == 1:],
'cplural': 's'[connection_count == 1:]})
@@ -266,22 +267,22 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
report info will be created for the connection. The combined report
data is returned.
"""
- LOG.debug(_("Report: Collecting status for IPSec connections on VPN "
- "service %s"), vpn_service.service_id)
+ LOG.debug("Report: Collecting status for IPSec connections on VPN "
+ "service %s", vpn_service.service_id)
tunnels = vpn_service.get_ipsec_connections_status()
report = {}
for connection in vpn_service.conn_state.values():
if connection.forced_down:
- LOG.debug(_("Connection %s forced down"), connection.conn_id)
+ LOG.debug("Connection %s forced down", connection.conn_id)
current_status = constants.DOWN
else:
current_status = connection.find_current_status_in(tunnels)
- LOG.debug(_("Connection %(conn)s reported %(status)s"),
+ LOG.debug("Connection %(conn)s reported %(status)s",
{'conn': connection.conn_id,
'status': current_status})
frag = connection.update_status_and_build_report(current_status)
if frag:
- LOG.debug(_("Report: Adding info for IPSec connection %s"),
+ LOG.debug("Report: Adding info for IPSec connection %s",
connection.conn_id)
report.update(frag)
return report
@@ -301,7 +302,7 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
pending_handled = plugin_utils.in_pending_status(
vpn_service.last_status)
vpn_service.update_last_status()
- LOG.debug(_("Report: Adding info for VPN service %s"),
+ LOG.debug("Report: Adding info for VPN service %s",
vpn_service.service_id)
return {u'id': vpn_service.service_id,
u'status': vpn_service.last_status,
@@ -323,17 +324,17 @@ class CiscoCsrIPsecDriver(device_drivers.DeviceDriver):
def report_status_internal(self, context):
"""Generate report and send to plugin, if anything changed."""
service_report = []
- LOG.debug(_("Report: Starting status report processing"))
+ LOG.debug("Report: Starting status report processing")
for vpn_service_id, vpn_service in self.service_state.items():
- LOG.debug(_("Report: Collecting status for VPN service %s"),
+ LOG.debug("Report: Collecting status for VPN service %s",
vpn_service_id)
report = self.build_report_for_service(vpn_service)
if report:
service_report.append(report)
if service_report:
- LOG.info(_("Sending status report update to plugin"))
+ LOG.info(_LI("Sending status report update to plugin"))
self.agent_rpc.update_status(context, service_report)
- LOG.debug(_("Report: Completed status report processing"))
+ LOG.debug("Report: Completed status report processing")
return service_report
@lockutils.synchronized('vpn-agent', 'neutron-')
@@ -617,8 +618,8 @@ class CiscoCsrIPSecConnection(object):
LOG.debug("%(resource)s %(which)s is configured",
{'resource': resource, 'which': which})
return
- LOG.error(_("Unable to create %(resource)s %(which)s: "
- "%(status)d"),
+ LOG.error(_LE("Unable to create %(resource)s %(which)s: "
+ "%(status)d"),
{'resource': resource, 'which': which,
'status': self.csr.status})
# ToDO(pcm): Set state to error
@@ -630,7 +631,7 @@ class CiscoCsrIPSecConnection(object):
try:
getattr(self.csr, create_action)(info)
except AttributeError:
- LOG.exception(_("Internal error - '%s' is not defined"),
+ LOG.exception(_LE("Internal error - '%s' is not defined"),
create_action)
raise CsrResourceCreateFailure(resource=title,
which=resource_id)
@@ -643,22 +644,22 @@ class CiscoCsrIPSecConnection(object):
LOG.debug("%(resource)s configuration %(which)s was removed",
{'resource': resource, 'which': which})
else:
- LOG.warning(_("Unable to delete %(resource)s %(which)s: "
- "%(status)d"), {'resource': resource,
- 'which': which,
- 'status': status})
+ LOG.warning(_LW("Unable to delete %(resource)s %(which)s: "
+ "%(status)d"), {'resource': resource,
+ 'which': which,
+ 'status': status})
def do_rollback(self):
"""Undo create steps that were completed successfully."""
for step in reversed(self.steps):
delete_action = 'delete_%s' % step.action
- LOG.debug(_("Performing rollback action %(action)s for "
- "resource %(resource)s"), {'action': delete_action,
- 'resource': step.title})
+ LOG.debug("Performing rollback action %(action)s for "
+ "resource %(resource)s", {'action': delete_action,
+ 'resource': step.title})
try:
getattr(self.csr, delete_action)(step.resource_id)
except AttributeError:
- LOG.exception(_("Internal error - '%s' is not defined"),
+ LOG.exception(_LE("Internal error - '%s' is not defined"),
delete_action)
raise CsrResourceCreateFailure(resource=step.title,
which=step.resource_id)
@@ -678,7 +679,7 @@ class CiscoCsrIPSecConnection(object):
ike_policy_id = conn_info['cisco']['ike_policy_id']
ipsec_policy_id = conn_info['cisco']['ipsec_policy_id']
- LOG.debug(_('Creating IPSec connection %s'), conn_id)
+ LOG.debug('Creating IPSec connection %s', conn_id)
# Get all the attributes needed to create
try:
psk_info = self.create_psk_info(psk_id, conn_info)
@@ -711,10 +712,10 @@ class CiscoCsrIPSecConnection(object):
route_id, 'Static Route')
except CsrResourceCreateFailure:
self.do_rollback()
- LOG.info(_("FAILED: Create of IPSec site-to-site connection %s"),
+ LOG.info(_LI("FAILED: Create of IPSec site-to-site connection %s"),
conn_id)
else:
- LOG.info(_("SUCCESS: Created IPSec site-to-site connection %s"),
+ LOG.info(_LI("SUCCESS: Created IPSec site-to-site connection %s"),
conn_id)
def delete_ipsec_site_connection(self, context, conn_id):
@@ -723,13 +724,13 @@ class CiscoCsrIPSecConnection(object):
This will be best effort and will continue, if there are any
failures.
"""
- LOG.debug(_('Deleting IPSec connection %s'), conn_id)
+ LOG.debug('Deleting IPSec connection %s', conn_id)
if not self.steps:
- LOG.warning(_('Unable to find connection %s'), conn_id)
+ LOG.warning(_LW('Unable to find connection %s'), conn_id)
else:
self.do_rollback()
- LOG.info(_("SUCCESS: Deleted IPSec site-to-site connection %s"),
+ LOG.info(_LI("SUCCESS: Deleted IPSec site-to-site connection %s"),
conn_id)
def set_admin_state(self, is_up):
@@ -737,6 +738,7 @@ class CiscoCsrIPSecConnection(object):
self.csr.set_ipsec_connection_state(self.tunnel, admin_up=is_up)
if self.csr.status != requests.codes.NO_CONTENT:
state = "UP" if is_up else "DOWN"
- LOG.error(_("Unable to change %(tunnel)s admin state to "
- "%(state)s"), {'tunnel': self.tunnel, 'state': state})
+ LOG.error(_LE("Unable to change %(tunnel)s admin state to "
+ "%(state)s"), {'tunnel': self.tunnel,
+ 'state': state})
raise CsrAdminStateChangeFailure(tunnel=self.tunnel, state=state)
diff --git a/neutron/services/vpn/device_drivers/ipsec.py b/neutron/services/vpn/device_drivers/ipsec.py
index c19b61ec25..a3375fb0ea 100644
--- a/neutron/services/vpn/device_drivers/ipsec.py
+++ b/neutron/services/vpn/device_drivers/ipsec.py
@@ -28,6 +28,7 @@ from neutron.agent.linux import ip_lib
from neutron.agent.linux import utils
from neutron.common import rpc as n_rpc
from neutron import context
+from neutron.openstack.common.gettextutils import _LE
from neutron.openstack.common import lockutils
from neutron.openstack.common import log as logging
from neutron.openstack.common import loopingcall
@@ -244,7 +245,7 @@ class BaseSwanProcess():
self.start()
except RuntimeError:
LOG.exception(
- _("Failed to enable vpn process on router %s"),
+ _LE("Failed to enable vpn process on router %s"),
self.id)
def disable(self):
@@ -255,7 +256,7 @@ class BaseSwanProcess():
self.remove_config()
except RuntimeError:
LOG.exception(
- _("Failed to disable vpn process on router %s"),
+ _LE("Failed to disable vpn process on router %s"),
self.id)
@abc.abstractmethod
diff --git a/neutron/services/vpn/plugin.py b/neutron/services/vpn/plugin.py
index 9353d6c571..c260386103 100644
--- a/neutron/services/vpn/plugin.py
+++ b/neutron/services/vpn/plugin.py
@@ -15,6 +15,7 @@
# under the License.
from neutron.db.vpn import vpn_db
+from neutron.openstack.common.gettextutils import _LI
from neutron.openstack.common import log as logging
from neutron.plugins.common import constants
from neutron.services import service_base
@@ -41,7 +42,7 @@ class VPNDriverPlugin(VPNPlugin, vpn_db.VPNPluginRpcDbMixin):
# Load the service driver from neutron.conf.
drivers, default_provider = service_base.load_drivers(
constants.VPN, self)
- LOG.info(_("VPN plugin using service driver: %s"), default_provider)
+ LOG.info(_LI("VPN plugin using service driver: %s"), default_provider)
self.ipsec_driver = drivers[default_provider]
def _get_driver_for_vpnservice(self, vpnservice):
diff --git a/neutron/services/vpn/service_drivers/__init__.py b/neutron/services/vpn/service_drivers/__init__.py
index e6f2551a74..8703ebf35e 100644
--- a/neutron/services/vpn/service_drivers/__init__.py
+++ b/neutron/services/vpn/service_drivers/__init__.py
@@ -94,8 +94,8 @@ class BaseIPsecVpnAgentApi(n_rpc.RpcProxy):
admin_state_up=True,
active=True)
for l3_agent in l3_agents:
- LOG.debug(_('Notify agent at %(topic)s.%(host)s the message '
- '%(method)s %(args)s'),
+ LOG.debug('Notify agent at %(topic)s.%(host)s the message '
+ '%(method)s %(args)s',
{'topic': self.topic,
'host': l3_agent.host,
'method': method,
diff --git a/neutron/services/vpn/service_drivers/cisco_cfg_loader.py b/neutron/services/vpn/service_drivers/cisco_cfg_loader.py
index 771007dd41..d866508345 100644
--- a/neutron/services/vpn/service_drivers/cisco_cfg_loader.py
+++ b/neutron/services/vpn/service_drivers/cisco_cfg_loader.py
@@ -32,8 +32,7 @@ from oslo.config import cfg
from neutron.db import l3_db
from neutron.db import models_v2
-from neutron.openstack.common.gettextutils import _LE
-from neutron.openstack.common.gettextutils import _LI
+from neutron.openstack.common.gettextutils import _LE, _LI
from neutron.openstack.common import log as logging
from neutron.services.vpn.device_drivers import (
cisco_csr_rest_client as csr_client)
@@ -103,8 +102,8 @@ def get_available_csrs_from_config(config_files):
try:
netaddr.IPAddress(rest_mgmt_ip)
except netaddr.core.AddrFormatError:
- LOG.error(_("Ignoring Cisco CSR for subnet %s - "
- "REST management is not an IP address"),
+ LOG.error(_LE("Ignoring Cisco CSR for subnet %s - "
+ "REST management is not an IP address"),
for_router)
continue
try:
diff --git a/neutron/services/vpn/service_drivers/cisco_csr_db.py b/neutron/services/vpn/service_drivers/cisco_csr_db.py
index f29bec5fe3..37f9a8490d 100644
--- a/neutron/services/vpn/service_drivers/cisco_csr_db.py
+++ b/neutron/services/vpn/service_drivers/cisco_csr_db.py
@@ -20,6 +20,7 @@ from neutron.common import exceptions
from neutron.db import model_base
from neutron.db import models_v2
from neutron.db.vpn import vpn_db
+from neutron.openstack.common.gettextutils import _LI
from neutron.openstack.common import log as logging
LOG = logging.getLogger(__name__)
@@ -156,10 +157,10 @@ def determine_csr_policy_id(policy_type, conn_policy_field, map_policy_field,
then call lookup_policy() to find the current mapping for that ID.
"""
csr_id = get_next_available_id(session, map_policy_field, policy_type)
- LOG.debug(_("Reserved new CSR ID %(csr_id)d for %(policy)s "
- "ID %(policy_id)s"), {'csr_id': csr_id,
- 'policy': policy_type,
- 'policy_id': policy_id})
+ LOG.debug("Reserved new CSR ID %(csr_id)d for %(policy)s "
+ "ID %(policy_id)s", {'csr_id': csr_id,
+ 'policy': policy_type,
+ 'policy_id': policy_id})
return csr_id
@@ -183,9 +184,9 @@ def get_tunnel_mapping_for(conn_id, session):
try:
entry = session.query(IdentifierMap).filter_by(
ipsec_site_conn_id=conn_id).one()
- LOG.debug(_("Mappings for IPSec connection %(conn)s - "
- "tunnel=%(tunnel)s ike_policy=%(csr_ike)d "
- "ipsec_policy=%(csr_ipsec)d"),
+ LOG.debug("Mappings for IPSec connection %(conn)s - "
+ "tunnel=%(tunnel)s ike_policy=%(csr_ike)d "
+ "ipsec_policy=%(csr_ipsec)d",
{'conn': conn_id, 'tunnel': entry.csr_tunnel_id,
'csr_ike': entry.csr_ike_policy_id,
'csr_ipsec': entry.csr_ipsec_policy_id})
@@ -222,9 +223,9 @@ def create_tunnel_mapping(context, conn_info):
msg = _("Attempt to create duplicate entry in Cisco CSR "
"mapping table for connection %s") % conn_id
raise CsrInternalError(reason=msg)
- LOG.info(_("Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d "
- "using IKE policy ID %(ike_id)d and IPSec policy "
- "ID %(ipsec_id)d"),
+ LOG.info(_LI("Mapped connection %(conn_id)s to Tunnel%(tunnel_id)d "
+ "using IKE policy ID %(ike_id)d and IPSec policy "
+ "ID %(ipsec_id)d"),
{'conn_id': conn_id, 'tunnel_id': csr_tunnel_id,
'ike_id': csr_ike_id, 'ipsec_id': csr_ipsec_id})
@@ -234,4 +235,4 @@ def delete_tunnel_mapping(context, conn_info):
with context.session.begin():
sess_qry = context.session.query(IdentifierMap)
sess_qry.filter_by(ipsec_site_conn_id=conn_id).delete()
- LOG.info(_("Removed mapping for connection %s"), conn_id)
+ LOG.info(_LI("Removed mapping for connection %s"), conn_id)
diff --git a/neutron/services/vpn/service_drivers/cisco_ipsec.py b/neutron/services/vpn/service_drivers/cisco_ipsec.py
index 55b478b9ab..28e3d589fe 100644
--- a/neutron/services/vpn/service_drivers/cisco_ipsec.py
+++ b/neutron/services/vpn/service_drivers/cisco_ipsec.py
@@ -101,8 +101,8 @@ class CiscoCsrIPsecVpnAgentApi(service_drivers.BaseIPsecVpnAgentApi,
# NOTE: This is a config error for workaround. At this point we
# can't set state of resource to error.
return
- LOG.debug(_('Notify agent at %(topic)s.%(host)s the message '
- '%(method)s %(args)s for router %(router)s'),
+ LOG.debug('Notify agent at %(topic)s.%(host)s the message '
+ '%(method)s %(args)s for router %(router)s',
{'topic': self.topic,
'host': host,
'method': method,
diff --git a/neutron/tests/__init__.py b/neutron/tests/__init__.py
index c11422ed49..e69de29bb2 100644
--- a/neutron/tests/__init__.py
+++ b/neutron/tests/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2011 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/base.py b/neutron/tests/base.py
index adda2a0bd8..dae1320de5 100644
--- a/neutron/tests/base.py
+++ b/neutron/tests/base.py
@@ -125,11 +125,25 @@ class BaseTestCase(testtools.TestCase):
'neutron.common.exceptions.NeutronException.use_fatal_exceptions',
fake_use_fatal_exceptions))
+ self.setup_rpc_mocks()
+
+ if sys.version_info < (2, 7) and getattr(self, 'fmt', '') == 'xml':
+ raise self.skipException('XML Testing Skipped in Py26')
+
+ self.setup_config()
+ self.addOnException(self.check_for_systemexit)
+
+ def setup_rpc_mocks(self):
# don't actually start RPC listeners when testing
self.useFixture(fixtures.MonkeyPatch(
'neutron.common.rpc.Connection.consume_in_threads',
fake_consume_in_threads))
+ # immediately return RPC calls
+ self.useFixture(fixtures.MonkeyPatch(
+ 'neutron.common.rpc.RpcProxy._RpcProxy__call_rpc_method',
+ mock.MagicMock()))
+
self.useFixture(fixtures.MonkeyPatch(
'oslo.messaging.Notifier', fake_notifier.FakeNotifier))
@@ -144,12 +158,6 @@ class BaseTestCase(testtools.TestCase):
self.addCleanup(n_rpc.cleanup)
n_rpc.init(CONF)
- if sys.version_info < (2, 7) and getattr(self, 'fmt', '') == 'xml':
- raise self.skipException('XML Testing Skipped in Py26')
-
- self.setup_config()
- self.addOnException(self.check_for_systemexit)
-
def check_for_systemexit(self, exc_info):
if isinstance(exc_info[1], SystemExit):
self.fail("A SystemExit was raised during the test. %s"
diff --git a/neutron/tests/etc/neutron.conf.test b/neutron/tests/etc/neutron.conf.test
index 45fcf29411..c636bd2721 100644
--- a/neutron/tests/etc/neutron.conf.test
+++ b/neutron/tests/etc/neutron.conf.test
@@ -12,7 +12,7 @@ bind_host = 0.0.0.0
bind_port = 9696
# Path to the extensions
-api_extensions_path = unit/extensions
+api_extensions_path = neutron/tests/unit/extensions
# Paste configuration file
api_paste_config = api-paste.ini.test
diff --git a/neutron/tests/functional/__init__.py b/neutron/tests/functional/__init__.py
index e744db95dc..e69de29bb2 100644
--- a/neutron/tests/functional/__init__.py
+++ b/neutron/tests/functional/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/functional/agent/__init__.py b/neutron/tests/functional/agent/__init__.py
index e744db95dc..e69de29bb2 100644
--- a/neutron/tests/functional/agent/__init__.py
+++ b/neutron/tests/functional/agent/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/functional/agent/linux/__init__.py b/neutron/tests/functional/agent/linux/__init__.py
index e744db95dc..e69de29bb2 100644
--- a/neutron/tests/functional/agent/linux/__init__.py
+++ b/neutron/tests/functional/agent/linux/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/functional/agent/linux/test_process_monitor.py b/neutron/tests/functional/agent/linux/test_process_monitor.py
index 8327a38b1e..4d3b69d279 100644
--- a/neutron/tests/functional/agent/linux/test_process_monitor.py
+++ b/neutron/tests/functional/agent/linux/test_process_monitor.py
@@ -29,7 +29,6 @@ class BaseTestProcessMonitor(base.BaseSudoTestCase):
def setUp(self):
super(BaseTestProcessMonitor, self).setUp()
self._exit_handler_called = False
- cfg.CONF.set_override('check_child_processes', True)
cfg.CONF.set_override('check_child_processes_interval', 1)
self._child_processes = []
self._ext_processes = None
diff --git a/neutron/tests/unit/agent/__init__.py b/neutron/tests/unit/agent/__init__.py
index e744db95dc..e69de29bb2 100644
--- a/neutron/tests/unit/agent/__init__.py
+++ b/neutron/tests/unit/agent/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/agent/linux/__init__.py b/neutron/tests/unit/agent/linux/__init__.py
index e744db95dc..e69de29bb2 100644
--- a/neutron/tests/unit/agent/linux/__init__.py
+++ b/neutron/tests/unit/agent/linux/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/agent/linux/test_ovs_lib.py b/neutron/tests/unit/agent/linux/test_ovs_lib.py
index 8d2444acce..5af128cd9b 100644
--- a/neutron/tests/unit/agent/linux/test_ovs_lib.py
+++ b/neutron/tests/unit/agent/linux/test_ovs_lib.py
@@ -822,8 +822,10 @@ class OVS_Lib_Test(base.BaseTestCase):
with testtools.ExpectedException(Exception):
self.br.get_local_port_mac()
- def _test_get_vif_port_by_id(self, iface_id, data, br_name=None):
+ def _test_get_vif_port_by_id(self, iface_id, data, br_name=None,
+ extra_calls_and_values=None):
headings = ['external_ids', 'name', 'ofport']
+
# Each element is a tuple of (expected mock call, return_value)
expected_calls_and_values = [
(mock.call(["ovs-vsctl", self.TO, "--format=json",
@@ -836,9 +838,15 @@ class OVS_Lib_Test(base.BaseTestCase):
if not br_name:
br_name = self.BR_NAME
+ # Only the last information list in 'data' is used, so if more
+ # than one vif is described in data, the rest must be declared
+ # in the argument 'expected_calls_and_values'.
+ if extra_calls_and_values:
+ expected_calls_and_values.extend(extra_calls_and_values)
+
expected_calls_and_values.append(
(mock.call(["ovs-vsctl", self.TO,
- "iface-to-br", data[0][headings.index('name')]],
+ "iface-to-br", data[-1][headings.index('name')]],
root_helper=self.root_helper),
br_name))
tools.setup_mock_calls(self.execute, expected_calls_and_values)
@@ -847,6 +855,15 @@ class OVS_Lib_Test(base.BaseTestCase):
tools.verify_mock_calls(self.execute, expected_calls_and_values)
return vif_port
+ def _assert_vif_port(self, vif_port, ofport=None, mac=None):
+ if not ofport or ofport == -1 or not mac:
+ self.assertIsNone(vif_port)
+ return
+ self.assertEqual('tap99id', vif_port.vif_id)
+ self.assertEqual(mac, vif_port.vif_mac)
+ self.assertEqual('tap99', vif_port.port_name)
+ self.assertEqual(ofport, vif_port.ofport)
+
def _test_get_vif_port_by_id_with_data(self, ofport=None, mac=None):
external_ids = [["iface-id", "tap99id"],
["iface-status", "active"]]
@@ -855,13 +872,7 @@ class OVS_Lib_Test(base.BaseTestCase):
data = [[["map", external_ids], "tap99",
ofport if ofport else '["set",[]]']]
vif_port = self._test_get_vif_port_by_id('tap99id', data)
- if not ofport or ofport == -1 or not mac:
- self.assertIsNone(vif_port)
- return
- self.assertEqual(vif_port.vif_id, 'tap99id')
- self.assertEqual(vif_port.vif_mac, 'aa:bb:cc:dd:ee:ff')
- self.assertEqual(vif_port.port_name, 'tap99')
- self.assertEqual(vif_port.ofport, ofport)
+ self._assert_vif_port(vif_port, ofport, mac)
def test_get_vif_by_port_id_with_ofport(self):
self._test_get_vif_port_by_id_with_data(
@@ -887,6 +898,22 @@ class OVS_Lib_Test(base.BaseTestCase):
self.assertIsNone(self._test_get_vif_port_by_id('tap99id', data,
"br-ext"))
+ def test_get_vif_by_port_id_multiple_vifs(self):
+ external_ids = [["iface-id", "tap99id"],
+ ["iface-status", "active"],
+ ["attached-mac", "de:ad:be:ef:13:37"]]
+ data = [[["map", external_ids], "dummytap", 1],
+ [["map", external_ids], "tap99", 1337]]
+ extra_calls_and_values = [
+ (mock.call(["ovs-vsctl", self.TO,
+ "iface-to-br", "dummytap"],
+ root_helper=self.root_helper),
+ "br-ext")]
+
+ vif_port = self._test_get_vif_port_by_id(
+ 'tap99id', data, extra_calls_and_values=extra_calls_and_values)
+ self._assert_vif_port(vif_port, ofport=1337, mac="de:ad:be:ef:13:37")
+
class TestDeferredOVSBridge(base.BaseTestCase):
diff --git a/neutron/tests/unit/agent/test_l2population_rpc.py b/neutron/tests/unit/agent/test_l2population_rpc.py
index 7b1e053449..563c53b19d 100644
--- a/neutron/tests/unit/agent/test_l2population_rpc.py
+++ b/neutron/tests/unit/agent/test_l2population_rpc.py
@@ -234,3 +234,17 @@ class TestL2populationRpcCallBackTunnelMixin(
upd_fdb_entry_val, self.local_ip,
self.local_vlan_map1)
self.assertFalse(m_setup_entry_for_arp_reply.call_count)
+
+ def test_fdb_chg_ip_tun_empty_before_after(self):
+ upd_fdb_entry_val = {
+ self.lvms[0].net: {
+ self.local_ip: {},
+ },
+ }
+ m_setup_entry_for_arp_reply = mock.Mock()
+ self.fakeagent.setup_entry_for_arp_reply = m_setup_entry_for_arp_reply
+ # passing non-local ip
+ self.fakeagent.fdb_chg_ip_tun('context', self.fakebr,
+ upd_fdb_entry_val, "8.8.8.8",
+ self.local_vlan_map1)
+ self.assertFalse(m_setup_entry_for_arp_reply.call_count)
diff --git a/neutron/tests/unit/bigswitch/__init__.py b/neutron/tests/unit/bigswitch/__init__.py
index b706747cf8..e69de29bb2 100644
--- a/neutron/tests/unit/bigswitch/__init__.py
+++ b/neutron/tests/unit/bigswitch/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/bigswitch/test_restproxy_plugin.py b/neutron/tests/unit/bigswitch/test_restproxy_plugin.py
index 4d1845fce9..87391cf945 100644
--- a/neutron/tests/unit/bigswitch/test_restproxy_plugin.py
+++ b/neutron/tests/unit/bigswitch/test_restproxy_plugin.py
@@ -155,9 +155,10 @@ class TestBigSwitchProxyPortsV2(test_plugin.TestPortsV2,
# stop normal patch
self.httpPatch.stop()
with patch(HTTPCON, new=fake_server.HTTPConnectionMock500):
- self._delete('ports', port['port']['id'],
- expected_code=
- webob.exc.HTTPInternalServerError.code)
+ self._delete(
+ 'ports',
+ port['port']['id'],
+ expected_code=webob.exc.HTTPInternalServerError.code)
self.httpPatch.start()
port = self._get_ports(n['network']['id'])[0]
self.assertEqual('BUILD', port['status'])
diff --git a/neutron/tests/unit/bigswitch/test_servermanager.py b/neutron/tests/unit/bigswitch/test_servermanager.py
index 43723fe8f9..efab0c41ed 100644
--- a/neutron/tests/unit/bigswitch/test_servermanager.py
+++ b/neutron/tests/unit/bigswitch/test_servermanager.py
@@ -465,7 +465,8 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase):
('www.example.org', 443), 90, '127.0.0.1'
)])
self.wrap_mock.assert_has_calls([mock.call(
- self.socket_mock(), None, None, cert_reqs=ssl.CERT_NONE
+ self.socket_mock(), None, None, cert_reqs=ssl.CERT_NONE,
+ ssl_version=ssl.PROTOCOL_TLSv1
)])
self.assertEqual(con.sock, self.wrap_mock())
@@ -480,7 +481,8 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase):
)])
self.wrap_mock.assert_has_calls([mock.call(
self.socket_mock(), None, None, ca_certs='SOMECERTS.pem',
- cert_reqs=ssl.CERT_REQUIRED
+ cert_reqs=ssl.CERT_REQUIRED,
+ ssl_version=ssl.PROTOCOL_TLSv1
)])
self.assertEqual(con.sock, self.wrap_mock())
@@ -500,7 +502,8 @@ class ServerManagerTests(test_rp.BigSwitchProxyPluginV2TestCase):
('www.example.org', 443), 90, '127.0.0.1'
)])
self.wrap_mock.assert_has_calls([mock.call(
- self.socket_mock(), None, None, cert_reqs=ssl.CERT_NONE
+ self.socket_mock(), None, None, cert_reqs=ssl.CERT_NONE,
+ ssl_version=ssl.PROTOCOL_TLSv1
)])
# _tunnel() doesn't take any args
tunnel_mock.assert_has_calls([mock.call()])
diff --git a/neutron/tests/unit/brocade/__init__.py b/neutron/tests/unit/brocade/__init__.py
index b9eda04a0e..e69de29bb2 100644
--- a/neutron/tests/unit/brocade/__init__.py
+++ b/neutron/tests/unit/brocade/__init__.py
@@ -1,15 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-#
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/cisco/__init__.py b/neutron/tests/unit/cisco/__init__.py
index b706747cf8..e69de29bb2 100644
--- a/neutron/tests/unit/cisco/__init__.py
+++ b/neutron/tests/unit/cisco/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py b/neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py
index 48c7b4866e..e9df1a0902 100644
--- a/neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py
+++ b/neutron/tests/unit/cisco/cfg_agent/test_cfg_agent.py
@@ -71,7 +71,7 @@ class TestCiscoCfgAgentWIthStateReporting(base.BaseTestCase):
self.conf = cfg.ConfigOpts()
config.register_agent_state_opts_helper(cfg.CONF)
self.conf.register_opts(base_config.core_opts)
- self.conf.register_opts(cfg_agent.CiscoCfgAgent.OPTS)
+ self.conf.register_opts(cfg_agent.CiscoCfgAgent.OPTS, "cfg_agent")
cfg.CONF.set_override('report_interval', 0, 'AGENT')
super(TestCiscoCfgAgentWIthStateReporting, self).setUp()
self.devmgr_plugin_api_cls_p = mock.patch(
diff --git a/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py b/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py
index f30b60f24b..23c8f6fb5c 100644
--- a/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py
+++ b/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py
@@ -326,7 +326,7 @@ class RouterSchedulingTestCase(L3RouterApplianceTestCaseBase,
self.assertIsNotNone(hosting_device_1)
cfg_dh_rpc.report_non_responding_hosting_devices(
self.adminContext,
- host = None,
+ host=None,
hosting_device_ids=[hosting_device_1['id']])
self.assertEqual(1, mock_notify.call_count)
mock_notify.assert_called_with(
diff --git a/neutron/tests/unit/cisco/n1kv/__init__.py b/neutron/tests/unit/cisco/n1kv/__init__.py
index 73c4997f21..e69de29bb2 100644
--- a/neutron/tests/unit/cisco/n1kv/__init__.py
+++ b/neutron/tests/unit/cisco/n1kv/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 Cisco Systems, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py b/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py
index e412dfc7e6..8b898b6241 100644
--- a/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py
+++ b/neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py
@@ -587,7 +587,7 @@ class TestN1kvNetworkProfiles(N1kvPluginTestCase):
net_p_req = self.new_create_request('network_profiles', data)
net_p_req.environ['neutron.context'] = context.Context('',
self.tenant_id,
- is_admin = True)
+ is_admin=True)
res = net_p_req.get_response(self.ext_api)
self.assertEqual(201, res.status_int)
net_p = self.deserialize(self.fmt, res)
@@ -612,7 +612,7 @@ class TestN1kvNetworkProfiles(N1kvPluginTestCase):
net_p['network_profile']['id'])
update_req.environ['neutron.context'] = context.Context('',
self.tenant_id,
- is_admin = True)
+ is_admin=True)
update_res = update_req.get_response(self.ext_api)
self.assertEqual(200, update_res.status_int)
db_session = db.get_session()
@@ -623,7 +623,7 @@ class TestN1kvNetworkProfiles(N1kvPluginTestCase):
net_p['network_profile']['id'])
self.assertRaises(c_exc.ProfileTenantBindingNotFound,
n1kv_db_v2.get_profile_binding,
- db_session, 'tenant2',
+ db_session, 'tenant4',
net_p['network_profile']['id'])
tenant3 = n1kv_db_v2.get_profile_binding(db_session, 'tenant3',
net_p['network_profile']['id'])
@@ -637,24 +637,39 @@ class TestN1kvNetworkProfiles(N1kvPluginTestCase):
net_p['network_profile']['id'])
update_req.environ['neutron.context'] = context.Context('',
self.tenant_id,
- is_admin = True)
+ is_admin=True)
update_res = update_req.get_response(self.ext_api)
self.assertEqual(200, update_res.status_int)
# current tenant_id should always present
tenant_id = n1kv_db_v2.get_profile_binding(db_session, self.tenant_id,
net_p['network_profile']['id'])
+ self.assertIsNotNone(tenant_id)
self.assertRaises(c_exc.ProfileTenantBindingNotFound,
n1kv_db_v2.get_profile_binding,
db_session, 'tenant1',
net_p['network_profile']['id'])
self.assertRaises(c_exc.ProfileTenantBindingNotFound,
n1kv_db_v2.get_profile_binding,
- db_session, 'tenant2',
+ db_session, 'tenant4',
net_p['network_profile']['id'])
tenant3 = n1kv_db_v2.get_profile_binding(db_session, 'tenant3',
net_p['network_profile']['id'])
- self.assertIsNotNone(tenant_id)
self.assertIsNotNone(tenant3)
+ # Add new tenant4 to network profile and make sure existing tenants
+ # are not deleted.
+ data = {'network_profile': {c_const.ADD_TENANTS:
+ ['tenant4']}}
+ update_req = self.new_update_request('network_profiles',
+ data,
+ net_p['network_profile']['id'])
+ update_req.environ['neutron.context'] = context.Context('',
+ self.tenant_id,
+ is_admin=True)
+ update_res = update_req.get_response(self.ext_api)
+ self.assertEqual(200, update_res.status_int)
+ tenant4 = n1kv_db_v2.get_profile_binding(db_session, 'tenant4',
+ net_p['network_profile']['id'])
+ self.assertIsNotNone(tenant4)
class TestN1kvBasicGet(test_plugin.TestBasicGet,
@@ -793,6 +808,24 @@ class TestN1kvPorts(test_plugin.TestPortsV2,
# for network object clean up to succeed.
client_patch.stop()
+ def test_delete_last_port_vmnetwork_cleanup(self):
+ """Test whether VMNetwork is cleaned up from db on last port delete."""
+ db_session = db.get_session()
+ with self.port() as port:
+ pt = port['port']
+ self.assertIsNotNone(n1kv_db_v2.
+ get_vm_network(db_session,
+ pt['n1kv:profile_id'],
+ pt['network_id']))
+ req = self.new_delete_request('ports', port['port']['id'])
+ req.get_response(self.api)
+ # Verify VMNetwork is cleaned up from the database on port delete.
+ self.assertRaises(c_exc.VMNetworkNotFound,
+ n1kv_db_v2.get_vm_network,
+ db_session,
+ pt['n1kv:profile_id'],
+ pt['network_id'])
+
class TestN1kvPolicyProfiles(N1kvPluginTestCase):
def setUp(self):
diff --git a/neutron/tests/unit/db/__init__.py b/neutron/tests/unit/db/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/tests/unit/db/__init__.py
+++ b/neutron/tests/unit/db/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/db/firewall/__init__.py b/neutron/tests/unit/db/firewall/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/tests/unit/db/firewall/__init__.py
+++ b/neutron/tests/unit/db/firewall/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/db/firewall/test_db_firewall.py b/neutron/tests/unit/db/firewall/test_db_firewall.py
index 0fc3c2c61e..efd9936693 100644
--- a/neutron/tests/unit/db/firewall/test_db_firewall.py
+++ b/neutron/tests/unit/db/firewall/test_db_firewall.py
@@ -335,6 +335,17 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase):
for k, v in attrs.iteritems():
self.assertEqual(fwp['firewall_policy'][k], v)
+ def test_create_admin_firewall_policy_with_other_tenant_rules(self):
+ with self.firewall_rule(shared=False) as fr:
+ fw_rule_ids = [fr['firewall_rule']['id']]
+ res = self._create_firewall_policy(None, 'firewall_policy1',
+ description=DESCRIPTION,
+ shared=SHARED,
+ firewall_rules=fw_rule_ids,
+ audited=AUDITED,
+ tenant_id='admin-tenant')
+ self.assertEqual(webob.exc.HTTPConflict.code, res.status_int)
+
def test_create_firewall_policy_with_previously_associated_rule(self):
with self.firewall_rule() as fwr:
fw_rule_ids = [fwr['firewall_rule']['id']]
@@ -562,6 +573,16 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase):
res = req.get_response(self.ext_api)
self.assertEqual(webob.exc.HTTPConflict.code, res.status_int)
+ def test_update_firewall_policy_assoc_with_other_tenant_firewall(self):
+ with self.firewall_policy(shared=True, tenant_id='tenant1') as fwp:
+ fwp_id = fwp['firewall_policy']['id']
+ with self.firewall(firewall_policy_id=fwp_id):
+ data = {'firewall_policy': {'shared': False}}
+ req = self.new_update_request('firewall_policies', data,
+ fwp['firewall_policy']['id'])
+ res = req.get_response(self.ext_api)
+ self.assertEqual(webob.exc.HTTPConflict.code, res.status_int)
+
def test_delete_firewall_policy(self):
ctx = context.get_admin_context()
with self.firewall_policy(do_delete=False) as fwp:
@@ -603,9 +624,9 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase):
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- ADMIN_STATE_UP):
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=ADMIN_STATE_UP):
req = self.new_delete_request('firewall_policies', fwp_id)
res = req.get_response(self.ext_api)
self.assertEqual(res.status_int, 409)
@@ -834,6 +855,17 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase):
[fwr_id])
self.assertEqual(res['firewall_policy']['audited'], False)
+ def test_update_firewall_rule_associated_with_other_tenant_policy(self):
+ with self.firewall_rule(shared=True, tenant_id='tenant1') as fwr:
+ fwr_id = [fwr['firewall_rule']['id']]
+ with self.firewall_policy(shared=False,
+ firewall_rules=fwr_id):
+ data = {'firewall_rule': {'shared': False}}
+ req = self.new_update_request('firewall_rules', data,
+ fwr['firewall_rule']['id'])
+ res = req.get_response(self.ext_api)
+ self.assertEqual(webob.exc.HTTPConflict.code, res.status_int)
+
def test_delete_firewall_rule(self):
ctx = context.get_admin_context()
with self.firewall_rule(do_delete=False) as fwr:
@@ -864,10 +896,11 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase):
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(name=attrs['name'],
- firewall_policy_id=fwp_id,
- admin_state_up=
- ADMIN_STATE_UP) as firewall:
+ with self.firewall(
+ name=attrs['name'],
+ firewall_policy_id=fwp_id,
+ admin_state_up=ADMIN_STATE_UP
+ ) as firewall:
for k, v in attrs.iteritems():
self.assertEqual(firewall['firewall'][k], v)
@@ -887,10 +920,10 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase):
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(name=name,
- firewall_policy_id=fwp_id,
- admin_state_up=
- ADMIN_STATE_UP) as firewall:
+ with self.firewall(
+ name=name,
+ firewall_policy_id=fwp_id,
+ admin_state_up=ADMIN_STATE_UP) as firewall:
req = self.new_show_request('firewalls',
firewall['firewall']['id'],
fmt=self.fmt)
@@ -921,9 +954,9 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase):
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- ADMIN_STATE_UP) as firewall:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=ADMIN_STATE_UP) as firewall:
data = {'firewall': {'name': name}}
req = self.new_update_request('firewalls', data,
firewall['firewall']['id'])
@@ -1057,6 +1090,18 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase):
expected_code=webob.exc.HTTPBadRequest.code,
expected_body=None)
+ def test_insert_rule_for_policy_of_other_tenant(self):
+ with self.firewall_rule(tenant_id='tenant-2', shared=False) as fwr:
+ fwr_id = fwr['firewall_rule']['id']
+ with self.firewall_policy(name='firewall_policy') as fwp:
+ fwp_id = fwp['firewall_policy']['id']
+ insert_data = {'firewall_rule_id': fwr_id}
+ self._rule_action(
+ 'insert', fwp_id, fwr_id, insert_before=None,
+ insert_after=None,
+ expected_code=webob.exc.HTTPConflict.code,
+ expected_body=None, body_data=insert_data)
+
def test_insert_rule_in_policy(self):
attrs = self._get_test_firewall_policy_attrs()
attrs['audited'] = False
diff --git a/neutron/tests/unit/db/loadbalancer/__init__.py b/neutron/tests/unit/db/loadbalancer/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/tests/unit/db/loadbalancer/__init__.py
+++ b/neutron/tests/unit/db/loadbalancer/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/db/metering/__init__.py b/neutron/tests/unit/db/metering/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/tests/unit/db/metering/__init__.py
+++ b/neutron/tests/unit/db/metering/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/db/test_l3_dvr_db.py b/neutron/tests/unit/db/test_l3_dvr_db.py
index 6ef9b1a5b0..b9b8b3bba4 100644
--- a/neutron/tests/unit/db/test_l3_dvr_db.py
+++ b/neutron/tests/unit/db/test_l3_dvr_db.py
@@ -256,3 +256,52 @@ class L3DvrTestCase(testlib_api.SqlTestCase):
}
mock_fip_clear = self._delete_floatingip_test_setup(floatingip)
self.assertTrue(mock_fip_clear.called)
+
+ def _floatingip_on_port_test_setup(self, hostid):
+ router = {'id': 'foo_router_id', 'distributed': True}
+ floatingip = {
+ 'id': _uuid(),
+ 'port_id': _uuid(),
+ 'router_id': 'foo_router_id'
+ }
+ routers = {
+ 'foo_router_id': router
+ }
+ fipagent = {
+ 'id': _uuid()
+ }
+
+ # NOTE: mock.patch is not needed here since self.mixin is created fresh
+ # for each test. It doesn't work with some methods since the mixin is
+ # tested in isolation (e.g. _get_agent_by_type_and_host).
+ self.mixin.get_vm_port_hostid = mock.Mock(return_value=hostid)
+ self.mixin._get_agent_by_type_and_host = mock.Mock(
+ return_value=fipagent)
+ self.mixin.get_fip_sync_interfaces = mock.Mock(
+ return_value='fip_interface')
+
+ self.mixin._process_floating_ips(self.ctx, routers, [floatingip])
+ return (router, floatingip)
+
+ def test_floatingip_on_port_no_host(self):
+ router, fip = self._floatingip_on_port_test_setup(None)
+
+ self.assertTrue(self.mixin.get_vm_port_hostid.called)
+ self.assertFalse(self.mixin._get_agent_by_type_and_host.called)
+ self.assertFalse(self.mixin.get_fip_sync_interfaces.called)
+
+ self.assertNotIn(l3_const.FLOATINGIP_KEY, router)
+ self.assertNotIn(l3_const.FLOATINGIP_AGENT_INTF_KEY, router)
+
+ def test_floatingip_on_port_with_host(self):
+ router, fip = self._floatingip_on_port_test_setup(_uuid())
+
+ self.assertTrue(self.mixin.get_vm_port_hostid.called)
+ self.assertTrue(self.mixin._get_agent_by_type_and_host.called)
+ self.assertTrue(self.mixin.get_fip_sync_interfaces.called)
+
+ self.assertIn(l3_const.FLOATINGIP_KEY, router)
+ self.assertIn(l3_const.FLOATINGIP_AGENT_INTF_KEY, router)
+ self.assertIn(fip, router[l3_const.FLOATINGIP_KEY])
+ self.assertIn('fip_interface',
+ router[l3_const.FLOATINGIP_AGENT_INTF_KEY])
diff --git a/neutron/tests/unit/db/test_l3_ha_db.py b/neutron/tests/unit/db/test_l3_ha_db.py
index 4616612bbd..807436caa7 100644
--- a/neutron/tests/unit/db/test_l3_ha_db.py
+++ b/neutron/tests/unit/db/test_l3_ha_db.py
@@ -55,12 +55,13 @@ class L3HATestFramework(testlib_api.SqlTestCase,
cfg.CONF.set_override('allow_overlapping_ips', True)
def _create_router(self, ha=True, tenant_id='tenant1', distributed=None):
+ self.admin_ctx.tenant_id = tenant_id
router = {'name': 'router1', 'admin_state_up': True}
if ha is not None:
router['ha'] = ha
if distributed is not None:
router['distributed'] = distributed
- return self.plugin._create_router_db(self.admin_ctx, router, tenant_id)
+ return self.plugin.create_router(self.admin_ctx, {'router': router})
def _update_router(self, router_id, ha=True, distributed=None):
data = {'ha': ha} if ha is not None else {}
@@ -100,7 +101,7 @@ class L3HAGetSyncDataTestCase(L3HATestFramework):
def test_l3_agent_routers_query_interface(self):
router = self._create_router()
- self._bind_router(router.id)
+ self._bind_router(router['id'])
routers = self.plugin.get_ha_sync_data_for_host(self.admin_ctx,
self.agent1['host'])
self.assertEqual(1, len(routers))
@@ -117,13 +118,13 @@ class L3HAGetSyncDataTestCase(L3HATestFramework):
def test_update_state(self):
router = self._create_router()
- self._bind_router(router.id)
+ self._bind_router(router['id'])
routers = self.plugin.get_ha_sync_data_for_host(self.admin_ctx,
self.agent1['host'])
state = routers[0].get(constants.HA_ROUTER_STATE_KEY)
self.assertEqual('standby', state)
- self.plugin.update_router_state(self.admin_ctx, router.id, 'active',
+ self.plugin.update_router_state(self.admin_ctx, router['id'], 'active',
self.agent1['host'])
routers = self.plugin.get_ha_sync_data_for_host(self.admin_ctx,
@@ -163,7 +164,7 @@ class L3HATestCase(L3HATestFramework):
def test_ha_router_create(self):
router = self._create_router()
- self.assertTrue(router.extra_attributes['ha'])
+ self.assertTrue(router['ha'])
def test_ha_router_create_with_distributed(self):
self.assertRaises(l3_ext_ha_mode.DistributedHARouterNotSupported,
@@ -172,37 +173,37 @@ class L3HATestCase(L3HATestFramework):
def test_no_ha_router_create(self):
router = self._create_router(ha=False)
- self.assertFalse(router.extra_attributes['ha'])
+ self.assertFalse(router['ha'])
def test_router_create_with_ha_conf_enabled(self):
cfg.CONF.set_override('l3_ha', True)
router = self._create_router(ha=None)
- self.assertTrue(router.extra_attributes['ha'])
+ self.assertTrue(router['ha'])
def test_migration_from_ha(self):
router = self._create_router()
- self.assertTrue(router.extra_attributes['ha'])
+ self.assertTrue(router['ha'])
- router = self._update_router(router.id, ha=False)
+ router = self._update_router(router['id'], ha=False)
self.assertFalse(router.extra_attributes['ha'])
self.assertIsNone(router.extra_attributes['ha_vr_id'])
def test_migration_to_ha(self):
router = self._create_router(ha=False)
- self.assertFalse(router.extra_attributes['ha'])
+ self.assertFalse(router['ha'])
- router = self._update_router(router.id, ha=True)
+ router = self._update_router(router['id'], ha=True)
self.assertTrue(router.extra_attributes['ha'])
self.assertIsNotNone(router.extra_attributes['ha_vr_id'])
def test_migrate_ha_router_to_distributed(self):
router = self._create_router()
- self.assertTrue(router.extra_attributes['ha'])
+ self.assertTrue(router['ha'])
self.assertRaises(l3_ext_ha_mode.DistributedHARouterNotSupported,
self._update_router,
- router.id,
+ router['id'],
distributed=True)
def test_unique_ha_network_per_tenant(self):
@@ -247,7 +248,7 @@ class L3HATestCase(L3HATestFramework):
def test_update_router_to_ha_notifies_agent(self):
router = self._create_router(ha=False)
self.notif_m.reset_mock()
- self._update_router(router.id, ha=True)
+ self._update_router(router['id'], ha=True)
self.assertTrue(self.notif_m.called)
def test_unique_vr_id_between_routers(self):
@@ -272,18 +273,20 @@ class L3HATestCase(L3HATestFramework):
@mock.patch('neutron.db.l3_hamode_db.MAX_ALLOCATION_TRIES', new=2)
def test_vr_id_allocation_contraint_conflict(self):
router = self._create_router()
- network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id)
+ network = self.plugin.get_ha_network(self.admin_ctx,
+ router['tenant_id'])
with mock.patch.object(self.plugin, '_get_allocated_vr_id',
return_value=set()) as alloc:
self.assertRaises(l3_ext_ha_mode.MaxVRIDAllocationTriesReached,
self.plugin._allocate_vr_id, self.admin_ctx,
- network.network_id, router.id)
+ network.network_id, router['id'])
self.assertEqual(2, len(alloc.mock_calls))
def test_vr_id_allocation_delete_router(self):
router = self._create_router()
- network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id)
+ network = self.plugin.get_ha_network(self.admin_ctx,
+ router['tenant_id'])
allocs_before = self.plugin._get_allocated_vr_id(self.admin_ctx,
network.network_id)
@@ -292,19 +295,20 @@ class L3HATestCase(L3HATestFramework):
network.network_id)
self.assertNotEqual(allocs_before, allocs_current)
- self.plugin.delete_router(self.admin_ctx, router.id)
+ self.plugin.delete_router(self.admin_ctx, router['id'])
allocs_after = self.plugin._get_allocated_vr_id(self.admin_ctx,
network.network_id)
self.assertEqual(allocs_before, allocs_after)
def test_vr_id_allocation_router_migration(self):
router = self._create_router()
- network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id)
+ network = self.plugin.get_ha_network(self.admin_ctx,
+ router['tenant_id'])
allocs_before = self.plugin._get_allocated_vr_id(self.admin_ctx,
network.network_id)
router = self._create_router()
- self._update_router(router.id, ha=False)
+ self._update_router(router['id'], ha=False)
allocs_after = self.plugin._get_allocated_vr_id(self.admin_ctx,
network.network_id)
self.assertEqual(allocs_before, allocs_after)
@@ -321,16 +325,17 @@ class L3HATestCase(L3HATestFramework):
def test_add_ha_port_binding_failure_rolls_back_port(self):
router = self._create_router()
- device_filter = {'device_id': [router.id]}
+ device_filter = {'device_id': [router['id']]}
ports_before = self.core_plugin.get_ports(
self.admin_ctx, filters=device_filter)
- network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id)
+ network = self.plugin.get_ha_network(self.admin_ctx,
+ router['tenant_id'])
with mock.patch.object(self.plugin, '_create_ha_port_binding',
side_effect=ValueError):
self.assertRaises(ValueError, self.plugin.add_ha_port,
- self.admin_ctx, router.id, network.network_id,
- router.tenant_id)
+ self.admin_ctx, router['id'], network.network_id,
+ router['tenant_id'])
ports_after = self.core_plugin.get_ports(
self.admin_ctx, filters=device_filter)
@@ -362,15 +367,17 @@ class L3HATestCase(L3HATestFramework):
def test_create_ha_interfaces_binding_failure_rolls_back_ports(self):
router = self._create_router()
- network = self.plugin.get_ha_network(self.admin_ctx, router.tenant_id)
- device_filter = {'device_id': [router.id]}
+ network = self.plugin.get_ha_network(self.admin_ctx,
+ router['tenant_id'])
+ device_filter = {'device_id': [router['id']]}
ports_before = self.core_plugin.get_ports(
self.admin_ctx, filters=device_filter)
+ router_db = self.plugin._get_router(self.admin_ctx, router['id'])
with mock.patch.object(self.plugin, '_create_ha_port_binding',
side_effect=ValueError):
self.assertRaises(ValueError, self.plugin._create_ha_interfaces,
- self.admin_ctx, router, network)
+ self.admin_ctx, router_db, network)
ports_after = self.core_plugin.get_ports(
self.admin_ctx, filters=device_filter)
diff --git a/neutron/tests/unit/db/test_migration.py b/neutron/tests/unit/db/test_migration.py
new file mode 100644
index 0000000000..3e699df2ec
--- /dev/null
+++ b/neutron/tests/unit/db/test_migration.py
@@ -0,0 +1,343 @@
+# Copyright 2014 OpenStack Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+import collections
+import logging
+import pprint
+
+import alembic
+import alembic.autogenerate
+import alembic.migration
+import mock
+from oslo.config import cfg
+from oslo.db.sqlalchemy import test_base
+from oslo.db.sqlalchemy import test_migrations
+from oslo.db.sqlalchemy import utils
+import pkg_resources as pkg
+import sqlalchemy
+import sqlalchemy.sql.expression as expr
+import testscenarios
+
+from neutron.db.migration import cli as migration
+from neutron.db.migration.models import head as head_models
+from neutron.openstack.common.fixture import config
+
+LOG = logging.getLogger(__name__)
+
+
+cfg.CONF.import_opt('core_plugin', 'neutron.common.config')
+cfg.CONF.import_opt('service_plugins', 'neutron.common.config')
+
+
+def _discover_plugins(plugin_type):
+ return [
+ '%s.%s' % (entrypoint.module_name, entrypoint.attrs[0])
+ for entrypoint in
+ pkg.iter_entry_points(plugin_type)
+ ]
+
+SERVICE_PLUGINS = _discover_plugins("neutron.service_plugins")
+CORE_PLUGINS = _discover_plugins('neutron.core_plugins')
+
+
+class _TestModelsMigrations(test_migrations.ModelsMigrationsSync):
+ '''Test for checking of equality models state and migrations.
+
+ For the opportunistic testing you need to set up a db named
+ 'openstack_citest' with user 'openstack_citest' and password
+ 'openstack_citest' on localhost.
+ The test will then use that db and user/password combo to run the tests.
+
+ For PostgreSQL on Ubuntu this can be done with the following commands::
+
+ sudo -u postgres psql
+ postgres=# create user openstack_citest with createdb login password
+ 'openstack_citest';
+ postgres=# create database openstack_citest with owner
+ openstack_citest;
+
+ For MySQL on Ubuntu this can be done with the following commands::
+
+ mysql -u root
+ >create database openstack_citest;
+ >grant all privileges on openstack_citest.* to
+ openstack_citest@localhost identified by 'openstack_citest';
+
+ Output is a list that contains information about differences between db and
+ models. Output example::
+
+ [('add_table',
+ Table('bat', MetaData(bind=None),
+ Column('info', String(), table=<bat>), schema=None)),
+ ('remove_table',
+ Table(u'bar', MetaData(bind=None),
+ Column(u'data', VARCHAR(), table=<bar>), schema=None)),
+ ('add_column',
+ None,
+ 'foo',
+ Column('data', Integer(), table=<foo>)),
+ ('remove_column',
+ None,
+ 'foo',
+ Column(u'old_data', VARCHAR(), table=None)),
+ [('modify_nullable',
+ None,
+ 'foo',
+ u'x',
+ {'existing_server_default': None,
+ 'existing_type': INTEGER()},
+ True,
+ False)]]
+
+ * ``remove_*`` means that there is extra table/column/constraint in db;
+
+ * ``add_*`` means that it is missing in db;
+
+ * ``modify_*`` means that on column in db is set wrong
+ type/nullable/server_default. Element contains information:
+ * what should be modified,
+ * schema,
+ * table,
+ * column,
+ * existing correct column parameters,
+ * right value,
+ * wrong value.
+
+ '''
+
+ def setUp(self):
+ patch = mock.patch.dict('sys.modules', {
+ 'ryu': mock.MagicMock(),
+ 'ryu.app': mock.MagicMock(),
+ 'heleosapi': mock.MagicMock(),
+ 'midonetclient': mock.MagicMock(),
+ 'midonetclient.neutron': mock.MagicMock(),
+ })
+ patch.start()
+ self.addCleanup(patch.stop)
+ super(_TestModelsMigrations, self).setUp()
+ self.cfg = self.useFixture(config.Config())
+ self.cfg.config(service_plugins=SERVICE_PLUGINS,
+ core_plugin=self.core_plugin)
+ self.alembic_config = migration.get_alembic_config()
+ self.alembic_config.neutron_config = cfg.CONF
+
+ def db_sync(self, engine):
+ cfg.CONF.set_override('connection', engine.url, group='database')
+ migration.do_alembic_command(self.alembic_config, 'upgrade', 'head')
+ cfg.CONF.clear_override('connection', group='database')
+
+ def get_engine(self):
+ return self.engine
+
+ def get_metadata(self):
+ return head_models.get_metadata()
+
+ def include_object(self, object_, name, type_, reflected, compare_to):
+ if type_ == 'table' and name == 'alembic_version':
+ return False
+
+ return super(_TestModelsMigrations, self).include_object(
+ object_, name, type_, reflected, compare_to)
+
+ def compare_server_default(self, ctxt, ins_col, meta_col,
+ insp_def, meta_def, rendered_meta_def):
+ return self._compare_server_default(ctxt.bind, meta_col, insp_def,
+ meta_def)
+
+ # TODO(akamyshnikova):remove _compare_server_default methods when it
+ # appears in oslo.db(version>1.0.0)
+ @utils.DialectFunctionDispatcher.dispatch_for_dialect("*")
+ def _compare_server_default(bind, meta_col, insp_def, meta_def):
+ pass
+
+ @_compare_server_default.dispatch_for('mysql')
+ def _compare_server_default(bind, meta_col, insp_def, meta_def):
+ if isinstance(meta_col.type, sqlalchemy.Boolean):
+ if meta_def is None or insp_def is None:
+ return meta_def != insp_def
+ return not (
+ isinstance(meta_def.arg, expr.True_) and insp_def == "'1'" or
+ isinstance(meta_def.arg, expr.False_) and insp_def == "'0'"
+ )
+
+ if isinstance(meta_col.type, sqlalchemy.Integer):
+ if meta_def is None or insp_def is None:
+ return meta_def != insp_def
+ return meta_def.arg == insp_def
+
+ @_compare_server_default.dispatch_for('postgresql')
+ def _compare_server_default(bind, meta_col, insp_def, meta_def):
+ if isinstance(meta_col.type, sqlalchemy.Enum):
+ if meta_def is None or insp_def is None:
+ return meta_def != insp_def
+ return insp_def != "'%s'::%s" % (meta_def.arg, meta_col.type.name)
+ elif isinstance(meta_col.type, sqlalchemy.String):
+ if meta_def is None or insp_def is None:
+ return meta_def != insp_def
+ return insp_def != "'%s'::character varying" % meta_def.arg
+
+ def test_models_sync(self):
+ # drop all tables after a test run
+ self.addCleanup(self._cleanup)
+
+ # run migration scripts
+ self.db_sync(self.get_engine())
+
+ with self.get_engine().connect() as conn:
+ opts = {
+ 'include_object': self.include_object,
+ 'compare_type': self.compare_type,
+ 'compare_server_default': self.compare_server_default,
+ }
+ mc = alembic.migration.MigrationContext.configure(conn, opts=opts)
+
+ # compare schemas and fail with diff, if it's not empty
+ diff1 = alembic.autogenerate.compare_metadata(mc,
+ self.get_metadata())
+ insp = sqlalchemy.engine.reflection.Inspector.from_engine(
+ self.get_engine())
+ dialect = self.get_engine().dialect.name
+ self.check_mysql_engine(dialect, insp)
+ diff2 = self.compare_foreign_keys(self.get_metadata(),
+ self.get_engine())
+
+ result = filter(self.remove_unrelated_errors, diff1 + diff2)
+ if result:
+ msg = pprint.pformat(result, indent=2, width=20)
+
+ self.fail("Models and migration scripts aren't in sync:\n%s" % msg)
+
+ def check_mysql_engine(self, dialect, insp):
+ if dialect != 'mysql':
+ return
+
+ # Test that table creation on mysql only builds InnoDB tables
+ tables = insp.get_table_names()
+ self.assertTrue(len(tables) > 0,
+ "No tables found. Wrong schema?")
+ noninnodb = [table for table in tables if
+ insp.get_table_options(table)['mysql_engine'] != 'InnoDB'
+ and table != 'alembic_version']
+ self.assertEqual(0, len(noninnodb), "%s non InnoDB tables created" %
+ noninnodb)
+
+ FKInfo = collections.namedtuple('FKInfo', ['constrained_columns',
+ 'referred_table',
+ 'referred_columns'])
+
+ def compare_foreign_keys(self, metadata, bind):
+ """Compare foreign keys between model and db table.
+
+ Returns a list that contains information about:
+ * should be a new key added or removed existing,
+ * name of that key,
+ * source table,
+ * referred table,
+ * constrained columns,
+ * referred columns
+
+ Output::
+
+ [('drop_key',
+ 'testtbl_fk_check_fkey',
+ 'testtbl',
+ fk_info(constrained_columns=(u'fk_check',),
+ referred_table=u'table',
+ referred_columns=(u'fk_check',)))]
+
+ """
+
+ diff = []
+ insp = sqlalchemy.engine.reflection.Inspector.from_engine(bind)
+ # Get all tables from db
+ db_tables = insp.get_table_names()
+ # Get all tables from models
+ model_tables = metadata.tables
+ for table in db_tables:
+ if table not in model_tables:
+ continue
+ # Get all necessary information about key of current table from db
+ fk_db = dict((self._get_fk_info_from_db(i), i['name'])
+ for i in insp.get_foreign_keys(table))
+ fk_db_set = set(fk_db.keys())
+ # Get all necessary information about key of current table from
+ # models
+ fk_models = dict((self._get_fk_info_from_model(fk), fk)
+ for fk in model_tables[table].foreign_keys)
+ fk_models_set = set(fk_models.keys())
+ for key in (fk_db_set - fk_models_set):
+ diff.append(('drop_key', fk_db[key], table, key))
+ LOG.info(("Detected removed foreign key %(fk)r on "
+ "table %(table)r"), {'fk': fk_db[key],
+ 'table': table})
+ for key in (fk_models_set - fk_db_set):
+ diff.append(('add_key', fk_models[key], key))
+ LOG.info((
+ "Detected added foreign key for column %(fk)r on table "
+ "%(table)r"), {'fk': fk_models[key].column.name,
+ 'table': table})
+ return diff
+
+ def _get_fk_info_from_db(self, fk):
+ return self.FKInfo(tuple(fk['constrained_columns']),
+ fk['referred_table'],
+ tuple(fk['referred_columns']))
+
+ def _get_fk_info_from_model(self, fk):
+ return self.FKInfo((fk.parent.name,), fk.column.table.name,
+ (fk.column.name,))
+
+ # Remove some difference that are not mistakes just specific of
+ # dialects, etc
+ def remove_unrelated_errors(self, element):
+ insp = sqlalchemy.engine.reflection.Inspector.from_engine(
+ self.get_engine())
+ dialect = self.get_engine().dialect.name
+ if isinstance(element, tuple):
+ if dialect == 'mysql' and element[0] == 'remove_index':
+ table_name = element[1].table.name
+ for fk in insp.get_foreign_keys(table_name):
+ if fk['name'] == element[1].name:
+ return False
+ cols = [c.name for c in element[1].expressions]
+ for col in cols:
+ if col in insp.get_pk_constraint(
+ table_name)['constrained_columns']:
+ return False
+ else:
+ for modified, _, table, column, _, _, new in element:
+ if modified == 'modify_default' and dialect == 'mysql':
+ constrained = insp.get_pk_constraint(table)
+ if column in constrained['constrained_columns']:
+ return False
+ return True
+
+load_tests = testscenarios.load_tests_apply_scenarios
+
+_scenarios = []
+for plugin in CORE_PLUGINS:
+ plugin_name = plugin.split('.')[-1]
+ class_name = plugin_name
+ _scenarios.append((class_name, {'core_plugin': plugin}))
+
+
+class TestModelsMigrationsMysql(_TestModelsMigrations,
+ test_base.MySQLOpportunisticTestCase):
+ scenarios = _scenarios
+
+
+class TestModelsMigrationsPsql(_TestModelsMigrations,
+ test_base.PostgreSQLOpportunisticTestCase):
+ scenarios = _scenarios
diff --git a/neutron/tests/unit/db/vpn/__init__.py b/neutron/tests/unit/db/vpn/__init__.py
index f560154933..e69de29bb2 100644
--- a/neutron/tests/unit/db/vpn/__init__.py
+++ b/neutron/tests/unit/db/vpn/__init__.py
@@ -1,14 +0,0 @@
-# (c) Copyright 2013 Hewlett-Packard Development Company, L.P.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/db/vpn/test_db_vpnaas.py b/neutron/tests/unit/db/vpn/test_db_vpnaas.py
index 979240ed15..6f641df6d1 100644
--- a/neutron/tests/unit/db/vpn/test_db_vpnaas.py
+++ b/neutron/tests/unit/db/vpn/test_db_vpnaas.py
@@ -434,7 +434,7 @@ class VPNPluginDbTestCase(VPNTestMixin,
service_plugins=service_plugins
)
self._subnet_id = uuidutils.generate_uuid()
- self.core_plugin = TestVpnCorePlugin
+ self.core_plugin = TestVpnCorePlugin()
self.plugin = vpn_plugin.VPNPlugin()
ext_mgr = api_extensions.PluginAwareExtensionManager(
extensions_path,
@@ -867,6 +867,55 @@ class TestVpnaas(VPNPluginDbTestCase):
if k in expected),
expected)
+ def test_delete_router_interface_in_use_by_vpnservice(self):
+ """Test delete router interface in use by vpn service."""
+ with self.subnet(cidr='10.2.0.0/24') as subnet:
+ with self.router() as router:
+ with self.vpnservice(subnet=subnet,
+ router=router):
+ self._router_interface_action('remove',
+ router['router']['id'],
+ subnet['subnet']['id'],
+ None,
+ expected_code=webob.exc.
+ HTTPConflict.code)
+
+ def test_delete_external_gateway_interface_in_use_by_vpnservice(self):
+ """Test delete external gateway interface in use by vpn service."""
+ with self.subnet(cidr='10.2.0.0/24') as subnet:
+ with self.router() as router:
+ with self.subnet(cidr='11.0.0.0/24') as public_sub:
+ self._set_net_external(
+ public_sub['subnet']['network_id'])
+ self._add_external_gateway_to_router(
+ router['router']['id'],
+ public_sub['subnet']['network_id'])
+ with self.vpnservice(subnet=subnet,
+ router=router):
+ self._remove_external_gateway_from_router(
+ router['router']['id'],
+ public_sub['subnet']['network_id'],
+ expected_code=webob.exc.HTTPConflict.code)
+
+ def test_router_update_after_ipsec_site_connection(self):
+ """Test case to update router after vpn connection."""
+ rname1 = "router_one"
+ rname2 = "router_two"
+ with self.subnet(cidr='10.2.0.0/24') as subnet:
+ with self.router(name=rname1) as r:
+ with self.vpnservice(subnet=subnet,
+ router=r
+ ) as vpnservice:
+ self.ipsec_site_connection(
+ name='connection1', vpnservice=vpnservice
+ )
+ body = self._show('routers', r['router']['id'])
+ self.assertEqual(body['router']['name'], rname1)
+ body = self._update('routers', r['router']['id'],
+ {'router': {'name': rname2}})
+ body = self._show('routers', r['router']['id'])
+ self.assertEqual(body['router']['name'], rname2)
+
def test_update_vpnservice(self):
"""Test case to update a vpnservice."""
name = 'new_vpnservice1'
diff --git a/neutron/tests/unit/embrane/__init__.py b/neutron/tests/unit/embrane/__init__.py
index 5627edf2c9..e69de29bb2 100644
--- a/neutron/tests/unit/embrane/__init__.py
+++ b/neutron/tests/unit/embrane/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Embrane, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/extensions/__init__.py b/neutron/tests/unit/extensions/__init__.py
index 153622e504..e69de29bb2 100644
--- a/neutron/tests/unit/extensions/__init__.py
+++ b/neutron/tests/unit/extensions/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2011 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/hyperv/__init__.py b/neutron/tests/unit/hyperv/__init__.py
index 0089853d72..e69de29bb2 100644
--- a/neutron/tests/unit/hyperv/__init__.py
+++ b/neutron/tests/unit/hyperv/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Cloudbase Solutions SRL
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/linuxbridge/__init__.py b/neutron/tests/unit/linuxbridge/__init__.py
index b706747cf8..e69de29bb2 100644
--- a/neutron/tests/unit/linuxbridge/__init__.py
+++ b/neutron/tests/unit/linuxbridge/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/linuxbridge/test_agent_scheduler.py b/neutron/tests/unit/linuxbridge/test_agent_scheduler.py
deleted file mode 100644
index 397baaf5c2..0000000000
--- a/neutron/tests/unit/linuxbridge/test_agent_scheduler.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from neutron.tests.unit.linuxbridge import test_linuxbridge_plugin
-from neutron.tests.unit.openvswitch import test_agent_scheduler
-
-
-class LbAgentSchedulerTestCase(
- test_agent_scheduler.OvsAgentSchedulerTestCase):
- plugin_str = test_linuxbridge_plugin.PLUGIN_NAME
- l3_plugin = None
-
-
-class LbL3AgentNotifierTestCase(
- test_agent_scheduler.OvsL3AgentNotifierTestCase):
- plugin_str = test_linuxbridge_plugin.PLUGIN_NAME
- l3_plugin = None
-
-
-class LbDhcpAgentNotifierTestCase(
- test_agent_scheduler.OvsDhcpAgentNotifierTestCase):
- plugin_str = test_linuxbridge_plugin.PLUGIN_NAME
diff --git a/neutron/tests/unit/linuxbridge/test_lb_db.py b/neutron/tests/unit/linuxbridge/test_lb_db.py
deleted file mode 100644
index f432482103..0000000000
--- a/neutron/tests/unit/linuxbridge/test_lb_db.py
+++ /dev/null
@@ -1,169 +0,0 @@
-# Copyright (c) 2012 OpenStack Foundation.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from oslo.config import cfg
-from six import moves
-import testtools
-from testtools import matchers
-
-from neutron.common import exceptions as n_exc
-from neutron.db import api as db
-from neutron.plugins.linuxbridge.db import l2network_db_v2 as lb_db
-from neutron.tests.unit import test_db_plugin as test_plugin
-from neutron.tests.unit import testlib_api
-
-PHYS_NET = 'physnet1'
-PHYS_NET_2 = 'physnet2'
-VLAN_MIN = 10
-VLAN_MAX = 19
-VLAN_RANGES = {PHYS_NET: [(VLAN_MIN, VLAN_MAX)]}
-UPDATED_VLAN_RANGES = {PHYS_NET: [(VLAN_MIN + 5, VLAN_MAX + 5)],
- PHYS_NET_2: [(VLAN_MIN + 20, VLAN_MAX + 20)]}
-
-PLUGIN_NAME = ('neutron.plugins.linuxbridge.'
- 'lb_neutron_plugin.LinuxBridgePluginV2')
-
-
-class NetworkStatesTest(testlib_api.SqlTestCase):
- def setUp(self):
- super(NetworkStatesTest, self).setUp()
- lb_db.sync_network_states(VLAN_RANGES)
- self.session = db.get_session()
-
- def test_sync_network_states(self):
- self.assertIsNone(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN - 1))
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN + 1).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX - 1).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX).allocated)
- self.assertIsNone(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX + 1))
-
- lb_db.sync_network_states(UPDATED_VLAN_RANGES)
-
- self.assertIsNone(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN + 5 - 1))
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN + 5).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN + 5 + 1).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX + 5 - 1).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX + 5).allocated)
- self.assertIsNone(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX + 5 + 1))
-
- self.assertIsNone(lb_db.get_network_state(PHYS_NET_2,
- VLAN_MIN + 20 - 1))
- self.assertFalse(lb_db.get_network_state(PHYS_NET_2,
- VLAN_MIN + 20).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET_2,
- VLAN_MIN + 20 + 1).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET_2,
- VLAN_MAX + 20 - 1).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET_2,
- VLAN_MAX + 20).allocated)
- self.assertIsNone(lb_db.get_network_state(PHYS_NET_2,
- VLAN_MAX + 20 + 1))
-
- lb_db.sync_network_states(VLAN_RANGES)
-
- self.assertIsNone(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN - 1))
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MIN + 1).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX - 1).allocated)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX).allocated)
- self.assertIsNone(lb_db.get_network_state(PHYS_NET,
- VLAN_MAX + 1))
-
- self.assertIsNone(lb_db.get_network_state(PHYS_NET_2,
- VLAN_MIN + 20))
- self.assertIsNone(lb_db.get_network_state(PHYS_NET_2,
- VLAN_MAX + 20))
-
- def test_network_pool(self):
- vlan_ids = set()
- for x in moves.xrange(VLAN_MIN, VLAN_MAX + 1):
- physical_network, vlan_id = lb_db.reserve_network(self.session)
- self.assertEqual(physical_network, PHYS_NET)
- self.assertThat(vlan_id, matchers.GreaterThan(VLAN_MIN - 1))
- self.assertThat(vlan_id, matchers.LessThan(VLAN_MAX + 1))
- vlan_ids.add(vlan_id)
-
- with testtools.ExpectedException(n_exc.NoNetworkAvailable):
- physical_network, vlan_id = lb_db.reserve_network(self.session)
-
- for vlan_id in vlan_ids:
- lb_db.release_network(self.session, PHYS_NET, vlan_id, VLAN_RANGES)
-
- def test_specific_network_inside_pool(self):
- vlan_id = VLAN_MIN + 5
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- vlan_id).allocated)
- lb_db.reserve_specific_network(self.session, PHYS_NET, vlan_id)
- self.assertTrue(lb_db.get_network_state(PHYS_NET,
- vlan_id).allocated)
-
- with testtools.ExpectedException(n_exc.VlanIdInUse):
- lb_db.reserve_specific_network(self.session, PHYS_NET, vlan_id)
-
- lb_db.release_network(self.session, PHYS_NET, vlan_id, VLAN_RANGES)
- self.assertFalse(lb_db.get_network_state(PHYS_NET,
- vlan_id).allocated)
-
- def test_specific_network_outside_pool(self):
- vlan_id = VLAN_MAX + 5
- self.assertIsNone(lb_db.get_network_state(PHYS_NET, vlan_id))
- lb_db.reserve_specific_network(self.session, PHYS_NET, vlan_id)
- self.assertTrue(lb_db.get_network_state(PHYS_NET,
- vlan_id).allocated)
-
- with testtools.ExpectedException(n_exc.VlanIdInUse):
- lb_db.reserve_specific_network(self.session, PHYS_NET, vlan_id)
-
- lb_db.release_network(self.session, PHYS_NET, vlan_id, VLAN_RANGES)
- self.assertIsNone(lb_db.get_network_state(PHYS_NET, vlan_id))
-
-
-class NetworkBindingsTest(test_plugin.NeutronDbPluginV2TestCase):
- def setUp(self):
- cfg.CONF.set_override('network_vlan_ranges', ['physnet1:1000:2999'],
- group='VLANS')
- super(NetworkBindingsTest, self).setUp(plugin=PLUGIN_NAME)
- self.session = db.get_session()
-
- def test_add_network_binding(self):
- params = {'provider:network_type': 'vlan',
- 'provider:physical_network': PHYS_NET,
- 'provider:segmentation_id': 1234}
- params['arg_list'] = tuple(params.keys())
- with self.network(**params) as network:
- TEST_NETWORK_ID = network['network']['id']
- binding = lb_db.get_network_binding(self.session, TEST_NETWORK_ID)
- self.assertIsNotNone(binding)
- self.assertEqual(binding.network_id, TEST_NETWORK_ID)
- self.assertEqual(binding.physical_network, PHYS_NET)
- self.assertEqual(binding.vlan_id, 1234)
diff --git a/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py b/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py
index adc3822db3..1a2bbc4d2e 100644
--- a/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py
+++ b/neutron/tests/unit/linuxbridge/test_lb_neutron_agent.py
@@ -377,10 +377,10 @@ class TestLinuxBridgeManager(base.BaseTestCase):
def test_get_tap_device_name(self):
if_id = "123456789101112"
self.assertEqual(self.lbm.get_tap_device_name(if_id),
- "tap" + if_id[0:11])
+ constants.TAP_DEVICE_PREFIX + if_id[0:11])
if_id = ""
self.assertEqual(self.lbm.get_tap_device_name(if_id),
- "tap")
+ constants.TAP_DEVICE_PREFIX)
def test_get_vxlan_device_name(self):
vn_id = constants.MAX_VXLAN_VNI
diff --git a/neutron/tests/unit/linuxbridge/test_lb_security_group.py b/neutron/tests/unit/linuxbridge/test_lb_security_group.py
deleted file mode 100644
index e930092dbc..0000000000
--- a/neutron/tests/unit/linuxbridge/test_lb_security_group.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-import mock
-
-from neutron.api.v2 import attributes
-from neutron.extensions import securitygroup as ext_sg
-from neutron.plugins.linuxbridge.db import l2network_db_v2 as lb_db
-from neutron.tests.unit import test_extension_security_group as test_sg
-from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc
-
-
-PLUGIN_NAME = ('neutron.plugins.linuxbridge.'
- 'lb_neutron_plugin.LinuxBridgePluginV2')
-NOTIFIER = ('neutron.plugins.linuxbridge.'
- 'lb_neutron_plugin.AgentNotifierApi')
-
-
-class LinuxBridgeSecurityGroupsTestCase(test_sg.SecurityGroupDBTestCase):
- _plugin_name = PLUGIN_NAME
-
- def setUp(self, plugin=None):
- test_sg_rpc.set_firewall_driver(test_sg_rpc.FIREWALL_IPTABLES_DRIVER)
- notifier_p = mock.patch(NOTIFIER)
- notifier_cls = notifier_p.start()
- self.notifier = mock.Mock()
- notifier_cls.return_value = self.notifier
- self._attribute_map_bk_ = {}
- for item in attributes.RESOURCE_ATTRIBUTE_MAP:
- self._attribute_map_bk_[item] = (attributes.
- RESOURCE_ATTRIBUTE_MAP[item].
- copy())
- super(LinuxBridgeSecurityGroupsTestCase, self).setUp(PLUGIN_NAME)
-
- def tearDown(self):
- attributes.RESOURCE_ATTRIBUTE_MAP = self._attribute_map_bk_
- super(LinuxBridgeSecurityGroupsTestCase, self).tearDown()
-
-
-class TestLinuxBridgeSecurityGroups(LinuxBridgeSecurityGroupsTestCase,
- test_sg.TestSecurityGroups,
- test_sg_rpc.SGNotificationTestMixin):
- pass
-
-
-class TestLinuxBridgeSecurityGroupsXML(TestLinuxBridgeSecurityGroups):
- fmt = 'xml'
-
-
-class TestLinuxBridgeSecurityGroupsDB(LinuxBridgeSecurityGroupsTestCase):
- def test_security_group_get_port_from_device(self):
- with self.network() as n:
- with self.subnet(n):
- with self.security_group() as sg:
- security_group_id = sg['security_group']['id']
- res = self._create_port(self.fmt, n['network']['id'])
- port = self.deserialize(self.fmt, res)
- fixed_ips = port['port']['fixed_ips']
- data = {'port': {'fixed_ips': fixed_ips,
- 'name': port['port']['name'],
- ext_sg.SECURITYGROUPS:
- [security_group_id]}}
-
- req = self.new_update_request('ports', data,
- port['port']['id'])
- res = self.deserialize(self.fmt,
- req.get_response(self.api))
- port_id = res['port']['id']
- device_id = port_id[:8]
- port_dict = lb_db.get_port_from_device(device_id)
- self.assertEqual(port_id, port_dict['id'])
- self.assertEqual([security_group_id],
- port_dict[ext_sg.SECURITYGROUPS])
- self.assertEqual([], port_dict['security_group_rules'])
- self.assertEqual([fixed_ips[0]['ip_address']],
- port_dict['fixed_ips'])
- self._delete('ports', port['port']['id'])
-
- def test_security_group_get_port_from_device_with_no_port(self):
- port_dict = lb_db.get_port_from_device('bad_device_id')
- self.assertIsNone(port_dict)
-
-
-class TestLinuxBridgeSecurityGroupsDBXML(TestLinuxBridgeSecurityGroupsDB):
- fmt = 'xml'
diff --git a/neutron/tests/unit/linuxbridge/test_linuxbridge_plugin.py b/neutron/tests/unit/linuxbridge/test_linuxbridge_plugin.py
deleted file mode 100644
index 0572336af5..0000000000
--- a/neutron/tests/unit/linuxbridge/test_linuxbridge_plugin.py
+++ /dev/null
@@ -1,127 +0,0 @@
-# Copyright (c) 2012 OpenStack Foundation.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import mock
-from oslo.config import cfg
-
-from neutron.common import constants as q_const
-from neutron.extensions import portbindings
-from neutron import manager
-from neutron.plugins.linuxbridge import lb_neutron_plugin
-from neutron.tests.unit import _test_extension_portbindings as test_bindings
-from neutron.tests.unit import test_db_plugin as test_plugin
-from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc
-
-PLUGIN_NAME = ('neutron.plugins.linuxbridge.'
- 'lb_neutron_plugin.LinuxBridgePluginV2')
-
-
-class LinuxBridgePluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase):
- _plugin_name = PLUGIN_NAME
-
- def setUp(self):
- super(LinuxBridgePluginV2TestCase, self).setUp(PLUGIN_NAME)
- self.port_create_status = 'DOWN'
-
-
-class TestLinuxBridgeBasicGet(test_plugin.TestBasicGet,
- LinuxBridgePluginV2TestCase):
- pass
-
-
-class TestLinuxBridgeV2HTTPResponse(test_plugin.TestV2HTTPResponse,
- LinuxBridgePluginV2TestCase):
- pass
-
-
-class TestLinuxBridgeNetworksV2(test_plugin.TestNetworksV2,
- LinuxBridgePluginV2TestCase):
- pass
-
-
-class TestLinuxBridgePortsV2(test_plugin.TestPortsV2,
- LinuxBridgePluginV2TestCase):
-
- def test_update_port_status_build(self):
- with self.port() as port:
- self.assertEqual(port['port']['status'], 'DOWN')
- self.assertEqual(self.port_create_status, 'DOWN')
-
-
-class TestLinuxBridgePortBinding(LinuxBridgePluginV2TestCase,
- test_bindings.PortBindingsTestCase):
- VIF_TYPE = portbindings.VIF_TYPE_BRIDGE
- HAS_PORT_FILTER = True
- ENABLE_SG = True
- FIREWALL_DRIVER = test_sg_rpc.FIREWALL_IPTABLES_DRIVER
-
- def setUp(self):
- test_sg_rpc.set_firewall_driver(self.FIREWALL_DRIVER)
- cfg.CONF.set_override(
- 'enable_security_group', self.ENABLE_SG,
- group='SECURITYGROUP')
- super(TestLinuxBridgePortBinding, self).setUp()
-
-
-class TestLinuxBridgePortBindingNoSG(TestLinuxBridgePortBinding):
- HAS_PORT_FILTER = False
- ENABLE_SG = False
- FIREWALL_DRIVER = test_sg_rpc.FIREWALL_NOOP_DRIVER
-
-
-class TestLinuxBridgePortBindingHost(
- LinuxBridgePluginV2TestCase,
- test_bindings.PortBindingsHostTestCaseMixin):
- pass
-
-
-class TestLinuxBridgePluginRpcCallbacks(test_plugin.NeutronDbPluginV2TestCase):
- def setUp(self):
- super(TestLinuxBridgePluginRpcCallbacks, self).setUp(PLUGIN_NAME)
- self.callbacks = lb_neutron_plugin.LinuxBridgeRpcCallbacks()
-
- def test_update_device_down(self):
- with mock.patch.object(manager.NeutronManager, "get_plugin") as gp:
- plugin = gp.return_value
- plugin.get_port_from_device.return_value = None
- self.assertEqual(
- self.callbacks.update_device_down("fake_context",
- agent_id="123",
- device="device",
- host="host"),
- {'device': 'device', 'exists': False}
- )
- plugin.get_port_from_device.return_value = {
- 'id': 'fakeid',
- 'status': q_const.PORT_STATUS_ACTIVE}
- self.assertEqual(
- self.callbacks.update_device_down("fake_context",
- agent_id="123",
- device="device",
- host="host"),
- {'device': 'device', 'exists': True}
- )
-
- def test_update_device_up(self):
- with mock.patch.object(manager.NeutronManager, "get_plugin") as gp:
- plugin = gp.return_value
- plugin.get_port_from_device.return_value = {
- 'id': 'fakeid',
- 'status': q_const.PORT_STATUS_ACTIVE}
- self.callbacks.update_device_up("fake_context",
- agent_id="123",
- device="device",
- host="host")
- plugin.get_port_from_device.assert_called_once_with('device')
diff --git a/neutron/tests/unit/linuxbridge/test_rpcapi.py b/neutron/tests/unit/linuxbridge/test_rpcapi.py
deleted file mode 100644
index ee2972f67e..0000000000
--- a/neutron/tests/unit/linuxbridge/test_rpcapi.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright 2012, Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-"""
-Unit Tests for linuxbridge rpc
-"""
-
-import fixtures
-from oslo.config import cfg
-
-from neutron.agent import rpc as agent_rpc
-from neutron.common import topics
-from neutron.openstack.common import context
-from neutron.plugins.linuxbridge import lb_neutron_plugin as plb
-from neutron.tests import base
-
-
-class rpcApiTestCase(base.BaseTestCase):
- def _test_lb_api(self, rpcapi, topic, method, rpc_method,
- expected_msg=None, **kwargs):
- ctxt = context.RequestContext('fake_user', 'fake_project')
- expected_retval = 'foo' if method == 'call' else None
- expected_kwargs = {}
- if topic:
- expected_kwargs['topic'] = topic
- if 'version' in kwargs:
- expected_kwargs['version'] = kwargs.pop('version')
- if not expected_msg:
- expected_msg = rpcapi.make_msg(method, **kwargs)
- if rpc_method == 'cast' and method == 'run_instance':
- kwargs['call'] = False
-
- self.fake_args = None
- self.fake_kwargs = None
-
- def _fake_rpc_method(*args, **kwargs):
- self.fake_args = args
- self.fake_kwargs = kwargs
- if expected_retval:
- return expected_retval
-
- self.useFixture(fixtures.MonkeyPatch(
- 'neutron.common.rpc.RpcProxy.' + rpc_method,
- _fake_rpc_method))
-
- retval = getattr(rpcapi, method)(ctxt, **kwargs)
-
- self.assertEqual(expected_retval, retval)
- expected_args = [ctxt, expected_msg]
-
- # skip the first argument which is 'self'
- for arg, expected_arg in zip(self.fake_args[1:], expected_args):
- self.assertEqual(expected_arg, arg)
- self.assertEqual(expected_kwargs, self.fake_kwargs)
-
- def test_delete_network(self):
- rpcapi = plb.AgentNotifierApi(topics.AGENT)
- self._test_lb_api(rpcapi,
- topics.get_topic_name(topics.AGENT,
- topics.NETWORK,
- topics.DELETE),
- 'network_delete', rpc_method='fanout_cast',
- network_id='fake_request_spec')
-
- def test_port_update(self):
- cfg.CONF.set_override('rpc_support_old_agents', False, 'AGENT')
- rpcapi = plb.AgentNotifierApi(topics.AGENT)
- expected_msg = rpcapi.make_msg('port_update',
- port='fake_port',
- network_type='vlan',
- physical_network='fake_net',
- segmentation_id='fake_vlan_id')
- self._test_lb_api(rpcapi,
- topics.get_topic_name(topics.AGENT,
- topics.PORT,
- topics.UPDATE),
- 'port_update', rpc_method='fanout_cast',
- expected_msg=expected_msg,
- port='fake_port',
- physical_network='fake_net',
- vlan_id='fake_vlan_id')
-
- def test_port_update_old_agent(self):
- cfg.CONF.set_override('rpc_support_old_agents', True, 'AGENT')
- rpcapi = plb.AgentNotifierApi(topics.AGENT)
- expected_msg = rpcapi.make_msg('port_update',
- port='fake_port',
- network_type='vlan',
- physical_network='fake_net',
- segmentation_id='fake_vlan_id',
- vlan_id='fake_vlan_id')
- self._test_lb_api(rpcapi,
- topics.get_topic_name(topics.AGENT,
- topics.PORT,
- topics.UPDATE),
- 'port_update', rpc_method='fanout_cast',
- expected_msg=expected_msg,
- port='fake_port',
- physical_network='fake_net',
- vlan_id='fake_vlan_id')
-
- def test_device_details(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_lb_api(rpcapi, None,
- 'get_device_details', rpc_method='call',
- device='fake_device',
- agent_id='fake_agent_id',
- host='fake_host')
-
- def test_devices_details_list(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_lb_api(rpcapi, None,
- 'get_devices_details_list', rpc_method='call',
- devices=['fake_device1', 'fake_device2'],
- agent_id='fake_agent_id', host='fake_host',
- version='1.3')
-
- def test_update_device_down(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_lb_api(rpcapi, None,
- 'update_device_down', rpc_method='call',
- device='fake_device',
- agent_id='fake_agent_id',
- host='fake_host')
-
- def test_update_device_up(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_lb_api(rpcapi, None,
- 'update_device_up', rpc_method='call',
- device='fake_device',
- agent_id='fake_agent_id',
- host='fake_host')
diff --git a/neutron/tests/unit/metaplugin/__init__.py b/neutron/tests/unit/metaplugin/__init__.py
index 65685178bf..e69de29bb2 100644
--- a/neutron/tests/unit/metaplugin/__init__.py
+++ b/neutron/tests/unit/metaplugin/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012, Nachi Ueno, NTT MCL, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/midonet/__init__.py b/neutron/tests/unit/midonet/__init__.py
index e2cc2a75b7..e69de29bb2 100644
--- a/neutron/tests/unit/midonet/__init__.py
+++ b/neutron/tests/unit/midonet/__init__.py
@@ -1,15 +0,0 @@
-# Copyright (C) 2012 Midokura Japan K.K.
-# Copyright (C) 2013 Midokura PTE LTD
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/midonet/test_midonet_lib.py b/neutron/tests/unit/midonet/test_midonet_lib.py
index 9f456a8709..b581493ea5 100644
--- a/neutron/tests/unit/midonet/test_midonet_lib.py
+++ b/neutron/tests/unit/midonet/test_midonet_lib.py
@@ -92,14 +92,18 @@ class MidoClientTestCase(testtools.TestCase):
def test_delete_dhcp(self):
bridge = mock.Mock()
- subnet = mock.Mock()
- subnet.get_subnet_prefix.return_value = "10.0.0.0"
- subnets = mock.MagicMock(return_value=[subnet])
+ subnet1 = mock.Mock()
+ subnet1.get_subnet_prefix.return_value = "10.0.0.0"
+ subnet1.get_subnet_length.return_value = "16"
+ subnet2 = mock.Mock()
+ subnet2.get_subnet_prefix.return_value = "10.0.0.0"
+ subnet2.get_subnet_length.return_value = "24"
+ subnets = mock.MagicMock(return_value=[subnet1, subnet2])
bridge.get_dhcp_subnets.side_effect = subnets
self.client.delete_dhcp(bridge, "10.0.0.0/24")
bridge.assert_has_calls(mock.call.get_dhcp_subnets)
- subnet.assert_has_calls([mock.call.get_subnet_prefix(),
- mock.call.delete()])
+ self.assertFalse(subnet1.delete.called)
+ subnet2.delete.assert_called_once_with()
def test_add_dhcp_host(self):
diff --git a/neutron/tests/unit/ml2/__init__.py b/neutron/tests/unit/ml2/__init__.py
index 788cea1f70..e69de29bb2 100644
--- a/neutron/tests/unit/ml2/__init__.py
+++ b/neutron/tests/unit/ml2/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/ml2/drivers/__init__.py b/neutron/tests/unit/ml2/drivers/__init__.py
index 788cea1f70..e69de29bb2 100644
--- a/neutron/tests/unit/ml2/drivers/__init__.py
+++ b/neutron/tests/unit/ml2/drivers/__init__.py
@@ -1,14 +0,0 @@
-# Copyright (c) 2013 OpenStack Foundation
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py b/neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py
index b2a2989b64..dc3f29a3c9 100644
--- a/neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py
+++ b/neutron/tests/unit/ml2/drivers/arista/test_arista_l3_driver.py
@@ -391,3 +391,66 @@ class AristaL3DriverTestCases_MLAG_v6(base.BaseTestCase):
'ip_version': 6}
self.assertFalse(self.drv.remove_router_interface(None, router))
+
+
+class AristaL3DriverTestCasesMlag_one_switch_failed(base.BaseTestCase):
+ """Test cases to test with non redundant hardare in redundancy mode.
+
+ In the following test cases, the driver is configured in MLAG (redundancy
+ mode) but, one of the switches is mocked to throw exceptoin to mimic
+ failure of the switch. Ensure that the the operation does not fail when
+ one of the switches fails.
+ """
+
+ def setUp(self):
+ super(AristaL3DriverTestCasesMlag_one_switch_failed, self).setUp()
+ setup_arista_config('value', mlag=True)
+ self.drv = arista.AristaL3Driver()
+ self.drv._servers = []
+ self.drv._servers.append(mock.MagicMock())
+ self.drv._servers.append(mock.MagicMock())
+
+ def test_create_router_when_one_switch_fails(self):
+ router = {}
+ router['name'] = 'test-router-1'
+ tenant = '123'
+
+ # Make one of the switches throw an exception - i.e. fail
+ self.drv._servers[0].runCmds = mock.Mock(side_effect=Exception)
+ self.drv.create_router(None, tenant, router)
+
+ def test_delete_router_when_one_switch_fails(self):
+ router = {}
+ router['name'] = 'test-router-1'
+ tenant = '123'
+ router_id = '345'
+
+ # Make one of the switches throw an exception - i.e. fail
+ self.drv._servers[1].runCmds = mock.Mock(side_effect=Exception)
+ self.drv.delete_router(None, tenant, router_id, router)
+
+ def test_add_router_interface_when_one_switch_fails(self):
+ router = {}
+ router['name'] = 'test-router-1'
+ router['tenant_id'] = 'ten-1'
+ router['seg_id'] = '100'
+ router['ip_version'] = 4
+ router['cidr'] = '10.10.10.0/24'
+ router['gip'] = '10.10.10.1'
+
+ # Make one of the switches throw an exception - i.e. fail
+ self.drv._servers[1].runCmds = mock.Mock(side_effect=Exception)
+ self.drv.add_router_interface(None, router)
+
+ def test_remove_router_interface_when_one_switch_fails(self):
+ router = {}
+ router['name'] = 'test-router-1'
+ router['tenant_id'] = 'ten-1'
+ router['seg_id'] = '100'
+ router['ip_version'] = 4
+ router['cidr'] = '10.10.10.0/24'
+ router['gip'] = '10.10.10.1'
+
+ # Make one of the switches throw an exception - i.e. fail
+ self.drv._servers[0].runCmds = mock.Mock(side_effect=Exception)
+ self.drv.remove_router_interface(None, router)
diff --git a/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py b/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py
index 7c41361bf3..e2f50716ce 100644
--- a/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py
+++ b/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_mechanism_driver.py
@@ -68,10 +68,11 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
self.driver.apic_manager.apic.transaction = self.fake_transaction
def test_initialize(self):
- mgr = self.driver.apic_manager
self.driver.initialize()
- mgr.ensure_infra_created_on_apic.assert_called_once()
- mgr.ensure_bgp_pod_policy_created_on_apic.assert_called_once()
+ mgr = self.driver.apic_manager
+ self.assertEqual(1, mgr.ensure_infra_created_on_apic.call_count)
+ self.assertEqual(1,
+ mgr.ensure_bgp_pod_policy_created_on_apic.call_count)
def test_update_port_postcommit(self):
net_ctx = self._get_network_context(mocked.APIC_TENANT,
@@ -99,7 +100,7 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
self.driver.update_port_postcommit(port_ctx)
mgr.get_router_contract.assert_called_once_with(
port_ctx.current['device_id'])
- mgr.ensure_context_enforced.assert_called_once()
+ self.assertEqual(1, mgr.ensure_context_enforced.call_count)
mgr.ensure_external_routed_network_created.assert_called_once_with(
mocked.APIC_NETWORK, transaction='transaction')
mgr.ensure_logical_node_profile_created.assert_called_once_with(
@@ -119,17 +120,6 @@ class TestCiscoApicMechDriver(base.BaseTestCase,
mocked.APIC_NETWORK, mgr.get_router_contract.return_value,
transaction='transaction')
- def test_update_gw_port_postcommit_fail_contract_create(self):
- net_ctx = self._get_network_context(mocked.APIC_TENANT,
- mocked.APIC_NETWORK,
- TEST_SEGMENT1, external=True)
- port_ctx = self._get_port_context(mocked.APIC_TENANT,
- mocked.APIC_NETWORK,
- 'vm1', net_ctx, HOST_ID1, gw=True)
- mgr = self.driver.apic_manager
- self.driver.update_port_postcommit(port_ctx)
- mgr.ensure_external_routed_network_deleted.assert_called_once()
-
def test_create_network_postcommit(self):
ctx = self._get_network_context(mocked.APIC_TENANT,
mocked.APIC_NETWORK,
diff --git a/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py b/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py
index 3780e57de2..b687f47888 100644
--- a/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py
+++ b/neutron/tests/unit/ml2/drivers/cisco/apic/test_cisco_apic_sync.py
@@ -62,10 +62,10 @@ class TestCiscoApicSync(base.BaseTestCase):
sync.core_plugin.get_ports.return_value = [{'id': 'port',
'network_id': 'net'}]
sync.sync_base()
- self.driver.create_network_postcommit.assert_called_once()
- self.driver.create_subnet_postcommit.assert_called_once()
- self.get_locked_port_and_binding.assert_called_once()
- self.driver.create_port_postcommit.assert_called_once()
+ self.assertEqual(1, self.driver.create_network_postcommit.call_count)
+ self.assertEqual(1, self.driver.create_subnet_postcommit.call_count)
+ self.assertEqual(1, self.get_locked_port_and_binding.call_count)
+ self.assertEqual(1, self.driver.create_port_postcommit.call_count)
def test_sync_router(self):
sync = apic_sync.ApicRouterSynchronizer(self.driver)
@@ -74,4 +74,5 @@ class TestCiscoApicSync(base.BaseTestCase):
'network_id': 'net',
'device_id': 'dev'}]
sync.sync_router()
- self.driver.add_router_interface_postcommit.assert_called_once()
+ self.assertEqual(
+ 1, self.driver.add_router_interface_postcommit.call_count)
diff --git a/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py b/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py
index e7d7d45835..2f355f6a37 100644
--- a/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py
+++ b/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py
@@ -354,61 +354,45 @@ class TestCiscoPortsV2(CiscoML2MechanismTestCase,
def test_nexus_enable_vlan_cmd(self):
"""Verify the syntax of the command to enable a vlan on an intf.
- Confirm that for the first VLAN configured on a Nexus interface,
- the command string sent to the switch does not contain the
- keyword 'add'.
-
- Confirm that for the second VLAN configured on a Nexus interface,
- the command string sent to the switch contains the keyword 'add'.
-
- """
- # First vlan should be configured without 'add' keyword
- with self._create_resources():
- self.assertTrue(self._is_vlan_configured(
- vlan_creation_expected=True,
- add_keyword_expected=False))
- self.mock_ncclient.reset_mock()
- self.mock_bound_segment.return_value = BOUND_SEGMENT2
-
- # Second vlan should be configured with 'add' keyword
- with self._create_resources(name=NETWORK_NAME_2,
- device_id=DEVICE_ID_2,
- cidr=CIDR_2):
- self.assertTrue(self._is_vlan_configured(
- vlan_creation_expected=True,
- add_keyword_expected=True))
-
- # Return to first segment for delete port calls.
- self.mock_bound_segment.return_value = BOUND_SEGMENT1
-
- def test_nexus_add_trunk(self):
- """Verify syntax to enable a vlan on an interface.
-
- Test also verifies that the vlan interface is not created.
-
Test of the following ml2_conf_cisco_ini config:
[ml2_mech_cisco_nexus:1.1.1.1]
hostA=1/1
- hostB=1/2
+ hostB=1/2 (second pass only)
where vlan_id = 100
- Confirm that for the first host configured on a Nexus interface,
+ Confirm that for the first VLAN configured on a Nexus interface,
the command string sent to the switch does not contain the
keyword 'add'.
- Confirm that for the second host configured on a Nexus interface,
- the command staring sent to the switch contains does not contain
- the keyword 'name' [signifies vlan intf creation].
+ Confirm that for the second VLAN configured on a Nexus interface,
+ the command string sent to the switch contains the keyword 'add'
+ if it is on the same host. Confirm it does not contain the
+ keyword 'add' when on different hosts.
"""
- with self._create_resources(name='net1', cidr=CIDR_1):
- self.assertTrue(self._is_in_last_nexus_cfg(['allowed', 'vlan']))
- self.assertFalse(self._is_in_last_nexus_cfg(['add']))
- with self._create_resources(name='net2',
- cidr=CIDR_2, host_id=COMP_HOST_NAME_2):
- self.assertTrue(
- self._is_in_last_nexus_cfg(['allowed', 'vlan']))
- self.assertFalse(self._is_in_last_nexus_cfg(['name']))
+ hosts = [COMP_HOST_NAME, COMP_HOST_NAME_2]
+ for host in hosts:
+ # First vlan should be configured without 'add' keyword
+ with self._create_resources():
+ self.assertTrue(self._is_vlan_configured(
+ vlan_creation_expected=True,
+ add_keyword_expected=False))
+ self.mock_ncclient.reset_mock()
+ self.mock_bound_segment.return_value = BOUND_SEGMENT2
+
+ # Second vlan should be configured with 'add' keyword
+ # when on a single host.
+ with self._create_resources(name=NETWORK_NAME_2,
+ device_id=DEVICE_ID_2,
+ cidr=CIDR_2,
+ host_id=host):
+ self.assertTrue(self._is_vlan_configured(
+ vlan_creation_expected=True,
+ add_keyword_expected=(host == COMP_HOST_NAME)
+ ))
+
+ # Return to first segment for delete port calls.
+ self.mock_bound_segment.return_value = BOUND_SEGMENT1
def test_ncclient_version_detect(self):
"""Test ability to handle connection to old and new-style ncclient.
diff --git a/neutron/tests/unit/ml2/drivers/test_l2population.py b/neutron/tests/unit/ml2/drivers/test_l2population.py
index cfe76d3a57..85d8b37a73 100644
--- a/neutron/tests/unit/ml2/drivers/test_l2population.py
+++ b/neutron/tests/unit/ml2/drivers/test_l2population.py
@@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import contextlib
import mock
from neutron.common import constants
@@ -24,6 +25,7 @@ from neutron.extensions import providernet as pnet
from neutron import manager
from neutron.openstack.common import timeutils
from neutron.plugins.ml2 import config as config
+from neutron.plugins.ml2.drivers.l2pop import mech_driver as l2pop_mech_driver
from neutron.plugins.ml2 import managers
from neutron.plugins.ml2 import rpc
from neutron.tests.unit import test_db_plugin as test_plugin
@@ -794,3 +796,17 @@ class TestL2PopulationRpcTestCase(test_plugin.NeutronDbPluginV2TestCase):
self.mock_fanout.assert_called_with(
mock.ANY, expected, topic=self.fanout_topic)
+
+ def test_delete_port_invokes_update_device_down(self):
+ l2pop_mech = l2pop_mech_driver.L2populationMechanismDriver()
+ l2pop_mech.L2PopulationAgentNotify = mock.Mock()
+ l2pop_mech.rpc_ctx = mock.Mock()
+ with contextlib.nested(
+ mock.patch.object(l2pop_mech,
+ '_update_port_down',
+ return_value=None),
+ mock.patch.object(l2pop_mech.L2PopulationAgentNotify,
+ 'remove_fdb_entries')) as (upd_port_down,
+ rem_fdb_entries):
+ l2pop_mech.delete_port_postcommit(mock.Mock())
+ self.assertTrue(upd_port_down.called) \ No newline at end of file
diff --git a/neutron/tests/unit/ml2/test_mechanism_odl.py b/neutron/tests/unit/ml2/test_mechanism_odl.py
index 3679f9f1fd..8d87eb5a61 100644
--- a/neutron/tests/unit/ml2/test_mechanism_odl.py
+++ b/neutron/tests/unit/ml2/test_mechanism_odl.py
@@ -16,6 +16,7 @@
import mock
import requests
+from neutron.openstack.common import jsonutils
from neutron.plugins.common import constants
from neutron.plugins.ml2 import config as config
from neutron.plugins.ml2 import driver_api as api
@@ -121,11 +122,27 @@ class OpenDaylightMechanismTestPortsV2(test_plugin.TestPortsV2,
class AuthMatcher(object):
+
def __eq__(self, obj):
return (obj.username == config.cfg.CONF.ml2_odl.username and
obj.password == config.cfg.CONF.ml2_odl.password)
+class DataMatcher(object):
+
+ def __init__(self, operation, object_type, context):
+ self._data = context.current.copy()
+ self._object_type = object_type
+ filter_map = getattr(mechanism_odl.OpenDaylightMechanismDriver,
+ '%s_object_map' % operation)
+ attr_filter = filter_map["%ss" % object_type]
+ attr_filter(self._data, context)
+
+ def __eq__(self, s):
+ data = jsonutils.loads(s)
+ return self._data == data[self._object_type]
+
+
class OpenDaylightMechanismDriverTestCase(base.BaseTestCase):
def setUp(self):
@@ -139,18 +156,80 @@ class OpenDaylightMechanismDriverTestCase(base.BaseTestCase):
self.mech.initialize()
@staticmethod
- def _get_mock_delete_resource_context():
- current = {'id': '00000000-1111-2222-3333-444444444444'}
+ def _get_mock_network_operation_context():
+ current = {'status': 'ACTIVE',
+ 'subnets': [],
+ 'name': 'net1',
+ 'provider:physical_network': None,
+ 'admin_state_up': True,
+ 'tenant_id': 'test-tenant',
+ 'provider:network_type': 'local',
+ 'router:external': False,
+ 'shared': False,
+ 'id': 'd897e21a-dfd6-4331-a5dd-7524fa421c3e',
+ 'provider:segmentation_id': None}
+ context = mock.Mock(current=current)
+ return context
+
+ @staticmethod
+ def _get_mock_subnet_operation_context():
+ current = {'ipv6_ra_mode': None,
+ 'allocation_pools': [{'start': '10.0.0.2',
+ 'end': '10.0.1.254'}],
+ 'host_routes': [],
+ 'ipv6_address_mode': None,
+ 'cidr': '10.0.0.0/23',
+ 'id': '72c56c48-e9b8-4dcf-b3a7-0813bb3bd839',
+ 'name': '',
+ 'enable_dhcp': True,
+ 'network_id': 'd897e21a-dfd6-4331-a5dd-7524fa421c3e',
+ 'tenant_id': 'test-tenant',
+ 'dns_nameservers': [],
+ 'gateway_ip': '10.0.0.1',
+ 'ip_version': 4,
+ 'shared': False}
context = mock.Mock(current=current)
return context
+ @staticmethod
+ def _get_mock_port_operation_context():
+ current = {'status': 'DOWN',
+ 'binding:host_id': '',
+ 'allowed_address_pairs': [],
+ 'device_owner': 'fake_owner',
+ 'binding:profile': {},
+ 'fixed_ips': [],
+ 'id': '72c56c48-e9b8-4dcf-b3a7-0813bb3bd839',
+ 'security_groups': ['2f9244b4-9bee-4e81-bc4a-3f3c2045b3d7'],
+ 'device_id': 'fake_device',
+ 'name': '',
+ 'admin_state_up': True,
+ 'network_id': 'c13bba05-eb07-45ba-ace2-765706b2d701',
+ 'tenant_id': 'bad_tenant_id',
+ 'binding:vif_details': {},
+ 'binding:vnic_type': 'normal',
+ 'binding:vif_type': 'unbound',
+ 'mac_address': '12:34:56:78:21:b6'}
+ context = mock.Mock(current=current)
+ context._plugin.get_security_group = mock.Mock(return_value={})
+ return context
+
+ @classmethod
+ def _get_mock_operation_context(cls, object_type):
+ getter = getattr(cls, '_get_mock_%s_operation_context' % object_type)
+ return getter()
+
_status_code_msgs = {
+ 200: '',
+ 201: '',
204: '',
+ 400: '400 Client Error: Bad Request',
401: '401 Client Error: Unauthorized',
403: '403 Client Error: Forbidden',
404: '404 Client Error: Not Found',
409: '409 Client Error: Conflict',
- 501: '501 Server Error: Not Implemented'
+ 501: '501 Server Error: Not Implemented',
+ 503: '503 Server Error: Service Unavailable',
}
@classmethod
@@ -161,11 +240,9 @@ class OpenDaylightMechanismDriverTestCase(base.BaseTestCase):
cls._status_code_msgs[status_code])))
return response
- def _test_delete_resource_postcommit(self, object_type, status_code,
- exc_class=None):
+ def _test_single_operation(self, method, context, status_code,
+ exc_class=None, *args, **kwargs):
self.mech.out_of_sync = False
- method = getattr(self.mech, 'delete_%s_postcommit' % object_type)
- context = self._get_mock_delete_resource_context()
request_response = self._get_mock_request_response(status_code)
with mock.patch('requests.request',
return_value=request_response) as mock_method:
@@ -173,12 +250,105 @@ class OpenDaylightMechanismDriverTestCase(base.BaseTestCase):
self.assertRaises(exc_class, method, context)
else:
method(context)
+ mock_method.assert_called_once_with(
+ headers={'Content-Type': 'application/json'}, auth=AuthMatcher(),
+ timeout=config.cfg.CONF.ml2_odl.timeout, *args, **kwargs)
+
+ def _test_create_resource_postcommit(self, object_type, status_code,
+ exc_class=None):
+ method = getattr(self.mech, 'create_%s_postcommit' % object_type)
+ context = self._get_mock_operation_context(object_type)
+ url = '%s/%ss' % (config.cfg.CONF.ml2_odl.url, object_type)
+ kwargs = {'url': url,
+ 'data': DataMatcher('create', object_type, context)}
+ self._test_single_operation(method, context, status_code, exc_class,
+ 'post', **kwargs)
+
+ def _test_update_resource_postcommit(self, object_type, status_code,
+ exc_class=None):
+ method = getattr(self.mech, 'update_%s_postcommit' % object_type)
+ context = self._get_mock_operation_context(object_type)
url = '%s/%ss/%s' % (config.cfg.CONF.ml2_odl.url, object_type,
context.current['id'])
- mock_method.assert_called_once_with(
- 'delete', url=url, headers={'Content-Type': 'application/json'},
- data=None, auth=AuthMatcher(),
- timeout=config.cfg.CONF.ml2_odl.timeout)
+ kwargs = {'url': url,
+ 'data': DataMatcher('update', object_type, context)}
+ self._test_single_operation(method, context, status_code, exc_class,
+ 'put', **kwargs)
+
+ def _test_delete_resource_postcommit(self, object_type, status_code,
+ exc_class=None):
+ method = getattr(self.mech, 'delete_%s_postcommit' % object_type)
+ context = self._get_mock_operation_context(object_type)
+ url = '%s/%ss/%s' % (config.cfg.CONF.ml2_odl.url, object_type,
+ context.current['id'])
+ kwargs = {'url': url, 'data': None}
+ self._test_single_operation(method, context, status_code, exc_class,
+ 'delete', **kwargs)
+
+ def test_create_network_postcommit(self):
+ for status_code in (requests.codes.created,
+ requests.codes.bad_request):
+ self._test_create_resource_postcommit('network', status_code)
+ self._test_create_resource_postcommit(
+ 'network', requests.codes.unauthorized,
+ requests.exceptions.HTTPError)
+
+ def test_create_subnet_postcommit(self):
+ for status_code in (requests.codes.created,
+ requests.codes.bad_request):
+ self._test_create_resource_postcommit('subnet', status_code)
+ for status_code in (requests.codes.unauthorized,
+ requests.codes.forbidden,
+ requests.codes.not_found,
+ requests.codes.conflict,
+ requests.codes.not_implemented):
+ self._test_create_resource_postcommit(
+ 'subnet', status_code, requests.exceptions.HTTPError)
+
+ def test_create_port_postcommit(self):
+ for status_code in (requests.codes.created,
+ requests.codes.bad_request):
+ self._test_create_resource_postcommit('port', status_code)
+ for status_code in (requests.codes.unauthorized,
+ requests.codes.forbidden,
+ requests.codes.not_found,
+ requests.codes.conflict,
+ requests.codes.not_implemented,
+ requests.codes.service_unavailable):
+ self._test_create_resource_postcommit(
+ 'port', status_code, requests.exceptions.HTTPError)
+
+ def test_update_network_postcommit(self):
+ for status_code in (requests.codes.ok,
+ requests.codes.bad_request):
+ self._test_update_resource_postcommit('network', status_code)
+ for status_code in (requests.codes.forbidden,
+ requests.codes.not_found):
+ self._test_update_resource_postcommit(
+ 'network', status_code, requests.exceptions.HTTPError)
+
+ def test_update_subnet_postcommit(self):
+ for status_code in (requests.codes.ok,
+ requests.codes.bad_request):
+ self._test_update_resource_postcommit('subnet', status_code)
+ for status_code in (requests.codes.unauthorized,
+ requests.codes.forbidden,
+ requests.codes.not_found,
+ requests.codes.not_implemented):
+ self._test_update_resource_postcommit(
+ 'subnet', status_code, requests.exceptions.HTTPError)
+
+ def test_update_port_postcommit(self):
+ for status_code in (requests.codes.ok,
+ requests.codes.bad_request):
+ self._test_update_resource_postcommit('port', status_code)
+ for status_code in (requests.codes.unauthorized,
+ requests.codes.forbidden,
+ requests.codes.not_found,
+ requests.codes.conflict,
+ requests.codes.not_implemented):
+ self._test_update_resource_postcommit(
+ 'port', status_code, requests.exceptions.HTTPError)
def test_delete_network_postcommit(self):
self._test_delete_resource_postcommit('network',
diff --git a/neutron/tests/unit/ml2/test_ml2_plugin.py b/neutron/tests/unit/ml2/test_ml2_plugin.py
index e70aa3c4a5..d1729194c7 100644
--- a/neutron/tests/unit/ml2/test_ml2_plugin.py
+++ b/neutron/tests/unit/ml2/test_ml2_plugin.py
@@ -23,6 +23,9 @@ from neutron.common import constants
from neutron.common import exceptions as exc
from neutron.common import utils
from neutron import context
+from neutron.db import db_base_plugin_v2 as base_plugin
+from neutron.extensions import external_net as external_net
+from neutron.extensions import l3agentscheduler
from neutron.extensions import multiprovidernet as mpnet
from neutron.extensions import portbindings
from neutron.extensions import providernet as pnet
@@ -36,6 +39,7 @@ from neutron.plugins.ml2 import driver_context
from neutron.plugins.ml2.drivers import type_vlan
from neutron.plugins.ml2 import models
from neutron.plugins.ml2 import plugin as ml2_plugin
+from neutron.tests import base
from neutron.tests.unit import _test_extension_portbindings as test_bindings
from neutron.tests.unit.ml2.drivers import mechanism_logger as mech_logger
from neutron.tests.unit.ml2.drivers import mechanism_test as mech_test
@@ -145,6 +149,22 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase):
mock.call(_("The port '%s' was deleted"), 'invalid-uuid')
])
+ def test_l3_cleanup_on_net_delete(self):
+ l3plugin = manager.NeutronManager.get_service_plugins().get(
+ service_constants.L3_ROUTER_NAT)
+ kwargs = {'arg_list': (external_net.EXTERNAL,),
+ external_net.EXTERNAL: True}
+ with self.network(**kwargs) as n:
+ with self.subnet(network=n, cidr='200.0.0.0/22'):
+ l3plugin.create_floatingip(
+ context.get_admin_context(),
+ {'floatingip': {'floating_network_id': n['network']['id'],
+ 'tenant_id': n['network']['tenant_id']}}
+ )
+ self._delete('networks', n['network']['id'])
+ flips = l3plugin.get_floatingips(context.get_admin_context())
+ self.assertFalse(flips)
+
def test_delete_port_no_notify_in_disassociate_floatingips(self):
ctx = context.get_admin_context()
plugin = manager.NeutronManager.get_plugin()
@@ -177,6 +197,9 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase):
self.assertTrue(utils.is_dvr_serviced(
constants.DEVICE_OWNER_LOADBALANCER))
+ def test_check_if_dhcp_port_serviced_by_dvr(self):
+ self.assertTrue(utils.is_dvr_serviced(constants.DEVICE_OWNER_DHCP))
+
def test_check_if_port_not_serviced_by_dvr(self):
self.assertFalse(utils.is_dvr_serviced(
constants.DEVICE_OWNER_ROUTER_INTF))
@@ -205,61 +228,73 @@ class TestMl2DvrPortsV2(TestMl2PortsV2):
mock.PropertyMock(return_value=extensions))
self.service_plugins = {'L3_ROUTER_NAT': self.l3plugin}
- def test_delete_last_vm_port(self):
- fip_set = set()
- ns_to_delete = {'host': 'vmhost', 'agent_id': 'vm_l3_agent',
+ def _test_delete_dvr_serviced_port(self, device_owner, floating_ip=False):
+ ns_to_delete = {'host': 'myhost', 'agent_id': 'vm_l3_agent',
'router_id': 'my_router'}
+ fip_set = set()
+ if floating_ip:
+ fip_set.add(ns_to_delete['router_id'])
with contextlib.nested(
mock.patch.object(manager.NeutronManager,
'get_service_plugins',
return_value=self.service_plugins),
- self.port(do_delete=False, device_owner='compute:None'),
+ self.port(do_delete=False,
+ device_owner=device_owner),
mock.patch.object(self.l3plugin, 'notify_routers_updated'),
mock.patch.object(self.l3plugin, 'disassociate_floatingips',
return_value=fip_set),
- mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_vm',
+ mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_port',
return_value=[ns_to_delete]),
mock.patch.object(self.l3plugin, 'remove_router_from_l3_agent')
) as (get_service_plugin, port, notify, disassociate_floatingips,
- ddinv, remove_router_from_l3_agent):
+ dvr_delns_ifno_port, remove_router_from_l3_agent):
port_id = port['port']['id']
self.plugin.delete_port(self.context, port_id)
notify.assert_has_calls([mock.call(self.context, fip_set)])
+ dvr_delns_ifno_port.assert_called_once_with(self.context,
+ port['port']['id'])
remove_router_from_l3_agent.assert_has_calls([
mock.call(self.context, ns_to_delete['agent_id'],
ns_to_delete['router_id'])
])
+ def test_delete_last_vm_port(self):
+ self._test_delete_dvr_serviced_port(device_owner='compute:None')
+
def test_delete_last_vm_port_with_floatingip(self):
- ns_to_delete = {'host': 'vmhost', 'agent_id': 'vm_l3_agent',
+ self._test_delete_dvr_serviced_port(device_owner='compute:None',
+ floating_ip=True)
+
+ def test_delete_vm_port_namespace_already_deleted(self):
+ ns_to_delete = {'host': 'myhost',
+ 'agent_id': 'vm_l3_agent',
'router_id': 'my_router'}
- fip_set = set([ns_to_delete['router_id']])
with contextlib.nested(
mock.patch.object(manager.NeutronManager,
'get_service_plugins',
return_value=self.service_plugins),
- self.port(do_delete=False, device_owner='compute:None'),
- mock.patch.object(self.l3plugin, 'notify_routers_updated'),
- mock.patch.object(self.l3plugin, 'disassociate_floatingips',
- return_value=fip_set),
- mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_vm',
+ self.port(do_delete=False,
+ device_owner='compute:None'),
+ mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_port',
return_value=[ns_to_delete]),
- mock.patch.object(self.l3plugin, 'remove_router_from_l3_agent')
- ) as (get_service_plugins, port, notify, disassociate_floatingips,
- ddinv, remove_router_from_l3_agent):
+ mock.patch.object(self.l3plugin, 'remove_router_from_l3_agent',
+ side_effect=l3agentscheduler.RouterNotHostedByL3Agent(
+ router_id=ns_to_delete['router_id'],
+ agent_id=ns_to_delete['agent_id']))
+ ) as (get_service_plugin, port, dvr_delns_ifno_port,
+ remove_router_from_l3_agent):
- port_id = port['port']['id']
- self.plugin.delete_port(self.context, port_id)
+ self.plugin.delete_port(self.context, port['port']['id'])
+ remove_router_from_l3_agent.assert_called_once_with(self.context,
+ ns_to_delete['agent_id'], ns_to_delete['router_id'])
- notify.assert_has_calls([mock.call(self.context, fip_set)])
- remove_router_from_l3_agent.assert_has_calls([
- mock.call(self.context, ns_to_delete['agent_id'],
- ns_to_delete['router_id'])
- ])
+ def test_delete_lbaas_vip_port(self):
+ self._test_delete_dvr_serviced_port(
+ device_owner=constants.DEVICE_OWNER_LOADBALANCER)
class TestMl2PortBinding(Ml2PluginV2TestCase,
@@ -548,20 +583,24 @@ class TestMultiSegmentNetworks(Ml2PluginV2TestCase):
network_req = self.new_create_request('networks', data)
network = self.deserialize(self.fmt,
network_req.get_response(self.api))
- tz = network['network'][mpnet.SEGMENTS]
- for tz in data['network'][mpnet.SEGMENTS]:
+ segments = network['network'][mpnet.SEGMENTS]
+ for segment_index, segment in enumerate(data['network']
+ [mpnet.SEGMENTS]):
for field in [pnet.NETWORK_TYPE, pnet.PHYSICAL_NETWORK,
pnet.SEGMENTATION_ID]:
- self.assertEqual(tz.get(field), tz.get(field))
+ self.assertEqual(segment.get(field),
+ segments[segment_index][field])
# Tests get_network()
net_req = self.new_show_request('networks', network['network']['id'])
network = self.deserialize(self.fmt, net_req.get_response(self.api))
- tz = network['network'][mpnet.SEGMENTS]
- for tz in data['network'][mpnet.SEGMENTS]:
+ segments = network['network'][mpnet.SEGMENTS]
+ for segment_index, segment in enumerate(data['network']
+ [mpnet.SEGMENTS]):
for field in [pnet.NETWORK_TYPE, pnet.PHYSICAL_NETWORK,
pnet.SEGMENTATION_ID]:
- self.assertEqual(tz.get(field), tz.get(field))
+ self.assertEqual(segment.get(field),
+ segments[segment_index][field])
def test_create_network_with_provider_and_multiprovider_fail(self):
data = {'network': {'name': 'net1',
@@ -951,3 +990,81 @@ class TestFaultyMechansimDriver(Ml2PluginV2FaultyDriverTestCase):
self.assertEqual(new_name, port['port']['name'])
self._delete('ports', port['port']['id'])
+
+
+class TestMl2PluginCreateUpdateDeletePort(base.BaseTestCase):
+ def setUp(self):
+ super(TestMl2PluginCreateUpdateDeletePort, self).setUp()
+ self.context = mock.MagicMock()
+
+ def _ensure_transaction_is_closed(self):
+ transaction = self.context.session.begin(subtransactions=True)
+ enter = transaction.__enter__.call_count
+ exit = transaction.__exit__.call_count
+ self.assertEqual(enter, exit)
+
+ def _create_plugin_for_create_update_port(self, new_host_port):
+ plugin = ml2_plugin.Ml2Plugin()
+ plugin.extension_manager = mock.Mock()
+ plugin.type_manager = mock.Mock()
+ plugin.mechanism_manager = mock.Mock()
+ plugin.notifier = mock.Mock()
+ plugin._get_host_port_if_changed = mock.Mock(
+ return_value=new_host_port)
+
+ plugin._notify_l3_agent_new_port = mock.Mock()
+ plugin._notify_l3_agent_new_port.side_effect = (
+ lambda c, p: self._ensure_transaction_is_closed())
+
+ return plugin
+
+ def test_create_port_rpc_outside_transaction(self):
+ with contextlib.nested(
+ mock.patch.object(ml2_plugin.Ml2Plugin, '__init__'),
+ mock.patch.object(base_plugin.NeutronDbPluginV2, 'create_port'),
+ ) as (init, super_create_port):
+ init.return_value = None
+
+ new_host_port = mock.Mock()
+ plugin = self._create_plugin_for_create_update_port(new_host_port)
+
+ plugin.create_port(self.context, mock.MagicMock())
+
+ plugin._notify_l3_agent_new_port.assert_called_once_with(
+ self.context, new_host_port)
+
+ def test_update_port_rpc_outside_transaction(self):
+ with contextlib.nested(
+ mock.patch.object(ml2_plugin.Ml2Plugin, '__init__'),
+ mock.patch.object(base_plugin.NeutronDbPluginV2, 'update_port'),
+ ) as (init, super_update_port):
+ init.return_value = None
+
+ new_host_port = mock.Mock()
+ plugin = self._create_plugin_for_create_update_port(new_host_port)
+
+ plugin.update_port(self.context, 'fake_id', mock.MagicMock())
+
+ plugin._notify_l3_agent_new_port.assert_called_once_with(
+ self.context, new_host_port)
+
+ def test_vmarp_table_update_outside_of_delete_transaction(self):
+ l3plugin = mock.Mock()
+ l3plugin.dvr_vmarp_table_update = (
+ lambda *args, **kwargs: self._ensure_transaction_is_closed())
+ l3plugin.dvr_deletens_if_no_port.return_value = []
+ l3plugin.supported_extension_aliases = [
+ 'router', constants.L3_AGENT_SCHEDULER_EXT_ALIAS,
+ constants.L3_DISTRIBUTED_EXT_ALIAS
+ ]
+ with contextlib.nested(
+ mock.patch.object(ml2_plugin.Ml2Plugin, '__init__',
+ return_value=None),
+ mock.patch.object(manager.NeutronManager,
+ 'get_service_plugins',
+ return_value={'L3_ROUTER_NAT': l3plugin}),
+ ):
+ plugin = self._create_plugin_for_create_update_port(mock.Mock())
+ # deleting the port will call dvr_vmarp_table_update, which will
+ # run the transaction balancing function defined in this test
+ plugin.delete_port(self.context, 'fake_id')
diff --git a/neutron/tests/unit/mlnx/__init__.py b/neutron/tests/unit/mlnx/__init__.py
index 7182ac4147..e69de29bb2 100644
--- a/neutron/tests/unit/mlnx/__init__.py
+++ b/neutron/tests/unit/mlnx/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 Mellanox Technologies, Ltd
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
diff --git a/neutron/tests/unit/mlnx/test_mlnx_comm_utils.py b/neutron/tests/unit/mlnx/test_mlnx_comm_utils.py
index bb8bdcced7..49f2eaceea 100644
--- a/neutron/tests/unit/mlnx/test_mlnx_comm_utils.py
+++ b/neutron/tests/unit/mlnx/test_mlnx_comm_utils.py
@@ -29,8 +29,7 @@ class WrongException(Exception):
class TestRetryDecorator(base.BaseTestCase):
def setUp(self):
super(TestRetryDecorator, self).setUp()
- self.sleep_fn_p = mock.patch.object(comm_utils.RetryDecorator,
- 'sleep_fn')
+ self.sleep_fn_p = mock.patch("time.sleep")
self.sleep_fn = self.sleep_fn_p.start()
def test_no_retry_required(self):
diff --git a/neutron/tests/unit/nec/__init__.py b/neutron/tests/unit/nec/__init__.py
index cff1fb258c..e69de29bb2 100644
--- a/neutron/tests/unit/nec/__init__.py
+++ b/neutron/tests/unit/nec/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2012 NEC Corporation. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/nec/test_agent_scheduler.py b/neutron/tests/unit/nec/test_agent_scheduler.py
index 7e1b24db30..70f4f1e7ca 100644
--- a/neutron/tests/unit/nec/test_agent_scheduler.py
+++ b/neutron/tests/unit/nec/test_agent_scheduler.py
@@ -41,6 +41,7 @@ class NecDhcpAgentNotifierTestCase(
test_nec_plugin.NecPluginV2TestCaseBase):
plugin_str = test_nec_plugin.PLUGIN_NAME
+ l3_plugin = None
def setUp(self):
self.setup_nec_plugin_base()
@@ -64,6 +65,7 @@ class NecL3AgentSchedulerWithOpenFlowRouter(
test_nec_plugin.NecPluginV2TestCaseBase):
plugin_str = test_nec_plugin.PLUGIN_NAME
+ l3_plugin = None
def setUp(self):
self.setup_nec_plugin_base()
diff --git a/neutron/tests/unit/nuage/test_nuage_plugin.py b/neutron/tests/unit/nuage/test_nuage_plugin.py
index e9a6595e72..37c062aff7 100644
--- a/neutron/tests/unit/nuage/test_nuage_plugin.py
+++ b/neutron/tests/unit/nuage/test_nuage_plugin.py
@@ -547,24 +547,24 @@ class TestNuageExtrarouteTestCase(NuagePluginV2TestCase,
class TestNuageProviderNetTestCase(NuagePluginV2TestCase):
def test_create_provider_network(self):
- phy_net = uuidutils.generate_uuid()
+ phys_net = uuidutils.generate_uuid()
data = {'network': {'name': 'pnet1',
'tenant_id': 'admin',
pnet.NETWORK_TYPE: 'vlan',
- pnet.PHYSICAL_NETWORK: phy_net,
+ pnet.PHYSICAL_NETWORK: phys_net,
pnet.SEGMENTATION_ID: 123}}
network_req = self.new_create_request('networks', data, self.fmt)
net = self.deserialize(self.fmt, network_req.get_response(self.api))
self.assertEqual('vlan', net['network'][pnet.NETWORK_TYPE])
- self.assertEqual(phy_net, net['network'][pnet.PHYSICAL_NETWORK])
+ self.assertEqual(phys_net, net['network'][pnet.PHYSICAL_NETWORK])
self.assertEqual(123, net['network'][pnet.SEGMENTATION_ID])
def test_create_provider_network_no_admin(self):
- phy_net = uuidutils.generate_uuid()
+ phys_net = uuidutils.generate_uuid()
data = {'network': {'name': 'pnet1',
'tenant_id': 'no_admin',
pnet.NETWORK_TYPE: 'vlan',
- pnet.PHYSICAL_NETWORK: phy_net,
+ pnet.PHYSICAL_NETWORK: phys_net,
pnet.SEGMENTATION_ID: 123}}
network_req = self.new_create_request('networks', data, self.fmt)
network_req.environ['neutron.context'] = context.Context(
@@ -572,6 +572,49 @@ class TestNuageProviderNetTestCase(NuagePluginV2TestCase):
res = network_req.get_response(self.api)
self.assertEqual(exc.HTTPForbidden.code, res.status_int)
+ def test_get_network_for_provider_network(self):
+ phys_net = uuidutils.generate_uuid()
+ data = {'network': {'name': 'pnet1',
+ 'tenant_id': 'admin',
+ pnet.NETWORK_TYPE: 'vlan',
+ pnet.PHYSICAL_NETWORK: phys_net,
+ pnet.SEGMENTATION_ID: 123}}
+ network_req = self.new_create_request('networks', data, self.fmt)
+ res = self.deserialize(self.fmt, network_req.get_response(self.api))
+
+ get_req = self.new_show_request('networks', res['network']['id'])
+ net = self.deserialize(self.fmt, get_req.get_response(self.api))
+ self.assertEqual('vlan', net['network'][pnet.NETWORK_TYPE])
+ self.assertEqual(phys_net, net['network'][pnet.PHYSICAL_NETWORK])
+ self.assertEqual(123, net['network'][pnet.SEGMENTATION_ID])
+
+ def test_list_networks_for_provider_network(self):
+ phys_net = uuidutils.generate_uuid()
+ data1 = {'network': {'name': 'pnet1',
+ 'tenant_id': 'admin',
+ pnet.NETWORK_TYPE: 'vlan',
+ pnet.PHYSICAL_NETWORK: phys_net,
+ pnet.SEGMENTATION_ID: 123}}
+ network_req_1 = self.new_create_request('networks', data1, self.fmt)
+ network_req_1.get_response(self.api)
+ data2 = {'network': {'name': 'pnet2',
+ 'tenant_id': 'admin',
+ pnet.NETWORK_TYPE: 'vlan',
+ pnet.PHYSICAL_NETWORK: phys_net,
+ pnet.SEGMENTATION_ID: 234}}
+ network_req_2 = self.new_create_request('networks', data2, self.fmt)
+ network_req_2.get_response(self.api)
+
+ list_req = self.new_list_request('networks')
+ pnets = self.deserialize(self.fmt, list_req.get_response(self.api))
+ self.assertEqual(2, len(pnets['networks']))
+ self.assertEqual('vlan', pnets['networks'][0][pnet.NETWORK_TYPE])
+ self.assertEqual(phys_net, pnets['networks'][0][pnet.PHYSICAL_NETWORK])
+ self.assertEqual(123, pnets['networks'][0][pnet.SEGMENTATION_ID])
+ self.assertEqual('vlan', pnets['networks'][1][pnet.NETWORK_TYPE])
+ self.assertEqual(phys_net, pnets['networks'][1][pnet.PHYSICAL_NETWORK])
+ self.assertEqual(234, pnets['networks'][1][pnet.SEGMENTATION_ID])
+
class TestNuageSecurityGroupTestCase(NuagePluginV2TestCase,
test_sg.TestSecurityGroups):
diff --git a/neutron/tests/unit/ofagent/test_arp_lib.py b/neutron/tests/unit/ofagent/test_arp_lib.py
index a0b0dcdafc..f0c1d69584 100644
--- a/neutron/tests/unit/ofagent/test_arp_lib.py
+++ b/neutron/tests/unit/ofagent/test_arp_lib.py
@@ -16,6 +16,7 @@
import collections
import contextlib
+import copy
import mock
@@ -203,6 +204,22 @@ class TestArpLib(OFAAgentTestCase):
self.arplib.del_arp_table_entry(self.nets[0].net, self.nets[0].ip)
self.assertEqual(self.arplib._arp_tbl, {})
+ def test_del_arp_table_entry_unknown_network(self):
+ self.arplib._arp_tbl = {
+ 100: {"192.0.2.1": "fa:16:3e:e2:37:37"},
+ }
+ orig = copy.deepcopy(self.arplib._arp_tbl)
+ self.arplib.del_arp_table_entry(200, "192.0.2.1")
+ self.assertEqual(orig, self.arplib._arp_tbl)
+
+ def test_del_arp_table_entry_unknown_ip(self):
+ self.arplib._arp_tbl = {
+ 100: {"192.0.2.1": "fa:16:3e:e2:37:37"},
+ }
+ orig = copy.deepcopy(self.arplib._arp_tbl)
+ self.arplib.del_arp_table_entry(100, "192.0.2.9")
+ self.assertEqual(orig, self.arplib._arp_tbl)
+
def test_del_arp_table_entry_multiple_net(self):
self.arplib._arp_tbl = {
self.nets[0].net: {self.nets[0].ip: self.nets[0].mac},
@@ -289,6 +306,11 @@ class TestArpLib(OFAAgentTestCase):
self._fake_get_protocol_arp = False
self._test_packet_in_handler_drop()
+ def test_packet_in_handler_corrupted(self):
+ mock.patch('ryu.lib.packet.packet.Packet',
+ side_effect=ValueError).start()
+ self._test_packet_in_handler_drop()
+
def test_packet_in_handler_unknown_network(self):
self.arplib._arp_tbl = {
self.nets[0].net: {self.nets[0].ip: self.nets[0].mac}}
diff --git a/neutron/tests/unit/ofagent/test_ofa_flows.py b/neutron/tests/unit/ofagent/test_ofa_flows.py
index 2f07448aac..a733288039 100644
--- a/neutron/tests/unit/ofagent/test_ofa_flows.py
+++ b/neutron/tests/unit/ofagent/test_ofa_flows.py
@@ -84,7 +84,7 @@ class TestOFAgentFlows(ofa_test_base.OFATestBase):
priority=0, table_id=12)),
call(ofpp.OFPFlowMod(dp, priority=0, table_id=13)),
]
- sendmsg.assert_has_calls(expected_calls)
+ sendmsg.assert_has_calls(expected_calls, any_order=True)
def test_install_arp_responder(self):
br = self.br
@@ -115,15 +115,27 @@ class TestOFAgentFlows(ofa_test_base.OFATestBase):
(dp, ofp, ofpp) = br._get_dp()
call = mock.call
expected_calls = [
- call(ofpp.OFPFlowMod(dp, instructions=[
- ofpp.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS,
- [ofpp.OFPActionSetField(tunnel_id=112),
- ofpp.OFPActionOutput(port=113),
- ofpp.OFPActionOutput(port=114)]),
- ofpp.OFPInstructionGotoTable(table_id=111)],
- match=ofpp.OFPMatch(metadata=
- meta.mk_metadata(111, meta.LOCAL)),
- priority=1, table_id=110))
+ call(
+ ofpp.OFPFlowMod(
+ dp,
+ instructions=[
+ ofpp.OFPInstructionActions(
+ ofp.OFPIT_APPLY_ACTIONS,
+ [
+ ofpp.OFPActionSetField(tunnel_id=112),
+ ofpp.OFPActionOutput(port=113),
+ ofpp.OFPActionOutput(port=114)
+ ]
+ ),
+ ofpp.OFPInstructionGotoTable(table_id=111)
+ ],
+ match=ofpp.OFPMatch(
+ metadata=meta.mk_metadata(111, meta.LOCAL)
+ ),
+ priority=1,
+ table_id=110
+ )
+ )
]
sendmsg.assert_has_calls(expected_calls)
@@ -134,11 +146,17 @@ class TestOFAgentFlows(ofa_test_base.OFATestBase):
(dp, ofp, ofpp) = br._get_dp()
call = mock.call
expected_calls = [
- call(ofpp.OFPFlowMod(dp, command=ofp.OFPFC_DELETE,
- match=ofpp.OFPMatch(metadata=
- meta.mk_metadata(111, meta.LOCAL)),
- out_group=ofp.OFPG_ANY,
- out_port=ofp.OFPP_ANY, priority=0, table_id=110))
+ call(
+ ofpp.OFPFlowMod(
+ dp,
+ command=ofp.OFPFC_DELETE,
+ match=ofpp.OFPMatch(
+ metadata=meta.mk_metadata(111, meta.LOCAL)
+ ),
+ out_group=ofp.OFPG_ANY,
+ out_port=ofp.OFPP_ANY, priority=0, table_id=110
+ )
+ )
]
sendmsg.assert_has_calls(expected_calls)
@@ -189,15 +207,30 @@ class TestOFAgentFlows(ofa_test_base.OFATestBase):
match=ofpp.OFPMatch(in_port=99,
vlan_vid=151 | ofp.OFPVID_PRESENT),
priority=1, table_id=0)),
- call(ofpp.OFPFlowMod(dp, instructions=[
- ofpp.OFPInstructionActions(ofp.OFPIT_APPLY_ACTIONS, [
- ofpp.OFPActionPushVlan(),
- ofpp.OFPActionSetField(vlan_vid=151 | ofp.OFPVID_PRESENT),
- ofpp.OFPActionOutput(port=99), ofpp.OFPActionPopVlan()]),
- ofpp.OFPInstructionGotoTable(table_id=13)],
- match=ofpp.OFPMatch(metadata=
- meta.mk_metadata(150, meta.LOCAL)),
- priority=1, table_id=12))
+ call(
+ ofpp.OFPFlowMod(
+ dp,
+ instructions=[
+ ofpp.OFPInstructionActions(
+ ofp.OFPIT_APPLY_ACTIONS,
+ [
+ ofpp.OFPActionPushVlan(),
+ ofpp.OFPActionSetField(
+ vlan_vid=151 | ofp.OFPVID_PRESENT
+ ),
+ ofpp.OFPActionOutput(port=99),
+ ofpp.OFPActionPopVlan()
+ ]
+ ),
+ ofpp.OFPInstructionGotoTable(table_id=13)
+ ],
+ match=ofpp.OFPMatch(
+ metadata=meta.mk_metadata(150, meta.LOCAL)
+ ),
+ priority=1,
+ table_id=12
+ )
+ )
]
sendmsg.assert_has_calls(expected_calls)
diff --git a/neutron/tests/unit/ofagent/test_ofa_neutron_agent.py b/neutron/tests/unit/ofagent/test_ofa_neutron_agent.py
index 638b40120e..32d2721e85 100644
--- a/neutron/tests/unit/ofagent/test_ofa_neutron_agent.py
+++ b/neutron/tests/unit/ofagent/test_ofa_neutron_agent.py
@@ -662,7 +662,8 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
'ip2', 'mac2')
]
- self.ryuapp.add_arp_table_entry.assert_has_calls(calls)
+ self.ryuapp.add_arp_table_entry.assert_has_calls(calls,
+ any_order=True)
setup_tun_fn.assert_called_once_with(self.agent.int_br,
'192.0.2.1', 'gre')
@@ -685,7 +686,8 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
'ip2', 'mac2')
]
- self.ryuapp.add_arp_table_entry.assert_has_calls(calls)
+ self.ryuapp.add_arp_table_entry.assert_has_calls(calls,
+ any_order=True)
self.assertFalse(setup_tun_fn.called)
def test_add_arp_table_entry_vlan(self):
@@ -716,7 +718,8 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
'ip2')
]
- self.ryuapp.del_arp_table_entry.assert_has_calls(calls)
+ self.ryuapp.del_arp_table_entry.assert_has_calls(calls,
+ any_order=True)
cleanup_tun_fn.assert_called_once_with(self.agent.int_br, 1, 'gre')
def _test_del_arp_table_entry_non_tunnel(self, network_type):
@@ -738,7 +741,8 @@ class TestOFANeutronAgent(ofa_test_base.OFAAgentTestBase):
mock.call(self.agent.local_vlan_map[self.lvms[0].net].vlan,
'ip2')
]
- self.ryuapp.del_arp_table_entry.assert_has_calls(calls)
+ self.ryuapp.del_arp_table_entry.assert_has_calls(calls,
+ any_order=True)
self.assertFalse(cleanup_tun_fn.called)
def test_del_arp_table_entry_vlan(self):
diff --git a/neutron/tests/unit/ofagent/test_ofa_ports.py b/neutron/tests/unit/ofagent/test_ofa_ports.py
index 3e36263931..8a19d8a70d 100644
--- a/neutron/tests/unit/ofagent/test_ofa_ports.py
+++ b/neutron/tests/unit/ofagent/test_ofa_ports.py
@@ -17,6 +17,7 @@
import mock
+from neutron.common import constants as n_const
from neutron.plugins.ofagent.agent import ports
from neutron.tests import base
@@ -34,7 +35,7 @@ class TestOFAgentPorts(base.BaseTestCase):
self.assertFalse(p2.is_neutron_port())
def test_neutron_port(self):
- for pref in ['qvo', 'qr-', 'qg-', 'tap']:
+ for pref in ['qvo', 'qr-', 'qg-', n_const.TAP_DEVICE_PREFIX]:
name = pref + '03b9a237-0b'
p1 = ports.Port(port_name=name, ofport=999)
ryu_ofp_port = mock.Mock(port_no=999)
diff --git a/neutron/tests/unit/opencontrail/test_contrail_plugin.py b/neutron/tests/unit/opencontrail/test_contrail_plugin.py
index de280f346f..a9a37be50e 100644
--- a/neutron/tests/unit/opencontrail/test_contrail_plugin.py
+++ b/neutron/tests/unit/opencontrail/test_contrail_plugin.py
@@ -214,7 +214,8 @@ class ContrailPluginTestCase(test_plugin.NeutronDbPluginV2TestCase):
_plugin_name = ('%s.NeutronPluginContrailCoreV2' % CONTRAIL_PKG_PATH)
def setUp(self, plugin=None, ext_mgr=None):
-
+ if 'v6' in self._testMethodName:
+ self.skipTest("OpenContrail Plugin does not support IPV6.")
cfg.CONF.keystone_authtoken = KeyStoneInfo()
mock.patch('requests.post').start().side_effect = FAKE_SERVER.request
super(ContrailPluginTestCase, self).setUp(self._plugin_name)
@@ -231,19 +232,6 @@ class TestContrailSubnetsV2(test_plugin.TestSubnetsV2,
def setUp(self):
super(TestContrailSubnetsV2, self).setUp()
- # Support ipv6 in contrail is planned in Juno
- def test_update_subnet_ipv6_attributes(self):
- self.skipTest("Contrail isn't supporting ipv6 yet")
-
- def test_update_subnet_ipv6_inconsistent_address_attribute(self):
- self.skipTest("Contrail isn't supporting ipv6 yet")
-
- def test_update_subnet_ipv6_inconsistent_enable_dhcp(self):
- self.skipTest("Contrail isn't supporting ipv6 yet")
-
- def test_update_subnet_ipv6_inconsistent_ra_attribute(self):
- self.skipTest("Contrail isn't supporting ipv6 yet")
-
def test_delete_subnet_dhcp_port_associated_with_other_subnets(self):
self.skipTest("There is no dhcp port in contrail")
diff --git a/neutron/tests/unit/openvswitch/__init__.py b/neutron/tests/unit/openvswitch/__init__.py
index b706747cf8..e69de29bb2 100644
--- a/neutron/tests/unit/openvswitch/__init__.py
+++ b/neutron/tests/unit/openvswitch/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/openvswitch/test_agent_scheduler.py b/neutron/tests/unit/openvswitch/test_agent_scheduler.py
index ed4f44023b..0fdf9fdbe1 100644
--- a/neutron/tests/unit/openvswitch/test_agent_scheduler.py
+++ b/neutron/tests/unit/openvswitch/test_agent_scheduler.py
@@ -19,6 +19,7 @@ import datetime
import mock
from oslo.config import cfg
+from oslo.db import exception as db_exc
from webob import exc
from neutron.api import extensions
@@ -27,6 +28,7 @@ from neutron.api.rpc.handlers import dhcp_rpc
from neutron.api.rpc.handlers import l3_rpc
from neutron.api.v2 import attributes
from neutron.common import constants
+from neutron.common import rpc as n_rpc
from neutron import context
from neutron.db import agents_db
from neutron.db import l3_agentschedulers_db
@@ -202,9 +204,9 @@ class OvsAgentSchedulerTestCaseBase(test_l3_plugin.L3NatTestCaseMixin,
AgentSchedulerTestMixIn,
test_plugin.NeutronDbPluginV2TestCase):
fmt = 'json'
- plugin_str = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.OVSNeutronPluginV2')
- l3_plugin = None
+ plugin_str = 'neutron.plugins.ml2.plugin.Ml2Plugin'
+ l3_plugin = ('neutron.tests.unit.test_l3_plugin.'
+ 'TestL3NatAgentSchedulingServicePlugin')
def setUp(self):
# Save the global RESOURCE_ATTRIBUTE_MAP before loading plugin
@@ -648,6 +650,53 @@ class OvsAgentSchedulerTestCase(OvsAgentSchedulerTestCaseBase):
agt_db.admin_state_up = state
self.adminContext.session.commit()
+ def test_router_rescheduler_catches_rpc_db_and_reschedule_exceptions(self):
+ with self.router():
+ l3_rpc_cb = l3_rpc.L3RpcCallback()
+ self._register_agent_states()
+ # schedule the router to host A
+ l3_rpc_cb.sync_routers(self.adminContext, host=L3_HOSTA)
+
+ plugin = manager.NeutronManager.get_service_plugins().get(
+ service_constants.L3_ROUTER_NAT)
+ mock.patch.object(
+ plugin, 'reschedule_router',
+ side_effect=[
+ db_exc.DBError(), n_rpc.RemoteError(),
+ l3agentscheduler.RouterReschedulingFailed(router_id='f',
+ agent_id='f'),
+ ValueError('this raises')
+ ]).start()
+ # these first three should not raise any errors
+ self._take_down_agent_and_run_reschedule(L3_HOSTA) # DBError
+ self._take_down_agent_and_run_reschedule(L3_HOSTA) # RemoteError
+ self._take_down_agent_and_run_reschedule(L3_HOSTA) # schedule err
+
+ # ValueError is not caught so it should raise
+ self.assertRaises(ValueError,
+ self._take_down_agent_and_run_reschedule,
+ L3_HOSTA)
+
+ def test_router_rescheduler_iterates_after_reschedule_failure(self):
+ plugin = manager.NeutronManager.get_service_plugins().get(
+ service_constants.L3_ROUTER_NAT)
+ l3_rpc_cb = l3_rpc.L3RpcCallback()
+ self._register_agent_states()
+ with contextlib.nested(self.router(), self.router()) as (r1, r2):
+ # schedule the routers to host A
+ l3_rpc_cb.sync_routers(self.adminContext, host=L3_HOSTA)
+
+ rs_mock = mock.patch.object(
+ plugin, 'reschedule_router',
+ side_effect=l3agentscheduler.RouterReschedulingFailed(
+ router_id='f', agent_id='f'),
+ ).start()
+ self._take_down_agent_and_run_reschedule(L3_HOSTA)
+ # make sure both had a reschedule attempt even though first failed
+ rs_mock.assert_has_calls([mock.call(mock.ANY, r1['router']['id']),
+ mock.call(mock.ANY, r2['router']['id'])],
+ any_order=True)
+
def test_router_is_not_rescheduled_from_alive_agent(self):
with self.router():
l3_rpc_cb = l3_rpc.L3RpcCallback()
@@ -1105,8 +1154,7 @@ class OvsDhcpAgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin,
test_agent_ext_plugin.AgentDBTestMixIn,
AgentSchedulerTestMixIn,
test_plugin.NeutronDbPluginV2TestCase):
- plugin_str = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.OVSNeutronPluginV2')
+ plugin_str = 'neutron.plugins.ml2.plugin.Ml2Plugin'
def setUp(self):
# Save the global RESOURCE_ATTRIBUTE_MAP before loading plugin
@@ -1271,9 +1319,9 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin,
test_agent_ext_plugin.AgentDBTestMixIn,
AgentSchedulerTestMixIn,
test_plugin.NeutronDbPluginV2TestCase):
- plugin_str = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.OVSNeutronPluginV2')
- l3_plugin = None
+ plugin_str = 'neutron.plugins.ml2.plugin.Ml2Plugin'
+ l3_plugin = ('neutron.tests.unit.test_l3_plugin.'
+ 'TestL3NatAgentSchedulingServicePlugin')
def setUp(self):
self.dhcp_notifier_cls_p = mock.patch(
@@ -1309,8 +1357,9 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin,
attributes.RESOURCE_ATTRIBUTE_MAP = self.saved_attr_map
def test_router_add_to_l3_agent_notification(self):
- plugin = manager.NeutronManager.get_plugin()
- l3_notifier = plugin.agent_notifiers[constants.AGENT_TYPE_L3]
+ l3_plugin = (manager.NeutronManager.get_service_plugins()
+ [service_constants.L3_ROUTER_NAT])
+ l3_notifier = l3_plugin.agent_notifiers[constants.AGENT_TYPE_L3]
with mock.patch.object(l3_notifier, 'cast') as mock_l3:
with self.router() as router1:
self._register_agent_states()
@@ -1330,8 +1379,9 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin,
self._assert_notify(notifications, expected_event_type)
def test_router_remove_from_l3_agent_notification(self):
- plugin = manager.NeutronManager.get_plugin()
- l3_notifier = plugin.agent_notifiers[constants.AGENT_TYPE_L3]
+ l3_plugin = (manager.NeutronManager.get_service_plugins()
+ [service_constants.L3_ROUTER_NAT])
+ l3_notifier = l3_plugin.agent_notifiers[constants.AGENT_TYPE_L3]
with mock.patch.object(l3_notifier, 'cast') as mock_l3:
with self.router() as router1:
self._register_agent_states()
@@ -1351,8 +1401,9 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin,
self._assert_notify(notifications, expected_event_type)
def test_agent_updated_l3_agent_notification(self):
- plugin = manager.NeutronManager.get_plugin()
- l3_notifier = plugin.agent_notifiers[constants.AGENT_TYPE_L3]
+ l3_plugin = (manager.NeutronManager.get_service_plugins()
+ [service_constants.L3_ROUTER_NAT])
+ l3_notifier = l3_plugin.agent_notifiers[constants.AGENT_TYPE_L3]
with mock.patch.object(l3_notifier, 'cast') as mock_l3:
self._register_agent_states()
hosta_id = self._get_agent_id(constants.AGENT_TYPE_L3,
diff --git a/neutron/tests/unit/openvswitch/test_openvswitch_plugin.py b/neutron/tests/unit/openvswitch/test_openvswitch_plugin.py
deleted file mode 100644
index af1c1d0425..0000000000
--- a/neutron/tests/unit/openvswitch/test_openvswitch_plugin.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# Copyright (c) 2012 OpenStack Foundation.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from oslo.config import cfg
-
-from neutron import context
-from neutron.extensions import portbindings
-from neutron.extensions import securitygroup as ext_sg
-from neutron.plugins.openvswitch import ovs_neutron_plugin
-from neutron.tests.unit import _test_extension_portbindings as test_bindings
-from neutron.tests.unit import test_db_plugin as test_plugin
-from neutron.tests.unit import test_extension_allowedaddresspairs as test_pair
-from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc
-
-import mock
-
-
-class OpenvswitchPluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase):
-
- _plugin_name = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.OVSNeutronPluginV2')
-
- def setUp(self):
- super(OpenvswitchPluginV2TestCase, self).setUp(self._plugin_name)
- self.port_create_status = 'DOWN'
-
-
-class TestOpenvswitchBasicGet(test_plugin.TestBasicGet,
- OpenvswitchPluginV2TestCase):
- pass
-
-
-class TestOpenvswitchV2HTTPResponse(test_plugin.TestV2HTTPResponse,
- OpenvswitchPluginV2TestCase):
- pass
-
-
-class TestOpenvswitchPortsV2(test_plugin.TestPortsV2,
- OpenvswitchPluginV2TestCase):
-
- def test_update_port_status_build(self):
- with self.port() as port:
- self.assertEqual(port['port']['status'], 'DOWN')
- self.assertEqual(self.port_create_status, 'DOWN')
-
-
-class TestOpenvswitchNetworksV2(test_plugin.TestNetworksV2,
- OpenvswitchPluginV2TestCase):
- pass
-
-
-class TestOpenvswitchPortBinding(OpenvswitchPluginV2TestCase,
- test_bindings.PortBindingsTestCase):
- VIF_TYPE = portbindings.VIF_TYPE_OVS
- HAS_PORT_FILTER = True
- ENABLE_SG = True
- FIREWALL_DRIVER = test_sg_rpc.FIREWALL_HYBRID_DRIVER
-
- def setUp(self, firewall_driver=None):
- test_sg_rpc.set_firewall_driver(self.FIREWALL_DRIVER)
- cfg.CONF.set_override(
- 'enable_security_group', self.ENABLE_SG,
- group='SECURITYGROUP')
- super(TestOpenvswitchPortBinding, self).setUp()
-
-
-class TestOpenvswitchPortBindingNoSG(TestOpenvswitchPortBinding):
- HAS_PORT_FILTER = False
- ENABLE_SG = False
- FIREWALL_DRIVER = test_sg_rpc.FIREWALL_NOOP_DRIVER
-
-
-class TestOpenvswitchPortBindingHost(
- OpenvswitchPluginV2TestCase,
- test_bindings.PortBindingsHostTestCaseMixin):
- pass
-
-
-class TestOpenvswitchAllowedAddressPairs(OpenvswitchPluginV2TestCase,
- test_pair.TestAllowedAddressPairs):
- pass
-
-
-class TestOpenvswitchUpdatePort(OpenvswitchPluginV2TestCase,
- ovs_neutron_plugin.OVSNeutronPluginV2):
-
- def test_update_port_add_remove_security_group(self):
- get_port_func = (
- 'neutron.db.db_base_plugin_v2.'
- 'NeutronDbPluginV2.get_port'
- )
- with mock.patch(get_port_func) as mock_get_port:
- mock_get_port.return_value = {
- ext_sg.SECURITYGROUPS: ["sg1", "sg2"],
- "admin_state_up": True,
- "fixed_ips": "fake_ip",
- "network_id": "fake_id"}
-
- update_port_func = (
- 'neutron.db.db_base_plugin_v2.'
- 'NeutronDbPluginV2.update_port'
- )
- with mock.patch(update_port_func) as mock_update_port:
- mock_update_port.return_value = {
- ext_sg.SECURITYGROUPS: ["sg2", "sg3"],
- "admin_state_up": True,
- "fixed_ips": "fake_ip",
- "network_id": "fake_id"}
-
- fake_func = (
- 'neutron.plugins.openvswitch.'
- 'ovs_db_v2.get_network_binding'
- )
- with mock.patch(fake_func) as mock_func:
- class MockBinding:
- network_type = "fake"
- segmentation_id = "fake"
- physical_network = "fake"
-
- mock_func.return_value = MockBinding()
-
- ctx = context.Context('', 'somebody')
- self.update_port(ctx, "id", {
- "port": {
- ext_sg.SECURITYGROUPS: [
- "sg2", "sg3"]}})
-
- sgmu = self.notifier.security_groups_member_updated
- sgmu.assert_called_with(ctx, set(['sg1', 'sg3']))
-
- def setUp(self):
- super(TestOpenvswitchUpdatePort, self).setUp()
- self.update_security_group_on_port = mock.MagicMock(return_value=True)
- self._process_portbindings_create_and_update = mock.MagicMock(
- return_value=True)
- self._update_extra_dhcp_opts_on_port = mock.MagicMock(
- return_value=True)
- self.update_address_pairs_on_port = mock.MagicMock(
- return_value=True)
-
- class MockNotifier:
- def __init__(self):
- self.port_update = mock.MagicMock(return_value=True)
- self.security_groups_member_updated = mock.MagicMock(
- return_value=True)
-
- self.notifier = MockNotifier()
diff --git a/neutron/tests/unit/openvswitch/test_ovs_db.py b/neutron/tests/unit/openvswitch/test_ovs_db.py
deleted file mode 100644
index a82f546b12..0000000000
--- a/neutron/tests/unit/openvswitch/test_ovs_db.py
+++ /dev/null
@@ -1,315 +0,0 @@
-# Copyright (c) 2012 OpenStack Foundation.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import mock
-from oslo.config import cfg
-from oslo.db import exception as db_exc
-from oslo.db.sqlalchemy import session
-from six import moves
-import testtools
-from testtools import matchers
-
-from neutron.common import exceptions as n_exc
-from neutron.db import api as db
-from neutron.plugins.openvswitch import ovs_db_v2
-from neutron.plugins.openvswitch import ovs_models_v2 as ovs_models
-from neutron.tests.unit import test_db_plugin as test_plugin
-from neutron.tests.unit import testlib_api
-
-PHYS_NET = 'physnet1'
-PHYS_NET_2 = 'physnet2'
-VLAN_MIN = 10
-VLAN_MAX = 19
-VLAN_RANGES = {PHYS_NET: [(VLAN_MIN, VLAN_MAX)]}
-UPDATED_VLAN_RANGES = {PHYS_NET: [(VLAN_MIN + 5, VLAN_MAX + 5)],
- PHYS_NET_2: [(VLAN_MIN + 20, VLAN_MAX + 20)]}
-TUN_MIN = 100
-TUN_MAX = 109
-TUNNEL_RANGES = [(TUN_MIN, TUN_MAX)]
-UPDATED_TUNNEL_RANGES = [(TUN_MIN + 5, TUN_MAX + 5)]
-
-PLUGIN_NAME = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.OVSNeutronPluginV2')
-
-
-class VlanAllocationsTest(testlib_api.SqlTestCase):
- def setUp(self):
- super(VlanAllocationsTest, self).setUp()
- ovs_db_v2.sync_vlan_allocations(VLAN_RANGES)
- self.session = db.get_session()
-
- def test_sync_vlan_allocations(self):
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN - 1))
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN).allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN + 1).allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX - 1).allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX).allocated)
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX + 1))
-
- ovs_db_v2.sync_vlan_allocations(UPDATED_VLAN_RANGES)
-
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN + 5 - 1))
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN + 5).
- allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN + 5 + 1).
- allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX + 5 - 1).
- allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX + 5).
- allocated)
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX + 5 + 1))
-
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET_2,
- VLAN_MIN + 20 - 1))
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET_2,
- VLAN_MIN + 20).
- allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET_2,
- VLAN_MIN + 20 + 1).
- allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET_2,
- VLAN_MAX + 20 - 1).
- allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET_2,
- VLAN_MAX + 20).
- allocated)
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET_2,
- VLAN_MAX + 20 + 1))
-
- ovs_db_v2.sync_vlan_allocations(VLAN_RANGES)
-
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN - 1))
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN).allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MIN + 1).allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX - 1).allocated)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX).allocated)
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- VLAN_MAX + 1))
-
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET_2,
- VLAN_MIN + 20))
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET_2,
- VLAN_MAX + 20))
-
- def test_vlan_pool(self):
- vlan_ids = set()
- for x in moves.xrange(VLAN_MIN, VLAN_MAX + 1):
- physical_network, vlan_id = ovs_db_v2.reserve_vlan(self.session)
- self.assertEqual(physical_network, PHYS_NET)
- self.assertThat(vlan_id, matchers.GreaterThan(VLAN_MIN - 1))
- self.assertThat(vlan_id, matchers.LessThan(VLAN_MAX + 1))
- vlan_ids.add(vlan_id)
-
- with testtools.ExpectedException(n_exc.NoNetworkAvailable):
- physical_network, vlan_id = ovs_db_v2.reserve_vlan(self.session)
-
- ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_ids.pop(),
- VLAN_RANGES)
- physical_network, vlan_id = ovs_db_v2.reserve_vlan(self.session)
- self.assertEqual(physical_network, PHYS_NET)
- self.assertThat(vlan_id, matchers.GreaterThan(VLAN_MIN - 1))
- self.assertThat(vlan_id, matchers.LessThan(VLAN_MAX + 1))
- vlan_ids.add(vlan_id)
-
- for vlan_id in vlan_ids:
- ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_id,
- VLAN_RANGES)
-
- def test_specific_vlan_inside_pool(self):
- vlan_id = VLAN_MIN + 5
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- vlan_id).allocated)
- ovs_db_v2.reserve_specific_vlan(self.session, PHYS_NET, vlan_id)
- self.assertTrue(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- vlan_id).allocated)
-
- with testtools.ExpectedException(n_exc.VlanIdInUse):
- ovs_db_v2.reserve_specific_vlan(self.session, PHYS_NET, vlan_id)
-
- ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_id, VLAN_RANGES)
- self.assertFalse(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- vlan_id).allocated)
-
- def test_specific_vlan_outside_pool(self):
- vlan_id = VLAN_MAX + 5
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, vlan_id))
- ovs_db_v2.reserve_specific_vlan(self.session, PHYS_NET, vlan_id)
- self.assertTrue(ovs_db_v2.get_vlan_allocation(PHYS_NET,
- vlan_id).allocated)
-
- with testtools.ExpectedException(n_exc.VlanIdInUse):
- ovs_db_v2.reserve_specific_vlan(self.session, PHYS_NET, vlan_id)
-
- ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_id, VLAN_RANGES)
- self.assertIsNone(ovs_db_v2.get_vlan_allocation(PHYS_NET, vlan_id))
-
- def test_sync_with_allocated_false(self):
- vlan_ids = set()
- for x in moves.xrange(VLAN_MIN, VLAN_MAX + 1):
- physical_network, vlan_id = ovs_db_v2.reserve_vlan(self.session)
- self.assertEqual(physical_network, PHYS_NET)
- self.assertThat(vlan_id, matchers.GreaterThan(VLAN_MIN - 1))
- self.assertThat(vlan_id, matchers.LessThan(VLAN_MAX + 1))
- vlan_ids.add(vlan_id)
-
- ovs_db_v2.release_vlan(self.session, PHYS_NET, vlan_ids.pop(),
- VLAN_RANGES)
- ovs_db_v2.sync_vlan_allocations({})
-
-
-class TunnelAllocationsTest(testlib_api.SqlTestCase):
- def setUp(self):
- super(TunnelAllocationsTest, self).setUp()
- ovs_db_v2.sync_tunnel_allocations(TUNNEL_RANGES)
- self.session = db.get_session()
-
- def test_sync_tunnel_allocations(self):
- self.assertIsNone(ovs_db_v2.get_tunnel_allocation(TUN_MIN - 1))
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MIN).allocated)
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MIN + 1).
- allocated)
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MAX - 1).
- allocated)
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MAX).allocated)
- self.assertIsNone(ovs_db_v2.get_tunnel_allocation(TUN_MAX + 1))
-
- ovs_db_v2.sync_tunnel_allocations(UPDATED_TUNNEL_RANGES)
-
- self.assertIsNone(ovs_db_v2.get_tunnel_allocation(TUN_MIN + 5 - 1))
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MIN + 5).
- allocated)
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MIN + 5 + 1).
- allocated)
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MAX + 5 - 1).
- allocated)
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(TUN_MAX + 5).
- allocated)
- self.assertIsNone(ovs_db_v2.get_tunnel_allocation(TUN_MAX + 5 + 1))
-
- def test_tunnel_pool(self):
- tunnel_ids = set()
- for x in moves.xrange(TUN_MIN, TUN_MAX + 1):
- tunnel_id = ovs_db_v2.reserve_tunnel(self.session)
- self.assertThat(tunnel_id, matchers.GreaterThan(TUN_MIN - 1))
- self.assertThat(tunnel_id, matchers.LessThan(TUN_MAX + 1))
- tunnel_ids.add(tunnel_id)
-
- with testtools.ExpectedException(n_exc.NoNetworkAvailable):
- tunnel_id = ovs_db_v2.reserve_tunnel(self.session)
-
- ovs_db_v2.release_tunnel(self.session, tunnel_ids.pop(), TUNNEL_RANGES)
- tunnel_id = ovs_db_v2.reserve_tunnel(self.session)
- self.assertThat(tunnel_id, matchers.GreaterThan(TUN_MIN - 1))
- self.assertThat(tunnel_id, matchers.LessThan(TUN_MAX + 1))
- tunnel_ids.add(tunnel_id)
-
- for tunnel_id in tunnel_ids:
- ovs_db_v2.release_tunnel(self.session, tunnel_id, TUNNEL_RANGES)
-
- def test_add_tunnel_endpoints(self):
- tun_1 = ovs_db_v2.add_tunnel_endpoint('192.168.0.1')
- tun_2 = ovs_db_v2.add_tunnel_endpoint('192.168.0.2')
- self.assertEqual(1, tun_1.id)
- self.assertEqual('192.168.0.1', tun_1.ip_address)
- self.assertEqual(2, tun_2.id)
- self.assertEqual('192.168.0.2', tun_2.ip_address)
-
- def test_specific_tunnel_inside_pool(self):
- tunnel_id = TUN_MIN + 5
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(tunnel_id).allocated)
- ovs_db_v2.reserve_specific_tunnel(self.session, tunnel_id)
- self.assertTrue(ovs_db_v2.get_tunnel_allocation(tunnel_id).allocated)
-
- with testtools.ExpectedException(n_exc.TunnelIdInUse):
- ovs_db_v2.reserve_specific_tunnel(self.session, tunnel_id)
-
- ovs_db_v2.release_tunnel(self.session, tunnel_id, TUNNEL_RANGES)
- self.assertFalse(ovs_db_v2.get_tunnel_allocation(tunnel_id).allocated)
-
- def test_specific_tunnel_outside_pool(self):
- tunnel_id = TUN_MAX + 5
- self.assertIsNone(ovs_db_v2.get_tunnel_allocation(tunnel_id))
- ovs_db_v2.reserve_specific_tunnel(self.session, tunnel_id)
- self.assertTrue(ovs_db_v2.get_tunnel_allocation(tunnel_id).allocated)
-
- with testtools.ExpectedException(n_exc.TunnelIdInUse):
- ovs_db_v2.reserve_specific_tunnel(self.session, tunnel_id)
-
- ovs_db_v2.release_tunnel(self.session, tunnel_id, TUNNEL_RANGES)
- self.assertIsNone(ovs_db_v2.get_tunnel_allocation(tunnel_id))
-
- def test_add_tunnel_endpoint_create_new_endpoint(self):
- addr = '10.0.0.1'
- ovs_db_v2.add_tunnel_endpoint(addr)
- self.assertIsNotNone(self.session.query(ovs_models.TunnelEndpoint).
- filter_by(ip_address=addr).first())
-
- def test_add_tunnel_endpoint_retrieve_an_existing_endpoint(self):
- addr = '10.0.0.1'
- self.session.add(ovs_models.TunnelEndpoint(ip_address=addr, id=1))
- self.session.flush()
-
- tunnel = ovs_db_v2.add_tunnel_endpoint(addr)
- self.assertEqual(tunnel.id, 1)
- self.assertEqual(tunnel.ip_address, addr)
-
- def test_add_tunnel_endpoint_handle_duplicate_error(self):
- with mock.patch.object(session.Session, 'query') as query_mock:
- error = db_exc.DBDuplicateEntry(['id'])
- query_mock.side_effect = error
-
- with testtools.ExpectedException(n_exc.NeutronException):
- ovs_db_v2.add_tunnel_endpoint('10.0.0.1', 5)
- self.assertEqual(query_mock.call_count, 5)
-
-
-class NetworkBindingsTest(test_plugin.NeutronDbPluginV2TestCase):
- def setUp(self):
- cfg.CONF.set_override('network_vlan_ranges', ['physnet1:1000:2999'],
- group='OVS')
- super(NetworkBindingsTest, self).setUp(plugin=PLUGIN_NAME)
- self.session = db.get_session()
-
- def test_add_network_binding(self):
- params = {'provider:network_type': 'vlan',
- 'provider:physical_network': PHYS_NET,
- 'provider:segmentation_id': 1234}
- params['arg_list'] = tuple(params.keys())
- with self.network(**params) as network:
- TEST_NETWORK_ID = network['network']['id']
- binding = ovs_db_v2.get_network_binding(self.session,
- TEST_NETWORK_ID)
- self.assertIsNotNone(binding)
- self.assertEqual(binding.network_id, TEST_NETWORK_ID)
- self.assertEqual(binding.network_type, 'vlan')
- self.assertEqual(binding.physical_network, PHYS_NET)
- self.assertEqual(binding.segmentation_id, 1234)
diff --git a/neutron/tests/unit/openvswitch/test_ovs_defaults.py b/neutron/tests/unit/openvswitch/test_ovs_defaults.py
index 0d5c00f730..e52b4530e9 100644
--- a/neutron/tests/unit/openvswitch/test_ovs_defaults.py
+++ b/neutron/tests/unit/openvswitch/test_ovs_defaults.py
@@ -27,9 +27,6 @@ class ConfigurationTest(base.BaseTestCase):
self.assertEqual('br-tun', cfg.CONF.OVS.tunnel_bridge)
self.assertEqual(2, cfg.CONF.AGENT.polling_interval)
self.assertEqual('sudo', cfg.CONF.AGENT.root_helper)
- self.assertEqual('local', cfg.CONF.OVS.tenant_network_type)
self.assertEqual(0, len(cfg.CONF.OVS.bridge_mappings))
- self.assertEqual(0, len(cfg.CONF.OVS.network_vlan_ranges))
- self.assertEqual(0, len(cfg.CONF.OVS.tunnel_id_ranges))
self.assertFalse(cfg.CONF.AGENT.l2_population)
self.assertFalse(cfg.CONF.AGENT.arp_responder)
diff --git a/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py b/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py
index 44376f0052..73d62b3dff 100644
--- a/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py
+++ b/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py
@@ -32,8 +32,7 @@ from neutron.plugins.openvswitch.common import constants
from neutron.tests import base
-NOTIFIER = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.AgentNotifierApi')
+NOTIFIER = 'neutron.plugins.ml2.rpc.AgentNotifierApi'
OVS_LINUX_KERN_VERS_WITHOUT_VXLAN = "3.12.0"
FAKE_MAC = '00:11:22:33:44:55'
@@ -136,6 +135,9 @@ class TestOvsNeutronAgent(base.BaseTestCase):
'FixedIntervalLoopingCall',
new=MockFixedIntervalLoopingCall)):
self.agent = ovs_neutron_agent.OVSNeutronAgent(**kwargs)
+ # set back to true because initial report state will succeed due
+ # to mocked out RPC calls
+ self.agent.use_call = True
self.agent.tun_br = mock.Mock()
self.agent.sg_agent = mock.Mock()
@@ -1047,6 +1049,20 @@ class TestOvsNeutronAgent(base.BaseTestCase):
{'2.2.2.2':
[[FAKE_MAC, FAKE_IP1],
n_const.FLOODING_ENTRY]}}}
+
+ class ActionMatcher(object):
+ def __init__(self, action_str):
+ self.ordered = self.order_ports(action_str)
+
+ def order_ports(self, action_str):
+ halves = action_str.split('output:')
+ ports = sorted(halves.pop().split(','))
+ halves.append(','.join(ports))
+ return 'output:'.join(halves)
+
+ def __eq__(self, other):
+ return self.ordered == self.order_ports(other)
+
with contextlib.nested(
mock.patch.object(self.agent.tun_br, 'deferred'),
mock.patch.object(self.agent.tun_br, 'do_action_flows'),
@@ -1074,8 +1090,8 @@ class TestOvsNeutronAgent(base.BaseTestCase):
'set_tunnel:seg1,output:2')]),
mock.call('mod', [dict(table=constants.FLOOD_TO_TUN,
dl_vlan='vlan1',
- actions='strip_vlan,'
- 'set_tunnel:seg1,output:1,2')]),
+ actions=ActionMatcher('strip_vlan,'
+ 'set_tunnel:seg1,output:1,2'))]),
]
do_action_flows_fn.assert_has_calls(expected_calls)
diff --git a/neutron/tests/unit/openvswitch/test_ovs_rpcapi.py b/neutron/tests/unit/openvswitch/test_ovs_rpcapi.py
deleted file mode 100644
index c443d6cd98..0000000000
--- a/neutron/tests/unit/openvswitch/test_ovs_rpcapi.py
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copyright 2012, Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-"""
-Unit Tests for openvswitch rpc
-"""
-
-import fixtures
-
-from neutron.agent import rpc as agent_rpc
-from neutron.common import topics
-from neutron.openstack.common import context
-from neutron.plugins.openvswitch.common import constants
-from neutron.plugins.openvswitch import ovs_neutron_plugin as povs
-from neutron.tests import base
-
-
-class rpcApiTestCase(base.BaseTestCase):
-
- def _test_ovs_api(self, rpcapi, topic, method, rpc_method, **kwargs):
- ctxt = context.RequestContext('fake_user', 'fake_project')
- expected_retval = 'foo' if method == 'call' else None
- expected_kwargs = {}
- if topic:
- expected_kwargs['topic'] = topic
- if 'version' in kwargs:
- expected_kwargs['version'] = kwargs.pop('version')
- expected_msg = rpcapi.make_msg(method, **kwargs)
- if rpc_method == 'cast' and method == 'run_instance':
- kwargs['call'] = False
-
- self.fake_args = None
- self.fake_kwargs = None
-
- def _fake_rpc_method(*args, **kwargs):
- self.fake_args = args
- self.fake_kwargs = kwargs
- if expected_retval:
- return expected_retval
-
- self.useFixture(fixtures.MonkeyPatch(
- 'neutron.common.rpc.RpcProxy.' + rpc_method,
- _fake_rpc_method))
-
- retval = getattr(rpcapi, method)(ctxt, **kwargs)
-
- self.assertEqual(retval, expected_retval)
- expected_args = [ctxt, expected_msg]
-
- # skip the first argument which is 'self'
- for arg, expected_arg in zip(self.fake_args[1:], expected_args):
- self.assertEqual(arg, expected_arg)
- self.assertEqual(expected_kwargs, self.fake_kwargs)
-
- def test_delete_network(self):
- rpcapi = povs.AgentNotifierApi(topics.AGENT)
- self._test_ovs_api(rpcapi,
- topics.get_topic_name(topics.AGENT,
- topics.NETWORK,
- topics.DELETE),
- 'network_delete', rpc_method='fanout_cast',
- network_id='fake_request_spec')
-
- def test_port_update(self):
- rpcapi = povs.AgentNotifierApi(topics.AGENT)
- self._test_ovs_api(rpcapi,
- topics.get_topic_name(topics.AGENT,
- topics.PORT,
- topics.UPDATE),
- 'port_update', rpc_method='fanout_cast',
- port='fake_port',
- network_type='fake_network_type',
- segmentation_id='fake_segmentation_id',
- physical_network='fake_physical_network')
-
- def test_tunnel_update(self):
- rpcapi = povs.AgentNotifierApi(topics.AGENT)
- self._test_ovs_api(rpcapi,
- topics.get_topic_name(topics.AGENT,
- constants.TUNNEL,
- topics.UPDATE),
- 'tunnel_update', rpc_method='fanout_cast',
- tunnel_ip='fake_ip', tunnel_id='fake_id',
- tunnel_type=None)
-
- def test_device_details(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_ovs_api(rpcapi, None,
- 'get_device_details', rpc_method='call',
- device='fake_device',
- agent_id='fake_agent_id',
- host='fake_host')
-
- def test_devices_details_list(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_ovs_api(rpcapi, None,
- 'get_devices_details_list', rpc_method='call',
- devices=['fake_device1', 'fake_device2'],
- agent_id='fake_agent_id', host='fake_host',
- version='1.3')
-
- def test_update_device_down(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_ovs_api(rpcapi, None,
- 'update_device_down', rpc_method='call',
- device='fake_device',
- agent_id='fake_agent_id',
- host='fake_host')
-
- def test_tunnel_sync(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_ovs_api(rpcapi, None,
- 'tunnel_sync', rpc_method='call',
- tunnel_ip='fake_tunnel_ip',
- tunnel_type=None)
-
- def test_update_device_up(self):
- rpcapi = agent_rpc.PluginApi(topics.PLUGIN)
- self._test_ovs_api(rpcapi, None,
- 'update_device_up', rpc_method='call',
- device='fake_device',
- agent_id='fake_agent_id',
- host='fake_host')
diff --git a/neutron/tests/unit/openvswitch/test_ovs_security_group.py b/neutron/tests/unit/openvswitch/test_ovs_security_group.py
deleted file mode 100644
index 83f91cb7b9..0000000000
--- a/neutron/tests/unit/openvswitch/test_ovs_security_group.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright 2013, Nachi Ueno, NTT MCL, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-import mock
-
-from neutron.api.v2 import attributes
-from neutron.extensions import securitygroup as ext_sg
-from neutron import manager
-from neutron.tests.unit import test_extension_security_group as test_sg
-from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc
-
-PLUGIN_NAME = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.OVSNeutronPluginV2')
-NOTIFIER = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.AgentNotifierApi')
-
-
-class OpenvswitchSecurityGroupsTestCase(test_sg.SecurityGroupDBTestCase):
- _plugin_name = PLUGIN_NAME
-
- def setUp(self, plugin=None):
- test_sg_rpc.set_firewall_driver(test_sg_rpc.FIREWALL_HYBRID_DRIVER)
- notifier_p = mock.patch(NOTIFIER)
- notifier_cls = notifier_p.start()
- self.notifier = mock.Mock()
- notifier_cls.return_value = self.notifier
- self._attribute_map_bk_ = {}
- for item in attributes.RESOURCE_ATTRIBUTE_MAP:
- self._attribute_map_bk_[item] = (attributes.
- RESOURCE_ATTRIBUTE_MAP[item].
- copy())
- super(OpenvswitchSecurityGroupsTestCase, self).setUp(PLUGIN_NAME)
-
- def tearDown(self):
- super(OpenvswitchSecurityGroupsTestCase, self).tearDown()
- attributes.RESOURCE_ATTRIBUTE_MAP = self._attribute_map_bk_
-
-
-class TestOpenvswitchSGServerRpcCallBack(
- OpenvswitchSecurityGroupsTestCase,
- test_sg_rpc.SGServerRpcCallBackTestCase):
- pass
-
-
-class TestOpenvswitchSGServerRpcCallBackXML(
- OpenvswitchSecurityGroupsTestCase,
- test_sg_rpc.SGServerRpcCallBackTestCaseXML):
- pass
-
-
-class TestOpenvswitchSecurityGroups(OpenvswitchSecurityGroupsTestCase,
- test_sg.TestSecurityGroups,
- test_sg_rpc.SGNotificationTestMixin):
- def test_security_group_get_port_from_device(self):
- with self.network() as n:
- with self.subnet(n):
- with self.security_group() as sg:
- security_group_id = sg['security_group']['id']
- res = self._create_port(self.fmt, n['network']['id'])
- port = self.deserialize(self.fmt, res)
- fixed_ips = port['port']['fixed_ips']
- data = {'port': {'fixed_ips': fixed_ips,
- 'name': port['port']['name'],
- ext_sg.SECURITYGROUPS:
- [security_group_id]}}
-
- req = self.new_update_request('ports', data,
- port['port']['id'])
- res = self.deserialize(self.fmt,
- req.get_response(self.api))
- port_id = res['port']['id']
- plugin = manager.NeutronManager.get_plugin()
- port_dict = plugin.get_port_from_device(port_id)
- self.assertEqual(port_id, port_dict['id'])
- self.assertEqual([security_group_id],
- port_dict[ext_sg.SECURITYGROUPS])
- self.assertEqual([], port_dict['security_group_rules'])
- self.assertEqual([fixed_ips[0]['ip_address']],
- port_dict['fixed_ips'])
- self._delete('ports', port_id)
-
- def test_security_group_get_port_from_device_with_no_port(self):
- plugin = manager.NeutronManager.get_plugin()
- port_dict = plugin.get_port_from_device('bad_device_id')
- self.assertIsNone(port_dict)
-
-
-class TestOpenvswitchSecurityGroupsXML(TestOpenvswitchSecurityGroups):
- fmt = 'xml'
diff --git a/neutron/tests/unit/plumgrid/__init__.py b/neutron/tests/unit/plumgrid/__init__.py
index f34feeeec9..e69de29bb2 100644
--- a/neutron/tests/unit/plumgrid/__init__.py
+++ b/neutron/tests/unit/plumgrid/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 PLUMgrid, Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/ryu/__init__.py b/neutron/tests/unit/ryu/__init__.py
index b706747cf8..e69de29bb2 100644
--- a/neutron/tests/unit/ryu/__init__.py
+++ b/neutron/tests/unit/ryu/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2012 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/__init__.py b/neutron/tests/unit/services/__init__.py
index 69bb9f6323..e69de29bb2 100644
--- a/neutron/tests/unit/services/__init__.py
+++ b/neutron/tests/unit/services/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 New Dream Network, LLC (DreamHost)
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/firewall/__init__.py b/neutron/tests/unit/services/firewall/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/tests/unit/services/firewall/__init__.py
+++ b/neutron/tests/unit/services/firewall/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/firewall/agents/__init__.py b/neutron/tests/unit/services/firewall/agents/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/tests/unit/services/firewall/agents/__init__.py
+++ b/neutron/tests/unit/services/firewall/agents/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/firewall/agents/l3reference/__init__.py b/neutron/tests/unit/services/firewall/agents/l3reference/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/tests/unit/services/firewall/agents/l3reference/__init__.py
+++ b/neutron/tests/unit/services/firewall/agents/l3reference/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py b/neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py
index 57edddcb45..c5c3afeef4 100644
--- a/neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py
+++ b/neutron/tests/unit/services/firewall/agents/l3reference/test_firewall_l3_agent.py
@@ -335,8 +335,9 @@ class TestFwaasL3AgentRpcCallback(base.BaseTestCase):
def _prepare_router_data(self, use_namespaces):
router = {'id': str(uuid.uuid4()), 'tenant_id': str(uuid.uuid4())}
+ ns = "ns-" + router['id']
return l3_agent.RouterInfo(router['id'], self.conf.root_helper,
- use_namespaces, router=router)
+ use_namespaces, router=router, ns_name=ns)
def _get_router_info_list_with_namespace_helper(self,
router_use_namespaces):
diff --git a/neutron/tests/unit/services/firewall/agents/varmour/__init__.py b/neutron/tests/unit/services/firewall/agents/varmour/__init__.py
index a6a8955d8b..e69de29bb2 100755
--- a/neutron/tests/unit/services/firewall/agents/varmour/__init__.py
+++ b/neutron/tests/unit/services/firewall/agents/varmour/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/firewall/drivers/__init__.py b/neutron/tests/unit/services/firewall/drivers/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/tests/unit/services/firewall/drivers/__init__.py
+++ b/neutron/tests/unit/services/firewall/drivers/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/firewall/drivers/linux/__init__.py b/neutron/tests/unit/services/firewall/drivers/linux/__init__.py
index fb181bf622..e69de29bb2 100644
--- a/neutron/tests/unit/services/firewall/drivers/linux/__init__.py
+++ b/neutron/tests/unit/services/firewall/drivers/linux/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 OpenStack Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/firewall/drivers/varmour/__init__.py b/neutron/tests/unit/services/firewall/drivers/varmour/__init__.py
index a6a8955d8b..e69de29bb2 100755
--- a/neutron/tests/unit/services/firewall/drivers/varmour/__init__.py
+++ b/neutron/tests/unit/services/firewall/drivers/varmour/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013 OpenStack Foundation.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/firewall/test_fwaas_plugin.py b/neutron/tests/unit/services/firewall/test_fwaas_plugin.py
index f1278a8924..a9f8e67298 100644
--- a/neutron/tests/unit/services/firewall/test_fwaas_plugin.py
+++ b/neutron/tests/unit/services/firewall/test_fwaas_plugin.py
@@ -43,9 +43,10 @@ class TestFirewallCallbacks(test_db_firewall.FirewallPluginDbTestCase):
ctx = context.get_admin_context()
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP) as fw:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ) as fw:
fw_id = fw['firewall']['id']
res = self.callbacks.set_firewall_status(ctx, fw_id,
const.ACTIVE,
@@ -63,9 +64,10 @@ class TestFirewallCallbacks(test_db_firewall.FirewallPluginDbTestCase):
ctx = context.get_admin_context()
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP) as fw:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ) as fw:
fw_id = fw['firewall']['id']
fw_db = self.plugin._get_firewall(ctx, fw_id)
fw_db['status'] = const.PENDING_DELETE
@@ -131,10 +133,10 @@ class TestFirewallCallbacks(test_db_firewall.FirewallPluginDbTestCase):
res = req.get_response(self.ext_api)
attrs = self._get_test_firewall_attrs()
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- tenant_id=tenant_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP) as fw:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ tenant_id=tenant_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP) as fw:
fw_id = fw['firewall']['id']
res = self.callbacks.get_firewalls_for_tenant(ctx,
host='dummy')
@@ -229,9 +231,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin):
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP) as firewall:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ) as firewall:
fw_id = firewall['firewall']['id']
res = self.callbacks.set_firewall_status(ctx, fw_id,
const.ACTIVE)
@@ -252,9 +255,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin):
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP) as firewall:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ) as firewall:
fw_id = firewall['firewall']['id']
data = {'firewall': {'name': name}}
req = self.new_update_request('firewalls', data, fw_id)
@@ -265,10 +269,11 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin):
ctx = context.get_admin_context()
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP,
- tenant_id='noadmin') as firewall:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP,
+ tenant_id='noadmin'
+ ) as firewall:
fw_id = firewall['firewall']['id']
self.callbacks.set_firewall_status(ctx, fw_id,
const.ACTIVE)
@@ -286,9 +291,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin):
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP):
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ):
data = {'firewall_policy': {'name': name}}
req = self.new_update_request('firewall_policies',
data, fwp_id)
@@ -306,9 +312,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin):
req = self.new_update_request('firewall_policies', data,
fwp_id)
req.get_response(self.ext_api)
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP):
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ):
data = {'firewall_rule': {'protocol': 'udp'}}
req = self.new_update_request('firewall_rules',
data, fr_id)
@@ -323,9 +330,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin):
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP) as firewall:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ) as firewall:
fw_id = firewall['firewall']['id']
attrs = self._replace_firewall_status(attrs,
const.PENDING_CREATE,
@@ -367,9 +375,10 @@ class TestFirewallPluginBase(test_db_firewall.TestFirewallDBPlugin):
req.get_response(self.ext_api)
attrs = self._get_test_firewall_attrs()
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP) as fw:
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ) as fw:
fw_id = fw['firewall']['id']
fw_rules = (
self.plugin._make_firewall_dict_with_rules(ctx,
diff --git a/neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py b/neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py
index 79fb88d4e9..b2ead4e693 100644
--- a/neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py
+++ b/neutron/tests/unit/services/l3_router/test_l3_apic_plugin.py
@@ -120,7 +120,8 @@ class TestCiscoApicL3Plugin(testlib_api.SqlTestCase,
mgr = self.plugin.manager
self.plugin.remove_router_interface(self.context, ROUTER,
interface_info)
- mgr.delete_contract_for_epg.assert_called_once()
+ mgr.remove_router_interface.assert_called_once_with(
+ mocked.APIC_TENANT, mocked.APIC_ROUTER, mocked.APIC_NETWORK)
def test_add_router_interface_subnet(self):
self._test_add_router_interface(self.interface_info['subnet'])
diff --git a/neutron/tests/unit/services/loadbalancer/__init__.py b/neutron/tests/unit/services/loadbalancer/__init__.py
index 69bb9f6323..e69de29bb2 100644
--- a/neutron/tests/unit/services/loadbalancer/__init__.py
+++ b/neutron/tests/unit/services/loadbalancer/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 New Dream Network, LLC (DreamHost)
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/loadbalancer/drivers/__init__.py b/neutron/tests/unit/services/loadbalancer/drivers/__init__.py
index 69bb9f6323..e69de29bb2 100644
--- a/neutron/tests/unit/services/loadbalancer/drivers/__init__.py
+++ b/neutron/tests/unit/services/loadbalancer/drivers/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 New Dream Network, LLC (DreamHost)
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py b/neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py
index 69bb9f6323..e69de29bb2 100644
--- a/neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py
+++ b/neutron/tests/unit/services/loadbalancer/drivers/haproxy/__init__.py
@@ -1,13 +0,0 @@
-# Copyright 2013 New Dream Network, LLC (DreamHost)
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py b/neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py
index 45acdf5ee6..0f8a2fd51a 100644
--- a/neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py
+++ b/neutron/tests/unit/services/loadbalancer/drivers/haproxy/test_namespace_driver.py
@@ -272,10 +272,11 @@ class TestHaproxyNSDriver(base.BaseTestCase):
'test_interface',
'mac_addr',
namespace='test_ns')
- self.vif_driver.init_l3.assert_called_once_with('test_interface',
- ['10.0.0.2/24'],
- namespace=
- 'test_ns')
+ self.vif_driver.init_l3.assert_called_once_with(
+ 'test_interface',
+ ['10.0.0.2/24'],
+ namespace='test_ns'
+ )
cmd = ['route', 'add', 'default', 'gw', '10.0.0.1']
cmd_arping = ['arping', '-U', '-I',
'test_interface', '-c',
@@ -339,10 +340,11 @@ class TestHaproxyNSDriver(base.BaseTestCase):
'test_interface',
'mac_addr',
namespace='test_ns')
- self.vif_driver.init_l3.assert_called_once_with('test_interface',
- ['10.0.0.2/24'],
- namespace=
- 'test_ns')
+ self.vif_driver.init_l3.assert_called_once_with(
+ 'test_interface',
+ ['10.0.0.2/24'],
+ namespace='test_ns'
+ )
self.assertFalse(ip_wrap.called)
dev_exists.return_value = True
self.assertRaises(exceptions.PreexistingDeviceFailure,
@@ -375,10 +377,11 @@ class TestHaproxyNSDriver(base.BaseTestCase):
'test_interface',
'mac_addr',
namespace='test_ns')
- self.vif_driver.init_l3.assert_called_once_with('test_interface',
- ['10.0.0.2/24'],
- namespace=
- 'test_ns')
+ self.vif_driver.init_l3.assert_called_once_with(
+ 'test_interface',
+ ['10.0.0.2/24'],
+ namespace='test_ns'
+ )
cmd = ['route', 'add', 'default', 'gw', '10.0.0.1']
ip_wrap.assert_has_calls([
mock.call('sudo_test', namespace='test_ns'),
diff --git a/neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py b/neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py
index 817d20e752..e69de29bb2 100644
--- a/neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py
+++ b/neutron/tests/unit/services/loadbalancer/drivers/radware/__init__.py
@@ -1,13 +0,0 @@
-# copyright 2013 Radware LTD.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py b/neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py
index 31f6cb2f18..ba5c968bd8 100644
--- a/neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py
+++ b/neutron/tests/unit/services/loadbalancer/drivers/radware/test_plugin_driver.py
@@ -19,6 +19,7 @@ import mock
from oslo.config import cfg
from six.moves import queue as Queue
+from neutron.api.v2 import attributes
from neutron import context
from neutron.extensions import loadbalancer
from neutron import manager
@@ -155,6 +156,16 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
"""Call _get_pip twice and verify that a Port is created once."""
port_dict = {'fixed_ips': [{'subnet_id': '10.10.10.10',
'ip_address': '11.11.11.11'}]}
+ port_data = {
+ 'tenant_id': 'tenant_id',
+ 'name': 'port_name',
+ 'network_id': 'network_id',
+ 'mac_address': attributes.ATTR_NOT_SPECIFIED,
+ 'admin_state_up': False,
+ 'device_id': '',
+ 'device_owner': 'neutron:' + constants.LOADBALANCER,
+ 'fixed_ips': [{'subnet_id': '10.10.10.10'}]
+ }
self.plugin_instance._core_plugin.get_ports = mock.Mock(
return_value=[])
self.plugin_instance._core_plugin.create_port = mock.Mock(
@@ -163,15 +174,18 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
radware_driver._get_pip(context.get_admin_context(),
'tenant_id', 'port_name',
'network_id', '10.10.10.10')
- self.plugin_instance._core_plugin.get_ports.assert_called_once()
- self.plugin_instance._core_plugin.create_port.assert_called_once()
+ self.plugin_instance._core_plugin.get_ports.assert_called_once_with(
+ mock.ANY, filters={'name': ['port_name']})
+ self.plugin_instance._core_plugin.create_port.assert_called_once_with(
+ mock.ANY, {'port': port_data})
self.plugin_instance._core_plugin.create_port.reset_mock()
self.plugin_instance._core_plugin.get_ports.reset_mock()
self.plugin_instance._core_plugin.get_ports.return_value = [port_dict]
radware_driver._get_pip(context.get_admin_context(),
'tenant_id', 'port_name',
'network_id', '10.10.10.10')
- self.plugin_instance._core_plugin.get_ports.assert_called_once()
+ self.plugin_instance._core_plugin.get_ports.assert_called_once_with(
+ mock.ANY, filters={'name': ['port_name']})
self.assertFalse(self.plugin_instance._core_plugin.create_port.called)
def test_rest_client_recover_was_called(self):
@@ -181,7 +195,9 @@ class TestLoadBalancerPlugin(TestLoadBalancerPluginBase):
radware_driver.rest_client._call = self.orig__call
self.assertRaises(r_exc.RESTRequestFailure,
radware_driver._verify_workflow_templates)
- self.recover_mock.assert_called_once()
+ self.recover_mock.assert_called_once_with('GET',
+ '/api/workflowTemplate',
+ None, None, False)
def test_rest_client_flip_servers(self):
radware_driver = self.plugin_instance.drivers['radware']
diff --git a/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py b/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py
index 1d78c03d2f..7d083922f6 100644
--- a/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py
+++ b/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py
@@ -61,8 +61,7 @@ class LBaaSAgentSchedulerTestCase(test_agent_ext_plugin.AgentDBTestMixIn,
test_db_loadbalancer.LoadBalancerTestMixin,
test_plugin.NeutronDbPluginV2TestCase):
fmt = 'json'
- plugin_str = ('neutron.plugins.openvswitch.'
- 'ovs_neutron_plugin.OVSNeutronPluginV2')
+ plugin_str = 'neutron.plugins.ml2.plugin.Ml2Plugin'
def setUp(self):
# Save the global RESOURCE_ATTRIBUTE_MAP
diff --git a/neutron/tests/unit/services/metering/__init__.py b/neutron/tests/unit/services/metering/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/tests/unit/services/metering/__init__.py
+++ b/neutron/tests/unit/services/metering/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/metering/drivers/__init__.py b/neutron/tests/unit/services/metering/drivers/__init__.py
index bc20be2a0c..e69de29bb2 100644
--- a/neutron/tests/unit/services/metering/drivers/__init__.py
+++ b/neutron/tests/unit/services/metering/drivers/__init__.py
@@ -1,13 +0,0 @@
-# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/vpn/__init__.py b/neutron/tests/unit/services/vpn/__init__.py
index f560154933..e69de29bb2 100644
--- a/neutron/tests/unit/services/vpn/__init__.py
+++ b/neutron/tests/unit/services/vpn/__init__.py
@@ -1,14 +0,0 @@
-# (c) Copyright 2013 Hewlett-Packard Development Company, L.P.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/vpn/device_drivers/__init__.py b/neutron/tests/unit/services/vpn/device_drivers/__init__.py
index 46d9c1bed8..e69de29bb2 100644
--- a/neutron/tests/unit/services/vpn/device_drivers/__init__.py
+++ b/neutron/tests/unit/services/vpn/device_drivers/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013, Nachi Ueno, NTT I3, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/vpn/device_drivers/cisco_csr_mock.py b/neutron/tests/unit/services/vpn/device_drivers/cisco_csr_mock.py
deleted file mode 100644
index 93a126bfda..0000000000
--- a/neutron/tests/unit/services/vpn/device_drivers/cisco_csr_mock.py
+++ /dev/null
@@ -1,577 +0,0 @@
-# Copyright 2014 Cisco Systems, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-"""Mock REST requests to Cisco Cloud Services Router."""
-
-import re
-
-import functools
-# TODO(pcm): Remove when switch to requests-mock package. Comment out, if use
-# local copy of httmock.py source. Needed for PEP8.
-import httmock
-import requests
-from requests import exceptions as r_exc
-
-from neutron.openstack.common import log as logging
-# TODO(pcm) Remove once httmock package is added to test-requirements. For
-# now, uncomment and include httmock source to unit test.
-# from neutron.tests.unit.services.vpn.device_drivers import httmock
-
-LOG = logging.getLogger(__name__)
-
-
-def repeat(n):
- """Decorator to limit the number of times a handler is called.
-
- Will allow the wrapped function (handler) to be called 'n' times.
- After that, this will return None for any additional calls,
- allowing other handlers, if any, to be invoked.
- """
-
- class static:
- retries = n
-
- def decorator(func):
- @functools.wraps(func)
- def wrapped(*args, **kwargs):
- if static.retries == 0:
- return None
- static.retries -= 1
- return func(*args, **kwargs)
- return wrapped
- return decorator
-
-
-def filter_request(methods, resource):
- """Decorator to invoke handler once for a specific resource.
-
- This will call the handler only for a specific resource using
- a specific method(s). Any other resource request or method will
- return None, allowing other handlers, if any, to be invoked.
- """
-
- class static:
- target_methods = [m.upper() for m in methods]
- target_resource = resource
-
- def decorator(func):
- @functools.wraps(func)
- def wrapped(*args, **kwargs):
- if (args[1].method in static.target_methods and
- static.target_resource in args[0].path):
- return func(*args, **kwargs)
- else:
- return None # Not for this resource
- return wrapped
- return decorator
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def token(url, request):
- if 'auth/token-services' in url.path:
- return {'status_code': requests.codes.OK,
- 'content': {'token-id': 'dummy-token'}}
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def token_unauthorized(url, request):
- if 'auth/token-services' in url.path:
- return {'status_code': requests.codes.UNAUTHORIZED}
-
-
-@httmock.urlmatch(netloc=r'wrong-host')
-def token_wrong_host(url, request):
- raise r_exc.ConnectionError()
-
-
-@httmock.all_requests
-def token_timeout(url, request):
- raise r_exc.Timeout()
-
-
-@filter_request(['get'], 'global/host-name')
-@httmock.all_requests
-def timeout(url, request):
- """Simulated timeout of a normal request."""
-
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- raise r_exc.Timeout()
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def no_such_resource(url, request):
- """Indicate not found error, when invalid resource requested."""
- return {'status_code': requests.codes.NOT_FOUND}
-
-
-@filter_request(['get'], 'global/host-name')
-@repeat(1)
-@httmock.urlmatch(netloc=r'localhost')
-def expired_request(url, request):
- """Simulate access denied failure on first request for this resource.
-
- Intent here is to simulate that the token has expired, by failing
- the first request to the resource. Because of the repeat=1, this
- will only be called once, and subsequent calls will not be handled
- by this function, but instead will access the normal handler and
- will pass. Currently configured for a GET request, but will work
- with POST and PUT as well. For DELETE, would need to filter_request on a
- different resource (e.g. 'global/local-users')
- """
-
- return {'status_code': requests.codes.UNAUTHORIZED}
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def normal_get(url, request):
- if request.method != 'GET':
- return
- LOG.debug("GET mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- if 'global/host-name' in url.path:
- content = {u'kind': u'object#host-name',
- u'host-name': u'Router'}
- return httmock.response(requests.codes.OK, content=content)
- if 'global/local-users' in url.path:
- content = {u'kind': u'collection#local-user',
- u'users': ['peter', 'paul', 'mary']}
- return httmock.response(requests.codes.OK, content=content)
- if 'interfaces/GigabitEthernet' in url.path:
- actual_interface = url.path.split('/')[-1]
- ip = actual_interface[-1]
- content = {u'kind': u'object#interface',
- u'description': u'Changed description',
- u'if-name': actual_interface,
- u'proxy-arp': True,
- u'subnet-mask': u'255.255.255.0',
- u'icmp-unreachable': True,
- u'nat-direction': u'',
- u'icmp-redirects': True,
- u'ip-address': u'192.168.200.%s' % ip,
- u'verify-unicast-source': False,
- u'type': u'ethernet'}
- return httmock.response(requests.codes.OK, content=content)
- if 'vpn-svc/ike/policies/2' in url.path:
- content = {u'kind': u'object#ike-policy',
- u'priority-id': u'2',
- u'version': u'v1',
- u'local-auth-method': u'pre-share',
- u'encryption': u'aes256',
- u'hash': u'sha',
- u'dhGroup': 5,
- u'lifetime': 3600}
- return httmock.response(requests.codes.OK, content=content)
- if 'vpn-svc/ike/keyrings' in url.path:
- content = {u'kind': u'object#ike-keyring',
- u'keyring-name': u'5',
- u'pre-shared-key-list': [
- {u'key': u'super-secret',
- u'encrypted': False,
- u'peer-address': u'10.10.10.20 255.255.255.0'}
- ]}
- return httmock.response(requests.codes.OK, content=content)
- if 'vpn-svc/ipsec/policies/' in url.path:
- ipsec_policy_id = url.path.split('/')[-1]
- content = {u'kind': u'object#ipsec-policy',
- u'mode': u'tunnel',
- u'policy-id': u'%s' % ipsec_policy_id,
- u'protection-suite': {
- u'esp-encryption': u'esp-256-aes',
- u'esp-authentication': u'esp-sha-hmac',
- u'ah': u'ah-sha-hmac',
- },
- u'anti-replay-window-size': u'Disable',
- u'lifetime-sec': 120,
- u'pfs': u'group5',
- u'lifetime-kb': 4608000,
- u'idle-time': None}
- return httmock.response(requests.codes.OK, content=content)
- if 'vpn-svc/site-to-site/Tunnel' in url.path:
- tunnel = url.path.split('/')[-1]
- # Use same number, to allow mock to generate IPSec policy ID
- ipsec_policy_id = tunnel[6:]
- content = {u'kind': u'object#vpn-site-to-site',
- u'vpn-interface-name': u'%s' % tunnel,
- u'ip-version': u'ipv4',
- u'vpn-type': u'site-to-site',
- u'ipsec-policy-id': u'%s' % ipsec_policy_id,
- u'ike-profile-id': None,
- u'mtu': 1500,
- u'local-device': {
- u'ip-address': '10.3.0.1/24',
- u'tunnel-ip-address': '10.10.10.10'
- },
- u'remote-device': {
- u'tunnel-ip-address': '10.10.10.20'
- }}
- return httmock.response(requests.codes.OK, content=content)
- if 'vpn-svc/ike/keepalive' in url.path:
- content = {u'interval': 60,
- u'retry': 4,
- u'periodic': True}
- return httmock.response(requests.codes.OK, content=content)
- if 'routing-svc/static-routes' in url.path:
- content = {u'destination-network': u'10.1.0.0/24',
- u'kind': u'object#static-route',
- u'next-hop-router': None,
- u'outgoing-interface': u'GigabitEthernet1',
- u'admin-distance': 1}
- return httmock.response(requests.codes.OK, content=content)
- if 'vpn-svc/site-to-site/active/sessions' in url.path:
- # Only including needed fields for mock
- content = {u'kind': u'collection#vpn-active-sessions',
- u'items': [{u'status': u'DOWN-NEGOTIATING',
- u'vpn-interface-name': u'Tunnel123'}, ]}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@filter_request(['get'], 'vpn-svc/ike/keyrings')
-@httmock.urlmatch(netloc=r'localhost')
-def get_fqdn(url, request):
- LOG.debug("GET FQDN mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- content = {u'kind': u'object#ike-keyring',
- u'keyring-name': u'5',
- u'pre-shared-key-list': [
- {u'key': u'super-secret',
- u'encrypted': False,
- u'peer-address': u'cisco.com'}
- ]}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@filter_request(['get'], 'vpn-svc/ipsec/policies/')
-@httmock.urlmatch(netloc=r'localhost')
-def get_no_ah(url, request):
- LOG.debug("GET No AH mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- ipsec_policy_id = url.path.split('/')[-1]
- content = {u'kind': u'object#ipsec-policy',
- u'mode': u'tunnel',
- u'anti-replay-window-size': u'128',
- u'policy-id': u'%s' % ipsec_policy_id,
- u'protection-suite': {
- u'esp-encryption': u'esp-aes',
- u'esp-authentication': u'esp-sha-hmac',
- },
- u'lifetime-sec': 120,
- u'pfs': u'group5',
- u'lifetime-kb': 4608000,
- u'idle-time': None}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def get_defaults(url, request):
- if request.method != 'GET':
- return
- LOG.debug("GET mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- if 'vpn-svc/ike/policies/2' in url.path:
- content = {u'kind': u'object#ike-policy',
- u'priority-id': u'2',
- u'version': u'v1',
- u'local-auth-method': u'pre-share',
- u'encryption': u'des',
- u'hash': u'sha',
- u'dhGroup': 1,
- u'lifetime': 86400}
- return httmock.response(requests.codes.OK, content=content)
- if 'vpn-svc/ipsec/policies/' in url.path:
- ipsec_policy_id = url.path.split('/')[-1]
- content = {u'kind': u'object#ipsec-policy',
- u'mode': u'tunnel',
- u'policy-id': u'%s' % ipsec_policy_id,
- u'protection-suite': {},
- u'lifetime-sec': 3600,
- u'pfs': u'Disable',
- u'anti-replay-window-size': u'None',
- u'lifetime-kb': 4608000,
- u'idle-time': None}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@filter_request(['get'], 'vpn-svc/site-to-site')
-@httmock.urlmatch(netloc=r'localhost')
-def get_unnumbered(url, request):
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- tunnel = url.path.split('/')[-1]
- ipsec_policy_id = tunnel[6:]
- content = {u'kind': u'object#vpn-site-to-site',
- u'vpn-interface-name': u'%s' % tunnel,
- u'ip-version': u'ipv4',
- u'vpn-type': u'site-to-site',
- u'ipsec-policy-id': u'%s' % ipsec_policy_id,
- u'ike-profile-id': None,
- u'mtu': 1500,
- u'local-device': {
- u'ip-address': u'GigabitEthernet3',
- u'tunnel-ip-address': u'10.10.10.10'
- },
- u'remote-device': {
- u'tunnel-ip-address': u'10.10.10.20'
- }}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@filter_request(['get'], 'vpn-svc/site-to-site/Tunnel')
-@httmock.urlmatch(netloc=r'localhost')
-def get_admin_down(url, request):
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- # URI has .../Tunnel#/state, so get number from 2nd to last element
- tunnel = url.path.split('/')[-2]
- content = {u'kind': u'object#vpn-site-to-site-state',
- u'vpn-interface-name': u'%s' % tunnel,
- u'line-protocol-state': u'down',
- u'enabled': False}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@filter_request(['get'], 'vpn-svc/site-to-site/Tunnel')
-@httmock.urlmatch(netloc=r'localhost')
-def get_admin_up(url, request):
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- # URI has .../Tunnel#/state, so get number from 2nd to last element
- tunnel = url.path.split('/')[-2]
- content = {u'kind': u'object#vpn-site-to-site-state',
- u'vpn-interface-name': u'%s' % tunnel,
- u'line-protocol-state': u'down',
- u'enabled': True}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@filter_request(['get'], 'vpn-svc/site-to-site')
-@httmock.urlmatch(netloc=r'localhost')
-def get_mtu(url, request):
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- tunnel = url.path.split('/')[-1]
- ipsec_policy_id = tunnel[6:]
- content = {u'kind': u'object#vpn-site-to-site',
- u'vpn-interface-name': u'%s' % tunnel,
- u'ip-version': u'ipv4',
- u'vpn-type': u'site-to-site',
- u'ipsec-policy-id': u'%s' % ipsec_policy_id,
- u'ike-profile-id': None,
- u'mtu': 9192,
- u'local-device': {
- u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'
- },
- u'remote-device': {
- u'tunnel-ip-address': u'10.10.10.20'
- }}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@filter_request(['get'], 'vpn-svc/ike/keepalive')
-@httmock.urlmatch(netloc=r'localhost')
-def get_not_configured(url, request):
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.NOT_FOUND}
-
-
-@filter_request(['get'], 'vpn-svc/site-to-site/active/sessions')
-@httmock.urlmatch(netloc=r'localhost')
-def get_none(url, request):
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- content = {u'kind': u'collection#vpn-active-sessions',
- u'items': []}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@filter_request(['get'], 'interfaces/GigabitEthernet3')
-@httmock.urlmatch(netloc=r'localhost')
-def get_local_ip(url, request):
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- content = {u'kind': u'object#interface',
- u'subnet-mask': u'255.255.255.0',
- u'ip-address': u'10.5.0.2'}
- return httmock.response(requests.codes.OK, content=content)
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def post(url, request):
- if request.method != 'POST':
- return
- LOG.debug("POST mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- if 'interfaces/GigabitEthernet' in url.path:
- return {'status_code': requests.codes.NO_CONTENT}
- if 'global/local-users' in url.path:
- if 'username' not in request.body:
- return {'status_code': requests.codes.BAD_REQUEST}
- if '"privilege": 20' in request.body:
- return {'status_code': requests.codes.BAD_REQUEST}
- headers = {'location': '%s/test-user' % url.geturl()}
- return httmock.response(requests.codes.CREATED, headers=headers)
- if 'vpn-svc/ike/policies' in url.path:
- headers = {'location': "%s/2" % url.geturl()}
- return httmock.response(requests.codes.CREATED, headers=headers)
- if 'vpn-svc/ipsec/policies' in url.path:
- m = re.search(r'"policy-id": "(\S+)"', request.body)
- if m:
- headers = {'location': "%s/%s" % (url.geturl(), m.group(1))}
- return httmock.response(requests.codes.CREATED, headers=headers)
- return {'status_code': requests.codes.BAD_REQUEST}
- if 'vpn-svc/ike/keyrings' in url.path:
- headers = {'location': "%s/5" % url.geturl()}
- return httmock.response(requests.codes.CREATED, headers=headers)
- if 'vpn-svc/site-to-site' in url.path:
- m = re.search(r'"vpn-interface-name": "(\S+)"', request.body)
- if m:
- headers = {'location': "%s/%s" % (url.geturl(), m.group(1))}
- return httmock.response(requests.codes.CREATED, headers=headers)
- return {'status_code': requests.codes.BAD_REQUEST}
- if 'routing-svc/static-routes' in url.path:
- headers = {'location':
- "%s/10.1.0.0_24_GigabitEthernet1" % url.geturl()}
- return httmock.response(requests.codes.CREATED, headers=headers)
-
-
-@filter_request(['post'], 'global/local-users')
-@httmock.urlmatch(netloc=r'localhost')
-def post_change_attempt(url, request):
- LOG.debug("POST change value mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.NOT_FOUND,
- 'content': {
- u'error-code': -1,
- u'error-message': u'user test-user already exists'}}
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def post_duplicate(url, request):
- LOG.debug("POST duplicate mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.BAD_REQUEST,
- 'content': {
- u'error-code': -1,
- u'error-message': u'policy 2 exist, not allow to '
- u'update policy using POST method'}}
-
-
-@filter_request(['post'], 'vpn-svc/site-to-site')
-@httmock.urlmatch(netloc=r'localhost')
-def post_missing_ipsec_policy(url, request):
- LOG.debug("POST missing ipsec policy mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.BAD_REQUEST}
-
-
-@filter_request(['post'], 'vpn-svc/site-to-site')
-@httmock.urlmatch(netloc=r'localhost')
-def post_missing_ike_policy(url, request):
- LOG.debug("POST missing ike policy mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.BAD_REQUEST}
-
-
-@filter_request(['post'], 'vpn-svc/site-to-site')
-@httmock.urlmatch(netloc=r'localhost')
-def post_bad_ip(url, request):
- LOG.debug("POST bad IP mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.BAD_REQUEST}
-
-
-@filter_request(['post'], 'vpn-svc/site-to-site')
-@httmock.urlmatch(netloc=r'localhost')
-def post_bad_mtu(url, request):
- LOG.debug("POST bad mtu mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.BAD_REQUEST}
-
-
-@filter_request(['post'], 'vpn-svc/ipsec/policies')
-@httmock.urlmatch(netloc=r'localhost')
-def post_bad_lifetime(url, request):
- LOG.debug("POST bad lifetime mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.BAD_REQUEST}
-
-
-@filter_request(['post'], 'vpn-svc/ipsec/policies')
-@httmock.urlmatch(netloc=r'localhost')
-def post_bad_name(url, request):
- LOG.debug("POST bad IPSec policy name for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- return {'status_code': requests.codes.BAD_REQUEST}
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def put(url, request):
- if request.method != 'PUT':
- return
- LOG.debug("PUT mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- # Any resource
- return {'status_code': requests.codes.NO_CONTENT}
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def delete(url, request):
- if request.method != 'DELETE':
- return
- LOG.debug("DELETE mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- # Any resource
- return {'status_code': requests.codes.NO_CONTENT}
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def delete_unknown(url, request):
- if request.method != 'DELETE':
- return
- LOG.debug("DELETE unknown mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- # Any resource
- return {'status_code': requests.codes.NOT_FOUND,
- 'content': {
- u'error-code': -1,
- u'error-message': 'user unknown not found'}}
-
-
-@httmock.urlmatch(netloc=r'localhost')
-def delete_not_allowed(url, request):
- if request.method != 'DELETE':
- return
- LOG.debug("DELETE not allowed mock for %s", url)
- if not request.headers.get('X-auth-token', None):
- return {'status_code': requests.codes.UNAUTHORIZED}
- # Any resource
- return {'status_code': requests.codes.METHOD_NOT_ALLOWED}
diff --git a/neutron/tests/unit/services/vpn/device_drivers/notest_cisco_csr_rest.py b/neutron/tests/unit/services/vpn/device_drivers/notest_cisco_csr_rest.py
deleted file mode 100644
index a89abe9445..0000000000
--- a/neutron/tests/unit/services/vpn/device_drivers/notest_cisco_csr_rest.py
+++ /dev/null
@@ -1,1358 +0,0 @@
-# Copyright 2014 Cisco Systems, Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-#TODO(pcm): Rename this file to remove the "no" prefix, once httmock is
-# approved and added to requirements.txt
-
-import random
-
-# TODO(pcm): Remove when update to requests-mock package. Comment out, if use
-# local copy of httmock.py source. Needed for PEP8.
-import httmock
-import requests
-
-from neutron.openstack.common import log as logging
-from neutron.services.vpn.device_drivers import (
- cisco_csr_rest_client as csr_client)
-from neutron.tests import base
-from neutron.tests.unit.services.vpn.device_drivers import (
- cisco_csr_mock as csr_request)
-# TODO(pcm) Uncomment to run w/local copy of httmock.py source. Remove when
-# update to requests-mock package.
-# from neutron.tests.unit.services.vpn.device_drivers import httmock
-
-
-LOG = logging.getLogger(__name__)
-# Enables debug logging to console
-if True:
- logging.CONF.set_override('debug', True)
- logging.setup('neutron')
-
-dummy_policy_id = 'dummy-ipsec-policy-id-name'
-
-
-# Note: Helper functions to test reuse of IDs.
-def generate_pre_shared_key_id():
- return random.randint(100, 200)
-
-
-def generate_ike_policy_id():
- return random.randint(200, 300)
-
-
-def generate_ipsec_policy_id():
- return random.randint(300, 400)
-
-
-class TestCsrLoginRestApi(base.BaseTestCase):
-
- """Test logging into CSR to obtain token-id."""
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrLoginRestApi, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def test_get_token(self):
- """Obtain the token and its expiration time."""
- with httmock.HTTMock(csr_request.token):
- self.assertTrue(self.csr.authenticate())
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertIsNotNone(self.csr.token)
-
- def test_unauthorized_token_request(self):
- """Negative test of invalid user/password."""
- self.csr.auth = ('stack', 'bogus')
- with httmock.HTTMock(csr_request.token_unauthorized):
- self.assertIsNone(self.csr.authenticate())
- self.assertEqual(requests.codes.UNAUTHORIZED, self.csr.status)
-
- def test_non_existent_host(self):
- """Negative test of request to non-existent host."""
- self.csr.host = 'wrong-host'
- self.csr.token = 'Set by some previously successful access'
- with httmock.HTTMock(csr_request.token_wrong_host):
- self.assertIsNone(self.csr.authenticate())
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
- self.assertIsNone(self.csr.token)
-
- def test_timeout_on_token_access(self):
- """Negative test of a timeout on a request."""
- with httmock.HTTMock(csr_request.token_timeout):
- self.assertIsNone(self.csr.authenticate())
- self.assertEqual(requests.codes.REQUEST_TIMEOUT, self.csr.status)
- self.assertIsNone(self.csr.token)
-
-
-class TestCsrGetRestApi(base.BaseTestCase):
-
- """Test CSR GET REST API."""
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrGetRestApi, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def test_valid_rest_gets(self):
- """Simple GET requests.
-
- First request will do a post to get token (login). Assumes
- that there are two interfaces on the CSR.
- """
-
- with httmock.HTTMock(csr_request.token,
- csr_request.normal_get):
- content = self.csr.get_request('global/host-name')
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertIn('host-name', content)
- self.assertNotEqual(None, content['host-name'])
-
- content = self.csr.get_request('global/local-users')
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertIn('users', content)
-
-
-class TestCsrPostRestApi(base.BaseTestCase):
-
- """Test CSR POST REST API."""
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrPostRestApi, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def test_post_requests(self):
- """Simple POST requests (repeatable).
-
- First request will do a post to get token (login). Assumes
- that there are two interfaces (Ge1 and Ge2) on the CSR.
- """
-
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- content = self.csr.post_request(
- 'interfaces/GigabitEthernet1/statistics',
- payload={'action': 'clear'})
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- self.assertIsNone(content)
- content = self.csr.post_request(
- 'interfaces/GigabitEthernet2/statistics',
- payload={'action': 'clear'})
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- self.assertIsNone(content)
-
- def test_post_with_location(self):
- """Create a user and verify that location returned."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- location = self.csr.post_request(
- 'global/local-users',
- payload={'username': 'test-user',
- 'password': 'pass12345',
- 'privilege': 15})
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('global/local-users/test-user', location)
-
- def test_post_missing_required_attribute(self):
- """Negative test of POST with missing mandatory info."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- self.csr.post_request('global/local-users',
- payload={'password': 'pass12345',
- 'privilege': 15})
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
-
- def test_post_invalid_attribute(self):
- """Negative test of POST with invalid info."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- self.csr.post_request('global/local-users',
- payload={'username': 'test-user',
- 'password': 'pass12345',
- 'privilege': 20})
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
-
- def test_post_already_exists(self):
- """Negative test of a duplicate POST.
-
- Uses the lower level _do_request() API to just perform the POST and
- obtain the response, without any error processing.
- """
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- location = self.csr._do_request(
- 'POST',
- 'global/local-users',
- payload={'username': 'test-user',
- 'password': 'pass12345',
- 'privilege': 15},
- more_headers=csr_client.HEADER_CONTENT_TYPE_JSON)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('global/local-users/test-user', location)
- with httmock.HTTMock(csr_request.token,
- csr_request.post_change_attempt):
- self.csr._do_request(
- 'POST',
- 'global/local-users',
- payload={'username': 'test-user',
- 'password': 'pass12345',
- 'privilege': 15},
- more_headers=csr_client.HEADER_CONTENT_TYPE_JSON)
- # Note: For local-user, a 404 error is returned. For
- # site-to-site connection a 400 is returned.
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
-
- def test_post_changing_value(self):
- """Negative test of a POST trying to change a value."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- location = self.csr.post_request(
- 'global/local-users',
- payload={'username': 'test-user',
- 'password': 'pass12345',
- 'privilege': 15})
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('global/local-users/test-user', location)
- with httmock.HTTMock(csr_request.token,
- csr_request.post_change_attempt):
- content = self.csr.post_request('global/local-users',
- payload={'username': 'test-user',
- 'password': 'changed',
- 'privilege': 15})
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
- expected = {u'error-code': -1,
- u'error-message': u'user test-user already exists'}
- self.assertDictContainsSubset(expected, content)
-
-
-class TestCsrPutRestApi(base.BaseTestCase):
-
- """Test CSR PUT REST API."""
-
- def _save_resources(self):
- with httmock.HTTMock(csr_request.token,
- csr_request.normal_get):
- details = self.csr.get_request('global/host-name')
- if self.csr.status != requests.codes.OK:
- self.fail("Unable to save original host name")
- self.original_host = details['host-name']
- details = self.csr.get_request('interfaces/GigabitEthernet1')
- if self.csr.status != requests.codes.OK:
- self.fail("Unable to save interface Ge1 description")
- self.original_if = details
- if details.get('description', ''):
- self.original_if['description'] = ''
- self.csr.token = None
-
- def _restore_resources(self, user, password):
- """Restore the host name and itnerface description.
-
- Must restore the user and password, so that authentication
- token can be obtained (as some tests corrupt auth info).
- Will also clear token, so that it gets a fresh token.
- """
-
- self.csr.auth = (user, password)
- self.csr.token = None
- with httmock.HTTMock(csr_request.token,
- csr_request.put):
- payload = {'host-name': self.original_host}
- self.csr.put_request('global/host-name', payload=payload)
- if self.csr.status != requests.codes.NO_CONTENT:
- self.fail("Unable to restore host name after test")
- payload = {'description': self.original_if['description'],
- 'if-name': self.original_if['if-name'],
- 'ip-address': self.original_if['ip-address'],
- 'subnet-mask': self.original_if['subnet-mask'],
- 'type': self.original_if['type']}
- self.csr.put_request('interfaces/GigabitEthernet1',
- payload=payload)
- if self.csr.status != requests.codes.NO_CONTENT:
- self.fail("Unable to restore I/F Ge1 description after test")
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- """Prepare for PUT API tests."""
- super(TestCsrPutRestApi, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- self._save_resources()
- self.addCleanup(self._restore_resources, 'stack', 'cisco')
-
- def test_put_requests(self):
- """Simple PUT requests (repeatable).
-
- First request will do a post to get token (login). Assumes
- that there are two interfaces on the CSR (Ge1 and Ge2).
- """
-
- with httmock.HTTMock(csr_request.token,
- csr_request.put,
- csr_request.normal_get):
- payload = {'host-name': 'TestHost'}
- content = self.csr.put_request('global/host-name',
- payload=payload)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- self.assertIsNone(content)
-
- payload = {'host-name': 'TestHost2'}
- content = self.csr.put_request('global/host-name',
- payload=payload)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- self.assertIsNone(content)
-
- def test_change_interface_description(self):
- """Test that interface description can be changed.
-
- This was a problem with an earlier version of the CSR image and is
- here to prevent regression.
- """
- with httmock.HTTMock(csr_request.token,
- csr_request.put,
- csr_request.normal_get):
- payload = {'description': u'Changed description',
- 'if-name': self.original_if['if-name'],
- 'ip-address': self.original_if['ip-address'],
- 'subnet-mask': self.original_if['subnet-mask'],
- 'type': self.original_if['type']}
- content = self.csr.put_request(
- 'interfaces/GigabitEthernet1', payload=payload)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- self.assertIsNone(content)
- content = self.csr.get_request('interfaces/GigabitEthernet1')
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertIn('description', content)
- self.assertEqual(u'Changed description',
- content['description'])
-
- def ignore_test_change_to_empty_interface_description(self):
- """Test that interface description can be changed to empty string.
-
- This is a problem in the current version of the CSR image, which
- rejects the change with a 400 error. This test is here to prevent
- a regression (once it is fixed) Note that there is code in the
- test setup to change the description to a non-empty string to
- avoid failures in other tests.
- """
- with httmock.HTTMock(csr_request.token,
- csr_request.put,
- csr_request.normal_get):
- payload = {'description': '',
- 'if-name': self.original_if['if-name'],
- 'ip-address': self.original_if['ip-address'],
- 'subnet-mask': self.original_if['subnet-mask'],
- 'type': self.original_if['type']}
- content = self.csr.put_request(
- 'interfaces/GigabitEthernet1', payload=payload)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- self.assertIsNone(content)
- content = self.csr.get_request('interfaces/GigabitEthernet1')
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertIn('description', content)
- self.assertEqual('', content['description'])
-
-
-class TestCsrDeleteRestApi(base.BaseTestCase):
-
- """Test CSR DELETE REST API."""
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrDeleteRestApi, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def _make_dummy_user(self):
- """Create a user that will be later deleted."""
- self.csr.post_request('global/local-users',
- payload={'username': 'dummy',
- 'password': 'dummy',
- 'privilege': 15})
- self.assertEqual(requests.codes.CREATED, self.csr.status)
-
- def test_delete_requests(self):
- """Simple DELETE requests (creating entry first)."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.delete):
- self._make_dummy_user()
- self.csr.token = None # Force login
- self.csr.delete_request('global/local-users/dummy')
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- # Delete again, but without logging in this time
- self._make_dummy_user()
- self.csr.delete_request('global/local-users/dummy')
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
-
- def test_delete_non_existent_entry(self):
- """Negative test of trying to delete a non-existent user."""
- with httmock.HTTMock(csr_request.token,
- csr_request.delete_unknown):
- content = self.csr.delete_request('global/local-users/unknown')
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
- expected = {u'error-code': -1,
- u'error-message': u'user unknown not found'}
- self.assertDictContainsSubset(expected, content)
-
- def test_delete_not_allowed(self):
- """Negative test of trying to delete the host-name."""
- with httmock.HTTMock(csr_request.token,
- csr_request.delete_not_allowed):
- self.csr.delete_request('global/host-name')
- self.assertEqual(requests.codes.METHOD_NOT_ALLOWED,
- self.csr.status)
-
-
-class TestCsrRestApiFailures(base.BaseTestCase):
-
- """Test failure cases common for all REST APIs.
-
- Uses the lower level _do_request() to just perform the operation and get
- the result, without any error handling.
- """
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=0.1):
- super(TestCsrRestApiFailures, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def test_request_for_non_existent_resource(self):
- """Negative test of non-existent resource on REST request."""
- with httmock.HTTMock(csr_request.token,
- csr_request.no_such_resource):
- self.csr.post_request('no/such/request')
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
- # The result is HTTP 404 message, so no error content to check
-
- def test_timeout_during_request(self):
- """Negative test of timeout during REST request."""
- with httmock.HTTMock(csr_request.token,
- csr_request.timeout):
- self.csr._do_request('GET', 'global/host-name')
- self.assertEqual(requests.codes.REQUEST_TIMEOUT, self.csr.status)
-
- def test_token_expired_on_request(self):
- """Token expired before trying a REST request.
-
- The mock is configured to return a 401 error on the first
- attempt to reference the host name. Simulate expiration of
- token by changing it.
- """
-
- with httmock.HTTMock(csr_request.token,
- csr_request.expired_request,
- csr_request.normal_get):
- self.csr.token = '123' # These are 44 characters, so won't match
- content = self.csr._do_request('GET', 'global/host-name')
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertIn('host-name', content)
- self.assertNotEqual(None, content['host-name'])
-
- def test_failed_to_obtain_token_for_request(self):
- """Negative test of unauthorized user for REST request."""
- self.csr.auth = ('stack', 'bogus')
- with httmock.HTTMock(csr_request.token_unauthorized):
- self.csr._do_request('GET', 'global/host-name')
- self.assertEqual(requests.codes.UNAUTHORIZED, self.csr.status)
-
-
-class TestCsrRestIkePolicyCreate(base.BaseTestCase):
-
- """Test IKE policy create REST requests."""
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrRestIkePolicyCreate, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def test_create_delete_ike_policy(self):
- """Create and then delete IKE policy."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- policy_id = '2'
- policy_info = {u'priority-id': u'%s' % policy_id,
- u'encryption': u'aes256',
- u'hash': u'sha',
- u'dhGroup': 5,
- u'lifetime': 3600}
- location = self.csr.create_ike_policy(policy_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ike/policies/%s' % policy_id, location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_policy = {u'kind': u'object#ike-policy',
- u'version': u'v1',
- u'local-auth-method': u'pre-share'}
- expected_policy.update(policy_info)
- self.assertEqual(expected_policy, content)
- # Now delete and verify the IKE policy is gone
- with httmock.HTTMock(csr_request.token,
- csr_request.delete,
- csr_request.no_such_resource):
- self.csr.delete_ike_policy(policy_id)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
-
- def test_create_ike_policy_with_defaults(self):
- """Create IKE policy using defaults for all optional values."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.get_defaults):
- policy_id = '2'
- policy_info = {u'priority-id': u'%s' % policy_id}
- location = self.csr.create_ike_policy(policy_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ike/policies/%s' % policy_id, location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_policy = {u'kind': u'object#ike-policy',
- u'version': u'v1',
- u'encryption': u'des',
- u'hash': u'sha',
- u'dhGroup': 1,
- u'lifetime': 86400,
- # Lower level sets this, but it is the default
- u'local-auth-method': u'pre-share'}
- expected_policy.update(policy_info)
- self.assertEqual(expected_policy, content)
-
- def test_create_duplicate_ike_policy(self):
- """Negative test of trying to create a duplicate IKE policy."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- policy_id = '2'
- policy_info = {u'priority-id': u'%s' % policy_id,
- u'encryption': u'aes',
- u'hash': u'sha',
- u'dhGroup': 5,
- u'lifetime': 3600}
- location = self.csr.create_ike_policy(policy_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ike/policies/%s' % policy_id, location)
- with httmock.HTTMock(csr_request.token,
- csr_request.post_duplicate):
- location = self.csr.create_ike_policy(policy_info)
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
- expected = {u'error-code': -1,
- u'error-message': u'policy 2 exist, not allow to '
- u'update policy using POST method'}
- self.assertDictContainsSubset(expected, location)
-
-
-class TestCsrRestIPSecPolicyCreate(base.BaseTestCase):
-
- """Test IPSec policy create REST requests."""
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrRestIPSecPolicyCreate, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def test_create_delete_ipsec_policy(self):
- """Create and then delete IPSec policy."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- policy_id = '123'
- policy_info = {
- u'policy-id': u'%s' % policy_id,
- u'protection-suite': {
- u'esp-encryption': u'esp-256-aes',
- u'esp-authentication': u'esp-sha-hmac',
- u'ah': u'ah-sha-hmac',
- },
- u'lifetime-sec': 120,
- u'pfs': u'group5',
- u'anti-replay-window-size': u'disable'
- }
- location = self.csr.create_ipsec_policy(policy_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ipsec/policies/%s' % policy_id, location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_policy = {u'kind': u'object#ipsec-policy',
- u'mode': u'tunnel',
- u'lifetime-kb': 4608000,
- u'idle-time': None}
- expected_policy.update(policy_info)
- # CSR will respond with capitalized value
- expected_policy[u'anti-replay-window-size'] = u'Disable'
- self.assertEqual(expected_policy, content)
- # Now delete and verify the IPSec policy is gone
- with httmock.HTTMock(csr_request.token,
- csr_request.delete,
- csr_request.no_such_resource):
- self.csr.delete_ipsec_policy(policy_id)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
-
- def test_create_ipsec_policy_with_defaults(self):
- """Create IPSec policy with default for all optional values."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.get_defaults):
- policy_id = '123'
- policy_info = {
- u'policy-id': u'%s' % policy_id,
- }
- location = self.csr.create_ipsec_policy(policy_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ipsec/policies/%s' % policy_id, location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_policy = {u'kind': u'object#ipsec-policy',
- u'mode': u'tunnel',
- u'protection-suite': {},
- u'lifetime-sec': 3600,
- u'pfs': u'Disable',
- u'anti-replay-window-size': u'None',
- u'lifetime-kb': 4608000,
- u'idle-time': None}
- expected_policy.update(policy_info)
- self.assertEqual(expected_policy, content)
-
- def test_create_ipsec_policy_with_uuid(self):
- """Create IPSec policy using UUID for id."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- policy_info = {
- u'policy-id': u'%s' % dummy_policy_id,
- u'protection-suite': {
- u'esp-encryption': u'esp-256-aes',
- u'esp-authentication': u'esp-sha-hmac',
- u'ah': u'ah-sha-hmac',
- },
- u'lifetime-sec': 120,
- u'pfs': u'group5',
- u'anti-replay-window-size': u'disable'
- }
- location = self.csr.create_ipsec_policy(policy_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ipsec/policies/%s' % dummy_policy_id,
- location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_policy = {u'kind': u'object#ipsec-policy',
- u'mode': u'tunnel',
- u'lifetime-kb': 4608000,
- u'idle-time': None}
- expected_policy.update(policy_info)
- # CSR will respond with capitalized value
- expected_policy[u'anti-replay-window-size'] = u'Disable'
- self.assertEqual(expected_policy, content)
-
- def test_create_ipsec_policy_without_ah(self):
- """Create IPSec policy."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.get_no_ah):
- policy_id = '10'
- policy_info = {
- u'policy-id': u'%s' % policy_id,
- u'protection-suite': {
- u'esp-encryption': u'esp-aes',
- u'esp-authentication': u'esp-sha-hmac',
- },
- u'lifetime-sec': 120,
- u'pfs': u'group5',
- u'anti-replay-window-size': u'128'
- }
- location = self.csr.create_ipsec_policy(policy_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ipsec/policies/%s' % policy_id, location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_policy = {u'kind': u'object#ipsec-policy',
- u'mode': u'tunnel',
- u'lifetime-kb': 4608000,
- u'idle-time': None}
- expected_policy.update(policy_info)
- self.assertEqual(expected_policy, content)
-
- def test_invalid_ipsec_policy_lifetime(self):
- """Failure test of IPSec policy with unsupported lifetime."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post_bad_lifetime):
- policy_id = '123'
- policy_info = {
- u'policy-id': u'%s' % policy_id,
- u'protection-suite': {
- u'esp-encryption': u'esp-aes',
- u'esp-authentication': u'esp-sha-hmac',
- u'ah': u'ah-sha-hmac',
- },
- u'lifetime-sec': 119,
- u'pfs': u'group5',
- u'anti-replay-window-size': u'128'
- }
- self.csr.create_ipsec_policy(policy_info)
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
-
- def test_create_ipsec_policy_with_invalid_name(self):
- """Failure test of creating IPSec policy with name too long."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post_bad_name,
- csr_request.get_defaults):
- policy_id = 'policy-name-is-too-long-32-chars'
- policy_info = {
- u'policy-id': u'%s' % policy_id,
- }
- self.csr.create_ipsec_policy(policy_info)
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
-
-
-class TestCsrRestPreSharedKeyCreate(base.BaseTestCase):
-
- """Test Pre-shared key (PSK) create REST requests."""
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrRestPreSharedKeyCreate, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def test_create_delete_pre_shared_key(self):
- """Create and then delete a keyring entry for pre-shared key."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- psk_id = '5'
- psk_info = {u'keyring-name': u'%s' % psk_id,
- u'pre-shared-key-list': [
- {u'key': u'super-secret',
- u'encrypted': False,
- u'peer-address': u'10.10.10.20/24'}
- ]}
- location = self.csr.create_pre_shared_key(psk_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ike/keyrings/%s' % psk_id, location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_policy = {u'kind': u'object#ike-keyring'}
- expected_policy.update(psk_info)
- # Note: the peer CIDR is returned as an IP and mask
- expected_policy[u'pre-shared-key-list'][0][u'peer-address'] = (
- u'10.10.10.20 255.255.255.0')
- self.assertEqual(expected_policy, content)
- # Now delete and verify pre-shared key is gone
- with httmock.HTTMock(csr_request.token,
- csr_request.delete,
- csr_request.no_such_resource):
- self.csr.delete_pre_shared_key(psk_id)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
-
- def test_create_pre_shared_key_with_fqdn_peer(self):
- """Create pre-shared key using FQDN for peer address."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.get_fqdn):
- psk_id = '5'
- psk_info = {u'keyring-name': u'%s' % psk_id,
- u'pre-shared-key-list': [
- {u'key': u'super-secret',
- u'encrypted': False,
- u'peer-address': u'cisco.com'}
- ]}
- location = self.csr.create_pre_shared_key(psk_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ike/keyrings/%s' % psk_id, location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_policy = {u'kind': u'object#ike-keyring'}
- expected_policy.update(psk_info)
- self.assertEqual(expected_policy, content)
-
- def test_create_pre_shared_key_with_duplicate_peer_address(self):
- """Negative test of creating a second pre-shared key with same peer."""
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- psk_id = '5'
- psk_info = {u'keyring-name': u'%s' % psk_id,
- u'pre-shared-key-list': [
- {u'key': u'super-secret',
- u'encrypted': False,
- u'peer-address': u'10.10.10.20/24'}
- ]}
- location = self.csr.create_pre_shared_key(psk_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/ike/keyrings/%s' % psk_id, location)
- with httmock.HTTMock(csr_request.token,
- csr_request.post_duplicate):
- psk_id = u'6'
- another_psk_info = {u'keyring-name': psk_id,
- u'pre-shared-key-list': [
- {u'key': u'abc123def',
- u'encrypted': False,
- u'peer-address': u'10.10.10.20/24'}
- ]}
- self.csr.create_ike_policy(another_psk_info)
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
-
-
-class TestCsrRestIPSecConnectionCreate(base.BaseTestCase):
-
- """Test IPSec site-to-site connection REST requests.
-
- This requires us to have first created an IKE policy, IPSec policy,
- and pre-shared key, so it's more of an itegration test, when used
- with a real CSR (as we can't mock out these pre-conditions.
- """
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrRestIPSecConnectionCreate, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def _make_psk_for_test(self):
- psk_id = generate_pre_shared_key_id()
- self._remove_resource_for_test(self.csr.delete_pre_shared_key,
- psk_id)
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- psk_info = {u'keyring-name': u'%d' % psk_id,
- u'pre-shared-key-list': [
- {u'key': u'super-secret',
- u'encrypted': False,
- u'peer-address': u'10.10.10.20/24'}
- ]}
- self.csr.create_pre_shared_key(psk_info)
- if self.csr.status != requests.codes.CREATED:
- self.fail("Unable to create PSK for test case")
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_pre_shared_key, psk_id)
- return psk_id
-
- def _make_ike_policy_for_test(self):
- policy_id = generate_ike_policy_id()
- self._remove_resource_for_test(self.csr.delete_ike_policy,
- policy_id)
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- policy_info = {u'priority-id': u'%d' % policy_id,
- u'encryption': u'aes',
- u'hash': u'sha',
- u'dhGroup': 5,
- u'lifetime': 3600}
- self.csr.create_ike_policy(policy_info)
- if self.csr.status != requests.codes.CREATED:
- self.fail("Unable to create IKE policy for test case")
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ike_policy, policy_id)
- return policy_id
-
- def _make_ipsec_policy_for_test(self):
- policy_id = generate_ipsec_policy_id()
- self._remove_resource_for_test(self.csr.delete_ipsec_policy,
- policy_id)
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- policy_info = {
- u'policy-id': u'%d' % policy_id,
- u'protection-suite': {
- u'esp-encryption': u'esp-aes',
- u'esp-authentication': u'esp-sha-hmac',
- u'ah': u'ah-sha-hmac',
- },
- u'lifetime-sec': 120,
- u'pfs': u'group5',
- u'anti-replay-window-size': u'disable'
- }
- self.csr.create_ipsec_policy(policy_info)
- if self.csr.status != requests.codes.CREATED:
- self.fail("Unable to create IPSec policy for test case")
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_policy, policy_id)
- return policy_id
-
- def _remove_resource_for_test(self, delete_resource, resource_id):
- with httmock.HTTMock(csr_request.token,
- csr_request.delete):
- delete_resource(resource_id)
-
- def _prepare_for_site_conn_create(self, skip_psk=False, skip_ike=False,
- skip_ipsec=False):
- """Create the policies and PSK so can then create site conn."""
- if not skip_psk:
- self._make_psk_for_test()
- if not skip_ike:
- self._make_ike_policy_for_test()
- if not skip_ipsec:
- ipsec_policy_id = self._make_ipsec_policy_for_test()
- else:
- ipsec_policy_id = generate_ipsec_policy_id()
- # Note: Use same ID number for tunnel and IPSec policy, so that when
- # GET tunnel info, the mocks can infer the IPSec policy ID from the
- # tunnel number.
- return (ipsec_policy_id, ipsec_policy_id)
-
- def test_create_delete_ipsec_connection(self):
- """Create and then delete an IPSec connection."""
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create()
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- connection_info = {
- u'vpn-interface-name': u'Tunnel%d' % tunnel_id,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'mtu': 1500,
- u'local-device': {u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- location = self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- 'Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id,
- location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_connection = {u'kind': u'object#vpn-site-to-site',
- u'ike-profile-id': None,
- u'mtu': 1500,
- u'ip-version': u'ipv4'}
- expected_connection.update(connection_info)
- self.assertEqual(expected_connection, content)
- # Now delete and verify that site-to-site connection is gone
- with httmock.HTTMock(csr_request.token,
- csr_request.delete,
- csr_request.no_such_resource):
- # Only delete connection. Cleanup will take care of prerequisites
- self.csr.delete_ipsec_connection('Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
-
- def test_create_ipsec_connection_with_no_tunnel_subnet(self):
- """Create an IPSec connection without an IP address on tunnel."""
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create()
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.get_unnumbered):
- connection_info = {
- u'vpn-interface-name': u'Tunnel%d' % tunnel_id,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'local-device': {u'ip-address': u'GigabitEthernet3',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- location = self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- 'Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id,
- location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_connection = {u'kind': u'object#vpn-site-to-site',
- u'ike-profile-id': None,
- u'mtu': 1500,
- u'ip-version': u'ipv4'}
- expected_connection.update(connection_info)
- self.assertEqual(expected_connection, content)
-
- def test_create_ipsec_connection_no_pre_shared_key(self):
- """Test of connection create without associated pre-shared key.
-
- The CSR will create the connection, but will not be able to pass
- traffic without the pre-shared key.
- """
-
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create(
- skip_psk=True)
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- connection_info = {
- u'vpn-interface-name': u'Tunnel%d' % tunnel_id,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'mtu': 1500,
- u'local-device': {u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- location = self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- 'Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id,
- location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_connection = {u'kind': u'object#vpn-site-to-site',
- u'ike-profile-id': None,
- u'mtu': 1500,
- u'ip-version': u'ipv4'}
- expected_connection.update(connection_info)
- self.assertEqual(expected_connection, content)
-
- def test_create_ipsec_connection_with_default_ike_policy(self):
- """Test of connection create without IKE policy (uses default).
-
- Without an IKE policy, the CSR will use a built-in default IKE
- policy setting for the connection.
- """
-
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create(
- skip_ike=True)
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- connection_info = {
- u'vpn-interface-name': u'Tunnel%d' % tunnel_id,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'mtu': 1500,
- u'local-device': {u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- location = self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- 'Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id,
- location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_connection = {u'kind': u'object#vpn-site-to-site',
- u'ike-profile-id': None,
- u'mtu': 1500,
- u'ip-version': u'ipv4'}
- expected_connection.update(connection_info)
- self.assertEqual(expected_connection, content)
-
- def test_set_ipsec_connection_admin_state_changes(self):
- """Create IPSec connection in admin down state."""
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create()
- tunnel = u'Tunnel%d' % tunnel_id
- with httmock.HTTMock(csr_request.token,
- csr_request.post):
- connection_info = {
- u'vpn-interface-name': tunnel,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'mtu': 1500,
- u'local-device': {u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- location = self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- tunnel)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/site-to-site/%s' % tunnel, location)
- state_uri = location + "/state"
- # Note: When created, the tunnel will be in admin 'up' state
- # Note: Line protocol state will be down, unless have an active conn.
- expected_state = {u'kind': u'object#vpn-site-to-site-state',
- u'vpn-interface-name': tunnel,
- u'line-protocol-state': u'down',
- u'enabled': False}
- with httmock.HTTMock(csr_request.put,
- csr_request.get_admin_down):
- self.csr.set_ipsec_connection_state(tunnel, admin_up=False)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- content = self.csr.get_request(state_uri, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertEqual(expected_state, content)
-
- with httmock.HTTMock(csr_request.put,
- csr_request.get_admin_up):
- self.csr.set_ipsec_connection_state(tunnel, admin_up=True)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- content = self.csr.get_request(state_uri, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_state[u'enabled'] = True
- self.assertEqual(expected_state, content)
-
- def test_create_ipsec_connection_missing_ipsec_policy(self):
- """Negative test of connection create without IPSec policy."""
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create(
- skip_ipsec=True)
- with httmock.HTTMock(
- csr_request.token,
- csr_request.post_missing_ipsec_policy):
- connection_info = {
- u'vpn-interface-name': u'Tunnel%d' % tunnel_id,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'local-device': {u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- 'Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
-
- def _determine_conflicting_ip(self):
- with httmock.HTTMock(csr_request.token,
- csr_request.get_local_ip):
- details = self.csr.get_request('interfaces/GigabitEthernet3')
- if self.csr.status != requests.codes.OK:
- self.fail("Unable to obtain interface GigabitEthernet3's IP")
- if_ip = details.get('ip-address')
- if not if_ip:
- self.fail("No IP address for GigabitEthernet3 interface")
- return '.'.join(if_ip.split('.')[:3]) + '.10'
-
- def test_create_ipsec_connection_conficting_tunnel_ip(self):
- """Negative test of connection create with conflicting tunnel IP.
-
- Find out the IP of a local interface (GigabitEthernet3) and create an
- IP that is on the same subnet. Note: this interface needs to be up.
- """
-
- conflicting_ip = self._determine_conflicting_ip()
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create()
- with httmock.HTTMock(csr_request.token,
- csr_request.post_bad_ip):
- connection_info = {
- u'vpn-interface-name': u'Tunnel%d' % tunnel_id,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'local-device': {u'ip-address': u'%s/24' % conflicting_ip,
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- 'Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
-
- def test_create_ipsec_connection_with_max_mtu(self):
- """Create an IPSec connection with max MTU value."""
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create()
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.get_mtu):
- connection_info = {
- u'vpn-interface-name': u'Tunnel%d' % tunnel_id,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'mtu': 9192,
- u'local-device': {u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- location = self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- 'Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id,
- location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_connection = {u'kind': u'object#vpn-site-to-site',
- u'ike-profile-id': None,
- u'ip-version': u'ipv4'}
- expected_connection.update(connection_info)
- self.assertEqual(expected_connection, content)
-
- def test_create_ipsec_connection_with_bad_mtu(self):
- """Negative test of connection create with unsupported MTU value."""
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create()
- with httmock.HTTMock(csr_request.token,
- csr_request.post_bad_mtu):
- connection_info = {
- u'vpn-interface-name': u'Tunnel%d' % tunnel_id,
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'mtu': 9193,
- u'local-device': {u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- 'Tunnel%d' % tunnel_id)
- self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
-
- def test_status_when_no_tunnels_exist(self):
- """Get status, when there are no tunnels."""
- with httmock.HTTMock(csr_request.token,
- csr_request.get_none):
- tunnels = self.csr.read_tunnel_statuses()
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertEqual([], tunnels)
-
- def test_status_for_one_tunnel(self):
- """Get status of one tunnel."""
- # Create the IPsec site-to-site connection first
- tunnel_id, ipsec_policy_id = self._prepare_for_site_conn_create()
- tunnel_id = 123 # Must hard code to work with mock
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- connection_info = {
- u'vpn-interface-name': u'Tunnel123',
- u'ipsec-policy-id': u'%d' % ipsec_policy_id,
- u'local-device': {u'ip-address': u'10.3.0.1/24',
- u'tunnel-ip-address': u'10.10.10.10'},
- u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
- }
- location = self.csr.create_ipsec_connection(connection_info)
- self.addCleanup(self._remove_resource_for_test,
- self.csr.delete_ipsec_connection,
- u'Tunnel123')
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('vpn-svc/site-to-site/Tunnel%d' % tunnel_id,
- location)
- with httmock.HTTMock(csr_request.token,
- csr_request.normal_get):
- tunnels = self.csr.read_tunnel_statuses()
- self.assertEqual(requests.codes.OK, self.csr.status)
- self.assertEqual([(u'Tunnel123', u'DOWN-NEGOTIATING'), ], tunnels)
-
-
-class TestCsrRestIkeKeepaliveCreate(base.BaseTestCase):
-
- """Test IKE keepalive REST requests.
-
- Note: On the Cisco CSR, the IKE keepalive for v1 is a global configuration
- that applies to all VPN tunnels to specify Dead Peer Detection information.
- As a result, this REST API is not used in the OpenStack device driver, and
- the keepalive will default to zero (disabled).
- """
-
- def _save_dpd_info(self):
- with httmock.HTTMock(csr_request.token,
- csr_request.normal_get):
- details = self.csr.get_request('vpn-svc/ike/keepalive')
- if self.csr.status == requests.codes.OK:
- self.dpd = details
- self.addCleanup(self._restore_dpd_info)
- elif self.csr.status != requests.codes.NOT_FOUND:
- self.fail("Unable to save original DPD info")
-
- def _restore_dpd_info(self):
- with httmock.HTTMock(csr_request.token,
- csr_request.put):
- payload = {'interval': self.dpd['interval'],
- 'retry': self.dpd['retry']}
- self.csr.put_request('vpn-svc/ike/keepalive', payload=payload)
- if self.csr.status != requests.codes.NO_CONTENT:
- self.fail("Unable to restore DPD info after test")
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrRestIkeKeepaliveCreate, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
- self._save_dpd_info()
- self.csr.token = None
-
- def test_configure_ike_keepalive(self):
- """Set IKE keep-alive (aka Dead Peer Detection) for the CSR."""
- with httmock.HTTMock(csr_request.token,
- csr_request.put,
- csr_request.normal_get):
- keepalive_info = {'interval': 60, 'retry': 4}
- self.csr.configure_ike_keepalive(keepalive_info)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- content = self.csr.get_request('vpn-svc/ike/keepalive')
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected = {'periodic': False}
- expected.update(keepalive_info)
- self.assertDictContainsSubset(expected, content)
-
- def test_disable_ike_keepalive(self):
- """Disable IKE keep-alive (aka Dead Peer Detection) for the CSR."""
- with httmock.HTTMock(csr_request.token,
- csr_request.delete,
- csr_request.put,
- csr_request.get_not_configured):
- keepalive_info = {'interval': 0, 'retry': 4}
- self.csr.configure_ike_keepalive(keepalive_info)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
-
-
-class TestCsrRestStaticRoute(base.BaseTestCase):
-
- """Test static route REST requests.
-
- A static route is added for the peer's private network. Would create
- a route for each of the peer CIDRs specified for the VPN connection.
- """
-
- def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
- super(TestCsrRestStaticRoute, self).setUp()
- info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
- 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
- self.csr = csr_client.CsrRestClient(info)
-
- def test_create_delete_static_route(self):
- """Create and then delete a static route for the tunnel."""
- cidr = u'10.1.0.0/24'
- interface = u'GigabitEthernet1'
- expected_id = '10.1.0.0_24_GigabitEthernet1'
- with httmock.HTTMock(csr_request.token,
- csr_request.post,
- csr_request.normal_get):
- route_info = {u'destination-network': cidr,
- u'outgoing-interface': interface}
- location = self.csr.create_static_route(route_info)
- self.assertEqual(requests.codes.CREATED, self.csr.status)
- self.assertIn('routing-svc/static-routes/%s' % expected_id,
- location)
- # Check the hard-coded items that get set as well...
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.OK, self.csr.status)
- expected_route = {u'kind': u'object#static-route',
- u'next-hop-router': None,
- u'admin-distance': 1}
- expected_route.update(route_info)
- self.assertEqual(expected_route, content)
- # Now delete and verify that static route is gone
- with httmock.HTTMock(csr_request.token,
- csr_request.delete,
- csr_request.no_such_resource):
- route_id = csr_client.make_route_id(cidr, interface)
- self.csr.delete_static_route(route_id)
- self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
- content = self.csr.get_request(location, full_url=True)
- self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
diff --git a/neutron/tests/unit/services/vpn/device_drivers/test_cisco_csr_rest.py b/neutron/tests/unit/services/vpn/device_drivers/test_cisco_csr_rest.py
new file mode 100644
index 0000000000..b7092af457
--- /dev/null
+++ b/neutron/tests/unit/services/vpn/device_drivers/test_cisco_csr_rest.py
@@ -0,0 +1,1626 @@
+# Copyright 2014 Cisco Systems, Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+import random
+import re
+
+import requests
+from requests import exceptions as r_exc
+from requests_mock.contrib import fixture as mock_fixture
+
+from neutron.services.vpn.device_drivers import (
+ cisco_csr_rest_client as csr_client)
+from neutron.tests import base
+
+
+dummy_policy_id = 'dummy-ipsec-policy-id-name'
+BASE_URL = 'https://%s:55443/api/v1/'
+LOCAL_URL = 'https://localhost:55443/api/v1/'
+
+URI_HOSTNAME = 'global/host-name'
+URI_USERS = 'global/local-users'
+URI_AUTH = 'auth/token-services'
+URI_INTERFACE_GE1 = 'interfaces/GigabitEthernet1'
+URI_PSK = 'vpn-svc/ike/keyrings'
+URI_PSK_ID = URI_PSK + '/%s'
+URI_IKE_POLICY = 'vpn-svc/ike/policies'
+URI_IKE_POLICY_ID = URI_IKE_POLICY + '/%s'
+URI_IPSEC_POLICY = 'vpn-svc/ipsec/policies'
+URI_IPSEC_POLICY_ID = URI_IPSEC_POLICY + '/%s'
+URI_IPSEC_CONN = 'vpn-svc/site-to-site'
+URI_IPSEC_CONN_ID = URI_IPSEC_CONN + '/%s'
+URI_KEEPALIVE = 'vpn-svc/ike/keepalive'
+URI_ROUTES = 'routing-svc/static-routes'
+URI_ROUTES_ID = URI_ROUTES + '/%s'
+URI_SESSIONS = 'vpn-svc/site-to-site/active/sessions'
+
+
+# Note: Helper functions to test reuse of IDs.
+def generate_pre_shared_key_id():
+ return random.randint(100, 200)
+
+
+def generate_ike_policy_id():
+ return random.randint(200, 300)
+
+
+def generate_ipsec_policy_id():
+ return random.randint(300, 400)
+
+
+class CiscoCsrBaseTestCase(base.BaseTestCase):
+
+ """Helper methods to register mock intercepts - used by child classes."""
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ super(CiscoCsrBaseTestCase, self).setUp()
+ self.base_url = BASE_URL % host
+ self.requests = self.useFixture(mock_fixture.Fixture())
+ info = {'rest_mgmt_ip': host, 'tunnel_ip': tunnel_ip,
+ 'username': 'stack', 'password': 'cisco', 'timeout': timeout}
+ self.csr = csr_client.CsrRestClient(info)
+
+ def _register_local_get(self, uri, json=None,
+ result_code=requests.codes.OK):
+ self.requests.register_uri(
+ 'GET',
+ LOCAL_URL + uri,
+ status_code=result_code,
+ json=json)
+
+ def _register_local_post(self, uri, resource_id,
+ result_code=requests.codes.CREATED):
+ self.requests.register_uri(
+ 'POST',
+ LOCAL_URL + uri,
+ status_code=result_code,
+ headers={'location': LOCAL_URL + uri + '/' + str(resource_id)})
+
+ def _register_local_delete(self, uri, resource_id, json=None,
+ result_code=requests.codes.NO_CONTENT):
+ self.requests.register_uri(
+ 'DELETE',
+ LOCAL_URL + uri + '/' + str(resource_id),
+ status_code=result_code,
+ json=json)
+
+ def _register_local_delete_by_id(self, resource_id,
+ result_code=requests.codes.NO_CONTENT):
+ local_resource_re = re.compile(LOCAL_URL + '.+%s$' % resource_id)
+ self.requests.register_uri(
+ 'DELETE',
+ local_resource_re,
+ status_code=result_code)
+
+ def _register_local_put(self, uri, resource_id,
+ result_code=requests.codes.NO_CONTENT):
+ self.requests.register_uri('PUT',
+ LOCAL_URL + uri + '/' + resource_id,
+ status_code=result_code)
+
+ def _register_local_get_not_found(self, uri, resource_id,
+ result_code=requests.codes.NOT_FOUND):
+ self.requests.register_uri(
+ 'GET',
+ LOCAL_URL + uri + '/' + str(resource_id),
+ status_code=result_code)
+
+ def _helper_register_auth_request(self):
+ self.requests.register_uri('POST',
+ LOCAL_URL + URI_AUTH,
+ status_code=requests.codes.OK,
+ json={'token-id': 'dummy-token'})
+
+ def _helper_register_psk_post(self, psk_id):
+ self._register_local_post(URI_PSK, psk_id)
+
+ def _helper_register_ike_policy_post(self, policy_id):
+ self._register_local_post(URI_IKE_POLICY, policy_id)
+
+ def _helper_register_ipsec_policy_post(self, policy_id):
+ self._register_local_post(URI_IPSEC_POLICY, policy_id)
+
+ def _helper_register_tunnel_post(self, tunnel):
+ self._register_local_post(URI_IPSEC_CONN, tunnel)
+
+
+class TestCsrLoginRestApi(CiscoCsrBaseTestCase):
+
+ """Test logging into CSR to obtain token-id."""
+
+ def test_get_token(self):
+ """Obtain the token and its expiration time."""
+ self._helper_register_auth_request()
+ self.assertTrue(self.csr.authenticate())
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertIsNotNone(self.csr.token)
+
+ def test_unauthorized_token_request(self):
+ """Negative test of invalid user/password."""
+ self.requests.register_uri('POST',
+ LOCAL_URL + URI_AUTH,
+ status_code=requests.codes.UNAUTHORIZED)
+ self.csr.auth = ('stack', 'bogus')
+ self.assertIsNone(self.csr.authenticate())
+ self.assertEqual(requests.codes.UNAUTHORIZED, self.csr.status)
+
+ def _simulate_wrong_host(self, request):
+ if 'wrong-host' in request.url:
+ raise r_exc.ConnectionError()
+
+ def test_non_existent_host(self):
+ """Negative test of request to non-existent host."""
+ self.requests.add_matcher(self._simulate_wrong_host)
+ self.csr.host = 'wrong-host'
+ self.csr.token = 'Set by some previously successful access'
+ self.assertIsNone(self.csr.authenticate())
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+ self.assertIsNone(self.csr.token)
+
+ def _simulate_token_timeout(self, request):
+ raise r_exc.Timeout()
+
+ def test_timeout_on_token_access(self):
+ """Negative test of a timeout on a request."""
+ self.requests.add_matcher(self._simulate_token_timeout)
+ self.assertIsNone(self.csr.authenticate())
+ self.assertEqual(requests.codes.REQUEST_TIMEOUT, self.csr.status)
+ self.assertIsNone(self.csr.token)
+
+
+class TestCsrGetRestApi(CiscoCsrBaseTestCase):
+
+ """Test CSR GET REST API."""
+
+ def test_valid_rest_gets(self):
+ """Simple GET requests.
+
+ First request will do a post to get token (login). Assumes
+ that there are two interfaces on the CSR.
+ """
+
+ self._helper_register_auth_request()
+ self._register_local_get(URI_HOSTNAME,
+ json={u'kind': u'object#host-name',
+ u'host-name': u'Router'})
+ self._register_local_get(URI_USERS,
+ json={u'kind': u'collection#local-user',
+ u'users': ['peter', 'paul', 'mary']})
+
+ actual = self.csr.get_request(URI_HOSTNAME)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertIn('host-name', actual)
+ self.assertIsNotNone(actual['host-name'])
+
+ actual = self.csr.get_request(URI_USERS)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertIn('users', actual)
+
+
+class TestCsrPostRestApi(CiscoCsrBaseTestCase):
+
+ """Test CSR POST REST API."""
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Setup for each test in this suite.
+
+ Each test case will have a normal authentication mock response
+ registered here, although they may replace it, as needed.
+ """
+ super(TestCsrPostRestApi, self).setUp(host, tunnel_ip, timeout)
+ self._helper_register_auth_request()
+
+ def test_post_requests(self):
+ """Simple POST requests (repeatable).
+
+ First request will do a post to get token (login). Assumes
+ that there are two interfaces (Ge1 and Ge2) on the CSR.
+ """
+
+ interface_re = re.compile('https://localhost:55443/.*/interfaces/'
+ 'GigabitEthernet\d/statistics')
+ self.requests.register_uri('POST',
+ interface_re,
+ status_code=requests.codes.NO_CONTENT)
+
+ actual = self.csr.post_request(
+ 'interfaces/GigabitEthernet1/statistics',
+ payload={'action': 'clear'})
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ self.assertIsNone(actual)
+ actual = self.csr.post_request(
+ 'interfaces/GigabitEthernet2/statistics',
+ payload={'action': 'clear'})
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ self.assertIsNone(actual)
+
+ def test_post_with_location(self):
+ """Create a user and verify that location returned."""
+ self.requests.register_uri(
+ 'POST',
+ LOCAL_URL + URI_USERS,
+ status_code=requests.codes.CREATED,
+ headers={'location': LOCAL_URL + URI_USERS + '/test-user'})
+ location = self.csr.post_request(
+ URI_USERS,
+ payload={'username': 'test-user',
+ 'password': 'pass12345',
+ 'privilege': 15})
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_USERS + '/test-user', location)
+
+ def test_post_missing_required_attribute(self):
+ """Negative test of POST with missing mandatory info."""
+ self.requests.register_uri('POST',
+ LOCAL_URL + URI_USERS,
+ status_code=requests.codes.BAD_REQUEST)
+ self.csr.post_request(URI_USERS,
+ payload={'password': 'pass12345',
+ 'privilege': 15})
+ self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
+
+ def test_post_invalid_attribute(self):
+ """Negative test of POST with invalid info."""
+ self.requests.register_uri('POST',
+ LOCAL_URL + URI_USERS,
+ status_code=requests.codes.BAD_REQUEST)
+ self.csr.post_request(URI_USERS,
+ payload={'username': 'test-user',
+ 'password': 'pass12345',
+ 'privilege': 20})
+ self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
+
+ def test_post_already_exists(self):
+ """Negative test of a duplicate POST.
+
+ Uses the lower level _do_request() API to just perform the POST and
+ obtain the response, without any error processing.
+ """
+
+ self.requests.register_uri(
+ 'POST',
+ LOCAL_URL + URI_USERS,
+ status_code=requests.codes.CREATED,
+ headers={'location': LOCAL_URL + URI_USERS + '/test-user'})
+
+ location = self.csr._do_request(
+ 'POST',
+ URI_USERS,
+ payload={'username': 'test-user',
+ 'password': 'pass12345',
+ 'privilege': 15},
+ more_headers=csr_client.HEADER_CONTENT_TYPE_JSON)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_USERS + '/test-user', location)
+ self.csr.post_request(URI_USERS,
+ payload={'username': 'test-user',
+ 'password': 'pass12345',
+ 'privilege': 20})
+
+ self.requests.register_uri(
+ 'POST',
+ LOCAL_URL + URI_USERS,
+ status_code=requests.codes.NOT_FOUND,
+ json={u'error-code': -1,
+ u'error-message': u'user test-user already exists'})
+
+ self.csr._do_request(
+ 'POST',
+ URI_USERS,
+ payload={'username': 'test-user',
+ 'password': 'pass12345',
+ 'privilege': 15},
+ more_headers=csr_client.HEADER_CONTENT_TYPE_JSON)
+ # Note: For local-user, a 404 error is returned. For
+ # site-to-site connection a 400 is returned.
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+
+ def test_post_changing_value(self):
+ """Negative test of a POST trying to change a value."""
+ self.requests.register_uri(
+ 'POST',
+ LOCAL_URL + URI_USERS,
+ status_code=requests.codes.CREATED,
+ headers={'location': LOCAL_URL + URI_USERS + '/test-user'})
+
+ location = self.csr.post_request(
+ URI_USERS,
+ payload={'username': 'test-user',
+ 'password': 'pass12345',
+ 'privilege': 15})
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_USERS + '/test-user', location)
+
+ self.requests.register_uri(
+ 'POST',
+ LOCAL_URL + URI_USERS,
+ status_code=requests.codes.NOT_FOUND,
+ json={u'error-code': -1,
+ u'error-message': u'user test-user already exists'})
+
+ actual = self.csr.post_request(URI_USERS,
+ payload={'username': 'test-user',
+ 'password': 'changed',
+ 'privilege': 15})
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+ expected = {u'error-code': -1,
+ u'error-message': u'user test-user already exists'}
+ self.assertDictSupersetOf(expected, actual)
+
+
+class TestCsrPutRestApi(CiscoCsrBaseTestCase):
+
+ """Test CSR PUT REST API."""
+
+ def _save_resources(self):
+ self._register_local_get(URI_HOSTNAME,
+ json={u'kind': u'object#host-name',
+ u'host-name': u'Router'})
+ interface_info = {u'kind': u'object#interface',
+ u'description': u'Changed description',
+ u'if-name': 'interfaces/GigabitEthernet1',
+ u'proxy-arp': True,
+ u'subnet-mask': u'255.255.255.0',
+ u'icmp-unreachable': True,
+ u'nat-direction': u'',
+ u'icmp-redirects': True,
+ u'ip-address': u'192.168.200.1',
+ u'verify-unicast-source': False,
+ u'type': u'ethernet'}
+ self._register_local_get(URI_INTERFACE_GE1,
+ json=interface_info)
+ details = self.csr.get_request(URI_HOSTNAME)
+ if self.csr.status != requests.codes.OK:
+ self.fail("Unable to save original host name")
+ self.original_host = details['host-name']
+ details = self.csr.get_request(URI_INTERFACE_GE1)
+ if self.csr.status != requests.codes.OK:
+ self.fail("Unable to save interface Ge1 description")
+ self.original_if = details
+ self.csr.token = None
+
+ def _restore_resources(self, user, password):
+ """Restore the host name and interface description.
+
+ Must restore the user and password, so that authentication
+ token can be obtained (as some tests corrupt auth info).
+ Will also clear token, so that it gets a fresh token.
+ """
+
+ self._register_local_put('global', 'host-name')
+ self._register_local_put('interfaces', 'GigabitEthernet1')
+
+ self.csr.auth = (user, password)
+ self.csr.token = None
+ payload = {'host-name': self.original_host}
+ self.csr.put_request(URI_HOSTNAME, payload=payload)
+ if self.csr.status != requests.codes.NO_CONTENT:
+ self.fail("Unable to restore host name after test")
+ payload = {'description': self.original_if['description'],
+ 'if-name': self.original_if['if-name'],
+ 'ip-address': self.original_if['ip-address'],
+ 'subnet-mask': self.original_if['subnet-mask'],
+ 'type': self.original_if['type']}
+ self.csr.put_request(URI_INTERFACE_GE1,
+ payload=payload)
+ if self.csr.status != requests.codes.NO_CONTENT:
+ self.fail("Unable to restore I/F Ge1 description after test")
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Setup for each test in this suite.
+
+ Each test case will have a normal authentication mock response
+ registered here, although they may replace it, as needed. In
+ addition, resources are saved, before each test is run, and
+ restored, after each test completes.
+ """
+ super(TestCsrPutRestApi, self).setUp(host, tunnel_ip, timeout)
+ self._helper_register_auth_request()
+ self._save_resources()
+ self.addCleanup(self._restore_resources, 'stack', 'cisco')
+
+ def test_put_requests(self):
+ """Simple PUT requests (repeatable).
+
+ First request will do a post to get token (login). Assumes
+ that there are two interfaces on the CSR (Ge1 and Ge2).
+ """
+
+ self._register_local_put('interfaces', 'GigabitEthernet1')
+ self._register_local_put('global', 'host-name')
+
+ actual = self.csr.put_request(URI_HOSTNAME,
+ payload={'host-name': 'TestHost'})
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ self.assertIsNone(actual)
+
+ actual = self.csr.put_request(URI_HOSTNAME,
+ payload={'host-name': 'TestHost2'})
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ self.assertIsNone(actual)
+
+ def test_change_interface_description(self):
+ """Test that interface description can be changed.
+
+ This was a problem with an earlier version of the CSR image and is
+ here to prevent regression.
+ """
+ self._register_local_put('interfaces', 'GigabitEthernet1')
+ payload = {'description': u'Changed description',
+ 'if-name': self.original_if['if-name'],
+ 'ip-address': self.original_if['ip-address'],
+ 'subnet-mask': self.original_if['subnet-mask'],
+ 'type': self.original_if['type']}
+ actual = self.csr.put_request(URI_INTERFACE_GE1, payload=payload)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ self.assertIsNone(actual)
+ actual = self.csr.get_request(URI_INTERFACE_GE1)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertIn('description', actual)
+ self.assertEqual(u'Changed description',
+ actual['description'])
+
+ def ignore_test_change_to_empty_interface_description(self):
+ """Test that interface description can be changed to empty string.
+
+ This is here to prevent regression, where the CSR was rejecting
+ an attempt to set the description to an empty string.
+ """
+ self._register_local_put('interfaces', 'GigabitEthernet1')
+ payload = {'description': '',
+ 'if-name': self.original_if['if-name'],
+ 'ip-address': self.original_if['ip-address'],
+ 'subnet-mask': self.original_if['subnet-mask'],
+ 'type': self.original_if['type']}
+ actual = self.csr.put_request(URI_INTERFACE_GE1, payload=payload)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ self.assertIsNone(actual)
+ actual = self.csr.get_request(URI_INTERFACE_GE1)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertIn('description', actual)
+ self.assertEqual('', actual['description'])
+
+
+class TestCsrDeleteRestApi(CiscoCsrBaseTestCase):
+
+ """Test CSR DELETE REST API."""
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Setup for each test in this suite.
+
+ Each test case will have a normal authentication mock response
+ registered here, although they may replace it, as needed.
+ """
+ super(TestCsrDeleteRestApi, self).setUp(host, tunnel_ip, timeout)
+ self._helper_register_auth_request()
+
+ def _make_dummy_user(self):
+ """Create a user that will be later deleted."""
+ self.requests.register_uri(
+ 'POST',
+ LOCAL_URL + URI_USERS,
+ status_code=requests.codes.CREATED,
+ headers={'location': LOCAL_URL + URI_USERS + '/dummy'})
+ self.csr.post_request(URI_USERS,
+ payload={'username': 'dummy',
+ 'password': 'dummy',
+ 'privilege': 15})
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+
+ def test_delete_requests(self):
+ """Simple DELETE requests (creating entry first)."""
+ self._register_local_delete(URI_USERS, 'dummy')
+ self._make_dummy_user()
+ self.csr.token = None # Force login
+ self.csr.delete_request(URI_USERS + '/dummy')
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ # Delete again, but without logging in this time
+ self._make_dummy_user()
+ self.csr.delete_request(URI_USERS + '/dummy')
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+
+ def test_delete_non_existent_entry(self):
+ """Negative test of trying to delete a non-existent user."""
+ expected = {u'error-code': -1,
+ u'error-message': u'user unknown not found'}
+ self._register_local_delete(URI_USERS, 'unknown',
+ result_code=requests.codes.NOT_FOUND,
+ json=expected)
+ actual = self.csr.delete_request(URI_USERS + '/unknown')
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+ self.assertDictSupersetOf(expected, actual)
+
+ def test_delete_not_allowed(self):
+ """Negative test of trying to delete the host-name."""
+ self._register_local_delete(
+ 'global', 'host-name',
+ result_code=requests.codes.METHOD_NOT_ALLOWED)
+ self.csr.delete_request(URI_HOSTNAME)
+ self.assertEqual(requests.codes.METHOD_NOT_ALLOWED,
+ self.csr.status)
+
+
+class TestCsrRestApiFailures(CiscoCsrBaseTestCase):
+
+ """Test failure cases common for all REST APIs.
+
+ Uses the lower level _do_request() to just perform the operation and get
+ the result, without any error handling.
+ """
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=0.1):
+ """Setup for each test in this suite.
+
+ Each test case will have a normal authentication mock response
+ registered here, although they may replace it, as needed.
+ """
+ super(TestCsrRestApiFailures, self).setUp(host, tunnel_ip, timeout)
+ self._helper_register_auth_request()
+
+ def _simulate_timeout(self, request):
+ if URI_HOSTNAME in request.path_uri:
+ raise r_exc.Timeout()
+
+ def test_request_for_non_existent_resource(self):
+ """Negative test of non-existent resource on REST request."""
+ self.requests.register_uri('POST',
+ LOCAL_URL + 'no/such/request',
+ status_code=requests.codes.NOT_FOUND)
+ self.csr.post_request('no/such/request')
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+ # The result is HTTP 404 message, so no error content to check
+
+ def _simulate_get_timeout(self, request):
+ """Will raise exception for any host request to this resource."""
+ if URI_HOSTNAME in request.path_url:
+ raise r_exc.Timeout()
+
+ def test_timeout_during_request(self):
+ """Negative test of timeout during REST request."""
+ self.requests.add_matcher(self._simulate_get_timeout)
+ self.csr._do_request('GET', URI_HOSTNAME)
+ self.assertEqual(requests.codes.REQUEST_TIMEOUT, self.csr.status)
+
+ def _simulate_auth_failure(self, request):
+ """First time auth POST is done, re-report unauthorized."""
+ if URI_AUTH in request.path_url and not self.called_once:
+ self.called_once = True
+ resp = requests.Response()
+ resp.status_code = requests.codes.UNAUTHORIZED
+ return resp
+
+ def test_token_expired_on_request(self):
+ """Token expired before trying a REST request.
+
+ First, the token is set to a bogus value, to force it to
+ try to authenticate on the GET request. Second, a mock that
+ runs once, will simulate an auth failure. Third, the normal
+ auth mock will simulate success.
+ """
+
+ self._register_local_get(URI_HOSTNAME,
+ json={u'kind': u'object#host-name',
+ u'host-name': u'Router'})
+ self.called_once = False
+ self.requests.add_matcher(self._simulate_auth_failure)
+ self.csr.token = '123' # These are 44 characters, so won't match
+ actual = self.csr._do_request('GET', URI_HOSTNAME)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertIn('host-name', actual)
+ self.assertIsNotNone(actual['host-name'])
+
+ def test_failed_to_obtain_token_for_request(self):
+ """Negative test of unauthorized user for REST request."""
+ self.csr.auth = ('stack', 'bogus')
+ self._register_local_get(URI_HOSTNAME,
+ result_code=requests.codes.UNAUTHORIZED)
+ self.csr._do_request('GET', URI_HOSTNAME)
+ self.assertEqual(requests.codes.UNAUTHORIZED, self.csr.status)
+
+
+class TestCsrRestIkePolicyCreate(CiscoCsrBaseTestCase):
+
+ """Test IKE policy create REST requests."""
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Setup for each test in this suite.
+
+ Each test case will have a normal authentication and post mock
+ response registered, although the test may replace them, if needed.
+ """
+ super(TestCsrRestIkePolicyCreate, self).setUp(host, tunnel_ip, timeout)
+ self._helper_register_auth_request()
+ self._helper_register_ike_policy_post(2)
+
+ def _helper_register_ike_policy_get(self):
+ content = {u'kind': u'object#ike-policy',
+ u'priority-id': u'2',
+ u'version': u'v1',
+ u'local-auth-method': u'pre-share',
+ u'encryption': u'aes256',
+ u'hash': u'sha',
+ u'dhGroup': 5,
+ u'lifetime': 3600}
+ self._register_local_get(URI_IKE_POLICY_ID % '2', json=content)
+
+ def test_create_delete_ike_policy(self):
+ """Create and then delete IKE policy."""
+ self._helper_register_ike_policy_get()
+ policy_info = {u'priority-id': u'2',
+ u'encryption': u'aes256',
+ u'hash': u'sha',
+ u'dhGroup': 5,
+ u'lifetime': 3600}
+ location = self.csr.create_ike_policy(policy_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IKE_POLICY_ID % '2', location)
+ # Check the hard-coded items that get set as well...
+ actual = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ expected_policy = {u'kind': u'object#ike-policy',
+ u'version': u'v1',
+ u'local-auth-method': u'pre-share'}
+ expected_policy.update(policy_info)
+ self.assertEqual(expected_policy, actual)
+
+ # Now delete and verify the IKE policy is gone
+ self._register_local_delete(URI_IKE_POLICY, 2)
+ self._register_local_get_not_found(URI_IKE_POLICY, 2)
+
+ self.csr.delete_ike_policy(2)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ actual = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+
+ def test_create_ike_policy_with_defaults(self):
+ """Create IKE policy using defaults for all optional values."""
+ policy = {u'kind': u'object#ike-policy',
+ u'priority-id': u'2',
+ u'version': u'v1',
+ u'local-auth-method': u'pre-share',
+ u'encryption': u'des',
+ u'hash': u'sha',
+ u'dhGroup': 1,
+ u'lifetime': 86400}
+ self._register_local_get(URI_IKE_POLICY_ID % '2', json=policy)
+ policy_info = {u'priority-id': u'2'}
+ location = self.csr.create_ike_policy(policy_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IKE_POLICY_ID % '2', location)
+
+ # Check the hard-coded items that get set as well...
+ actual = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ expected_policy = {u'kind': u'object#ike-policy',
+ u'version': u'v1',
+ u'encryption': u'des',
+ u'hash': u'sha',
+ u'dhGroup': 1,
+ u'lifetime': 86400,
+ # Lower level sets this, but it is the default
+ u'local-auth-method': u'pre-share'}
+ expected_policy.update(policy_info)
+ self.assertEqual(expected_policy, actual)
+
+ def test_create_duplicate_ike_policy(self):
+ """Negative test of trying to create a duplicate IKE policy."""
+ self._helper_register_ike_policy_get()
+ policy_info = {u'priority-id': u'2',
+ u'encryption': u'aes',
+ u'hash': u'sha',
+ u'dhGroup': 5,
+ u'lifetime': 3600}
+ location = self.csr.create_ike_policy(policy_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IKE_POLICY_ID % '2', location)
+ self.requests.register_uri(
+ 'POST',
+ LOCAL_URL + URI_IKE_POLICY,
+ status_code=requests.codes.BAD_REQUEST,
+ json={u'error-code': -1,
+ u'error-message': u'policy 2 exist, not allow to '
+ u'update policy using POST method'})
+ location = self.csr.create_ike_policy(policy_info)
+ self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
+ expected = {u'error-code': -1,
+ u'error-message': u'policy 2 exist, not allow to '
+ u'update policy using POST method'}
+ self.assertDictSupersetOf(expected, location)
+
+
+class TestCsrRestIPSecPolicyCreate(CiscoCsrBaseTestCase):
+
+ """Test IPSec policy create REST requests."""
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Set up for each test in this suite.
+
+ Each test case will have a normal authentication and post mock
+ response registered, although the test may replace them, if needed.
+ """
+ super(TestCsrRestIPSecPolicyCreate, self).setUp(host,
+ tunnel_ip,
+ timeout)
+ self._helper_register_auth_request()
+ self._helper_register_ipsec_policy_post(123)
+
+ def _helper_register_ipsec_policy_get(self, override=None):
+ content = {u'kind': u'object#ipsec-policy',
+ u'mode': u'tunnel',
+ u'policy-id': u'123',
+ u'protection-suite': {
+ u'esp-encryption': u'esp-256-aes',
+ u'esp-authentication': u'esp-sha-hmac',
+ u'ah': u'ah-sha-hmac',
+ },
+ u'anti-replay-window-size': u'Disable',
+ u'lifetime-sec': 120,
+ u'pfs': u'group5',
+ u'lifetime-kb': 4608000,
+ u'idle-time': None}
+ if override:
+ content.update(override)
+ self._register_local_get(URI_IPSEC_POLICY + '/123', json=content)
+
+ def test_create_delete_ipsec_policy(self):
+ """Create and then delete IPSec policy."""
+ policy_info = {
+ u'policy-id': u'123',
+ u'protection-suite': {
+ u'esp-encryption': u'esp-256-aes',
+ u'esp-authentication': u'esp-sha-hmac',
+ u'ah': u'ah-sha-hmac',
+ },
+ u'lifetime-sec': 120,
+ u'pfs': u'group5',
+ u'anti-replay-window-size': u'disable'
+ }
+ location = self.csr.create_ipsec_policy(policy_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_POLICY + '/123', location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_ipsec_policy_get()
+ actual = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ expected_policy = {u'kind': u'object#ipsec-policy',
+ u'mode': u'tunnel',
+ u'lifetime-kb': 4608000,
+ u'idle-time': None}
+ expected_policy.update(policy_info)
+ # CSR will respond with capitalized value
+ expected_policy[u'anti-replay-window-size'] = u'Disable'
+ self.assertEqual(expected_policy, actual)
+
+ # Now delete and verify the IPSec policy is gone
+ self._register_local_delete(URI_IPSEC_POLICY, 123)
+ self._register_local_get_not_found(URI_IPSEC_POLICY, 123)
+
+ self.csr.delete_ipsec_policy('123')
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ actual = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+
+ def test_create_ipsec_policy_with_defaults(self):
+ """Create IPSec policy with default for all optional values."""
+ policy_info = {u'policy-id': u'123'}
+ location = self.csr.create_ipsec_policy(policy_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_POLICY + '/123', location)
+
+ # Check the hard-coded items that get set as well...
+ expected_policy = {u'kind': u'object#ipsec-policy',
+ u'mode': u'tunnel',
+ u'policy-id': u'123',
+ u'protection-suite': {},
+ u'lifetime-sec': 3600,
+ u'pfs': u'Disable',
+ u'anti-replay-window-size': u'None',
+ u'lifetime-kb': 4608000,
+ u'idle-time': None}
+ self._register_local_get(URI_IPSEC_POLICY + '/123',
+ json=expected_policy)
+
+ actual = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_policy, actual)
+
+ def test_create_ipsec_policy_with_uuid(self):
+ """Create IPSec policy using UUID for id."""
+ # Override normal POST response w/one that has a different policy ID
+ self._helper_register_ipsec_policy_post(dummy_policy_id)
+ policy_info = {
+ u'policy-id': u'%s' % dummy_policy_id,
+ u'protection-suite': {
+ u'esp-encryption': u'esp-256-aes',
+ u'esp-authentication': u'esp-sha-hmac',
+ u'ah': u'ah-sha-hmac',
+ },
+ u'lifetime-sec': 120,
+ u'pfs': u'group5',
+ u'anti-replay-window-size': u'disable'
+ }
+ location = self.csr.create_ipsec_policy(policy_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_POLICY_ID % dummy_policy_id, location)
+
+ # Check the hard-coded items that get set as well...
+ expected_policy = {u'kind': u'object#ipsec-policy',
+ u'mode': u'tunnel',
+ u'lifetime-kb': 4608000,
+ u'idle-time': None}
+ expected_policy.update(policy_info)
+ # CSR will respond with capitalized value
+ expected_policy[u'anti-replay-window-size'] = u'Disable'
+ self._register_local_get(URI_IPSEC_POLICY_ID % dummy_policy_id,
+ json=expected_policy)
+ actual = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_policy, actual)
+
+ def test_create_ipsec_policy_without_ah(self):
+ """Create IPSec policy."""
+ policy_info = {
+ u'policy-id': u'123',
+ u'protection-suite': {
+ u'esp-encryption': u'esp-aes',
+ u'esp-authentication': u'esp-sha-hmac',
+ },
+ u'lifetime-sec': 120,
+ u'pfs': u'group5',
+ u'anti-replay-window-size': u'128'
+ }
+ location = self.csr.create_ipsec_policy(policy_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_POLICY_ID % '123', location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_ipsec_policy_get(
+ override={u'anti-replay-window-size': u'128',
+ u'protection-suite': {
+ u'esp-encryption': u'esp-aes',
+ u'esp-authentication': u'esp-sha-hmac'}})
+
+ actual = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ expected_policy = {u'kind': u'object#ipsec-policy',
+ u'mode': u'tunnel',
+ u'lifetime-kb': 4608000,
+ u'idle-time': None}
+ expected_policy.update(policy_info)
+ self.assertEqual(expected_policy, actual)
+
+ def test_invalid_ipsec_policy_lifetime(self):
+ """Failure test of IPSec policy with unsupported lifetime."""
+ # Override normal POST response with one that indicates bad request
+ self.requests.register_uri('POST',
+ LOCAL_URL + URI_IPSEC_POLICY,
+ status_code=requests.codes.BAD_REQUEST)
+ policy_info = {
+ u'policy-id': u'123',
+ u'protection-suite': {
+ u'esp-encryption': u'esp-aes',
+ u'esp-authentication': u'esp-sha-hmac',
+ u'ah': u'ah-sha-hmac',
+ },
+ u'lifetime-sec': 119,
+ u'pfs': u'group5',
+ u'anti-replay-window-size': u'128'
+ }
+ self.csr.create_ipsec_policy(policy_info)
+ self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
+
+ def test_create_ipsec_policy_with_invalid_name(self):
+ """Failure test of creating IPSec policy with name too long."""
+ # Override normal POST response with one that indicates bad request
+ self.requests.register_uri('POST',
+ LOCAL_URL + URI_IPSEC_POLICY,
+ status_code=requests.codes.BAD_REQUEST)
+ policy_info = {u'policy-id': u'policy-name-is-too-long-32-chars'}
+ self.csr.create_ipsec_policy(policy_info)
+ self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
+
+
+class TestCsrRestPreSharedKeyCreate(CiscoCsrBaseTestCase):
+
+ """Test Pre-shared key (PSK) create REST requests."""
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Set up for each test in this suite.
+
+ Each test case will have a normal authentication and post mock
+ response registered, although the test may replace them, if needed.
+ """
+ super(TestCsrRestPreSharedKeyCreate, self).setUp(host,
+ tunnel_ip,
+ timeout)
+ self._helper_register_auth_request()
+ self._helper_register_psk_post(5)
+
+ def _helper_register_psk_get(self, override=None):
+ content = {u'kind': u'object#ike-keyring',
+ u'keyring-name': u'5',
+ u'pre-shared-key-list': [
+ {u'key': u'super-secret',
+ u'encrypted': False,
+ u'peer-address': u'10.10.10.20 255.255.255.0'}
+ ]}
+ if override:
+ content.update(override)
+ self._register_local_get(URI_PSK_ID % '5', json=content)
+
+ def test_create_delete_pre_shared_key(self):
+ """Create and then delete a keyring entry for pre-shared key."""
+ psk_info = {u'keyring-name': u'5',
+ u'pre-shared-key-list': [
+ {u'key': u'super-secret',
+ u'encrypted': False,
+ u'peer-address': u'10.10.10.20/24'}
+ ]}
+ location = self.csr.create_pre_shared_key(psk_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_PSK_ID % '5', location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_psk_get()
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ expected_policy = {u'kind': u'object#ike-keyring'}
+ expected_policy.update(psk_info)
+ # Note: the peer CIDR is returned as an IP and mask
+ expected_policy[u'pre-shared-key-list'][0][u'peer-address'] = (
+ u'10.10.10.20 255.255.255.0')
+ self.assertEqual(expected_policy, content)
+
+ # Now delete and verify pre-shared key is gone
+ self._register_local_delete(URI_PSK, 5)
+ self._register_local_get_not_found(URI_PSK, 5)
+
+ self.csr.delete_pre_shared_key('5')
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+
+ def test_create_pre_shared_key_with_fqdn_peer(self):
+ """Create pre-shared key using FQDN for peer address."""
+ psk_info = {u'keyring-name': u'5',
+ u'pre-shared-key-list': [
+ {u'key': u'super-secret',
+ u'encrypted': False,
+ u'peer-address': u'cisco.com'}
+ ]}
+ location = self.csr.create_pre_shared_key(psk_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_PSK_ID % '5', location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_psk_get(
+ override={u'pre-shared-key-list': [
+ {u'key': u'super-secret',
+ u'encrypted': False,
+ u'peer-address': u'cisco.com'}
+ ]}
+ )
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ expected_policy = {u'kind': u'object#ike-keyring'}
+ expected_policy.update(psk_info)
+ self.assertEqual(expected_policy, content)
+
+
+class TestCsrRestIPSecConnectionCreate(CiscoCsrBaseTestCase):
+
+ """Test IPSec site-to-site connection REST requests.
+
+ This requires us to have first created an IKE policy, IPSec policy,
+ and pre-shared key, so it's more of an itegration test, when used
+ with a real CSR (as we can't mock out these pre-conditions).
+ """
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Setup for each test in this suite.
+
+ Each test case will have a normal authentication mock response
+ registered here, although they may replace it, as needed.
+ """
+ super(TestCsrRestIPSecConnectionCreate, self).setUp(host,
+ tunnel_ip,
+ timeout)
+ self._helper_register_auth_request()
+ self.route_id = '10.1.0.0_24_GigabitEthernet1'
+
+ def _make_psk_for_test(self):
+ psk_id = generate_pre_shared_key_id()
+ self._remove_resource_for_test(self.csr.delete_pre_shared_key,
+ psk_id)
+ self._helper_register_psk_post(psk_id)
+ psk_info = {u'keyring-name': u'%d' % psk_id,
+ u'pre-shared-key-list': [
+ {u'key': u'super-secret',
+ u'encrypted': False,
+ u'peer-address': u'10.10.10.20/24'}
+ ]}
+ self.csr.create_pre_shared_key(psk_info)
+ if self.csr.status != requests.codes.CREATED:
+ self.fail("Unable to create PSK for test case")
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_pre_shared_key, psk_id)
+ return psk_id
+
+ def _make_ike_policy_for_test(self):
+ policy_id = generate_ike_policy_id()
+ self._remove_resource_for_test(self.csr.delete_ike_policy,
+ policy_id)
+ self._helper_register_ike_policy_post(policy_id)
+ policy_info = {u'priority-id': u'%d' % policy_id,
+ u'encryption': u'aes',
+ u'hash': u'sha',
+ u'dhGroup': 5,
+ u'lifetime': 3600}
+ self.csr.create_ike_policy(policy_info)
+ if self.csr.status != requests.codes.CREATED:
+ self.fail("Unable to create IKE policy for test case")
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ike_policy, policy_id)
+ return policy_id
+
+ def _make_ipsec_policy_for_test(self):
+ policy_id = generate_ipsec_policy_id()
+ self._remove_resource_for_test(self.csr.delete_ipsec_policy,
+ policy_id)
+ self._helper_register_ipsec_policy_post(policy_id)
+ policy_info = {
+ u'policy-id': u'%d' % policy_id,
+ u'protection-suite': {
+ u'esp-encryption': u'esp-aes',
+ u'esp-authentication': u'esp-sha-hmac',
+ u'ah': u'ah-sha-hmac',
+ },
+ u'lifetime-sec': 120,
+ u'pfs': u'group5',
+ u'anti-replay-window-size': u'disable'
+ }
+ self.csr.create_ipsec_policy(policy_info)
+ if self.csr.status != requests.codes.CREATED:
+ self.fail("Unable to create IPSec policy for test case")
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_policy, policy_id)
+ return policy_id
+
+ def _remove_resource_for_test(self, delete_resource, resource_id):
+ self._register_local_delete_by_id(resource_id)
+ delete_resource(resource_id)
+
+ def _prepare_for_site_conn_create(self, skip_psk=False, skip_ike=False,
+ skip_ipsec=False):
+ """Create the policies and PSK so can then create site conn."""
+ if not skip_psk:
+ ike_policy_id = self._make_psk_for_test()
+ else:
+ ike_policy_id = generate_ike_policy_id()
+ if not skip_ike:
+ self._make_ike_policy_for_test()
+ if not skip_ipsec:
+ ipsec_policy_id = self._make_ipsec_policy_for_test()
+ else:
+ ipsec_policy_id = generate_ipsec_policy_id()
+ # Note: Use same ID number for tunnel and IPSec policy, so that when
+ # GET tunnel info, the mocks can infer the IPSec policy ID from the
+ # tunnel number.
+ return (ike_policy_id, ipsec_policy_id, ipsec_policy_id)
+
+ def _helper_register_ipsec_conn_get(self, tunnel, override=None):
+ # Use same number, to allow mock to generate IPSec policy ID
+ ipsec_policy_id = tunnel[6:]
+ content = {u'kind': u'object#vpn-site-to-site',
+ u'vpn-interface-name': u'%s' % tunnel,
+ u'ip-version': u'ipv4',
+ u'vpn-type': u'site-to-site',
+ u'ipsec-policy-id': u'%s' % ipsec_policy_id,
+ u'ike-profile-id': None,
+ u'mtu': 1500,
+ u'local-device': {
+ u'ip-address': '10.3.0.1/24',
+ u'tunnel-ip-address': '10.10.10.10'
+ },
+ u'remote-device': {
+ u'tunnel-ip-address': '10.10.10.20'
+ }}
+ if override:
+ content.update(override)
+ self._register_local_get(URI_IPSEC_CONN_ID % tunnel, json=content)
+
+ def test_create_delete_ipsec_connection(self):
+ """Create and then delete an IPSec connection."""
+ ike_policy_id, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create())
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._helper_register_tunnel_post(tunnel_name)
+ self._register_local_post(URI_ROUTES, self.route_id)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'mtu': 1500,
+ u'local-device': {u'ip-address': u'10.3.0.1/24',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ expected_connection = {u'kind': u'object#vpn-site-to-site',
+ u'ike-profile-id': None,
+ u'vpn-type': u'site-to-site',
+ u'mtu': 1500,
+ u'ip-version': u'ipv4'}
+ expected_connection.update(connection_info)
+ location = self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_ipsec_conn_get(tunnel_name)
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_connection, content)
+
+ # Now delete and verify that site-to-site connection is gone
+ self._register_local_delete_by_id(tunnel_name)
+ self._register_local_delete_by_id(ipsec_policy_id)
+ self._register_local_delete_by_id(ike_policy_id)
+ self._register_local_get_not_found(URI_IPSEC_CONN,
+ tunnel_name)
+ # Only delete connection. Cleanup will take care of prerequisites
+ self.csr.delete_ipsec_connection(tunnel_name)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
+
+ def test_create_ipsec_connection_with_no_tunnel_subnet(self):
+ """Create an IPSec connection without an IP address on tunnel."""
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create())
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._helper_register_tunnel_post(tunnel_name)
+ self._register_local_post(URI_ROUTES, self.route_id)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'local-device': {u'ip-address': u'GigabitEthernet3',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ expected_connection = {u'kind': u'object#vpn-site-to-site',
+ u'ike-profile-id': None,
+ u'vpn-type': u'site-to-site',
+ u'mtu': 1500,
+ u'ip-version': u'ipv4'}
+ expected_connection.update(connection_info)
+ location = self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn('vpn-svc/site-to-site/' + tunnel_name, location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_ipsec_conn_get(tunnel_name, override={
+ u'local-device': {
+ u'ip-address': u'GigabitEthernet3',
+ u'tunnel-ip-address': u'10.10.10.10'
+ }})
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_connection, content)
+
+ def test_create_ipsec_connection_no_pre_shared_key(self):
+ """Test of connection create without associated pre-shared key.
+
+ The CSR will create the connection, but will not be able to pass
+ traffic without the pre-shared key.
+ """
+
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create(skip_psk=True))
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._helper_register_tunnel_post(tunnel_name)
+ self._register_local_post(URI_ROUTES, self.route_id)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'mtu': 1500,
+ u'local-device': {u'ip-address': u'10.3.0.1/24',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ expected_connection = {u'kind': u'object#vpn-site-to-site',
+ u'ike-profile-id': None,
+ u'vpn-type': u'site-to-site',
+ u'ip-version': u'ipv4'}
+ expected_connection.update(connection_info)
+ location = self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_ipsec_conn_get(tunnel_name)
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_connection, content)
+
+ def test_create_ipsec_connection_with_default_ike_policy(self):
+ """Test of connection create without IKE policy (uses default).
+
+ Without an IKE policy, the CSR will use a built-in default IKE
+ policy setting for the connection.
+ """
+
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create(skip_ike=True))
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._helper_register_tunnel_post(tunnel_name)
+ self._register_local_post(URI_ROUTES, self.route_id)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'mtu': 1500,
+ u'local-device': {u'ip-address': u'10.3.0.1/24',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ expected_connection = {u'kind': u'object#vpn-site-to-site',
+ u'ike-profile-id': None,
+ u'vpn-type': u'site-to-site',
+ u'ip-version': u'ipv4'}
+ expected_connection.update(connection_info)
+ location = self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_ipsec_conn_get(tunnel_name)
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_connection, content)
+
+ def test_set_ipsec_connection_admin_state_changes(self):
+ """Create IPSec connection in admin down state."""
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create())
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._helper_register_tunnel_post(tunnel_name)
+ self._register_local_post(URI_ROUTES, self.route_id)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'mtu': 1500,
+ u'local-device': {u'ip-address': u'10.3.0.1/24',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ location = self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location)
+
+ state_url = location + "/state"
+ state_uri = URI_IPSEC_CONN_ID % tunnel_name + '/state'
+ # Note: When created, the tunnel will be in admin 'up' state
+ # Note: Line protocol state will be down, unless have an active conn.
+ expected_state = {u'kind': u'object#vpn-site-to-site-state',
+ u'vpn-interface-name': tunnel_name,
+ u'line-protocol-state': u'down',
+ u'enabled': False}
+ self._register_local_put(URI_IPSEC_CONN_ID % tunnel_name, 'state')
+ self.csr.set_ipsec_connection_state(tunnel_name, admin_up=False)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+
+ self._register_local_get(state_uri, json=expected_state)
+ content = self.csr.get_request(state_url, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_state, content)
+
+ self.csr.set_ipsec_connection_state(tunnel_name, admin_up=True)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ expected_state = {u'kind': u'object#vpn-site-to-site-state',
+ u'vpn-interface-name': tunnel_name,
+ u'line-protocol-state': u'down',
+ u'enabled': True}
+ self._register_local_get(state_uri, json=expected_state)
+ content = self.csr.get_request(state_url, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_state, content)
+
+ def test_create_ipsec_connection_missing_ipsec_policy(self):
+ """Negative test of connection create without IPSec policy."""
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create(skip_ipsec=True))
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._register_local_post(URI_IPSEC_CONN, tunnel_name,
+ result_code=requests.codes.BAD_REQUEST)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'local-device': {u'ip-address': u'10.3.0.1/24',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ 'Tunnel%d' % tunnel_id)
+ self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
+
+ def _determine_conflicting_ip(self):
+ content = {u'kind': u'object#interface',
+ u'subnet-mask': u'255.255.255.0',
+ u'ip-address': u'10.5.0.2'}
+ self._register_local_get('interfaces/GigabitEthernet3', json=content)
+ details = self.csr.get_request('interfaces/GigabitEthernet3')
+ if self.csr.status != requests.codes.OK:
+ self.fail("Unable to obtain interface GigabitEthernet3's IP")
+ if_ip = details.get('ip-address')
+ if not if_ip:
+ self.fail("No IP address for GigabitEthernet3 interface")
+ return '.'.join(if_ip.split('.')[:3]) + '.10'
+
+ def test_create_ipsec_connection_conficting_tunnel_ip(self):
+ """Negative test of connection create with conflicting tunnel IP.
+
+ Find out the IP of a local interface (GigabitEthernet3) and create an
+ IP that is on the same subnet. Note: this interface needs to be up.
+ """
+
+ conflicting_ip = self._determine_conflicting_ip()
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create())
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._register_local_post(URI_IPSEC_CONN, tunnel_name,
+ result_code=requests.codes.BAD_REQUEST)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'local-device': {u'ip-address': u'%s/24' % conflicting_ip,
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
+
+ def test_create_ipsec_connection_with_max_mtu(self):
+ """Create an IPSec connection with max MTU value."""
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create())
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._helper_register_tunnel_post(tunnel_name)
+ self._register_local_post(URI_ROUTES, self.route_id)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'mtu': 9192,
+ u'local-device': {u'ip-address': u'10.3.0.1/24',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ expected_connection = {u'kind': u'object#vpn-site-to-site',
+ u'ike-profile-id': None,
+ u'vpn-type': u'site-to-site',
+ u'ip-version': u'ipv4'}
+ expected_connection.update(connection_info)
+ location = self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location)
+
+ # Check the hard-coded items that get set as well...
+ self._helper_register_ipsec_conn_get(tunnel_name, override={
+ u'mtu': 9192})
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_connection, content)
+
+ def test_create_ipsec_connection_with_bad_mtu(self):
+ """Negative test of connection create with unsupported MTU value."""
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create())
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._register_local_post(URI_IPSEC_CONN, tunnel_name,
+ result_code=requests.codes.BAD_REQUEST)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'mtu': 9193,
+ u'local-device': {u'ip-address': u'10.3.0.1/24',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.BAD_REQUEST, self.csr.status)
+
+ def test_status_when_no_tunnels_exist(self):
+ """Get status, when there are no tunnels."""
+ content = {u'kind': u'collection#vpn-active-sessions',
+ u'items': []}
+ self._register_local_get(URI_SESSIONS, json=content)
+ tunnels = self.csr.read_tunnel_statuses()
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual([], tunnels)
+
+ def test_status_for_one_tunnel(self):
+ """Get status of one tunnel."""
+ # Create the IPsec site-to-site connection first
+ _, ipsec_policy_id, tunnel_id = (
+ self._prepare_for_site_conn_create())
+ tunnel_name = u'Tunnel%s' % tunnel_id
+ self._helper_register_tunnel_post(tunnel_name)
+ self._register_local_post(URI_ROUTES, self.route_id)
+ connection_info = {
+ u'vpn-interface-name': tunnel_name,
+ u'ipsec-policy-id': u'%d' % ipsec_policy_id,
+ u'local-device': {u'ip-address': u'10.3.0.1/24',
+ u'tunnel-ip-address': u'10.10.10.10'},
+ u'remote-device': {u'tunnel-ip-address': u'10.10.10.20'}
+ }
+ location = self.csr.create_ipsec_connection(connection_info)
+ self.addCleanup(self._remove_resource_for_test,
+ self.csr.delete_ipsec_connection,
+ tunnel_name)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_IPSEC_CONN_ID % tunnel_name, location)
+
+ # Now, check the status
+ content = {u'kind': u'collection#vpn-active-sessions',
+ u'items': [{u'status': u'DOWN-NEGOTIATING',
+ u'vpn-interface-name': tunnel_name}, ]}
+ self._register_local_get(URI_SESSIONS, json=content)
+ self._helper_register_ipsec_conn_get(tunnel_name)
+ tunnels = self.csr.read_tunnel_statuses()
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual([(tunnel_name, u'DOWN-NEGOTIATING'), ], tunnels)
+
+
+class TestCsrRestIkeKeepaliveCreate(CiscoCsrBaseTestCase):
+
+ """Test IKE keepalive REST requests.
+
+ Note: On the Cisco CSR, the IKE keepalive for v1 is a global configuration
+ that applies to all VPN tunnels to specify Dead Peer Detection information.
+ As a result, this REST API is not used in the OpenStack device driver, and
+ the keepalive will default to zero (disabled).
+ """
+
+ def _save_dpd_info(self):
+ details = self.csr.get_request(URI_KEEPALIVE)
+ if self.csr.status == requests.codes.OK:
+ self.dpd = details
+ self.addCleanup(self._restore_dpd_info)
+ elif self.csr.status != requests.codes.NOT_FOUND:
+ self.fail("Unable to save original DPD info")
+
+ def _restore_dpd_info(self):
+ payload = {'interval': self.dpd['interval'],
+ 'retry': self.dpd['retry']}
+ self.csr.put_request(URI_KEEPALIVE, payload=payload)
+ if self.csr.status != requests.codes.NO_CONTENT:
+ self.fail("Unable to restore DPD info after test")
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Set up for each test in this suite.
+
+ Each test case will have a normal authentication, get, and put mock
+ responses registered, although the test may replace them, if needed.
+ Dead Peer Detection settions will be saved for each test, and
+ restored afterwards.
+ """
+ super(TestCsrRestIkeKeepaliveCreate, self).setUp(host,
+ tunnel_ip,
+ timeout)
+ self._helper_register_auth_request()
+ self._helper_register_keepalive_get()
+ self._register_local_put('vpn-svc/ike', 'keepalive')
+ self._save_dpd_info()
+ self.csr.token = None
+
+ def _helper_register_keepalive_get(self, override=None):
+ content = {u'interval': 60,
+ u'retry': 4,
+ u'periodic': True}
+ if override:
+ content.update(override)
+ self._register_local_get(URI_KEEPALIVE, json=content)
+
+ def test_configure_ike_keepalive(self):
+ """Set IKE keep-alive (aka Dead Peer Detection) for the CSR."""
+ keepalive_info = {'interval': 60, 'retry': 4}
+ self.csr.configure_ike_keepalive(keepalive_info)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ content = self.csr.get_request(URI_KEEPALIVE)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ expected = {'periodic': False}
+ expected.update(keepalive_info)
+ self.assertDictSupersetOf(expected, content)
+
+ def test_disable_ike_keepalive(self):
+ """Disable IKE keep-alive (aka Dead Peer Detection) for the CSR."""
+ keepalive_info = {'interval': 0, 'retry': 4}
+ self.csr.configure_ike_keepalive(keepalive_info)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+
+
+class TestCsrRestStaticRoute(CiscoCsrBaseTestCase):
+
+ """Test static route REST requests.
+
+ A static route is added for the peer's private network. Would create
+ a route for each of the peer CIDRs specified for the VPN connection.
+ """
+
+ def setUp(self, host='localhost', tunnel_ip='10.10.10.10', timeout=None):
+ """Set up for each test in this suite.
+
+ Each test case will have a normal authentication mock response
+ registered, although the test may replace it, if needed.
+ """
+ super(TestCsrRestStaticRoute, self).setUp(host, tunnel_ip, timeout)
+ self._helper_register_auth_request()
+
+ def test_create_delete_static_route(self):
+ """Create and then delete a static route for the tunnel."""
+ expected_id = '10.1.0.0_24_GigabitEthernet1'
+ self._register_local_post(URI_ROUTES, resource_id=expected_id)
+ cidr = u'10.1.0.0/24'
+ interface = u'GigabitEthernet1'
+ route_info = {u'destination-network': cidr,
+ u'outgoing-interface': interface}
+ location = self.csr.create_static_route(route_info)
+ self.assertEqual(requests.codes.CREATED, self.csr.status)
+ self.assertIn(URI_ROUTES_ID % expected_id, location)
+
+ # Check the hard-coded items that get set as well...
+ expected_route = {u'destination-network': u'10.1.0.0/24',
+ u'kind': u'object#static-route',
+ u'next-hop-router': None,
+ u'outgoing-interface': u'GigabitEthernet1',
+ u'admin-distance': 1}
+ self._register_local_get(URI_ROUTES_ID % expected_id,
+ json=expected_route)
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.OK, self.csr.status)
+ self.assertEqual(expected_route, content)
+
+ # Now delete and verify that static route is gone
+ self._register_local_delete(URI_ROUTES, expected_id)
+ self._register_local_get_not_found(URI_ROUTES, expected_id)
+ route_id = csr_client.make_route_id(cidr, interface)
+ self.csr.delete_static_route(route_id)
+ self.assertEqual(requests.codes.NO_CONTENT, self.csr.status)
+ content = self.csr.get_request(location, full_url=True)
+ self.assertEqual(requests.codes.NOT_FOUND, self.csr.status)
diff --git a/neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py b/neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py
index f08364894c..c6a6c68463 100644
--- a/neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py
+++ b/neutron/tests/unit/services/vpn/device_drivers/test_cisco_ipsec.py
@@ -14,6 +14,7 @@
import copy
import httplib
+import operator
import mock
@@ -124,7 +125,7 @@ class TestCiscoCsrIPSecConnection(base.BaseTestCase):
steps are called in reverse order. At the end, there should be no
rollback infromation for the connection.
"""
- def fake_route_check_fails(*args, **kwargs):
+ def fake_route_check_fails(*args):
if args[0] == 'Static Route':
# So that subsequent calls to CSR rest client (for rollback)
# will fake as passing.
@@ -1530,7 +1531,8 @@ class TestCiscoCsrIPsecDeviceDriverSyncStatuses(base.BaseTestCase):
u'4': {u'status': constants.ACTIVE,
u'updated_pending_status': True}}
}]
- self.assertEqual(expected_report, report)
+ self.assertEqual(expected_report,
+ sorted(report, key=operator.itemgetter('id')))
# Check that service and connection statuses are updated
self.assertEqual(constants.ACTIVE, vpn_service1.last_status)
self.assertEqual(constants.ACTIVE,
diff --git a/neutron/tests/unit/services/vpn/service_drivers/__init__.py b/neutron/tests/unit/services/vpn/service_drivers/__init__.py
index 46d9c1bed8..e69de29bb2 100644
--- a/neutron/tests/unit/services/vpn/service_drivers/__init__.py
+++ b/neutron/tests/unit/services/vpn/service_drivers/__init__.py
@@ -1,14 +0,0 @@
-# Copyright 2013, Nachi Ueno, NTT I3, Inc.
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
diff --git a/neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py b/neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py
index 781344f75f..10b9d987c8 100644
--- a/neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py
+++ b/neutron/tests/unit/services/vpn/service_drivers/test_cisco_ipsec.py
@@ -29,19 +29,15 @@ from neutron.tests.unit import testlib_api
_uuid = uuidutils.generate_uuid
FAKE_VPN_CONN_ID = _uuid()
+FAKE_SERVICE_ID = _uuid()
FAKE_VPN_CONNECTION = {
- 'vpnservice_id': _uuid(),
+ 'vpnservice_id': FAKE_SERVICE_ID,
'id': FAKE_VPN_CONN_ID,
'ikepolicy_id': _uuid(),
'ipsecpolicy_id': _uuid(),
'tenant_id': _uuid()
}
-FAKE_SERVICE_ID = _uuid()
-FAKE_VPN_CONNECTION = {
- 'vpnservice_id': FAKE_SERVICE_ID
-}
-
FAKE_ROUTER_ID = _uuid()
FAKE_VPN_SERVICE = {
'router_id': FAKE_ROUTER_ID
diff --git a/neutron/tests/unit/services/vpn/test_vpn_agent.py b/neutron/tests/unit/services/vpn/test_vpn_agent.py
index f360dfaa1f..d6ab140fc3 100644
--- a/neutron/tests/unit/services/vpn/test_vpn_agent.py
+++ b/neutron/tests/unit/services/vpn/test_vpn_agent.py
@@ -93,8 +93,9 @@ class TestVPNAgent(base.BaseTestCase):
def test_get_namespace(self):
router_id = _uuid()
+ ns = "ns-" + router_id
ri = l3_agent.RouterInfo(router_id, self.conf.root_helper,
- self.conf.use_namespaces, {})
+ self.conf.use_namespaces, {}, ns_name=ns)
self.agent.router_info = {router_id: ri}
namespace = self.agent.get_namespace(router_id)
self.assertTrue(namespace.endswith(router_id))
@@ -170,9 +171,10 @@ class TestVPNAgent(base.BaseTestCase):
'neutron.agent.linux.iptables_manager.IptablesManager').start()
router_id = _uuid()
ri = l3_agent.RouterInfo(router_id, self.conf.root_helper,
- self.conf.use_namespaces, {})
+ self.conf.use_namespaces, {},
+ ns_name="qrouter-%s" % router_id)
ri.router = {
- 'id': _uuid(),
+ 'id': router_id,
'admin_state_up': True,
'routes': [],
'external_gateway_info': {},
@@ -183,15 +185,14 @@ class TestVPNAgent(base.BaseTestCase):
self.agent._router_removed(router_id)
device.destroy_router.assert_called_once_with(router_id)
- def test_process_routers(self):
+ def test_process_router_if_compatible(self):
self.plugin_api.get_external_network_id.return_value = None
- routers = [
- {'id': _uuid(),
- 'admin_state_up': True,
- 'routes': [],
- 'external_gateway_info': {}}]
+ router = {'id': _uuid(),
+ 'admin_state_up': True,
+ 'routes': [],
+ 'external_gateway_info': {}}
device = mock.Mock()
self.agent.devices = [device]
- self.agent._process_routers(routers, False)
- device.sync.assert_called_once_with(mock.ANY, routers)
+ self.agent._process_router_if_compatible(router)
+ device.sync.assert_called_once_with(mock.ANY, [router])
diff --git a/neutron/tests/unit/test_api_v2.py b/neutron/tests/unit/test_api_v2.py
index e2ee2aacb4..c38cbaa42f 100644
--- a/neutron/tests/unit/test_api_v2.py
+++ b/neutron/tests/unit/test_api_v2.py
@@ -13,7 +13,6 @@
# License for the specific language governing permissions and limitations
# under the License.
-import collections
import os
import mock
@@ -145,7 +144,7 @@ class APIv2TestCase(APIv2TestBase):
def _get_collection_kwargs(self, skipargs=[], **kwargs):
args_list = ['filters', 'fields', 'sorts', 'limit', 'marker',
'page_reverse']
- args_dict = collections.OrderedDict(
+ args_dict = dict(
(arg, mock.ANY) for arg in set(args_list) - set(skipargs))
args_dict.update(kwargs)
return args_dict
@@ -791,11 +790,7 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase):
def test_create_no_keystone_env(self):
data = {'name': 'net1'}
- res = self.api.post(_get_path('networks', fmt=self.fmt),
- self.serialize(data),
- content_type='application/' + self.fmt,
- expect_errors=True)
- self.assertEqual(res.status_int, exc.HTTPBadRequest.code)
+ self._test_create_failure_bad_request('networks', data)
def test_create_with_keystone_env(self):
tenant_id = _uuid()
@@ -827,45 +822,25 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase):
tenant_id = _uuid()
data = {'network': {'name': 'net1', 'tenant_id': tenant_id}}
env = {'neutron.context': context.Context('', tenant_id + "bad")}
- res = self.api.post(_get_path('networks', fmt=self.fmt),
- self.serialize(data),
- content_type='application/' + self.fmt,
- expect_errors=True,
- extra_environ=env)
- self.assertEqual(res.status_int, exc.HTTPBadRequest.code)
+ self._test_create_failure_bad_request('networks', data,
+ extra_environ=env)
def test_create_no_body(self):
data = {'whoa': None}
- res = self.api.post(_get_path('networks', fmt=self.fmt),
- self.serialize(data),
- content_type='application/' + self.fmt,
- expect_errors=True)
- self.assertEqual(res.status_int, exc.HTTPBadRequest.code)
+ self._test_create_failure_bad_request('networks', data)
def test_create_no_resource(self):
data = {}
- res = self.api.post(_get_path('networks', fmt=self.fmt),
- self.serialize(data),
- content_type='application/' + self.fmt,
- expect_errors=True)
- self.assertEqual(res.status_int, exc.HTTPBadRequest.code)
+ self._test_create_failure_bad_request('networks', data)
def test_create_missing_attr(self):
data = {'port': {'what': 'who', 'tenant_id': _uuid()}}
- res = self.api.post(_get_path('ports', fmt=self.fmt),
- self.serialize(data),
- content_type='application/' + self.fmt,
- expect_errors=True)
- self.assertEqual(res.status_int, 400)
+ self._test_create_failure_bad_request('ports', data)
def test_create_readonly_attr(self):
data = {'network': {'name': 'net1', 'tenant_id': _uuid(),
'status': "ACTIVE"}}
- res = self.api.post(_get_path('networks', fmt=self.fmt),
- self.serialize(data),
- content_type='application/' + self.fmt,
- expect_errors=True)
- self.assertEqual(res.status_int, 400)
+ self._test_create_failure_bad_request('networks', data)
def test_create_bulk(self):
data = {'networks': [{'name': 'net1',
@@ -888,38 +863,28 @@ class JSONV2TestCase(APIv2TestBase, testlib_api.WebTestCase):
content_type='application/' + self.fmt)
self.assertEqual(res.status_int, exc.HTTPCreated.code)
- def _test_create_bulk_failure(self, resource, data):
- # TODO(kevinbenton): update the rest of the failure cases to use
- # this.
+ def _test_create_failure_bad_request(self, resource, data, **kwargs):
res = self.api.post(_get_path(resource, fmt=self.fmt),
self.serialize(data),
content_type='application/' + self.fmt,
- expect_errors=True)
+ expect_errors=True, **kwargs)
self.assertEqual(res.status_int, exc.HTTPBadRequest.code)
def test_create_bulk_networks_none(self):
- self._test_create_bulk_failure('networks', {'networks': None})
+ self._test_create_failure_bad_request('networks', {'networks': None})
def test_create_bulk_networks_empty_list(self):
- self._test_create_bulk_failure('networks', {'networks': []})
+ self._test_create_failure_bad_request('networks', {'networks': []})
def test_create_bulk_missing_attr(self):
data = {'ports': [{'what': 'who', 'tenant_id': _uuid()}]}
- res = self.api.post(_get_path('ports', fmt=self.fmt),
- self.serialize(data),
- content_type='application/' + self.fmt,
- expect_errors=True)
- self.assertEqual(res.status_int, 400)
+ self._test_create_failure_bad_request('ports', data)
def test_create_bulk_partial_body(self):
data = {'ports': [{'device_id': 'device_1',
'tenant_id': _uuid()},
{'tenant_id': _uuid()}]}
- res = self.api.post(_get_path('ports', fmt=self.fmt),
- self.serialize(data),
- content_type='application/' + self.fmt,
- expect_errors=True)
- self.assertEqual(res.status_int, 400)
+ self._test_create_failure_bad_request('ports', data)
def test_create_attr_not_specified(self):
net_id = _uuid()
@@ -1207,6 +1172,18 @@ class SubresourceTest(base.BaseTestCase, testlib_plugin.PluginSetupHelper):
network_id='id1',
dummy=body)
+ def test_update_subresource_to_none(self):
+ instance = self.plugin.return_value
+
+ dummy_id = _uuid()
+ body = {'dummy': {}}
+ self.api.put_json('/networks/id1' + _get_path('dummies', id=dummy_id),
+ body)
+ instance.update_network_dummy.assert_called_once_with(mock.ANY,
+ dummy_id,
+ network_id='id1',
+ dummy=body)
+
def test_delete_sub_resource(self):
instance = self.plugin.return_value
diff --git a/neutron/tests/unit/test_db_plugin.py b/neutron/tests/unit/test_db_plugin.py
index 7754cc2b12..74292fac07 100644
--- a/neutron/tests/unit/test_db_plugin.py
+++ b/neutron/tests/unit/test_db_plugin.py
@@ -15,6 +15,7 @@
import contextlib
import copy
+import itertools
import mock
from oslo.config import cfg
@@ -368,10 +369,12 @@ class NeutronDbPluginV2TestCase(testlib_api.WebTestCase,
def _list_ports(self, fmt, expected_res_status=None,
net_id=None, **kwargs):
- query_params = None
+ query_params = []
if net_id:
- query_params = "network_id=%s" % net_id
- port_req = self.new_list_request('ports', fmt, query_params)
+ query_params.append("network_id=%s" % net_id)
+ if kwargs.get('device_owner'):
+ query_params.append("device_owner=%s" % kwargs.get('device_owner'))
+ port_req = self.new_list_request('ports', fmt, '&'.join(query_params))
if ('set_context' in kwargs and
kwargs['set_context'] is True and
'tenant_id' in kwargs):
@@ -1230,6 +1233,34 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s
self.assertEqual(ips[1]['ip_address'], '10.0.0.4')
self.assertEqual(ips[1]['subnet_id'], subnet['subnet']['id'])
+ def test_update_port_invalid_fixed_ip_address_v6_slaac(self):
+ with self.subnet(
+ cidr='2607:f0d0:1002:51::/64',
+ ip_version=6,
+ ipv6_address_mode=constants.IPV6_SLAAC,
+ gateway_ip=attributes.ATTR_NOT_SPECIFIED) as subnet:
+ with self.port(subnet=subnet) as port:
+ ips = port['port']['fixed_ips']
+ self.assertEqual(len(ips), 1)
+ port_mac = port['port']['mac_address']
+ subnet_cidr = subnet['subnet']['cidr']
+ eui_addr = str(ipv6_utils.get_ipv6_addr_by_EUI64(subnet_cidr,
+ port_mac))
+ self.assertEqual(ips[0]['ip_address'], eui_addr)
+ self.assertEqual(ips[0]['subnet_id'], subnet['subnet']['id'])
+
+ data = {'port': {'fixed_ips': [{'subnet_id':
+ subnet['subnet']['id'],
+ 'ip_address':
+ '2607:f0d0:1002:51::5'}]}}
+ req = self.new_update_request('ports', data,
+ port['port']['id'])
+ res = req.get_response(self.api)
+ err = self.deserialize(self.fmt, res)
+ self.assertEqual(res.status_int,
+ webob.exc.HTTPClientError.code)
+ self.assertEqual(err['NeutronError']['type'], 'InvalidInput')
+
def test_requested_duplicate_mac(self):
with self.port() as port:
mac = port['port']['mac_address']
@@ -1292,20 +1323,6 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s
res = self._create_port(self.fmt, net_id=net_id, **kwargs)
self.assertEqual(res.status_int, webob.exc.HTTPConflict.code)
- def test_generated_duplicate_ip_ipv6(self):
- with self.subnet(ip_version=6,
- cidr="2014::/64",
- ipv6_address_mode=constants.IPV6_SLAAC) as subnet:
- with self.port(subnet=subnet,
- fixed_ips=[{'subnet_id': subnet['subnet']['id'],
- 'ip_address':
- "2014::1322:33ff:fe44:5566"}]) as port:
- # Check configuring of duplicate IP
- kwargs = {"mac_address": "11:22:33:44:55:66"}
- net_id = port['port']['network_id']
- res = self._create_port(self.fmt, net_id=net_id, **kwargs)
- self.assertEqual(res.status_int, webob.exc.HTTPConflict.code)
-
def test_requested_subnet_id(self):
with self.subnet() as subnet:
with self.port(subnet=subnet) as port:
@@ -1390,13 +1407,64 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s
self._delete('ports', port3['port']['id'])
self._delete('ports', port4['port']['id'])
- def test_ip_allocation_for_ipv6_subnet_slaac_adddress_mode(self):
+ def test_requested_invalid_fixed_ip_address_v6_slaac(self):
+ with self.subnet(gateway_ip='fe80::1',
+ cidr='2607:f0d0:1002:51::/64',
+ ip_version=6,
+ ipv6_address_mode=constants.IPV6_SLAAC) as subnet:
+ kwargs = {"fixed_ips": [{'subnet_id': subnet['subnet']['id'],
+ 'ip_address': '2607:f0d0:1002:51::5'}]}
+ net_id = subnet['subnet']['network_id']
+ res = self._create_port(self.fmt, net_id=net_id, **kwargs)
+ self.assertEqual(res.status_int,
+ webob.exc.HTTPClientError.code)
+
+ def test_requested_subnet_id_v6_slaac(self):
+ with self.subnet(gateway_ip='fe80::1',
+ cidr='2607:f0d0:1002:51::/64',
+ ip_version=6,
+ ipv6_address_mode=constants.IPV6_SLAAC) as subnet:
+ with self.port(subnet,
+ fixed_ips=[{'subnet_id':
+ subnet['subnet']['id']}]) as port:
+ port_mac = port['port']['mac_address']
+ subnet_cidr = subnet['subnet']['cidr']
+ eui_addr = str(ipv6_utils.get_ipv6_addr_by_EUI64(subnet_cidr,
+ port_mac))
+ self.assertEqual(port['port']['fixed_ips'][0]['ip_address'],
+ eui_addr)
+
+ def test_requested_subnet_id_v4_and_v6_slaac(self):
+ with self.network() as network:
+ with contextlib.nested(
+ self.subnet(network),
+ self.subnet(network,
+ cidr='2607:f0d0:1002:51::/64',
+ ip_version=6,
+ gateway_ip='fe80::1',
+ ipv6_address_mode=constants.IPV6_SLAAC)
+ ) as (subnet, subnet2):
+ with self.port(
+ subnet,
+ fixed_ips=[{'subnet_id': subnet['subnet']['id']},
+ {'subnet_id': subnet2['subnet']['id']}]
+ ) as port:
+ ips = port['port']['fixed_ips']
+ self.assertEqual(len(ips), 2)
+ self.assertEqual(ips[0]['ip_address'], '10.0.0.2')
+ port_mac = port['port']['mac_address']
+ subnet_cidr = subnet2['subnet']['cidr']
+ eui_addr = str(ipv6_utils.get_ipv6_addr_by_EUI64(
+ subnet_cidr, port_mac))
+ self.assertEqual(ips[1]['ip_address'], eui_addr)
+
+ def test_ip_allocation_for_ipv6_subnet_slaac_address_mode(self):
res = self._create_network(fmt=self.fmt, name='net',
admin_state_up=True)
network = self.deserialize(self.fmt, res)
v6_subnet = self._make_subnet(self.fmt, network,
gateway='fe80::1',
- cidr='fe80::/80',
+ cidr='fe80::/64',
ip_version=6,
ipv6_ra_mode=None,
ipv6_address_mode=constants.IPV6_SLAAC)
@@ -2359,6 +2427,18 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
res = subnet_req.get_response(self.api)
self.assertEqual(res.status_int, webob.exc.HTTPClientError.code)
+ def test_create_subnet_V6_slaac_big_prefix(self):
+ with self.network() as network:
+ data = {'subnet': {'network_id': network['network']['id'],
+ 'cidr': '2014::/65',
+ 'ip_version': '6',
+ 'tenant_id': network['network']['tenant_id'],
+ 'gateway_ip': 'fe80::1',
+ 'ipv6_address_mode': 'slaac'}}
+ subnet_req = self.new_create_request('subnets', data)
+ res = subnet_req.get_response(self.api)
+ self.assertEqual(webob.exc.HTTPClientError.code, res.status_int)
+
def test_create_2_subnets_overlapping_cidr_allowed_returns_200(self):
cidr_1 = '10.0.0.0/23'
cidr_2 = '10.0.0.0/24'
@@ -3024,15 +3104,48 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
res = subnet_req.get_response(self.api)
self.assertEqual(res.status_int, webob.exc.HTTPClientError.code)
- def test_create_subnet_ipv6_attributes(self):
- gateway_ip = 'fe80::1'
- cidr = 'fe80::/80'
-
- for mode in constants.IPV6_MODES:
- self._test_create_subnet(gateway_ip=gateway_ip,
- cidr=cidr, ip_version=6,
- ipv6_ra_mode=mode,
- ipv6_address_mode=mode)
+ def _test_validate_subnet_ipv6_modes(self, cur_subnet=None,
+ expect_success=True, **modes):
+ plugin = manager.NeutronManager.get_plugin()
+ ctx = context.get_admin_context(load_admin_roles=False)
+ new_subnet = {'ip_version': 6,
+ 'cidr': 'fe80::/64',
+ 'enable_dhcp': True}
+ for mode, value in modes.items():
+ new_subnet[mode] = value
+ if expect_success:
+ plugin._validate_subnet(ctx, new_subnet, cur_subnet)
+ else:
+ self.assertRaises(n_exc.InvalidInput, plugin._validate_subnet,
+ ctx, new_subnet, cur_subnet)
+
+ def test_create_subnet_ipv6_ra_modes(self):
+ # Test all RA modes with no address mode specified
+ for ra_mode in constants.IPV6_MODES:
+ self._test_validate_subnet_ipv6_modes(
+ ipv6_ra_mode=ra_mode)
+
+ def test_create_subnet_ipv6_addr_modes(self):
+ # Test all address modes with no RA mode specified
+ for addr_mode in constants.IPV6_MODES:
+ self._test_validate_subnet_ipv6_modes(
+ ipv6_address_mode=addr_mode)
+
+ def test_create_subnet_ipv6_same_ra_and_addr_modes(self):
+ # Test all ipv6 modes with ra_mode==addr_mode
+ for ipv6_mode in constants.IPV6_MODES:
+ self._test_validate_subnet_ipv6_modes(
+ ipv6_ra_mode=ipv6_mode,
+ ipv6_address_mode=ipv6_mode)
+
+ def test_create_subnet_ipv6_different_ra_and_addr_modes(self):
+ # Test all ipv6 modes with ra_mode!=addr_mode
+ for ra_mode, addr_mode in itertools.permutations(
+ constants.IPV6_MODES, 2):
+ self._test_validate_subnet_ipv6_modes(
+ expect_success=not (ra_mode and addr_mode),
+ ipv6_ra_mode=ra_mode,
+ ipv6_address_mode=addr_mode)
def test_create_subnet_ipv6_out_of_cidr_global(self):
gateway_ip = '2000::1'
@@ -3058,7 +3171,7 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
def test_create_subnet_ipv6_attributes_no_dhcp_enabled(self):
gateway_ip = 'fe80::1'
- cidr = 'fe80::/80'
+ cidr = 'fe80::/64'
with testlib_api.ExpectedException(
webob.exc.HTTPClientError) as ctx_manager:
for mode in constants.IPV6_MODES:
@@ -3094,31 +3207,6 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
self.assertEqual(ctx_manager.exception.code,
webob.exc.HTTPClientError.code)
- def test_create_subnet_invalid_ipv6_combination(self):
- gateway_ip = 'fe80::1'
- cidr = 'fe80::/80'
- with testlib_api.ExpectedException(
- webob.exc.HTTPClientError) as ctx_manager:
- self._test_create_subnet(gateway_ip=gateway_ip,
- cidr=cidr, ip_version=6,
- ipv6_ra_mode='stateful',
- ipv6_address_mode='stateless')
- self.assertEqual(ctx_manager.exception.code,
- webob.exc.HTTPClientError.code)
-
- def test_create_subnet_ipv6_single_attribute_set(self):
- gateway_ip = 'fe80::1'
- cidr = 'fe80::/80'
- for mode in constants.IPV6_MODES:
- self._test_create_subnet(gateway_ip=gateway_ip,
- cidr=cidr, ip_version=6,
- ipv6_ra_mode=None,
- ipv6_address_mode=mode)
- self._test_create_subnet(gateway_ip=gateway_ip,
- cidr=cidr, ip_version=6,
- ipv6_ra_mode=mode,
- ipv6_address_mode=None)
-
def test_create_subnet_ipv6_ra_mode_ip_version_4(self):
cidr = '10.0.2.0/24'
with testlib_api.ExpectedException(
@@ -3298,24 +3386,21 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
self.assertEqual(res.status_int,
webob.exc.HTTPConflict.code)
- def test_update_subnet_ipv6_attributes(self):
- with self.subnet(ip_version=6, cidr='fe80::/80',
+ def test_update_subnet_ipv6_attributes_fails(self):
+ with self.subnet(ip_version=6, cidr='fe80::/64',
ipv6_ra_mode=constants.IPV6_SLAAC,
ipv6_address_mode=constants.IPV6_SLAAC) as subnet:
data = {'subnet': {'ipv6_ra_mode': constants.DHCPV6_STATEFUL,
'ipv6_address_mode': constants.DHCPV6_STATEFUL}}
req = self.new_update_request('subnets', data,
subnet['subnet']['id'])
- res = self.deserialize(self.fmt, req.get_response(self.api))
- self.assertEqual(res['subnet']['ipv6_ra_mode'],
- data['subnet']['ipv6_ra_mode'])
- self.assertEqual(res['subnet']['ipv6_address_mode'],
- data['subnet']['ipv6_address_mode'])
+ res = req.get_response(self.api)
+ self.assertEqual(res.status_int,
+ webob.exc.HTTPClientError.code)
- def test_update_subnet_ipv6_inconsistent_ra_attribute(self):
- with self.subnet(ip_version=6, cidr='fe80::/80',
- ipv6_ra_mode=constants.IPV6_SLAAC,
- ipv6_address_mode=constants.IPV6_SLAAC) as subnet:
+ def test_update_subnet_ipv6_ra_mode_fails(self):
+ with self.subnet(ip_version=6, cidr='fe80::/64',
+ ipv6_ra_mode=constants.IPV6_SLAAC) as subnet:
data = {'subnet': {'ipv6_ra_mode': constants.DHCPV6_STATEFUL}}
req = self.new_update_request('subnets', data,
subnet['subnet']['id'])
@@ -3323,9 +3408,8 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
self.assertEqual(res.status_int,
webob.exc.HTTPClientError.code)
- def test_update_subnet_ipv6_inconsistent_address_attribute(self):
- with self.subnet(ip_version=6, cidr='fe80::/80',
- ipv6_ra_mode=constants.IPV6_SLAAC,
+ def test_update_subnet_ipv6_ra_mode_fails(self):
+ with self.subnet(ip_version=6, cidr='fe80::/64',
ipv6_address_mode=constants.IPV6_SLAAC) as subnet:
data = {'subnet': {'ipv6_address_mode': constants.DHCPV6_STATEFUL}}
req = self.new_update_request('subnets', data,
@@ -3334,8 +3418,8 @@ class TestSubnetsV2(NeutronDbPluginV2TestCase):
self.assertEqual(res.status_int,
webob.exc.HTTPClientError.code)
- def test_update_subnet_ipv6_inconsistent_enable_dhcp(self):
- with self.subnet(ip_version=6, cidr='fe80::/80',
+ def test_update_subnet_ipv6_cannot_disable_dhcp(self):
+ with self.subnet(ip_version=6, cidr='fe80::/64',
ipv6_ra_mode=constants.IPV6_SLAAC,
ipv6_address_mode=constants.IPV6_SLAAC) as subnet:
data = {'subnet': {'enable_dhcp': False}}
diff --git a/neutron/tests/unit/test_dhcp_agent.py b/neutron/tests/unit/test_dhcp_agent.py
index c6f98643fe..cae87c692b 100644
--- a/neutron/tests/unit/test_dhcp_agent.py
+++ b/neutron/tests/unit/test_dhcp_agent.py
@@ -72,6 +72,8 @@ fake_meta_subnet = dhcp.DictModel(dict(id='bbbbbbbb-1111-2222-bbbbbbbbbbbb',
fake_fixed_ip1 = dhcp.DictModel(dict(id='', subnet_id=fake_subnet1.id,
ip_address='172.9.9.9'))
+fake_fixed_ip2 = dhcp.DictModel(dict(id='', subnet_id=fake_subnet1.id,
+ ip_address='172.9.9.10'))
fake_meta_fixed_ip = dhcp.DictModel(dict(id='', subnet=fake_meta_subnet,
ip_address='169.254.169.254'))
fake_allocation_pool_subnet1 = dhcp.DictModel(dict(id='', start='172.9.9.2',
@@ -89,7 +91,7 @@ fake_port2 = dhcp.DictModel(dict(id='12345678-1234-aaaa-123456789000',
device_owner='',
mac_address='aa:bb:cc:dd:ee:99',
network_id='12345678-1234-5678-1234567890ab',
- fixed_ips=[]))
+ fixed_ips=[fake_fixed_ip2]))
fake_meta_port = dhcp.DictModel(dict(id='12345678-1234-aaaa-1234567890ab',
mac_address='aa:bb:cc:dd:ee:ff',
@@ -98,6 +100,13 @@ fake_meta_port = dhcp.DictModel(dict(id='12345678-1234-aaaa-1234567890ab',
device_id='forzanapoli',
fixed_ips=[fake_meta_fixed_ip]))
+fake_dist_port = dhcp.DictModel(dict(id='12345678-1234-aaaa-1234567890ab',
+ mac_address='aa:bb:cc:dd:ee:ff',
+ network_id='12345678-1234-5678-1234567890ab',
+ device_owner=const.DEVICE_OWNER_DVR_INTERFACE,
+ device_id='forzanapoli',
+ fixed_ips=[fake_meta_fixed_ip]))
+
fake_network = dhcp.NetModel(True, dict(id='12345678-1234-5678-1234567890ab',
tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa',
admin_state_up=True,
@@ -112,6 +121,14 @@ isolated_network = dhcp.NetModel(
subnets=[fake_subnet1],
ports=[fake_port1]))
+nonisolated_dist_network = dhcp.NetModel(
+ True, dict(
+ id='12345678-1234-5678-1234567890ab',
+ tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa',
+ admin_state_up=True,
+ subnets=[fake_subnet1],
+ ports=[fake_port1, fake_port2]))
+
empty_network = dhcp.NetModel(
True, dict(
id='12345678-1234-5678-1234567890ab',
@@ -127,6 +144,13 @@ fake_meta_network = dhcp.NetModel(
subnets=[fake_meta_subnet],
ports=[fake_meta_port]))
+fake_dist_network = dhcp.NetModel(
+ True, dict(id='12345678-1234-5678-1234567890ab',
+ tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa',
+ admin_state_up=True,
+ subnets=[fake_meta_subnet],
+ ports=[fake_meta_port, fake_dist_port]))
+
fake_down_network = dhcp.NetModel(
True, dict(id='12345678-dddd-dddd-1234567890ab',
tenant_id='aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa',
@@ -540,13 +564,26 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
def test_enable_dhcp_helper_enable_metadata_nonisolated_network(self):
nonisolated_network = copy.deepcopy(isolated_network)
- nonisolated_network.ports[0].device_owner = "network:router_interface"
+ nonisolated_network.ports[0].device_owner = (
+ const.DEVICE_OWNER_ROUTER_INTF)
nonisolated_network.ports[0].fixed_ips[0].ip_address = '172.9.9.1'
self._enable_dhcp_helper(nonisolated_network,
enable_isolated_metadata=True,
is_isolated_network=False)
+ def test_enable_dhcp_helper_enable_metadata_nonisolated_dist_network(self):
+ nonisolated_dist_network.ports[0].device_owner = (
+ const.DEVICE_OWNER_ROUTER_INTF)
+ nonisolated_dist_network.ports[0].fixed_ips[0].ip_address = '172.9.9.1'
+ nonisolated_dist_network.ports[1].device_owner = (
+ const.DEVICE_OWNER_DVR_INTERFACE)
+ nonisolated_dist_network.ports[1].fixed_ips[0].ip_address = '172.9.9.1'
+
+ self._enable_dhcp_helper(nonisolated_dist_network,
+ enable_isolated_metadata=True,
+ is_isolated_network=False)
+
def test_enable_dhcp_helper_enable_metadata_empty_network(self):
self._enable_dhcp_helper(empty_network,
enable_isolated_metadata=True,
@@ -685,7 +722,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
mock.call().disable()
])
- def test_enable_isolated_metadata_proxy_with_metadata_network(self):
+ def _test_metadata_network(self, network):
cfg.CONF.set_override('enable_metadata_network', True)
cfg.CONF.set_override('debug', True)
cfg.CONF.set_override('verbose', False)
@@ -695,7 +732,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
# Ensure the mock is restored if this test fail
try:
with mock.patch(class_path) as ip_wrapper:
- self.dhcp.enable_isolated_metadata_proxy(fake_meta_network)
+ self.dhcp.enable_isolated_metadata_proxy(network)
ip_wrapper.assert_has_calls([mock.call(
'sudo',
'qdhcp-12345678-1234-5678-1234567890ab'),
@@ -708,11 +745,17 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
mock.ANY,
'--debug',
('--log-file=neutron-ns-metadata-proxy-%s.log' %
- fake_meta_network.id)], addl_env=None)
+ network.id)], addl_env=None)
])
finally:
self.external_process_p.start()
+ def test_enable_isolated_metadata_proxy_with_metadata_network(self):
+ self._test_metadata_network(fake_meta_network)
+
+ def test_enable_isolated_metadata_proxy_with_dist_network(self):
+ self._test_metadata_network(fake_dist_network)
+
def test_network_create_end(self):
payload = dict(network=dict(id=fake_network.id))
diff --git a/neutron/tests/unit/test_dhcp_rpc.py b/neutron/tests/unit/test_dhcp_rpc.py
index 6a2ed16d7e..2c4c5c9e6e 100644
--- a/neutron/tests/unit/test_dhcp_rpc.py
+++ b/neutron/tests/unit/test_dhcp_rpc.py
@@ -161,13 +161,44 @@ class TestDhcpRpcCallback(base.BaseTestCase):
self.plugin.assert_has_calls(expected)
return retval
+ def test_update_dhcp_port_verify_port_action_port_dict(self):
+ port = {'port': {'network_id': 'foo_network_id',
+ 'device_owner': constants.DEVICE_OWNER_DHCP,
+ 'fixed_ips': [{'subnet_id': 'foo_subnet_id'}]}
+ }
+ expected_port = {'port': {'network_id': 'foo_network_id',
+ 'device_owner': constants.DEVICE_OWNER_DHCP,
+ 'fixed_ips': [{'subnet_id': 'foo_subnet_id'}]
+ },
+ 'id': 'foo_port_id'
+ }
+
+ def _fake_port_action(plugin, context, port, action):
+ self.assertEqual(expected_port, port)
+
+ self.callbacks._port_action = _fake_port_action
+ self.callbacks.update_dhcp_port(mock.Mock(),
+ host='foo_host',
+ port_id='foo_port_id',
+ port=port)
+
def test_update_dhcp_port(self):
+ port = {'port': {'network_id': 'foo_network_id',
+ 'device_owner': constants.DEVICE_OWNER_DHCP,
+ 'fixed_ips': [{'subnet_id': 'foo_subnet_id'}]}
+ }
+ expected_port = {'port': {'network_id': 'foo_network_id',
+ 'device_owner': constants.DEVICE_OWNER_DHCP,
+ 'fixed_ips': [{'subnet_id': 'foo_subnet_id'}]
+ },
+ 'id': 'foo_port_id'
+ }
self.callbacks.update_dhcp_port(mock.Mock(),
host='foo_host',
port_id='foo_port_id',
- port=mock.Mock())
+ port=port)
self.plugin.assert_has_calls(
- mock.call.update_port(mock.ANY, 'foo_port_id', mock.ANY))
+ mock.call.update_port(mock.ANY, 'foo_port_id', expected_port))
def test_get_dhcp_port_existing(self):
port_retval = dict(id='port_id', fixed_ips=[dict(subnet_id='a')])
diff --git a/neutron/tests/unit/test_extension_ext_gw_mode.py b/neutron/tests/unit/test_extension_ext_gw_mode.py
index c119470d39..502fd1c0f9 100644
--- a/neutron/tests/unit/test_extension_ext_gw_mode.py
+++ b/neutron/tests/unit/test_extension_ext_gw_mode.py
@@ -245,14 +245,16 @@ class TestL3GwModeMixin(testlib_api.SqlTestCase,
def test_make_router_dict_with_ext_gw(self):
router_dict = self.target_object._make_router_dict(self.router)
self.assertEqual({'network_id': self.ext_net_id,
- 'enable_snat': True},
+ 'enable_snat': True,
+ 'external_fixed_ips': []},
router_dict[l3.EXTERNAL_GW_INFO])
def test_make_router_dict_with_ext_gw_snat_disabled(self):
self.router.enable_snat = False
router_dict = self.target_object._make_router_dict(self.router)
self.assertEqual({'network_id': self.ext_net_id,
- 'enable_snat': False},
+ 'enable_snat': False,
+ 'external_fixed_ips': []},
router_dict[l3.EXTERNAL_GW_INFO])
def test_build_routers_list_no_ext_gw(self):
@@ -364,7 +366,10 @@ class ExtGwModeIntTestCase(test_db_plugin.NeutronDbPluginV2TestCase,
('admin_state_up', True), ('status', 'ACTIVE'),
('external_gateway_info',
{'network_id': ext_net_id,
- 'enable_snat': snat_expected_value})]
+ 'enable_snat': snat_expected_value,
+ 'external_fixed_ips': [{
+ 'ip_address': mock.ANY,
+ 'subnet_id': s['subnet']['id']}]})]
with self.router(
name=name, admin_state_up=True, tenant_id=tenant_id,
external_gateway_info=input_value) as router:
diff --git a/neutron/tests/unit/test_extension_extended_attribute.py b/neutron/tests/unit/test_extension_extended_attribute.py
index 49f7dc32de..5b008c346c 100644
--- a/neutron/tests/unit/test_extension_extended_attribute.py
+++ b/neutron/tests/unit/test_extension_extended_attribute.py
@@ -26,7 +26,7 @@ from neutron.api.v2 import attributes
from neutron.common import config
from neutron import manager
from neutron.plugins.common import constants
-from neutron.plugins.openvswitch import ovs_neutron_plugin
+from neutron.plugins.ml2 import plugin as ml2_plugin
from neutron import quota
from neutron.tests import base
from neutron.tests.unit.extensions import extendedattribute as extattr
@@ -41,7 +41,7 @@ extensions_path = ':'.join(neutron.tests.unit.extensions.__path__)
class ExtensionExtendedAttributeTestPlugin(
- ovs_neutron_plugin.OVSNeutronPluginV2):
+ ml2_plugin.Ml2Plugin):
supported_extension_aliases = [
'ext-obj-test', "extended-ext-attr"
diff --git a/neutron/tests/unit/test_extension_extraroute.py b/neutron/tests/unit/test_extension_extraroute.py
index f2fa6e3394..dad220370f 100644
--- a/neutron/tests/unit/test_extension_extraroute.py
+++ b/neutron/tests/unit/test_extension_extraroute.py
@@ -403,7 +403,7 @@ class ExtraRouteDBTestCaseBase(object):
200,
s['subnet']['network_id'],
tenant_id=r['router']['tenant_id'],
- device_own=constants.DEVICE_OWNER_ROUTER_GW)
+ device_owner=constants.DEVICE_OWNER_ROUTER_GW)
port_list = self.deserialize('json', port_res)
self.assertEqual(len(port_list['ports']), 1)
diff --git a/neutron/tests/unit/test_extension_firewall.py b/neutron/tests/unit/test_extension_firewall.py
index 27abc0cc6b..a986b029f0 100644
--- a/neutron/tests/unit/test_extension_firewall.py
+++ b/neutron/tests/unit/test_extension_firewall.py
@@ -148,10 +148,9 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase):
res = self.api.post(_get_path('fw/firewall_rules', fmt=self.fmt),
self.serialize(data),
content_type='application/%s' % self.fmt)
- instance.create_firewall_rule.assert_called_with(mock.ANY,
- firewall_rule=
- {'firewall_rule':
- expected_call_args})
+ instance.create_firewall_rule.assert_called_with(
+ mock.ANY,
+ firewall_rule={'firewall_rule': expected_call_args})
self.assertEqual(res.status_int, exc.HTTPCreated.code)
res = self.deserialize(res)
self.assertIn('firewall_rule', res)
@@ -213,10 +212,10 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase):
fmt=self.fmt),
self.serialize(update_data))
- instance.update_firewall_rule.assert_called_with(mock.ANY,
- rule_id,
- firewall_rule=
- update_data)
+ instance.update_firewall_rule.assert_called_with(
+ mock.ANY,
+ rule_id,
+ firewall_rule=update_data)
self.assertEqual(res.status_int, exc.HTTPOk.code)
res = self.deserialize(res)
self.assertIn('firewall_rule', res)
@@ -242,9 +241,9 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase):
fmt=self.fmt),
self.serialize(data),
content_type='application/%s' % self.fmt)
- instance.create_firewall_policy.assert_called_with(mock.ANY,
- firewall_policy=
- data)
+ instance.create_firewall_policy.assert_called_with(
+ mock.ANY,
+ firewall_policy=data)
self.assertEqual(res.status_int, exc.HTTPCreated.code)
res = self.deserialize(res)
self.assertIn('firewall_policy', res)
@@ -299,10 +298,10 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase):
fmt=self.fmt),
self.serialize(update_data))
- instance.update_firewall_policy.assert_called_with(mock.ANY,
- policy_id,
- firewall_policy=
- update_data)
+ instance.update_firewall_policy.assert_called_with(
+ mock.ANY,
+ policy_id,
+ firewall_policy=update_data)
self.assertEqual(res.status_int, exc.HTTPOk.code)
res = self.deserialize(res)
self.assertIn('firewall_policy', res)
diff --git a/neutron/tests/unit/test_extension_security_group.py b/neutron/tests/unit/test_extension_security_group.py
index 478d4a31dd..4f52ba0807 100644
--- a/neutron/tests/unit/test_extension_security_group.py
+++ b/neutron/tests/unit/test_extension_security_group.py
@@ -573,6 +573,16 @@ class TestSecurityGroups(SecurityGroupDBTestCase):
neutron_context=neutron_context).get('security_groups')
self.assertEqual(len(sg), 1)
+ def test_security_group_port_create_creates_default_security_group(self):
+ res = self._create_network(self.fmt, 'net1', True,
+ tenant_id='not_admin',
+ set_context=True)
+ net1 = self.deserialize(self.fmt, res)
+ res = self._create_port(self.fmt, net1['network']['id'],
+ tenant_id='not_admin', set_context=True)
+ sg = self._list('security-groups').get('security_groups')
+ self.assertEqual(len(sg), 1)
+
def test_default_security_group_rules(self):
with self.network():
res = self.new_list_request('security-groups')
diff --git a/neutron/tests/unit/test_hacking.py b/neutron/tests/unit/test_hacking.py
index 895dbe9101..00ffd7de70 100644
--- a/neutron/tests/unit/test_hacking.py
+++ b/neutron/tests/unit/test_hacking.py
@@ -79,3 +79,21 @@ class HackingTestCase(base.BaseTestCase):
self.assertEqual(2, checks.no_author_tags("# author: pele")[0])
self.assertEqual(2, checks.no_author_tags("# Author: pele")[0])
self.assertEqual(3, checks.no_author_tags(".. moduleauthor:: pele")[0])
+
+ def test_assert_called_once(self):
+ fail_code = """
+ mock = Mock()
+ mock.method(1, 2, 3, test='wow')
+ mock.method.assert_called_once()
+ """
+ pass_code = """
+ mock = Mock()
+ mock.method(1, 2, 3, test='wow')
+ mock.method.assert_called_once_with()
+ """
+ self.assertEqual(
+ 1, len(list(checks.check_assert_called_once(fail_code,
+ "neutron/tests/test_assert.py"))))
+ self.assertEqual(
+ 0, len(list(checks.check_assert_called_once(pass_code,
+ "neutron/tests/test_assert.py"))))
diff --git a/neutron/tests/unit/test_iptables_firewall.py b/neutron/tests/unit/test_iptables_firewall.py
index d94da9aac8..c4c0cafb25 100644
--- a/neutron/tests/unit/test_iptables_firewall.py
+++ b/neutron/tests/unit/test_iptables_firewall.py
@@ -19,6 +19,7 @@ import mock
from oslo.config import cfg
from neutron.agent.common import config as a_cfg
+from neutron.agent.linux import iptables_comments as ic
from neutron.agent.linux import iptables_firewall
from neutron.agent import securitygroups_rpc as sg_cfg
from neutron.common import constants
@@ -42,6 +43,8 @@ class BaseIptablesFirewallTestCase(base.BaseTestCase):
super(BaseIptablesFirewallTestCase, self).setUp()
cfg.CONF.register_opts(a_cfg.ROOT_HELPER_OPTS, 'AGENT')
cfg.CONF.register_opts(sg_cfg.security_group_opts, 'SECURITYGROUP')
+ cfg.CONF.register_opts(a_cfg.IPTABLES_OPTS, 'AGENT')
+ cfg.CONF.set_override('comment_iptables_rules', False, 'AGENT')
self.utils_exec_p = mock.patch(
'neutron.agent.linux.utils.execute')
self.utils_exec = self.utils_exec_p.start()
@@ -71,55 +74,74 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
port = self._fake_port()
self.firewall.prepare_port_filter(port)
calls = [mock.call.add_chain('sg-fallback'),
- mock.call.add_rule('sg-fallback', '-j DROP'),
+ mock.call.add_rule(
+ 'sg-fallback', '-j DROP',
+ comment=ic.UNMATCH_DROP),
mock.call.ensure_remove_chain('sg-chain'),
mock.call.add_chain('sg-chain'),
mock.call.add_chain('ifake_dev'),
mock.call.add_rule('FORWARD',
'-m physdev --physdev-out tapfake_dev '
'--physdev-is-bridged '
- '-j $sg-chain'),
+ '-j $sg-chain', comment=ic.VM_INT_SG),
mock.call.add_rule('sg-chain',
'-m physdev --physdev-out tapfake_dev '
'--physdev-is-bridged '
- '-j $ifake_dev'),
+ '-j $ifake_dev',
+ comment=ic.SG_TO_VM_SG),
+ mock.call.add_rule(
+ 'ifake_dev',
+ '-m state --state INVALID -j DROP',
+ comment=None),
mock.call.add_rule(
- 'ifake_dev', '-m state --state INVALID -j DROP'),
+ 'ifake_dev',
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
mock.call.add_rule(
'ifake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ifake_dev', '-j $sg-fallback'),
+ '-j $sg-fallback', comment=None),
mock.call.add_chain('ofake_dev'),
mock.call.add_rule('FORWARD',
'-m physdev --physdev-in tapfake_dev '
'--physdev-is-bridged '
- '-j $sg-chain'),
+ '-j $sg-chain', comment=ic.VM_INT_SG),
mock.call.add_rule('sg-chain',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged '
- '-j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.SG_TO_VM_SG),
mock.call.add_rule('INPUT',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged '
- '-j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.INPUT_TO_SG),
mock.call.add_chain('sfake_dev'),
mock.call.add_rule(
'sfake_dev', '-m mac --mac-source ff:ff:ff:ff:ff:ff '
- '-s 10.0.0.1 -j RETURN'),
- mock.call.add_rule('sfake_dev', '-j DROP'),
+ '-s 10.0.0.1 -j RETURN',
+ comment=ic.PAIR_ALLOW),
+ mock.call.add_rule(
+ 'sfake_dev', '-j DROP',
+ comment=ic.PAIR_DROP),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 68 --dport 67 -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sfake_dev'),
+ '-p udp -m udp --sport 68 --dport 67 -j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev', '-j $sfake_dev',
+ comment=None),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 67 --dport 68 -j DROP'),
+ '-p udp -m udp --sport 67 --dport 68 -j DROP',
+ comment=None),
mock.call.add_rule(
- 'ofake_dev', '-m state --state INVALID -j DROP'),
+ 'ofake_dev',
+ '-m state --state INVALID -j DROP', comment=None),
mock.call.add_rule(
'ofake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sg-fallback'),
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ mock.call.add_rule(
+ 'ofake_dev',
+ '-j $sg-fallback',
+ comment=None),
mock.call.add_rule('sg-chain', '-j ACCEPT')]
self.v4filter_inst.assert_has_calls(calls)
@@ -127,7 +149,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
def test_filter_ipv4_ingress(self):
rule = {'ethertype': 'IPv4',
'direction': 'ingress'}
- ingress = mock.call.add_rule('ifake_dev', '-j RETURN')
+ ingress = mock.call.add_rule('ifake_dev', '-j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -136,7 +159,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv4',
'direction': 'ingress',
'source_ip_prefix': prefix}
- ingress = mock.call.add_rule('ifake_dev', '-s %s -j RETURN' % prefix)
+ ingress = mock.call.add_rule(
+ 'ifake_dev', '-s %s -j RETURN' % prefix, comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -144,7 +168,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv4',
'direction': 'ingress',
'protocol': 'tcp'}
- ingress = mock.call.add_rule('ifake_dev', '-p tcp -m tcp -j RETURN')
+ ingress = mock.call.add_rule(
+ 'ifake_dev', '-p tcp -m tcp -j RETURN', comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -155,7 +180,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'tcp',
'source_ip_prefix': prefix}
ingress = mock.call.add_rule('ifake_dev',
- '-s %s -p tcp -m tcp -j RETURN' % prefix)
+ '-s %s -p tcp -m tcp -j RETURN' % prefix,
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -163,7 +189,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv4',
'direction': 'ingress',
'protocol': 'icmp'}
- ingress = mock.call.add_rule('ifake_dev', '-p icmp -j RETURN')
+ ingress = mock.call.add_rule('ifake_dev', '-p icmp -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -174,7 +201,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'icmp',
'source_ip_prefix': prefix}
ingress = mock.call.add_rule(
- 'ifake_dev', '-s %s -p icmp -j RETURN' % prefix)
+ 'ifake_dev', '-s %s -p icmp -j RETURN' % prefix,
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -185,7 +213,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_min': 10,
'port_range_max': 10}
ingress = mock.call.add_rule('ifake_dev',
- '-p tcp -m tcp --dport 10 -j RETURN')
+ '-p tcp -m tcp --dport 10 -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -197,7 +226,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_max': 100}
ingress = mock.call.add_rule(
'ifake_dev',
- '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN')
+ '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -212,7 +242,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
ingress = mock.call.add_rule(
'ifake_dev',
'-s %s -p tcp -m tcp -m multiport --dports 10:100 '
- '-j RETURN' % prefix)
+ '-j RETURN' % prefix, comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -220,7 +250,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv4',
'direction': 'ingress',
'protocol': 'udp'}
- ingress = mock.call.add_rule('ifake_dev', '-p udp -m udp -j RETURN')
+ ingress = mock.call.add_rule(
+ 'ifake_dev', '-p udp -m udp -j RETURN', comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -231,7 +262,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'udp',
'source_ip_prefix': prefix}
ingress = mock.call.add_rule('ifake_dev',
- '-s %s -p udp -m udp -j RETURN' % prefix)
+ '-s %s -p udp -m udp -j RETURN' % prefix,
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -242,7 +274,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_min': 10,
'port_range_max': 10}
ingress = mock.call.add_rule('ifake_dev',
- '-p udp -m udp --dport 10 -j RETURN')
+ '-p udp -m udp --dport 10 -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -254,7 +287,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_max': 100}
ingress = mock.call.add_rule(
'ifake_dev',
- '-p udp -m udp -m multiport --dports 10:100 -j RETURN')
+ '-p udp -m udp -m multiport --dports 10:100 -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -269,14 +303,14 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
ingress = mock.call.add_rule(
'ifake_dev',
'-s %s -p udp -m udp -m multiport --dports 10:100 '
- '-j RETURN' % prefix)
+ '-j RETURN' % prefix, comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
def test_filter_ipv4_egress(self):
rule = {'ethertype': 'IPv4',
'direction': 'egress'}
- egress = mock.call.add_rule('ofake_dev', '-j RETURN')
+ egress = mock.call.add_rule('ofake_dev', '-j RETURN', comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -285,7 +319,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv4',
'direction': 'egress',
'source_ip_prefix': prefix}
- egress = mock.call.add_rule('ofake_dev', '-s %s -j RETURN' % prefix)
+ egress = mock.call.add_rule(
+ 'ofake_dev', '-s %s -j RETURN' % prefix, comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -293,7 +328,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv4',
'direction': 'egress',
'protocol': 'tcp'}
- egress = mock.call.add_rule('ofake_dev', '-p tcp -m tcp -j RETURN')
+ egress = mock.call.add_rule(
+ 'ofake_dev', '-p tcp -m tcp -j RETURN', comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -304,7 +340,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'tcp',
'source_ip_prefix': prefix}
egress = mock.call.add_rule('ofake_dev',
- '-s %s -p tcp -m tcp -j RETURN' % prefix)
+ '-s %s -p tcp -m tcp -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -312,7 +349,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv4',
'direction': 'egress',
'protocol': 'icmp'}
- egress = mock.call.add_rule('ofake_dev', '-p icmp -j RETURN')
+ egress = mock.call.add_rule('ofake_dev', '-p icmp -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -323,7 +361,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'icmp',
'source_ip_prefix': prefix}
egress = mock.call.add_rule(
- 'ofake_dev', '-s %s -p icmp -j RETURN' % prefix)
+ 'ofake_dev', '-s %s -p icmp -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -336,7 +375,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'source_ip_prefix': prefix}
egress = mock.call.add_rule(
'ofake_dev',
- '-s %s -p icmp --icmp-type 8 -j RETURN' % prefix)
+ '-s %s -p icmp --icmp-type 8 -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -349,7 +389,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'source_ip_prefix': prefix}
egress = mock.call.add_rule(
'ofake_dev',
- '-s %s -p icmp --icmp-type echo-request -j RETURN' % prefix)
+ '-s %s -p icmp --icmp-type echo-request -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -363,7 +404,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'source_ip_prefix': prefix}
egress = mock.call.add_rule(
'ofake_dev',
- '-s %s -p icmp --icmp-type 8/0 -j RETURN' % prefix)
+ '-s %s -p icmp --icmp-type 8/0 -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -374,7 +416,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_min': 10,
'port_range_max': 10}
egress = mock.call.add_rule('ofake_dev',
- '-p tcp -m tcp --dport 10 -j RETURN')
+ '-p tcp -m tcp --dport 10 -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -386,7 +429,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_max': 100}
egress = mock.call.add_rule(
'ofake_dev',
- '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN')
+ '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -401,7 +445,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
egress = mock.call.add_rule(
'ofake_dev',
'-s %s -p tcp -m tcp -m multiport --dports 10:100 '
- '-j RETURN' % prefix)
+ '-j RETURN' % prefix, comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -409,7 +453,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv4',
'direction': 'egress',
'protocol': 'udp'}
- egress = mock.call.add_rule('ofake_dev', '-p udp -m udp -j RETURN')
+ egress = mock.call.add_rule(
+ 'ofake_dev', '-p udp -m udp -j RETURN', comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -420,7 +465,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'udp',
'source_ip_prefix': prefix}
egress = mock.call.add_rule('ofake_dev',
- '-s %s -p udp -m udp -j RETURN' % prefix)
+ '-s %s -p udp -m udp -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -431,7 +477,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_min': 10,
'port_range_max': 10}
egress = mock.call.add_rule('ofake_dev',
- '-p udp -m udp --dport 10 -j RETURN')
+ '-p udp -m udp --dport 10 -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -443,7 +490,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_max': 100}
egress = mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp -m multiport --dports 10:100 -j RETURN')
+ '-p udp -m udp -m multiport --dports 10:100 -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -458,14 +506,15 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
egress = mock.call.add_rule(
'ofake_dev',
'-s %s -p udp -m udp -m multiport --dports 10:100 '
- '-j RETURN' % prefix)
+ '-j RETURN' % prefix, comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
def test_filter_ipv6_ingress(self):
rule = {'ethertype': 'IPv6',
'direction': 'ingress'}
- ingress = mock.call.add_rule('ifake_dev', '-j RETURN')
+ ingress = mock.call.add_rule('ifake_dev', '-j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -474,7 +523,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv6',
'direction': 'ingress',
'source_ip_prefix': prefix}
- ingress = mock.call.add_rule('ifake_dev', '-s %s -j RETURN' % prefix)
+ ingress = mock.call.add_rule(
+ 'ifake_dev', '-s %s -j RETURN' % prefix, comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -482,7 +532,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv6',
'direction': 'ingress',
'protocol': 'tcp'}
- ingress = mock.call.add_rule('ifake_dev', '-p tcp -m tcp -j RETURN')
+ ingress = mock.call.add_rule(
+ 'ifake_dev', '-p tcp -m tcp -j RETURN', comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -493,7 +544,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'tcp',
'source_ip_prefix': prefix}
ingress = mock.call.add_rule('ifake_dev',
- '-s %s -p tcp -m tcp -j RETURN' % prefix)
+ '-s %s -p tcp -m tcp -j RETURN' % prefix,
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -504,7 +556,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_min': 10,
'port_range_max': 10}
ingress = mock.call.add_rule('ifake_dev',
- '-p tcp -m tcp --dport 10 -j RETURN')
+ '-p tcp -m tcp --dport 10 -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -512,7 +565,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv6',
'direction': 'ingress',
'protocol': 'icmp'}
- ingress = mock.call.add_rule('ifake_dev', '-p icmpv6 -j RETURN')
+ ingress = mock.call.add_rule(
+ 'ifake_dev', '-p icmpv6 -j RETURN', comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -523,7 +577,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'icmp',
'source_ip_prefix': prefix}
ingress = mock.call.add_rule(
- 'ifake_dev', '-s %s -p icmpv6 -j RETURN' % prefix)
+ 'ifake_dev', '-s %s -p icmpv6 -j RETURN' % prefix,
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -535,7 +590,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_max': 100}
ingress = mock.call.add_rule(
'ifake_dev',
- '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN')
+ '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -550,7 +606,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
ingress = mock.call.add_rule(
'ifake_dev',
'-s %s -p tcp -m tcp -m multiport --dports 10:100 '
- '-j RETURN' % prefix)
+ '-j RETURN' % prefix, comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -558,7 +614,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv6',
'direction': 'ingress',
'protocol': 'udp'}
- ingress = mock.call.add_rule('ifake_dev', '-p udp -m udp -j RETURN')
+ ingress = mock.call.add_rule(
+ 'ifake_dev', '-p udp -m udp -j RETURN', comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -569,7 +626,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'udp',
'source_ip_prefix': prefix}
ingress = mock.call.add_rule('ifake_dev',
- '-s %s -p udp -m udp -j RETURN' % prefix)
+ '-s %s -p udp -m udp -j RETURN' % prefix,
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -580,7 +638,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_min': 10,
'port_range_max': 10}
ingress = mock.call.add_rule('ifake_dev',
- '-p udp -m udp --dport 10 -j RETURN')
+ '-p udp -m udp --dport 10 -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -592,7 +651,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_max': 100}
ingress = mock.call.add_rule(
'ifake_dev',
- '-p udp -m udp -m multiport --dports 10:100 -j RETURN')
+ '-p udp -m udp -m multiport --dports 10:100 -j RETURN',
+ comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -607,14 +667,14 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
ingress = mock.call.add_rule(
'ifake_dev',
'-s %s -p udp -m udp -m multiport --dports 10:100 '
- '-j RETURN' % prefix)
+ '-j RETURN' % prefix, comment=None)
egress = None
self._test_prepare_port_filter(rule, ingress, egress)
def test_filter_ipv6_egress(self):
rule = {'ethertype': 'IPv6',
'direction': 'egress'}
- egress = mock.call.add_rule('ofake_dev', '-j RETURN')
+ egress = mock.call.add_rule('ofake_dev', '-j RETURN', comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -623,7 +683,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv6',
'direction': 'egress',
'source_ip_prefix': prefix}
- egress = mock.call.add_rule('ofake_dev', '-s %s -j RETURN' % prefix)
+ egress = mock.call.add_rule(
+ 'ofake_dev', '-s %s -j RETURN' % prefix, comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -631,7 +692,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv6',
'direction': 'egress',
'protocol': 'tcp'}
- egress = mock.call.add_rule('ofake_dev', '-p tcp -m tcp -j RETURN')
+ egress = mock.call.add_rule(
+ 'ofake_dev', '-p tcp -m tcp -j RETURN', comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -642,7 +704,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'tcp',
'source_ip_prefix': prefix}
egress = mock.call.add_rule('ofake_dev',
- '-s %s -p tcp -m tcp -j RETURN' % prefix)
+ '-s %s -p tcp -m tcp -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -650,7 +713,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv6',
'direction': 'egress',
'protocol': 'icmp'}
- egress = mock.call.add_rule('ofake_dev', '-p icmpv6 -j RETURN')
+ egress = mock.call.add_rule(
+ 'ofake_dev', '-p icmpv6 -j RETURN', comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -661,7 +725,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'icmp',
'source_ip_prefix': prefix}
egress = mock.call.add_rule(
- 'ofake_dev', '-s %s -p icmpv6 -j RETURN' % prefix)
+ 'ofake_dev', '-s %s -p icmpv6 -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -674,7 +739,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'source_ip_prefix': prefix}
egress = mock.call.add_rule(
'ofake_dev',
- '-s %s -p icmpv6 --icmpv6-type 8 -j RETURN' % prefix)
+ '-s %s -p icmpv6 --icmpv6-type 8 -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -687,7 +753,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'source_ip_prefix': prefix}
egress = mock.call.add_rule(
'ofake_dev',
- '-s %s -p icmpv6 --icmpv6-type echo-request -j RETURN' % prefix)
+ '-s %s -p icmpv6 --icmpv6-type echo-request -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -701,7 +768,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'source_ip_prefix': prefix}
egress = mock.call.add_rule(
'ofake_dev',
- '-s %s -p icmpv6 --icmpv6-type 8/0 -j RETURN' % prefix)
+ '-s %s -p icmpv6 --icmpv6-type 8/0 -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -712,7 +780,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_min': 10,
'port_range_max': 10}
egress = mock.call.add_rule('ofake_dev',
- '-p tcp -m tcp --dport 10 -j RETURN')
+ '-p tcp -m tcp --dport 10 -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -724,7 +793,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_max': 100}
egress = mock.call.add_rule(
'ofake_dev',
- '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN')
+ '-p tcp -m tcp -m multiport --dports 10:100 -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -739,7 +809,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
egress = mock.call.add_rule(
'ofake_dev',
'-s %s -p tcp -m tcp -m multiport --dports 10:100 '
- '-j RETURN' % prefix)
+ '-j RETURN' % prefix, comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -747,7 +817,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
rule = {'ethertype': 'IPv6',
'direction': 'egress',
'protocol': 'udp'}
- egress = mock.call.add_rule('ofake_dev', '-p udp -m udp -j RETURN')
+ egress = mock.call.add_rule(
+ 'ofake_dev', '-p udp -m udp -j RETURN', comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -758,7 +829,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'protocol': 'udp',
'source_ip_prefix': prefix}
egress = mock.call.add_rule('ofake_dev',
- '-s %s -p udp -m udp -j RETURN' % prefix)
+ '-s %s -p udp -m udp -j RETURN' % prefix,
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -769,7 +841,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_min': 10,
'port_range_max': 10}
egress = mock.call.add_rule('ofake_dev',
- '-p udp -m udp --dport 10 -j RETURN')
+ '-p udp -m udp --dport 10 -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -781,7 +854,8 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'port_range_max': 100}
egress = mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp -m multiport --dports 10:100 -j RETURN')
+ '-p udp -m udp -m multiport --dports 10:100 -j RETURN',
+ comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -796,7 +870,7 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
egress = mock.call.add_rule(
'ofake_dev',
'-s %s -p udp -m udp -m multiport --dports 10:100 '
- '-j RETURN' % prefix)
+ '-j RETURN' % prefix, comment=None)
ingress = None
self._test_prepare_port_filter(rule, ingress, egress)
@@ -810,89 +884,113 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
filter_inst = self.v4filter_inst
dhcp_rule = [mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 68 --dport 67 -j RETURN')]
+ '-p udp -m udp --sport 68 --dport 67 -j RETURN',
+ comment=None)]
if ethertype == 'IPv6':
filter_inst = self.v6filter_inst
dhcp_rule = [mock.call.add_rule('ofake_dev',
- '-p icmpv6 -j RETURN'),
+ '-p icmpv6 -j RETURN',
+ comment=None),
mock.call.add_rule('ofake_dev', '-p udp -m udp '
'--sport 546 --dport 547 '
- '-j RETURN')]
+ '-j RETURN', comment=None)]
sg = [rule]
port['security_group_rules'] = sg
self.firewall.prepare_port_filter(port)
calls = [mock.call.add_chain('sg-fallback'),
- mock.call.add_rule('sg-fallback', '-j DROP'),
+ mock.call.add_rule(
+ 'sg-fallback',
+ '-j DROP',
+ comment=ic.UNMATCH_DROP),
mock.call.ensure_remove_chain('sg-chain'),
mock.call.add_chain('sg-chain'),
mock.call.add_chain('ifake_dev'),
mock.call.add_rule('FORWARD',
'-m physdev --physdev-out tapfake_dev '
'--physdev-is-bridged '
- '-j $sg-chain'),
+ '-j $sg-chain', comment=ic.VM_INT_SG),
mock.call.add_rule('sg-chain',
'-m physdev --physdev-out tapfake_dev '
'--physdev-is-bridged '
- '-j $ifake_dev'),
+ '-j $ifake_dev',
+ comment=ic.SG_TO_VM_SG),
]
if ethertype == 'IPv6':
for icmp6_type in constants.ICMPV6_ALLOWED_TYPES:
calls.append(
mock.call.add_rule('ifake_dev',
'-p icmpv6 --icmpv6-type %s -j RETURN' %
- icmp6_type))
- calls += [mock.call.add_rule('ifake_dev',
- '-m state --state INVALID -j DROP'),
- mock.call.add_rule(
- 'ifake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN')]
+ icmp6_type, comment=None))
+ calls += [
+ mock.call.add_rule(
+ 'ifake_dev',
+ '-m state --state INVALID -j DROP', comment=None
+ ),
+ mock.call.add_rule(
+ 'ifake_dev',
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None
+ )
+ ]
if ingress_expected_call:
calls.append(ingress_expected_call)
- calls += [mock.call.add_rule('ifake_dev', '-j $sg-fallback'),
+ calls += [mock.call.add_rule('ifake_dev',
+ '-j $sg-fallback', comment=None),
mock.call.add_chain('ofake_dev'),
mock.call.add_rule('FORWARD',
'-m physdev --physdev-in tapfake_dev '
'--physdev-is-bridged '
- '-j $sg-chain'),
+ '-j $sg-chain', comment=ic.VM_INT_SG),
mock.call.add_rule('sg-chain',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged '
- '-j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.SG_TO_VM_SG),
mock.call.add_rule('INPUT',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged '
- '-j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.INPUT_TO_SG),
mock.call.add_chain('sfake_dev'),
mock.call.add_rule(
'sfake_dev',
'-m mac --mac-source ff:ff:ff:ff:ff:ff -s %s -j RETURN'
- % prefix),
- mock.call.add_rule('sfake_dev', '-j DROP')]
+ % prefix,
+ comment=ic.PAIR_ALLOW),
+ mock.call.add_rule(
+ 'sfake_dev', '-j DROP',
+ comment=ic.PAIR_DROP)]
calls += dhcp_rule
- calls.append(mock.call.add_rule('ofake_dev', '-j $sfake_dev'))
+ calls.append(mock.call.add_rule('ofake_dev', '-j $sfake_dev',
+ comment=None))
if ethertype == 'IPv4':
calls.append(mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 67 --dport 68 -j DROP'))
+ '-p udp -m udp --sport 67 --dport 68 -j DROP',
+ comment=None))
if ethertype == 'IPv6':
calls.append(mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 547 --dport 546 -j DROP'))
+ '-p udp -m udp --sport 547 --dport 546 -j DROP',
+ comment=None))
- calls += [mock.call.add_rule(
- 'ofake_dev', '-m state --state INVALID -j DROP'),
- mock.call.add_rule(
- 'ofake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN')]
+ calls += [
+ mock.call.add_rule(
+ 'ofake_dev',
+ '-m state --state INVALID -j DROP', comment=None),
+ mock.call.add_rule(
+ 'ofake_dev',
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ ]
if egress_expected_call:
calls.append(egress_expected_call)
- calls += [mock.call.add_rule('ofake_dev', '-j $sg-fallback'),
+ calls += [mock.call.add_rule('ofake_dev',
+ '-j $sg-fallback', comment=None),
mock.call.add_rule('sg-chain', '-j ACCEPT')]
filter_inst.assert_has_calls(calls)
@@ -909,57 +1007,80 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
self.firewall.remove_port_filter(port)
self.firewall.remove_port_filter({'device': 'no-exist-device'})
calls = [mock.call.add_chain('sg-fallback'),
- mock.call.add_rule('sg-fallback', '-j DROP'),
+ mock.call.add_rule(
+ 'sg-fallback',
+ '-j DROP',
+ comment=ic.UNMATCH_DROP),
mock.call.ensure_remove_chain('sg-chain'),
mock.call.add_chain('sg-chain'),
mock.call.add_chain('ifake_dev'),
mock.call.add_rule(
'FORWARD',
'-m physdev --physdev-out tapfake_dev '
- '--physdev-is-bridged -j $sg-chain'),
+ '--physdev-is-bridged -j $sg-chain',
+ comment=ic.VM_INT_SG),
mock.call.add_rule(
'sg-chain',
'-m physdev --physdev-out tapfake_dev '
- '--physdev-is-bridged -j $ifake_dev'),
+ '--physdev-is-bridged -j $ifake_dev',
+ comment=ic.SG_TO_VM_SG),
+ mock.call.add_rule(
+ 'ifake_dev',
+ '-m state --state INVALID -j DROP', comment=None),
mock.call.add_rule(
- 'ifake_dev', '-m state --state INVALID -j DROP'),
+ 'ifake_dev',
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ mock.call.add_rule('ifake_dev', '-j RETURN',
+ comment=None),
mock.call.add_rule(
'ifake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ifake_dev', '-j RETURN'),
- mock.call.add_rule('ifake_dev', '-j $sg-fallback'),
+ '-j $sg-fallback', comment=None),
mock.call.add_chain('ofake_dev'),
mock.call.add_rule(
'FORWARD',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged -j $sg-chain'),
+ '--physdev-is-bridged -j $sg-chain',
+ comment=ic.VM_INT_SG),
mock.call.add_rule(
'sg-chain',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged -j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.SG_TO_VM_SG),
mock.call.add_rule(
'INPUT',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged -j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.INPUT_TO_SG),
mock.call.add_chain('sfake_dev'),
mock.call.add_rule(
'sfake_dev',
'-m mac --mac-source ff:ff:ff:ff:ff:ff -s 10.0.0.1 '
- '-j RETURN'),
- mock.call.add_rule('sfake_dev', '-j DROP'),
+ '-j RETURN',
+ comment=ic.PAIR_ALLOW),
+ mock.call.add_rule(
+ 'sfake_dev', '-j DROP',
+ comment=ic.PAIR_DROP),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 68 --dport 67 -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sfake_dev'),
+ '-p udp -m udp --sport 68 --dport 67 -j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev', '-j $sfake_dev',
+ comment=None),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 67 --dport 68 -j DROP'),
+ '-p udp -m udp --sport 67 --dport 68 -j DROP',
+ comment=None),
mock.call.add_rule(
- 'ofake_dev', '-m state --state INVALID -j DROP'),
+ 'ofake_dev', '-m state --state INVALID -j DROP',
+ comment=None),
mock.call.add_rule(
'ofake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sg-fallback'),
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ mock.call.add_rule(
+ 'ofake_dev',
+ '-j $sg-fallback', comment=None),
mock.call.add_rule('sg-chain', '-j ACCEPT'),
mock.call.ensure_remove_chain('ifake_dev'),
mock.call.ensure_remove_chain('ofake_dev'),
@@ -970,51 +1091,70 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
mock.call.add_rule(
'FORWARD',
'-m physdev --physdev-out tapfake_dev '
- '--physdev-is-bridged -j $sg-chain'),
+ '--physdev-is-bridged -j $sg-chain',
+ comment=ic.VM_INT_SG),
mock.call.add_rule(
'sg-chain',
'-m physdev --physdev-out tapfake_dev '
- '--physdev-is-bridged -j $ifake_dev'),
+ '--physdev-is-bridged -j $ifake_dev',
+ comment=ic.SG_TO_VM_SG),
+ mock.call.add_rule(
+ 'ifake_dev',
+ '-m state --state INVALID -j DROP', comment=None),
mock.call.add_rule(
'ifake_dev',
- '-m state --state INVALID -j DROP'),
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
mock.call.add_rule(
'ifake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ifake_dev', '-j $sg-fallback'),
+ '-j $sg-fallback', comment=None),
mock.call.add_chain('ofake_dev'),
mock.call.add_rule(
'FORWARD',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged -j $sg-chain'),
+ '--physdev-is-bridged -j $sg-chain',
+ comment=ic.VM_INT_SG),
mock.call.add_rule(
'sg-chain',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged -j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.SG_TO_VM_SG),
mock.call.add_rule(
'INPUT',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged -j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.INPUT_TO_SG),
mock.call.add_chain('sfake_dev'),
mock.call.add_rule(
'sfake_dev',
'-m mac --mac-source ff:ff:ff:ff:ff:ff -s 10.0.0.1 '
- '-j RETURN'),
- mock.call.add_rule('sfake_dev', '-j DROP'),
+ '-j RETURN',
+ comment=ic.PAIR_ALLOW),
+ mock.call.add_rule(
+ 'sfake_dev', '-j DROP',
+ comment=ic.PAIR_DROP),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 68 --dport 67 -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sfake_dev'),
+ '-p udp -m udp --sport 68 --dport 67 -j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev', '-j $sfake_dev',
+ comment=None),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 67 --dport 68 -j DROP'),
+ '-p udp -m udp --sport 67 --dport 68 -j DROP',
+ comment=None),
mock.call.add_rule(
- 'ofake_dev', '-m state --state INVALID -j DROP'),
+ 'ofake_dev',
+ '-m state --state INVALID -j DROP', comment=None),
mock.call.add_rule(
'ofake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sg-fallback'),
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev', '-j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev',
+ '-j $sg-fallback',
+ comment=None),
mock.call.add_rule('sg-chain', '-j ACCEPT'),
mock.call.ensure_remove_chain('ifake_dev'),
mock.call.ensure_remove_chain('ofake_dev'),
@@ -1116,60 +1256,76 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'fixed_ips': ['10.0.0.1', 'fe80::1', '10.0.0.2']}
self.firewall.prepare_port_filter(port)
calls = [mock.call.add_chain('sg-fallback'),
- mock.call.add_rule('sg-fallback', '-j DROP'),
+ mock.call.add_rule(
+ 'sg-fallback', '-j DROP',
+ comment=ic.UNMATCH_DROP),
mock.call.ensure_remove_chain('sg-chain'),
mock.call.add_chain('sg-chain'),
mock.call.add_chain('ifake_dev'),
mock.call.add_rule('FORWARD',
'-m physdev --physdev-out tapfake_dev '
'--physdev-is-bridged '
- '-j $sg-chain'),
+ '-j $sg-chain', comment=ic.VM_INT_SG),
mock.call.add_rule('sg-chain',
'-m physdev --physdev-out tapfake_dev '
'--physdev-is-bridged '
- '-j $ifake_dev'),
+ '-j $ifake_dev',
+ comment=ic.SG_TO_VM_SG),
mock.call.add_rule(
- 'ifake_dev', '-m state --state INVALID -j DROP'),
+ 'ifake_dev',
+ '-m state --state INVALID -j DROP', comment=None),
mock.call.add_rule(
'ifake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ifake_dev', '-j $sg-fallback'),
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ mock.call.add_rule('ifake_dev',
+ '-j $sg-fallback', comment=None),
mock.call.add_chain('ofake_dev'),
mock.call.add_rule('FORWARD',
'-m physdev --physdev-in tapfake_dev '
'--physdev-is-bridged '
- '-j $sg-chain'),
+ '-j $sg-chain', comment=ic.VM_INT_SG),
mock.call.add_rule('sg-chain',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged '
- '-j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.SG_TO_VM_SG),
mock.call.add_rule('INPUT',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged '
- '-j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.INPUT_TO_SG),
mock.call.add_chain('sfake_dev'),
mock.call.add_rule(
'sfake_dev',
'-m mac --mac-source ff:ff:ff:ff:ff:ff -s 10.0.0.1 '
- '-j RETURN'),
+ '-j RETURN',
+ comment=ic.PAIR_ALLOW),
mock.call.add_rule(
'sfake_dev',
'-m mac --mac-source ff:ff:ff:ff:ff:ff -s 10.0.0.2 '
- '-j RETURN'),
- mock.call.add_rule('sfake_dev', '-j DROP'),
+ '-j RETURN',
+ comment=ic.PAIR_ALLOW),
+ mock.call.add_rule(
+ 'sfake_dev', '-j DROP',
+ comment=ic.PAIR_DROP),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 68 --dport 67 -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sfake_dev'),
+ '-p udp -m udp --sport 68 --dport 67 -j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev', '-j $sfake_dev',
+ comment=None),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 67 --dport 68 -j DROP'),
+ '-p udp -m udp --sport 67 --dport 68 -j DROP',
+ comment=None),
mock.call.add_rule(
- 'ofake_dev', '-m state --state INVALID -j DROP'),
+ 'ofake_dev',
+ '-m state --state INVALID -j DROP', comment=None),
mock.call.add_rule(
'ofake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sg-fallback'),
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev',
+ '-j $sg-fallback', comment=None),
mock.call.add_rule('sg-chain', '-j ACCEPT')]
self.v4filter_inst.assert_has_calls(calls)
@@ -1179,55 +1335,71 @@ class IptablesFirewallTestCase(BaseIptablesFirewallTestCase):
'fixed_ips': []}
self.firewall.prepare_port_filter(port)
calls = [mock.call.add_chain('sg-fallback'),
- mock.call.add_rule('sg-fallback', '-j DROP'),
+ mock.call.add_rule(
+ 'sg-fallback', '-j DROP',
+ comment=ic.UNMATCH_DROP),
mock.call.ensure_remove_chain('sg-chain'),
mock.call.add_chain('sg-chain'),
mock.call.add_chain('ifake_dev'),
mock.call.add_rule('FORWARD',
'-m physdev --physdev-out tapfake_dev '
'--physdev-is-bridged '
- '-j $sg-chain'),
+ '-j $sg-chain', comment=ic.VM_INT_SG),
mock.call.add_rule('sg-chain',
'-m physdev --physdev-out tapfake_dev '
'--physdev-is-bridged '
- '-j $ifake_dev'),
+ '-j $ifake_dev',
+ comment=ic.SG_TO_VM_SG),
mock.call.add_rule(
- 'ifake_dev', '-m state --state INVALID -j DROP'),
+ 'ifake_dev',
+ '-m state --state INVALID -j DROP', comment=None),
mock.call.add_rule(
'ifake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ifake_dev', '-j $sg-fallback'),
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ mock.call.add_rule('ifake_dev', '-j $sg-fallback',
+ comment=None),
mock.call.add_chain('ofake_dev'),
mock.call.add_rule('FORWARD',
'-m physdev --physdev-in tapfake_dev '
'--physdev-is-bridged '
- '-j $sg-chain'),
+ '-j $sg-chain', comment=ic.VM_INT_SG),
mock.call.add_rule('sg-chain',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged '
- '-j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.SG_TO_VM_SG),
mock.call.add_rule('INPUT',
'-m physdev --physdev-in tapfake_dev '
- '--physdev-is-bridged '
- '-j $ofake_dev'),
+ '--physdev-is-bridged -j $ofake_dev',
+ comment=ic.INPUT_TO_SG),
mock.call.add_chain('sfake_dev'),
mock.call.add_rule(
'sfake_dev',
- '-m mac --mac-source ff:ff:ff:ff:ff:ff -j RETURN'),
- mock.call.add_rule('sfake_dev', '-j DROP'),
+ '-m mac --mac-source ff:ff:ff:ff:ff:ff -j RETURN',
+ comment=ic.PAIR_ALLOW),
+ mock.call.add_rule(
+ 'sfake_dev', '-j DROP',
+ comment=ic.PAIR_DROP),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 68 --dport 67 -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sfake_dev'),
+ '-p udp -m udp --sport 68 --dport 67 -j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev', '-j $sfake_dev',
+ comment=None),
mock.call.add_rule(
'ofake_dev',
- '-p udp -m udp --sport 67 --dport 68 -j DROP'),
+ '-p udp -m udp --sport 67 --dport 68 -j DROP',
+ comment=None),
mock.call.add_rule(
- 'ofake_dev', '-m state --state INVALID -j DROP'),
+ 'ofake_dev',
+ '-m state --state INVALID -j DROP',
+ comment=None),
mock.call.add_rule(
'ofake_dev',
- '-m state --state RELATED,ESTABLISHED -j RETURN'),
- mock.call.add_rule('ofake_dev', '-j $sg-fallback'),
+ '-m state --state RELATED,ESTABLISHED -j RETURN',
+ comment=None),
+ mock.call.add_rule('ofake_dev', '-j $sg-fallback',
+ comment=None),
mock.call.add_rule('sg-chain', '-j ACCEPT')]
self.v4filter_inst.assert_has_calls(calls)
diff --git a/neutron/tests/unit/test_iptables_manager.py b/neutron/tests/unit/test_iptables_manager.py
index ac0f9ad8c0..54380401d7 100644
--- a/neutron/tests/unit/test_iptables_manager.py
+++ b/neutron/tests/unit/test_iptables_manager.py
@@ -17,13 +17,17 @@ import inspect
import os
import mock
+from oslo.config import cfg
+from neutron.agent.common import config as a_cfg
+from neutron.agent.linux import iptables_comments as ic
from neutron.agent.linux import iptables_manager
from neutron.tests import base
from neutron.tests import tools
-IPTABLES_ARG = {'bn': iptables_manager.binary_name}
+IPTABLES_ARG = {'bn': iptables_manager.binary_name,
+ 'snat_out_comment': ic.SNAT_OUT}
NAT_DUMP = ('# Generated by iptables_manager\n'
'*nat\n'
@@ -59,6 +63,107 @@ FILTER_DUMP = ('# Generated by iptables_manager\n'
'COMMIT\n'
'# Completed by iptables_manager\n' % IPTABLES_ARG)
+COMMENTED_NAT_DUMP = (
+ '# Generated by iptables_manager\n'
+ '*nat\n'
+ ':neutron-postrouting-bottom - [0:0]\n'
+ ':%(bn)s-OUTPUT - [0:0]\n'
+ ':%(bn)s-POSTROUTING - [0:0]\n'
+ ':%(bn)s-PREROUTING - [0:0]\n'
+ ':%(bn)s-float-snat - [0:0]\n'
+ ':%(bn)s-snat - [0:0]\n'
+ '[0:0] -A PREROUTING -j %(bn)s-PREROUTING\n'
+ '[0:0] -A OUTPUT -j %(bn)s-OUTPUT\n'
+ '[0:0] -A POSTROUTING -j %(bn)s-POSTROUTING\n'
+ '[0:0] -A POSTROUTING -j neutron-postrouting-bottom\n'
+ '[0:0] -A neutron-postrouting-bottom -j %(bn)s-snat '
+ '-m comment --comment "%(snat_out_comment)s"\n'
+ '[0:0] -A %(bn)s-snat -j '
+ '%(bn)s-float-snat\n'
+ 'COMMIT\n'
+ '# Completed by iptables_manager\n' % IPTABLES_ARG)
+
+
+class IptablesCommentsTestCase(base.BaseTestCase):
+
+ def setUp(self):
+ super(IptablesCommentsTestCase, self).setUp()
+ cfg.CONF.register_opts(a_cfg.IPTABLES_OPTS, 'AGENT')
+ cfg.CONF.set_override('comment_iptables_rules', True, 'AGENT')
+ self.root_helper = 'sudo'
+ self.iptables = (iptables_manager.
+ IptablesManager(root_helper=self.root_helper))
+ self.execute = mock.patch.object(self.iptables, "execute").start()
+
+ def test_comments_short_enough(self):
+ for attr in dir(ic):
+ if not attr.startswith('__') and len(getattr(ic, attr)) > 255:
+ self.fail("Iptables comment %s is longer than 255 characters."
+ % attr)
+
+ def test_add_filter_rule(self):
+ filter_dump_mod = ('# Generated by iptables_manager\n'
+ '*filter\n'
+ ':neutron-filter-top - [0:0]\n'
+ ':%(bn)s-FORWARD - [0:0]\n'
+ ':%(bn)s-INPUT - [0:0]\n'
+ ':%(bn)s-OUTPUT - [0:0]\n'
+ ':%(bn)s-filter - [0:0]\n'
+ ':%(bn)s-local - [0:0]\n'
+ '[0:0] -A FORWARD -j neutron-filter-top\n'
+ '[0:0] -A OUTPUT -j neutron-filter-top\n'
+ '[0:0] -A neutron-filter-top -j %(bn)s-local\n'
+ '[0:0] -A INPUT -j %(bn)s-INPUT\n'
+ '[0:0] -A OUTPUT -j %(bn)s-OUTPUT\n'
+ '[0:0] -A FORWARD -j %(bn)s-FORWARD\n'
+ '[0:0] -A %(bn)s-filter -j DROP\n'
+ '[0:0] -A %(bn)s-INPUT -s 0/0 -d 192.168.0.2 -j '
+ '%(bn)s-filter\n'
+ 'COMMIT\n'
+ '# Completed by iptables_manager\n'
+ % IPTABLES_ARG)
+
+ raw_dump = _generate_raw_dump(IPTABLES_ARG)
+
+ expected_calls_and_values = [
+ (mock.call(['iptables-save', '-c'],
+ root_helper=self.root_helper),
+ ''),
+ (mock.call(['iptables-restore', '-c'],
+ process_input=(
+ raw_dump + COMMENTED_NAT_DUMP + filter_dump_mod),
+ root_helper=self.root_helper),
+ None),
+ (mock.call(['iptables-save', '-c'],
+ root_helper=self.root_helper),
+ ''),
+ (mock.call(['iptables-restore', '-c'],
+ process_input=(
+ raw_dump + COMMENTED_NAT_DUMP + FILTER_DUMP),
+ root_helper=self.root_helper
+ ),
+ None),
+ ]
+ tools.setup_mock_calls(self.execute, expected_calls_and_values)
+
+ self.iptables.ipv4['filter'].add_chain('filter')
+ self.iptables.ipv4['filter'].add_rule('filter', '-j DROP')
+ self.iptables.ipv4['filter'].add_rule('INPUT',
+ '-s 0/0 -d 192.168.0.2 -j'
+ ' %(bn)s-filter' % IPTABLES_ARG)
+ self.iptables.apply()
+
+ self.iptables.ipv4['filter'].remove_rule('filter', '-j DROP')
+ self.iptables.ipv4['filter'].remove_rule('INPUT',
+ '-s 0/0 -d 192.168.0.2 -j'
+ ' %(bn)s-filter'
+ % IPTABLES_ARG)
+ self.iptables.ipv4['filter'].remove_chain('filter')
+
+ self.iptables.apply()
+
+ tools.verify_mock_calls(self.execute, expected_calls_and_values)
+
def _generate_raw_dump(iptables_args):
return ('# Generated by iptables_manager\n'
@@ -77,6 +182,8 @@ class IptablesManagerStateFulTestCase(base.BaseTestCase):
def setUp(self):
super(IptablesManagerStateFulTestCase, self).setUp()
+ cfg.CONF.register_opts(a_cfg.IPTABLES_OPTS, 'AGENT')
+ cfg.CONF.set_override('comment_iptables_rules', False, 'AGENT')
self.root_helper = 'sudo'
self.iptables = iptables_manager.IptablesManager(
root_helper=self.root_helper)
@@ -936,6 +1043,8 @@ class IptablesManagerStateLessTestCase(base.BaseTestCase):
def setUp(self):
super(IptablesManagerStateLessTestCase, self).setUp()
+ cfg.CONF.register_opts(a_cfg.IPTABLES_OPTS, 'AGENT')
+ cfg.CONF.set_override('comment_iptables_rules', False, 'AGENT')
self.iptables = (iptables_manager.IptablesManager(state_less=True))
def test_nat_not_found(self):
diff --git a/neutron/tests/unit/test_l3_agent.py b/neutron/tests/unit/test_l3_agent.py
index 0be506e7ce..df362342d7 100644
--- a/neutron/tests/unit/test_l3_agent.py
+++ b/neutron/tests/unit/test_l3_agent.py
@@ -20,6 +20,7 @@ import datetime
import mock
import netaddr
from oslo.config import cfg
+from oslo import messaging
from testtools import matchers
from neutron.agent.common import config as agent_config
@@ -376,6 +377,27 @@ class TestBasicRouterOperations(base.BaseTestCase):
'neutron.openstack.common.loopingcall.FixedIntervalLoopingCall')
self.looping_call_p.start()
+ self.snat_ports = [{'subnet': {'cidr': '152.2.0.0/16',
+ 'gateway_ip': '152.2.0.1',
+ 'id': _uuid()},
+ 'network_id': _uuid(),
+ 'device_owner': 'network:router_centralized_snat',
+ 'ip_cidr': '152.2.0.13/16',
+ 'mac_address': 'fa:16:3e:80:8d:80',
+ 'fixed_ips': [{'subnet_id': _uuid(),
+ 'ip_address': '152.2.0.13'}],
+ 'id': _uuid(), 'device_id': _uuid()},
+ {'subnet': {'cidr': '152.10.0.0/16',
+ 'gateway_ip': '152.10.0.1',
+ 'id': _uuid()},
+ 'network_id': _uuid(),
+ 'device_owner': 'network:router_centralized_snat',
+ 'ip_cidr': '152.10.0.13/16',
+ 'mac_address': 'fa:16:3e:80:8d:80',
+ 'fixed_ips': [{'subnet_id': _uuid(),
+ 'ip_address': '152.10.0.13'}],
+ 'id': _uuid(), 'device_id': _uuid()}]
+
def _prepare_internal_network_data(self):
port_id = _uuid()
router_id = _uuid()
@@ -409,8 +431,9 @@ class TestBasicRouterOperations(base.BaseTestCase):
def test_router_info_create(self):
id = _uuid()
+ ns = "ns-" + id
ri = l3_agent.RouterInfo(id, self.conf.root_helper,
- self.conf.use_namespaces, {})
+ self.conf.use_namespaces, {}, ns_name=ns)
self.assertTrue(ri.ns_name.endswith(id))
@@ -427,8 +450,9 @@ class TestBasicRouterOperations(base.BaseTestCase):
'enable_snat': True,
'routes': [],
'gw_port': ex_gw_port}
+ ns = "ns-" + id
ri = l3_agent.RouterInfo(id, self.conf.root_helper,
- self.conf.use_namespaces, router)
+ self.conf.use_namespaces, router, ns_name=ns)
self.assertTrue(ri.ns_name.endswith(id))
self.assertEqual(ri.router, router)
@@ -497,11 +521,18 @@ class TestBasicRouterOperations(base.BaseTestCase):
def test_agent_remove_internal_network(self):
self._test_internal_network_action('remove')
- def _test_external_gateway_action(self, action):
- router = prepare_router_data(num_internal_ports=2)
- ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper,
- self.conf.use_namespaces, router=router)
+ def _test_external_gateway_action(self, action, router):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+ ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper,
+ self.conf.use_namespaces, router=router,
+ ns_name=agent.get_ns_name(router['id']))
+ # Special setup for dvr routers
+ if router.get('distributed'):
+ agent.conf.agent_mode = 'dvr_snat'
+ agent.host = HOSTNAME
+ agent._create_dvr_gateway = mock.Mock()
+ agent.get_snat_interfaces = mock.Mock(return_value=self.snat_ports)
+
ex_gw_port = {'fixed_ips': [{'ip_address': '20.0.0.30',
'subnet_id': _uuid()}],
'subnet': {'gateway_ip': '20.0.0.1'},
@@ -520,17 +551,23 @@ class TestBasicRouterOperations(base.BaseTestCase):
'port_id': _uuid()}]}
router[l3_constants.FLOATINGIP_KEY] = fake_fip['floatingips']
agent.external_gateway_added(ri, ex_gw_port, interface_name)
- self.assertEqual(self.mock_driver.plug.call_count, 1)
- self.assertEqual(self.mock_driver.init_l3.call_count, 1)
- self.send_arp.assert_called_once_with(ri.ns_name, interface_name,
- '20.0.0.30')
- kwargs = {'preserve_ips': ['192.168.1.34/32'],
- 'namespace': 'qrouter-' + router['id'],
- 'gateway': '20.0.0.1',
- 'extra_subnets': [{'cidr': '172.16.0.0/24'}]}
- self.mock_driver.init_l3.assert_called_with(interface_name,
- ['20.0.0.30/24'],
- **kwargs)
+ if not router.get('distributed'):
+ self.assertEqual(self.mock_driver.plug.call_count, 1)
+ self.assertEqual(self.mock_driver.init_l3.call_count, 1)
+ self.send_arp.assert_called_once_with(ri.ns_name,
+ interface_name,
+ '20.0.0.30')
+ kwargs = {'preserve_ips': ['192.168.1.34/32'],
+ 'namespace': 'qrouter-' + router['id'],
+ 'gateway': '20.0.0.1',
+ 'extra_subnets': [{'cidr': '172.16.0.0/24'}]}
+ self.mock_driver.init_l3.assert_called_with(interface_name,
+ ['20.0.0.30/24'],
+ **kwargs)
+ else:
+ agent._create_dvr_gateway.assert_called_once_with(
+ ri, ex_gw_port, interface_name,
+ self.snat_ports)
elif action == 'remove':
self.device_exists.return_value = True
@@ -556,9 +593,10 @@ class TestBasicRouterOperations(base.BaseTestCase):
def test_external_gateway_updated(self):
router = prepare_router_data(num_internal_ports=2)
- ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper,
- self.conf.use_namespaces, router=router)
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+ ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper,
+ self.conf.use_namespaces, router=router,
+ ns_name=agent.get_ns_name(router['id']))
interface_name, ex_gw_port = self._prepare_ext_gw_test(agent)
fake_fip = {'floatingips': [{'id': _uuid(),
@@ -614,7 +652,14 @@ class TestBasicRouterOperations(base.BaseTestCase):
'dvr_snat', 1)
def test_agent_add_external_gateway(self):
- self._test_external_gateway_action('add')
+ router = prepare_router_data(num_internal_ports=2)
+ self._test_external_gateway_action('add', router)
+
+ def test_agent_add_external_gateway_dist(self):
+ router = prepare_router_data(num_internal_ports=2)
+ router['distributed'] = True
+ router['gw_port_host'] = HOSTNAME
+ self._test_external_gateway_action('add', router)
def _test_arping(self, namespace):
if not namespace:
@@ -642,7 +687,14 @@ class TestBasicRouterOperations(base.BaseTestCase):
self._test_arping(namespace=False)
def test_agent_remove_external_gateway(self):
- self._test_external_gateway_action('remove')
+ router = prepare_router_data(num_internal_ports=2)
+ self._test_external_gateway_action('remove', router)
+
+ def test_agent_remove_external_gateway_dist(self):
+ router = prepare_router_data(num_internal_ports=2)
+ router['distributed'] = True
+ router['gw_port_host'] = HOSTNAME
+ self._test_external_gateway_action('remove', router)
def _check_agent_method_called(self, agent, calls, namespace):
self.mock_ip.netns.execute.assert_has_calls(
@@ -988,17 +1040,7 @@ class TestBasicRouterOperations(base.BaseTestCase):
del router[l3_constants.INTERFACE_KEY]
del router['gw_port']
agent.process_router(ri)
- ex_gw_port = agent._get_ex_gw_port(ri)
self.assertEqual(self.send_arp.call_count, 1)
- agent.process_router_floating_ip_addresses.assert_called_with(
- ri, ex_gw_port)
- agent.process_router_floating_ip_addresses.reset_mock()
- agent.process_router_floating_ip_nat_rules.assert_called_with(ri)
- agent.process_router_floating_ip_nat_rules.reset_mock()
-
- # now no ports no gateway, test state tear down
- ri.ex_gw_port = None
- agent.process_router(ri)
self.assertFalse(agent.process_router_floating_ip_addresses.called)
self.assertFalse(agent.process_router_floating_ip_nat_rules.called)
@@ -1153,6 +1195,10 @@ vrrp_instance VR_1 {
ri, {'id': _uuid()})
self.assertEqual({}, fip_statuses)
device.addr.delete.assert_called_once_with(4, '15.1.2.3/32')
+ self.mock_driver.delete_conntrack_state.assert_called_once_with(
+ root_helper=self.conf.root_helper,
+ namespace=ri.ns_name,
+ ip='15.1.2.3/32')
def test_process_router_floating_ip_nat_rules_remove(self):
ri = mock.MagicMock()
@@ -1703,44 +1749,25 @@ vrrp_instance VR_1 {
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent._queue = mock.Mock()
agent.router_deleted(None, FAKE_ID)
- agent._queue.add.assert_called_once()
+ self.assertEqual(1, agent._queue.add.call_count)
def test_routers_updated(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent._queue = mock.Mock()
agent.routers_updated(None, [FAKE_ID])
- agent._queue.add.assert_called_once()
+ self.assertEqual(1, agent._queue.add.call_count)
def test_removed_from_agent(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent._queue = mock.Mock()
agent.router_removed_from_agent(None, {'router_id': FAKE_ID})
- agent._queue.add.assert_called_once()
+ self.assertEqual(1, agent._queue.add.call_count)
def test_added_to_agent(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
agent._queue = mock.Mock()
agent.router_added_to_agent(None, [FAKE_ID])
- agent._queue.add.assert_called_once()
-
- def test_process_router_delete(self):
- agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
- ex_gw_port = {'id': _uuid(),
- 'network_id': _uuid(),
- 'fixed_ips': [{'ip_address': '19.4.4.4',
- 'subnet_id': _uuid()}],
- 'subnet': {'cidr': '19.4.4.0/24',
- 'gateway_ip': '19.4.4.1'}}
- router = {
- 'id': _uuid(),
- 'enable_snat': True,
- 'routes': [],
- 'gw_port': ex_gw_port}
- router['distributed'] = False
- agent._router_added(router['id'], router)
- agent.router_deleted(None, router['id'])
- agent._process_router_delete()
- self.assertFalse(list(agent.removed_routers))
+ self.assertEqual(1, agent._queue.add.call_count)
def test_destroy_fip_namespace(self):
class FakeDev(object):
@@ -1847,108 +1874,94 @@ vrrp_instance VR_1 {
self.assertEqual(['1234'], agent._router_ids())
self.assertFalse(agent._clean_stale_namespaces)
- def test_process_routers_with_no_ext_net_in_conf(self):
+ def test_process_router_if_compatible_with_no_ext_net_in_conf(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
self.plugin_api.get_external_network_id.return_value = 'aaa'
- routers = [
- {'id': _uuid(),
- 'routes': [],
- 'admin_state_up': True,
- 'external_gateway_info': {'network_id': 'aaa'}}]
+ router = {'id': _uuid(),
+ 'routes': [],
+ 'admin_state_up': True,
+ 'external_gateway_info': {'network_id': 'aaa'}}
- agent._process_routers(routers)
- self.assertIn(routers[0]['id'], agent.router_info)
+ agent._process_router_if_compatible(router)
+ self.assertIn(router['id'], agent.router_info)
self.plugin_api.get_external_network_id.assert_called_with(
agent.context)
- def test_process_routers_with_cached_ext_net(self):
+ def test_process_router_if_compatible_with_cached_ext_net(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
self.plugin_api.get_external_network_id.return_value = 'aaa'
agent.target_ex_net_id = 'aaa'
- routers = [
- {'id': _uuid(),
- 'routes': [],
- 'admin_state_up': True,
- 'external_gateway_info': {'network_id': 'aaa'}}]
+ router = {'id': _uuid(),
+ 'routes': [],
+ 'admin_state_up': True,
+ 'external_gateway_info': {'network_id': 'aaa'}}
- agent._process_routers(routers)
- self.assertIn(routers[0]['id'], agent.router_info)
+ agent._process_router_if_compatible(router)
+ self.assertIn(router['id'], agent.router_info)
self.assertFalse(self.plugin_api.get_external_network_id.called)
- def test_process_routers_with_stale_cached_ext_net(self):
+ def test_process_router_if_compatible_with_stale_cached_ext_net(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
self.plugin_api.get_external_network_id.return_value = 'aaa'
agent.target_ex_net_id = 'bbb'
- routers = [
- {'id': _uuid(),
- 'routes': [],
- 'admin_state_up': True,
- 'external_gateway_info': {'network_id': 'aaa'}}]
+ router = {'id': _uuid(),
+ 'routes': [],
+ 'admin_state_up': True,
+ 'external_gateway_info': {'network_id': 'aaa'}}
- agent._process_routers(routers)
- self.assertIn(routers[0]['id'], agent.router_info)
+ agent._process_router_if_compatible(router)
+ self.assertIn(router['id'], agent.router_info)
self.plugin_api.get_external_network_id.assert_called_with(
agent.context)
- def test_process_routers_with_no_ext_net_in_conf_and_two_net_plugin(self):
+ def test_process_router_if_compatible_w_no_ext_net_and_2_net_plugin(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
- routers = [
- {'id': _uuid(),
- 'routes': [],
- 'admin_state_up': True,
- 'external_gateway_info': {'network_id': 'aaa'}}]
+ router = {'id': _uuid(),
+ 'routes': [],
+ 'admin_state_up': True,
+ 'external_gateway_info': {'network_id': 'aaa'}}
agent.router_info = {}
self.plugin_api.get_external_network_id.side_effect = (
n_exc.TooManyExternalNetworks())
self.assertRaises(n_exc.TooManyExternalNetworks,
- agent._process_routers,
- routers)
- self.assertNotIn(routers[0]['id'], agent.router_info)
+ agent._process_router_if_compatible,
+ router)
+ self.assertNotIn(router['id'], agent.router_info)
- def test_process_routers_with_ext_net_in_conf(self):
+ def test_process_router_if_compatible_with_ext_net_in_conf(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
self.plugin_api.get_external_network_id.return_value = 'aaa'
- routers = [
- {'id': _uuid(),
- 'routes': [],
- 'admin_state_up': True,
- 'external_gateway_info': {'network_id': 'aaa'}},
- {'id': _uuid(),
- 'routes': [],
- 'admin_state_up': True,
- 'external_gateway_info': {'network_id': 'bbb'}}]
+ router = {'id': _uuid(),
+ 'routes': [],
+ 'admin_state_up': True,
+ 'external_gateway_info': {'network_id': 'bbb'}}
agent.router_info = {}
self.conf.set_override('gateway_external_network_id', 'aaa')
- agent._process_routers(routers)
- self.assertIn(routers[0]['id'], agent.router_info)
- self.assertNotIn(routers[1]['id'], agent.router_info)
+ self.assertRaises(n_exc.RouterNotCompatibleWithAgent,
+ agent._process_router_if_compatible,
+ router)
+ self.assertNotIn(router['id'], agent.router_info)
- def test_process_routers_with_no_bridge_no_ext_net_in_conf(self):
+ def test_process_router_if_compatible_with_no_bridge_no_ext_net(self):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
self.plugin_api.get_external_network_id.return_value = 'aaa'
- routers = [
- {'id': _uuid(),
- 'routes': [],
- 'admin_state_up': True,
- 'external_gateway_info': {'network_id': 'aaa'}},
- {'id': _uuid(),
- 'routes': [],
- 'admin_state_up': True,
- 'external_gateway_info': {'network_id': 'bbb'}}]
+ router = {'id': _uuid(),
+ 'routes': [],
+ 'admin_state_up': True,
+ 'external_gateway_info': {'network_id': 'aaa'}}
agent.router_info = {}
self.conf.set_override('external_network_bridge', '')
- agent._process_routers(routers)
- self.assertIn(routers[0]['id'], agent.router_info)
- self.assertIn(routers[1]['id'], agent.router_info)
+ agent._process_router_if_compatible(router)
+ self.assertIn(router['id'], agent.router_info)
def test_nonexistent_interface_driver(self):
self.conf.set_override('interface_driver', None)
@@ -2003,15 +2016,10 @@ vrrp_instance VR_1 {
ns_list = agent._list_namespaces()
agent._cleanup_namespaces(ns_list, [r['id'] for r in router_list])
- # Expect process manager to disable one radvd per stale namespace
- expected_pm_disables = len(stale_namespace_list)
-
# Expect process manager to disable metadata proxy per qrouter ns
qrouters = [n for n in stale_namespace_list
if n.startswith(l3_agent.NS_PREFIX)]
- expected_pm_disables += len(qrouters)
- self.assertEqual(expected_pm_disables, pm.disable.call_count)
self.assertEqual(agent._destroy_router_namespace.call_count,
len(qrouters))
self.assertEqual(agent._destroy_snat_namespace.call_count,
@@ -2073,31 +2081,11 @@ vrrp_instance VR_1 {
'mac_address': 'ca:fe:de:ad:be:ef',
'ip_cidr': '20.0.0.30/24'}
- snat_ports = [{'subnet': {'cidr': '152.2.0.0/16',
- 'gateway_ip': '152.2.0.1',
- 'id': _uuid()},
- 'network_id': _uuid(),
- 'device_owner': 'network:router_centralized_snat',
- 'ip_cidr': '152.2.0.13/16',
- 'mac_address': 'fa:16:3e:80:8d:80',
- 'fixed_ips': [{'subnet_id': _uuid(),
- 'ip_address': '152.2.0.13'}],
- 'id': _uuid(), 'device_id': _uuid()},
- {'subnet': {'cidr': '152.10.0.0/16',
- 'gateway_ip': '152.10.0.1',
- 'id': _uuid()},
- 'network_id': _uuid(),
- 'device_owner': 'network:router_centralized_snat',
- 'ip_cidr': '152.10.0.13/16',
- 'mac_address': 'fa:16:3e:80:8d:80',
- 'fixed_ips': [{'subnet_id': _uuid(),
- 'ip_address': '152.10.0.13'}],
- 'id': _uuid(), 'device_id': _uuid()}]
-
interface_name = agent.get_snat_int_device_name(port_id)
self.device_exists.return_value = False
- agent._create_dvr_gateway(ri, dvr_gw_port, interface_name, snat_ports)
+ agent._create_dvr_gateway(ri, dvr_gw_port, interface_name,
+ self.snat_ports)
# check 2 internal ports are plugged
# check 1 ext-gw-port is plugged
@@ -2185,8 +2173,9 @@ vrrp_instance VR_1 {
16, FIP_PRI)
# TODO(mrsmith): add more asserts
+ @mock.patch.object(l3_agent.L3NATAgent, '_fip_ns_unsubscribe')
@mock.patch.object(l3_agent.LinkLocalAllocator, '_write')
- def test_floating_ip_removed_dist(self, write):
+ def test_floating_ip_removed_dist(self, write, unsubscribe):
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
router = prepare_router_data()
agent_gw_port = {'fixed_ips': [{'ip_address': '20.0.0.30',
@@ -2201,6 +2190,7 @@ vrrp_instance VR_1 {
ri = l3_agent.RouterInfo(router['id'], self.conf.root_helper,
self.conf.use_namespaces, router=router)
ri.dist_fip_count = 2
+ agent.fip_ns_subscribers.add(ri.router_id)
ri.floating_ips_dict['11.22.33.44'] = FIP_PRI
ri.fip_2_rtr = '11.22.33.42'
ri.rtr_2_fip = '11.22.33.40'
@@ -2211,9 +2201,10 @@ vrrp_instance VR_1 {
self.mock_rule.delete_rule_priority.assert_called_with(FIP_PRI)
self.mock_ip_dev.route.delete_route.assert_called_with(fip_cidr,
str(s.ip))
+ self.assertFalse(unsubscribe.called, '_fip_ns_unsubscribe called!')
+
with mock.patch.object(agent, '_destroy_fip_namespace') as f:
ri.dist_fip_count = 1
- agent.agent_fip_count = 1
fip_ns_name = agent.get_fip_ns_name(
str(agent._fetch_external_net_id()))
ri.rtr_fip_subnet = agent.local_subnets.allocate(ri.router_id)
@@ -2224,6 +2215,7 @@ vrrp_instance VR_1 {
self.mock_ip_dev.route.delete_gateway.assert_called_once_with(
str(fip_to_rtr.ip), table=16)
f.assert_called_once_with(fip_ns_name)
+ unsubscribe.assert_called_once_with(ri.router_id)
def test_get_service_plugin_list(self):
service_plugins = [p_const.L3_ROUTER_NAT]
@@ -2239,6 +2231,60 @@ vrrp_instance VR_1 {
self.assertIsNone(agent.neutron_service_plugins)
self.assertTrue(self.plugin_api.get_service_plugin_list.called)
+ def test_get_service_plugin_list_retried(self):
+ raise_timeout = messaging.MessagingTimeout()
+ # Raise a timeout the first 2 times it calls
+ # get_service_plugin_list then return a empty tuple
+ self.plugin_api.get_service_plugin_list.side_effect = (
+ raise_timeout, raise_timeout, tuple()
+ )
+ agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+
+ self.assertEqual(agent.neutron_service_plugins, tuple())
+
+ def test_get_service_plugin_list_retried_max(self):
+ raise_timeout = messaging.MessagingTimeout()
+ # Raise a timeout 5 times
+ self.plugin_api.get_service_plugin_list.side_effect = (
+ (raise_timeout, ) * 5
+ )
+ self.assertRaises(messaging.MessagingTimeout, l3_agent.L3NATAgent,
+ HOSTNAME, self.conf)
+
+ def test__fip_ns_subscribe_is_first_true(self):
+ agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+ router_id = _uuid()
+ is_first = agent._fip_ns_subscribe(router_id)
+ self.assertTrue(is_first)
+ self.assertEqual(len(agent.fip_ns_subscribers), 1)
+
+ def test__fip_ns_subscribe_is_first_false(self):
+ agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+ router_id = _uuid()
+ router2_id = _uuid()
+ agent._fip_ns_subscribe(router_id)
+ is_first = agent._fip_ns_subscribe(router2_id)
+ self.assertFalse(is_first)
+ self.assertEqual(len(agent.fip_ns_subscribers), 2)
+
+ def test__fip_ns_unsubscribe_is_last_true(self):
+ agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+ router_id = _uuid()
+ agent.fip_ns_subscribers.add(router_id)
+ is_last = agent._fip_ns_unsubscribe(router_id)
+ self.assertTrue(is_last)
+ self.assertEqual(len(agent.fip_ns_subscribers), 0)
+
+ def test__fip_ns_unsubscribe_is_last_false(self):
+ agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
+ router_id = _uuid()
+ router2_id = _uuid()
+ agent.fip_ns_subscribers.add(router_id)
+ agent.fip_ns_subscribers.add(router2_id)
+ is_last = agent._fip_ns_unsubscribe(router_id)
+ self.assertFalse(is_last)
+ self.assertEqual(len(agent.fip_ns_subscribers), 1)
+
class TestL3AgentEventHandler(base.BaseTestCase):
diff --git a/neutron/tests/unit/test_l3_plugin.py b/neutron/tests/unit/test_l3_plugin.py
index 19838c3ec6..e81a32028c 100644
--- a/neutron/tests/unit/test_l3_plugin.py
+++ b/neutron/tests/unit/test_l3_plugin.py
@@ -22,6 +22,7 @@ import netaddr
from oslo.config import cfg
from webob import exc
+from neutron.api.rpc.agentnotifiers import l3_rpc_agent_api
from neutron.api.rpc.handlers import l3_rpc
from neutron.api.v2 import attributes
from neutron.common import constants as l3_constants
@@ -307,6 +308,13 @@ class TestL3NatAgentSchedulingServicePlugin(TestL3NatServicePlugin,
supported_extension_aliases = ["router", "l3_agent_scheduler"]
+ def __init__(self):
+ super(TestL3NatAgentSchedulingServicePlugin, self).__init__()
+ self.router_scheduler = importutils.import_object(
+ cfg.CONF.router_scheduler_driver)
+ self.agent_notifiers.update(
+ {l3_constants.AGENT_TYPE_L3: l3_rpc_agent_api.L3AgentNotifyAPI()})
+
class L3NATdbonlyMixinTestCase(base.BaseTestCase):
@@ -469,7 +477,7 @@ class L3NatTestCaseMixin(object):
public_sub['subnet']['network_id'],
port_id=private_port['port']['id'],
fixed_ip=fixed_ip,
- set_context=False)
+ set_context=set_context)
yield floatingip
if floatingip:
@@ -1094,11 +1102,17 @@ class L3NatTestCaseBase(L3NatTestCaseMixin):
'remove', tenant_router['router']['id'],
s['subnet']['id'], None, tenant_id='tenant_a')
- def test_router_add_gateway_invalid_network_returns_404(self):
+ def test_router_add_gateway_invalid_network_returns_400(self):
+ with self.router() as r:
+ self._add_external_gateway_to_router(
+ r['router']['id'],
+ "foobar", expected_code=exc.HTTPBadRequest.code)
+
+ def test_router_add_gateway_non_existent_network_returns_404(self):
with self.router() as r:
self._add_external_gateway_to_router(
r['router']['id'],
- "foobar", expected_code=exc.HTTPNotFound.code)
+ _uuid(), expected_code=exc.HTTPNotFound.code)
def test_router_add_gateway_net_not_external_returns_400(self):
with self.router() as r:
diff --git a/neutron/tests/unit/test_l3_schedulers.py b/neutron/tests/unit/test_l3_schedulers.py
index fdf823213b..09346758e0 100644
--- a/neutron/tests/unit/test_l3_schedulers.py
+++ b/neutron/tests/unit/test_l3_schedulers.py
@@ -822,7 +822,7 @@ class L3DvrSchedulerTestCase(testlib_api.SqlTestCase,
'.L3AgentNotifyAPI')):
self.dut.dvr_update_router_addvm(self.adminContext, port)
- def test_get_dvr_routers_by_vmportid(self):
+ def test_get_dvr_routers_by_portid(self):
dvr_port = {
'id': 'dvr_port1',
'device_id': 'r1',
@@ -844,8 +844,8 @@ class L3DvrSchedulerTestCase(testlib_api.SqlTestCase,
'.get_port', return_value=dvr_port),
mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2'
'.get_ports', return_value=[dvr_port])):
- router_id = self.dut.get_dvr_routers_by_vmportid(self.adminContext,
- dvr_port['id'])
+ router_id = self.dut.get_dvr_routers_by_portid(self.adminContext,
+ dvr_port['id'])
self.assertEqual(router_id.pop(), r1['id'])
def test_get_subnet_ids_on_router(self):
@@ -1056,11 +1056,12 @@ class L3HATestCaseMixin(testlib_api.SqlTestCase,
self._register_l3_agents()
def _create_ha_router(self, ha=True, tenant_id='tenant1'):
+ self.adminContext.tenant_id = tenant_id
router = {'name': 'router1', 'admin_state_up': True}
if ha is not None:
router['ha'] = ha
- return self.plugin._create_router_db(self.adminContext,
- router, tenant_id)
+ return self.plugin.create_router(self.adminContext,
+ {'router': router})
class L3_HA_scheduler_db_mixinTestCase(L3HATestCaseMixin):
diff --git a/neutron/tests/unit/test_linux_dhcp.py b/neutron/tests/unit/test_linux_dhcp.py
index f6f5fc6a23..a0187369b8 100644
--- a/neutron/tests/unit/test_linux_dhcp.py
+++ b/neutron/tests/unit/test_linux_dhcp.py
@@ -130,8 +130,9 @@ class FakeRouterPort:
'dddddddd-dddd-dddd-dddd-dddddddddddd')]
mac_address = '00:00:0f:rr:rr:rr'
- def __init__(self):
+ def __init__(self, dev_owner=constants.DEVICE_OWNER_ROUTER_INTF):
self.extra_dhcp_opts = []
+ self.device_owner = dev_owner
class FakePortMultipleAgents1:
@@ -341,6 +342,13 @@ class FakeV4NetworkNoRouter:
ports = [FakePort1()]
+class FakeV4NetworkDistRouter:
+ id = 'cccccccc-cccc-cccc-cccc-cccccccccccc'
+ subnets = [FakeV4Subnet()]
+ ports = [FakePort1(),
+ FakeRouterPort(dev_owner=constants.DEVICE_OWNER_DVR_INTERFACE)]
+
+
class FakeDualV4Pxe3Ports:
id = 'cccccccc-cccc-cccc-cccc-cccccccccccc'
subnets = [FakeV4Subnet(), FakeV4SubnetNoDHCP()]
@@ -798,7 +806,8 @@ class TestDnsmasq(TestBase):
self.assertTrue(mocks['_output_opts_file'].called)
self.execute.assert_called_once_with(expected,
root_helper='sudo',
- check_exit_code=True)
+ check_exit_code=True,
+ extra_ok_codes=None)
def test_spawn(self):
self._test_spawn(['--conf-file=', '--domain=openstacklocal'])
@@ -961,6 +970,26 @@ tag:tag0,option:router""".lstrip()
self.safe.assert_called_once_with('/foo/opts', expected)
+ def test_output_opts_file_dist_neutron_router_on_subnet(self):
+ expected = (
+ 'tag:tag0,option:dns-server,8.8.8.8\n'
+ 'tag:tag0,option:classless-static-route,20.0.0.1/24,20.0.0.1,'
+ '0.0.0.0/0,192.168.0.1\n'
+ 'tag:tag0,249,20.0.0.1/24,20.0.0.1,0.0.0.0/0,192.168.0.1\n'
+ 'tag:tag0,option:router,192.168.0.1').lstrip()
+
+ with mock.patch.object(dhcp.Dnsmasq, 'get_conf_file_name') as conf_fn:
+ conf_fn.return_value = '/foo/opts'
+ dm = dhcp.Dnsmasq(self.conf, FakeV4NetworkDistRouter(),
+ version=dhcp.Dnsmasq.MINIMUM_VERSION)
+ with mock.patch.object(dm, '_make_subnet_interface_ip_map') as ipm:
+ ipm.return_value = {FakeV4Subnet.id: '192.168.0.1'}
+
+ dm._output_opts_file()
+ self.assertTrue(ipm.called)
+
+ self.safe.assert_called_once_with('/foo/opts', expected)
+
def test_output_opts_file_pxe_2port_1net(self):
expected = (
'tag:tag0,option:dns-server,8.8.8.8\n'
diff --git a/neutron/tests/unit/test_linux_external_process.py b/neutron/tests/unit/test_linux_external_process.py
index 85c24544a2..b16b681e93 100644
--- a/neutron/tests/unit/test_linux_external_process.py
+++ b/neutron/tests/unit/test_linux_external_process.py
@@ -41,7 +41,8 @@ class TestProcessManager(base.BaseTestCase):
name.assert_called_once_with(ensure_pids_dir=True)
self.execute.assert_called_once_with(['the', 'cmd'],
root_helper='sudo',
- check_exit_code=True)
+ check_exit_code=True,
+ extra_ok_codes=None)
def test_enable_with_namespace(self):
callback = mock.Mock()
@@ -122,7 +123,7 @@ class TestProcessManager(base.BaseTestCase):
isdir.return_value = True
manager = ep.ProcessManager(self.conf, 'uuid')
retval = manager.get_pid_file_name(ensure_pids_dir=True)
- self.assertEqual(retval, '/var/path/uuid/pid')
+ self.assertEqual(retval, '/var/path/uuid.pid')
def test_get_pid_file_name_not_existing(self):
with mock.patch.object(ep.utils.os.path, 'isdir') as isdir:
@@ -130,15 +131,15 @@ class TestProcessManager(base.BaseTestCase):
isdir.return_value = False
manager = ep.ProcessManager(self.conf, 'uuid')
retval = manager.get_pid_file_name(ensure_pids_dir=True)
- self.assertEqual(retval, '/var/path/uuid/pid')
- makedirs.assert_called_once_with('/var/path/uuid', 0o755)
+ self.assertEqual(retval, '/var/path/uuid.pid')
+ makedirs.assert_called_once_with('/var/path', 0o755)
def test_get_pid_file_name_default(self):
with mock.patch.object(ep.utils.os.path, 'isdir') as isdir:
isdir.return_value = True
manager = ep.ProcessManager(self.conf, 'uuid')
retval = manager.get_pid_file_name(ensure_pids_dir=False)
- self.assertEqual(retval, '/var/path/uuid/pid')
+ self.assertEqual(retval, '/var/path/uuid.pid')
self.assertFalse(isdir.called)
def test_pid(self):
diff --git a/neutron/tests/unit/test_linux_ip_lib.py b/neutron/tests/unit/test_linux_ip_lib.py
index 6c20aa6d74..2b9486d3e7 100644
--- a/neutron/tests/unit/test_linux_ip_lib.py
+++ b/neutron/tests/unit/test_linux_ip_lib.py
@@ -792,7 +792,7 @@ class TestIpNetnsCommand(TestIPCmdBase):
execute.assert_called_once_with(
['ip', 'netns', 'exec', 'ns',
'sysctl', '-w', 'net.ipv4.conf.all.promote_secondaries=1'],
- root_helper='sudo', check_exit_code=True)
+ root_helper='sudo', check_exit_code=True, extra_ok_codes=None)
def test_delete_namespace(self):
with mock.patch('neutron.agent.linux.utils.execute'):
@@ -830,7 +830,8 @@ class TestIpNetnsCommand(TestIPCmdBase):
execute.assert_called_once_with(['ip', 'netns', 'exec', 'ns', 'ip',
'link', 'list'],
root_helper='sudo',
- check_exit_code=True)
+ check_exit_code=True,
+ extra_ok_codes=None)
def test_execute_env_var_prepend(self):
self.parent.namespace = 'ns'
@@ -841,7 +842,7 @@ class TestIpNetnsCommand(TestIPCmdBase):
['ip', 'netns', 'exec', 'ns', 'env'] +
['%s=%s' % (k, v) for k, v in env.items()] +
['ip', 'link', 'list'],
- root_helper='sudo', check_exit_code=True)
+ root_helper='sudo', check_exit_code=True, extra_ok_codes=None)
def test_execute_nosudo_with_no_namespace(self):
with mock.patch('neutron.agent.linux.utils.execute') as execute:
@@ -850,7 +851,8 @@ class TestIpNetnsCommand(TestIPCmdBase):
self.netns_cmd.execute(['test'])
execute.assert_called_once_with(['test'],
root_helper=None,
- check_exit_code=True)
+ check_exit_code=True,
+ extra_ok_codes=None)
class TestDeviceExists(base.BaseTestCase):
diff --git a/neutron/tests/unit/test_metadata_agent.py b/neutron/tests/unit/test_metadata_agent.py
index f5446e933c..7af182a5cf 100644
--- a/neutron/tests/unit/test_metadata_agent.py
+++ b/neutron/tests/unit/test_metadata_agent.py
@@ -433,6 +433,10 @@ class TestMetadataProxyHandlerCache(base.BaseTestCase):
self.assertEqual(response.content_type, "text/plain")
self.assertEqual(response.body, 'content')
+ def test_proxy_request_400(self):
+ self.assertIsInstance(self._proxy_request_test_helper(400),
+ webob.exc.HTTPBadRequest)
+
def test_proxy_request_403(self):
self.assertIsInstance(self._proxy_request_test_helper(403),
webob.exc.HTTPForbidden)
@@ -493,8 +497,8 @@ class TestUnixDomainWSGIServer(base.BaseTestCase):
def test_start(self):
mock_app = mock.Mock()
- with mock.patch.object(self.server, 'pool') as pool:
- self.server.start(mock_app, '/the/path', workers=0, backlog=128)
+ with mock.patch.object(self.server, '_launch') as launcher:
+ self.server.start(mock_app, '/the/path', workers=5, backlog=128)
self.eventlet.assert_has_calls([
mock.call.listen(
'/the/path',
@@ -502,27 +506,7 @@ class TestUnixDomainWSGIServer(base.BaseTestCase):
backlog=128
)]
)
- pool.spawn_n.assert_called_once_with(
- self.server._run,
- mock_app,
- self.eventlet.listen.return_value
- )
-
- @mock.patch('neutron.openstack.common.service.ProcessLauncher')
- def test_start_multiple_workers(self, process_launcher):
- launcher = process_launcher.return_value
-
- mock_app = mock.Mock()
- self.server.start(mock_app, '/the/path', workers=2, backlog=128)
- launcher.running = True
- launcher.launch_service.assert_called_once_with(self.server._server,
- workers=2)
-
- self.server.stop()
- self.assertFalse(launcher.running)
-
- self.server.wait()
- launcher.wait.assert_called_once_with()
+ launcher.assert_called_once_with(mock_app, workers=5)
def test_run(self):
with mock.patch.object(agent, 'logging') as logging:
diff --git a/neutron/tests/unit/test_metadata_namespace_proxy.py b/neutron/tests/unit/test_metadata_namespace_proxy.py
index 6f90d335f2..3ffbd9921f 100644
--- a/neutron/tests/unit/test_metadata_namespace_proxy.py
+++ b/neutron/tests/unit/test_metadata_namespace_proxy.py
@@ -148,15 +148,15 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase):
'application/json')
self.assertEqual(retval.body, '{}')
- def test_proxy_request_network_404(self):
+ def _test_proxy_request_network_4xx(self, status, method, expected):
self.handler.network_id = 'network_id'
- resp = mock.Mock(status=404)
+ resp = mock.Mock(status=status)
with mock.patch('httplib2.Http') as mock_http:
mock_http.return_value.request.return_value = (resp, '')
retval = self.handler._proxy_request('192.168.1.1',
- 'GET',
+ method,
'/latest/meta-data',
'',
'')
@@ -164,7 +164,7 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase):
mock_http.assert_has_calls([
mock.call().request(
'http://169.254.169.254/latest/meta-data',
- method='GET',
+ method=method,
headers={
'X-Forwarded-For': '192.168.1.1',
'X-Neutron-Network-ID': 'network_id'
@@ -174,35 +174,19 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase):
)]
)
- self.assertIsInstance(retval, webob.exc.HTTPNotFound)
+ self.assertIsInstance(retval, expected)
- def test_proxy_request_network_409(self):
- self.handler.network_id = 'network_id'
-
- resp = mock.Mock(status=409)
- with mock.patch('httplib2.Http') as mock_http:
- mock_http.return_value.request.return_value = (resp, '')
-
- retval = self.handler._proxy_request('192.168.1.1',
- 'POST',
- '/latest/meta-data',
- '',
- '')
+ def test_proxy_request_network_400(self):
+ self._test_proxy_request_network_4xx(
+ 400, 'GET', webob.exc.HTTPBadRequest)
- mock_http.assert_has_calls([
- mock.call().request(
- 'http://169.254.169.254/latest/meta-data',
- method='POST',
- headers={
- 'X-Forwarded-For': '192.168.1.1',
- 'X-Neutron-Network-ID': 'network_id'
- },
- connection_type=ns_proxy.UnixDomainHTTPConnection,
- body=''
- )]
- )
+ def test_proxy_request_network_404(self):
+ self._test_proxy_request_network_4xx(
+ 404, 'GET', webob.exc.HTTPNotFound)
- self.assertIsInstance(retval, webob.exc.HTTPConflict)
+ def test_proxy_request_network_409(self):
+ self._test_proxy_request_network_4xx(
+ 409, 'POST', webob.exc.HTTPConflict)
def test_proxy_request_network_500(self):
self.handler.network_id = 'network_id'
diff --git a/neutron/tests/unit/test_policy.py b/neutron/tests/unit/test_policy.py
index bc0074c909..af5d64c808 100644
--- a/neutron/tests/unit/test_policy.py
+++ b/neutron/tests/unit/test_policy.py
@@ -23,6 +23,7 @@ import six
import neutron
from neutron.api.v2 import attributes
+from neutron.common import constants as const
from neutron.common import exceptions
from neutron import context
from neutron import manager
@@ -282,9 +283,11 @@ class NeutronPolicyTestCase(base.BaseTestCase):
fake_manager_instance.plugin = plugin_klass()
def _test_action_on_attr(self, context, action, attr, value,
- exception=None):
+ exception=None, **kwargs):
action = "%s_network" % action
target = {'tenant_id': 'the_owner', attr: value}
+ if kwargs:
+ target.update(kwargs)
if exception:
self.assertRaises(exception, policy.enforce,
context, action, target)
@@ -293,10 +296,10 @@ class NeutronPolicyTestCase(base.BaseTestCase):
self.assertEqual(result, True)
def _test_nonadmin_action_on_attr(self, action, attr, value,
- exception=None):
+ exception=None, **kwargs):
user_context = context.Context('', "user", roles=['user'])
self._test_action_on_attr(user_context, action, attr,
- value, exception)
+ value, exception, **kwargs)
def test_nonadmin_write_on_private_fails(self):
self._test_nonadmin_action_on_attr('create', 'shared', False,
@@ -313,9 +316,11 @@ class NeutronPolicyTestCase(base.BaseTestCase):
def test_nonadmin_read_on_shared_succeeds(self):
self._test_nonadmin_action_on_attr('get', 'shared', True)
- def _test_enforce_adminonly_attribute(self, action):
+ def _test_enforce_adminonly_attribute(self, action, **kwargs):
admin_context = context.get_admin_context()
target = {'shared': True}
+ if kwargs:
+ target.update(kwargs)
result = policy.enforce(admin_context, action, target)
self.assertEqual(result, True)
@@ -323,7 +328,14 @@ class NeutronPolicyTestCase(base.BaseTestCase):
self._test_enforce_adminonly_attribute('create_network')
def test_enforce_adminonly_attribute_update(self):
- self._test_enforce_adminonly_attribute('update_network')
+ kwargs = {const.ATTRIBUTES_TO_UPDATE: ['shared']}
+ self._test_enforce_adminonly_attribute('update_network', **kwargs)
+
+ def test_reset_adminonly_attr_to_default_fails(self):
+ kwargs = {const.ATTRIBUTES_TO_UPDATE: ['shared']}
+ self._test_nonadmin_action_on_attr('update', 'shared', False,
+ exceptions.PolicyNotAuthorized,
+ **kwargs)
def test_enforce_adminonly_attribute_no_context_is_admin_policy(self):
del self.rules[policy.ADMIN_CTX_POLICY]
@@ -551,3 +563,24 @@ class NeutronPolicyTestCase(base.BaseTestCase):
{'extension:provider_network:set': 'rule:admin_only'},
dict((policy, 'rule:admin_only') for policy in
expected_policies))
+
+ def test_process_rules(self):
+ action = "create_something"
+ # Construct RuleChecks for an action, attribute and subattribute
+ match_rule = common_policy.RuleCheck('rule', action)
+ attr_rule = common_policy.RuleCheck('rule', '%s:%s' %
+ (action, 'somethings'))
+ sub_attr_rules = [common_policy.RuleCheck('rule', '%s:%s:%s' %
+ (action, 'attr',
+ 'sub_attr_1'))]
+ # Build an AndCheck from the given RuleChecks
+ # Make the checks nested to better check the recursion
+ sub_attr_rules = common_policy.AndCheck(sub_attr_rules)
+ attr_rule = common_policy.AndCheck(
+ [attr_rule, sub_attr_rules])
+
+ match_rule = common_policy.AndCheck([match_rule, attr_rule])
+ # Assert that the rules are correctly extracted from the match_rule
+ rules = policy._process_rules_list([], match_rule)
+ self.assertEqual(['create_something', 'create_something:somethings',
+ 'create_something:attr:sub_attr_1'], rules)
diff --git a/neutron/tests/unit/test_quota_ext.py b/neutron/tests/unit/test_quota_ext.py
index 262fb04411..55096f7d27 100644
--- a/neutron/tests/unit/test_quota_ext.py
+++ b/neutron/tests/unit/test_quota_ext.py
@@ -18,11 +18,13 @@ import sys
import mock
from oslo.config import cfg
import testtools
+from webob import exc
import webtest
from neutron.api import extensions
from neutron.api.v2 import attributes
from neutron.common import config
+from neutron.common import constants
from neutron.common import exceptions
from neutron import context
from neutron.db import quota_db
@@ -32,8 +34,7 @@ from neutron.tests.unit import test_api_v2
from neutron.tests.unit import testlib_api
from neutron.tests.unit import testlib_plugin
-TARGET_PLUGIN = ('neutron.plugins.linuxbridge.lb_neutron_plugin'
- '.LinuxBridgePluginV2')
+TARGET_PLUGIN = 'neutron.plugins.ml2.plugin.Ml2Plugin'
_get_path = test_api_v2._get_path
@@ -188,6 +189,16 @@ class QuotaExtensionDbTestCase(QuotaExtensionTestCase):
expect_errors=True)
self.assertEqual(400, res.status_int)
+ def test_update_quotas_with_out_of_range_integer_returns_400(self):
+ tenant_id = 'tenant_id1'
+ env = {'neutron.context': context.Context('', tenant_id,
+ is_admin=True)}
+ quotas = {'quota': {'network': constants.DB_INTEGER_MAX_VALUE + 1}}
+ res = self.api.put(_get_path('quotas', id=tenant_id, fmt=self.fmt),
+ self.serialize(quotas), extra_environ=env,
+ expect_errors=True)
+ self.assertEqual(exc.HTTPBadRequest.code, res.status_int)
+
def test_update_quotas_to_unlimited(self):
tenant_id = 'tenant_id1'
env = {'neutron.context': context.Context('', tenant_id,
diff --git a/neutron/tests/unit/test_security_groups_rpc.py b/neutron/tests/unit/test_security_groups_rpc.py
index 5a1d5dc97e..58a68bfe60 100644
--- a/neutron/tests/unit/test_security_groups_rpc.py
+++ b/neutron/tests/unit/test_security_groups_rpc.py
@@ -544,6 +544,52 @@ class SGServerRpcCallBackTestCase(test_sg.SecurityGroupDBTestCase):
expected)
self._delete('ports', port_id1)
+ def test_security_group_info_for_devices_only_ipv6_rule(self):
+ with self.network() as n:
+ with contextlib.nested(self.subnet(n),
+ self.security_group()) as (subnet_v4,
+ sg1):
+ sg1_id = sg1['security_group']['id']
+ rule1 = self._build_security_group_rule(
+ sg1_id,
+ 'ingress', const.PROTO_NAME_TCP, '22',
+ '22', remote_group_id=sg1_id,
+ ethertype=const.IPv6)
+ rules = {
+ 'security_group_rules': [rule1['security_group_rule']]}
+ self._make_security_group_rule(self.fmt, rules)
+
+ res1 = self._create_port(
+ self.fmt, n['network']['id'],
+ security_groups=[sg1_id])
+ ports_rest1 = self.deserialize(self.fmt, res1)
+ port_id1 = ports_rest1['port']['id']
+ self.rpc.devices = {port_id1: ports_rest1['port']}
+ devices = [port_id1, 'no_exist_device']
+
+ ctx = context.get_admin_context()
+ ports_rpc = self.rpc.security_group_info_for_devices(
+ ctx, devices=devices)
+ expected = {
+ 'security_groups': {sg1_id: [
+ {'direction': 'egress', 'ethertype': const.IPv4},
+ {'direction': 'egress', 'ethertype': const.IPv6},
+ {'direction': u'ingress',
+ 'protocol': const.PROTO_NAME_TCP,
+ 'ethertype': const.IPv6,
+ 'port_range_max': 22, 'port_range_min': 22,
+ 'remote_group_id': sg1_id}
+ ]},
+ 'sg_member_ips': {sg1_id: {
+ 'IPv6': [],
+ }}
+ }
+ self.assertEqual(expected['security_groups'],
+ ports_rpc['security_groups'])
+ self.assertEqual(expected['sg_member_ips'][sg1_id]['IPv6'],
+ ports_rpc['sg_member_ips'][sg1_id]['IPv6'])
+ self._delete('ports', port_id1)
+
def test_security_group_ra_rules_for_devices_ipv6_gateway_global(self):
fake_prefix = FAKE_PREFIX[const.IPv6]
fake_gateway = FAKE_IP['IPv6_GLOBAL']
@@ -975,6 +1021,7 @@ class BaseSecurityGroupAgentRpcTestCase(base.BaseTestCase):
self.agent.root_helper = 'sudo'
self.agent.plugin_rpc = mock.Mock()
self.agent.init_firewall(defer_refresh_firewall=defer_refresh_firewall)
+ self.default_firewall = self.agent.firewall
self.firewall = mock.Mock()
firewall_object = firewall_base.FirewallDriver()
self.firewall.defer_apply.side_effect = firewall_object.defer_apply
@@ -1011,6 +1058,26 @@ class SecurityGroupAgentRpcTestCase(BaseSecurityGroupAgentRpcTestCase):
self.fake_device),
])
+ def test_prepare_devices_filter_with_noopfirewall(self):
+ self.agent.firewall = self.default_firewall
+ self.agent.plugin_rpc.security_group_info_for_devices = mock.Mock()
+ self.agent.plugin_rpc.security_group_rules_for_devices = mock.Mock()
+ self.agent.prepare_devices_filter(['fake_device'])
+ self.assertFalse(self.agent.plugin_rpc.
+ security_group_info_for_devices.called)
+ self.assertFalse(self.agent.plugin_rpc.
+ security_group_rules_for_devices.called)
+
+ def test_prepare_devices_filter_with_firewall_disabled(self):
+ cfg.CONF.set_override('enable_security_group', False, 'SECURITYGROUP')
+ self.agent.plugin_rpc.security_group_info_for_devices = mock.Mock()
+ self.agent.plugin_rpc.security_group_rules_for_devices = mock.Mock()
+ self.agent.prepare_devices_filter(['fake_device'])
+ self.assertFalse(self.agent.plugin_rpc.
+ security_group_info_for_devices.called)
+ self.assertFalse(self.agent.plugin_rpc.
+ security_group_rules_for_devices.called)
+
def test_security_groups_rule_updated(self):
self.agent.refresh_firewall = mock.Mock()
self.agent.prepare_devices_filter(['fake_port_id'])
@@ -1065,6 +1132,30 @@ class SecurityGroupAgentRpcTestCase(BaseSecurityGroupAgentRpcTestCase):
self.agent.refresh_firewall([])
self.assertFalse(self.firewall.called)
+ def test_refresh_firewall_with_firewall_disabled(self):
+ cfg.CONF.set_override('enable_security_group', False, 'SECURITYGROUP')
+ self.agent.plugin_rpc.security_group_info_for_devices = mock.Mock()
+ self.agent.plugin_rpc.security_group_rules_for_devices = mock.Mock()
+ self.agent.firewall.defer_apply = mock.Mock()
+ self.agent.refresh_firewall([self.fake_device])
+ self.assertFalse(self.agent.plugin_rpc.
+ security_group_info_for_devices.called)
+ self.assertFalse(self.agent.plugin_rpc.
+ security_group_rules_for_devices.called)
+ self.assertFalse(self.agent.firewall.defer_apply.called)
+
+ def test_refresh_firewall_with_noopfirewall(self):
+ self.agent.firewall = self.default_firewall
+ self.agent.plugin_rpc.security_group_info_for_devices = mock.Mock()
+ self.agent.plugin_rpc.security_group_rules_for_devices = mock.Mock()
+ self.agent.firewall.defer_apply = mock.Mock()
+ self.agent.refresh_firewall([self.fake_device])
+ self.assertFalse(self.agent.plugin_rpc.
+ security_group_info_for_devices.called)
+ self.assertFalse(self.agent.plugin_rpc.
+ security_group_rules_for_devices.called)
+ self.assertFalse(self.agent.firewall.defer_apply.called)
+
class SecurityGroupAgentEnhancedRpcTestCase(
BaseSecurityGroupAgentRpcTestCase):
@@ -2254,11 +2345,13 @@ class TestSecurityGroupAgentWithIptables(base.BaseTestCase):
def setUp(self, defer_refresh_firewall=False, test_rpc_v1_1=True):
super(TestSecurityGroupAgentWithIptables, self).setUp()
config.register_root_helper(cfg.CONF)
+ config.register_iptables_opts(cfg.CONF)
cfg.CONF.set_override(
'lock_path',
'$state_path/lock')
set_firewall_driver(self.FIREWALL_DRIVER)
cfg.CONF.set_override('enable_ipset', False, group='SECURITYGROUP')
+ cfg.CONF.set_override('comment_iptables_rules', False, group='AGENT')
self.agent = sg_rpc.SecurityGroupAgentRpcMixin()
self.agent.context = None
diff --git a/neutron/tests/unit/test_wsgi.py b/neutron/tests/unit/test_wsgi.py
index d122913988..789b27ce62 100644
--- a/neutron/tests/unit/test_wsgi.py
+++ b/neutron/tests/unit/test_wsgi.py
@@ -56,12 +56,10 @@ class TestWSGIServer(base.BaseTestCase):
server = wsgi.Server("test_multiple_processes")
server.start(None, 0, host="127.0.0.1", workers=2)
- launcher.running = True
- launcher.launch_service.assert_called_once_with(server._server,
- workers=2)
+ launcher.launch_service.assert_called_once_with(mock.ANY, workers=2)
server.stop()
- self.assertFalse(launcher.running)
+ launcher.stop.assert_called_once_with()
server.wait()
launcher.wait.assert_called_once_with()
diff --git a/neutron/tests/unit/testlib_api.py b/neutron/tests/unit/testlib_api.py
index a8c7a7e6ed..564e0b501f 100644
--- a/neutron/tests/unit/testlib_api.py
+++ b/neutron/tests/unit/testlib_api.py
@@ -55,17 +55,24 @@ def create_request(path, body, content_type, method='GET',
class SqlTestCase(base.BaseTestCase):
+ # flag to indicate that the models have been loaded
+ _TABLES_ESTABLISHED = False
+
def setUp(self):
super(SqlTestCase, self).setUp()
# Register all data models
engine = db_api.get_engine()
- model_base.BASEV2.metadata.create_all(engine)
+ if not SqlTestCase._TABLES_ESTABLISHED:
+ model_base.BASEV2.metadata.create_all(engine)
+ SqlTestCase._TABLES_ESTABLISHED = True
- def unregister_models():
- """Unregister all data models."""
- model_base.BASEV2.metadata.drop_all(engine)
+ def clear_tables():
+ with engine.begin() as conn:
+ for table in reversed(
+ model_base.BASEV2.metadata.sorted_tables):
+ conn.execute(table.delete())
- self.addCleanup(unregister_models)
+ self.addCleanup(clear_tables)
class WebTestCase(SqlTestCase):
diff --git a/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py b/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py
index e3b92f25f8..006ad38648 100644
--- a/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py
+++ b/neutron/tests/unit/vmware/nsxlib/test_l2gateway.py
@@ -165,6 +165,7 @@ class L2GatewayTestCase(base.NsxlibTestCase):
"type": '%sConnector' % connector_type}],
"admin_status_enabled": True
}
+ body.get("tags").sort()
if client_certificate:
body["credential"] = {
"client_certificate": {
@@ -191,7 +192,7 @@ class L2GatewayTestCase(base.NsxlibTestCase):
request_mock.assert_called_once_with(
"POST",
"/ws.v1/transport-node",
- jsonutils.dumps(expected_req_body),
+ jsonutils.dumps(expected_req_body, sort_keys=True),
cluster=self.fake_cluster)
def test_update_gw_device(self):
@@ -215,7 +216,7 @@ class L2GatewayTestCase(base.NsxlibTestCase):
request_mock.assert_called_once_with(
"PUT",
"/ws.v1/transport-node/whatever",
- jsonutils.dumps(expected_req_body),
+ jsonutils.dumps(expected_req_body, sort_keys=True),
cluster=self.fake_cluster)
def test_update_gw_device_without_certificate(self):
@@ -238,7 +239,7 @@ class L2GatewayTestCase(base.NsxlibTestCase):
request_mock.assert_called_once_with(
"PUT",
"/ws.v1/transport-node/whatever",
- jsonutils.dumps(expected_req_body),
+ jsonutils.dumps(expected_req_body, sort_keys=True),
cluster=self.fake_cluster)
def test_get_gw_device_status(self):
diff --git a/neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py b/neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py
index 04c24172e2..a954a32b7d 100644
--- a/neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py
+++ b/neutron/tests/unit/vmware/vshield/test_fwaas_plugin.py
@@ -130,12 +130,13 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
attrs['router_id'] = self._create_and_get_router()
- with self.firewall(name=name,
- firewall_policy_id=fwp_id,
- router_id=attrs['router_id'],
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP,
- expected_res_status=201) as fw:
+ with self.firewall(
+ name=name,
+ firewall_policy_id=fwp_id,
+ router_id=attrs['router_id'],
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP,
+ expected_res_status=201
+ ) as fw:
attrs = self._replace_firewall_status(
attrs, const.PENDING_CREATE, const.ACTIVE)
for k, v in attrs.iteritems():
@@ -146,11 +147,12 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
attrs = self._get_test_firewall_attrs(name)
attrs['router_id'] = self._create_and_get_router()
- with self.firewall(name=name,
- router_id=attrs['router_id'],
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP,
- expected_res_status=201) as fw:
+ with self.firewall(
+ name=name,
+ router_id=attrs['router_id'],
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP,
+ expected_res_status=201
+ ) as fw:
attrs = self._replace_firewall_status(
attrs, const.PENDING_CREATE, const.ACTIVE)
for k, v in attrs.iteritems():
@@ -201,12 +203,13 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
router_id = self._create_and_get_router()
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
- with self.firewall(name='fw',
- firewall_policy_id=fwp_id,
- router_id=router_id,
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP,
- expected_res_status=201):
+ with self.firewall(
+ name='fw',
+ firewall_policy_id=fwp_id,
+ router_id=router_id,
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP,
+ expected_res_status=201
+ ):
self._delete('routers', router_id,
expected_code=webob.exc.HTTPConflict.code)
@@ -311,10 +314,11 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
firewall_rules=None,
audited=test_db_firewall.AUDITED) as fwp:
fwp_id = fwp['firewall_policy']['id']
- with self.firewall(firewall_policy_id=fwp_id,
- router_id=self._create_and_get_router(),
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP):
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ router_id=self._create_and_get_router(),
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ):
data = {'firewall_policy': {'name': name}}
req = self.new_update_request(
'firewall_policies', data, fwp['firewall_policy']['id'])
@@ -372,10 +376,11 @@ class FirewallPluginTestCase(test_db_firewall.FirewallPluginDbTestCase,
with self.firewall_policy() as fwp:
fwp_id = fwp['firewall_policy']['id']
attrs['firewall_policy_id'] = fwp_id
- with self.firewall(firewall_policy_id=fwp_id,
- router_id=self._create_and_get_router(),
- admin_state_up=
- test_db_firewall.ADMIN_STATE_UP):
+ with self.firewall(
+ firewall_policy_id=fwp_id,
+ router_id=self._create_and_get_router(),
+ admin_state_up=test_db_firewall.ADMIN_STATE_UP
+ ):
fwr_id = fwr['firewall_rule']['id']
data = {'firewall_policy': {'firewall_rules': [fwr_id]}}
req = self.new_update_request(
diff --git a/neutron/wsgi.py b/neutron/wsgi.py
index a98e222637..137dcb96e5 100644
--- a/neutron/wsgi.py
+++ b/neutron/wsgi.py
@@ -97,7 +97,8 @@ class WorkerService(object):
self._service._socket)
def wait(self):
- self._service.pool.waitall()
+ if isinstance(self._server, eventlet.greenthread.GreenThread):
+ self._server.wait()
def stop(self):
if isinstance(self._server, eventlet.greenthread.GreenThread):
@@ -113,7 +114,6 @@ class Server(object):
eventlet.wsgi.MAX_HEADER_LINE = CONF.max_header_line
self.pool = eventlet.GreenPool(threads)
self.name = name
- self._launcher = None
self._server = None
def _get_socket(self, host, port, backlog):
@@ -205,17 +205,22 @@ class Server(object):
self._socket = self._get_socket(self._host,
self._port,
backlog=backlog)
+
+ self._launch(application, workers)
+
+ def _launch(self, application, workers=0):
+ service = WorkerService(self, application)
if workers < 1:
- # For the case where only one process is required.
- self._server = self.pool.spawn(self._run, application,
- self._socket)
+ # The API service should run in the current process.
+ self._server = service
+ service.start()
systemd.notify_once()
else:
+ # The API service runs in a number of child processes.
# Minimize the cost of checking for child exit by extending the
# wait interval past the default of 0.01s.
- self._launcher = common_service.ProcessLauncher(wait_interval=1.0)
- self._server = WorkerService(self, application)
- self._launcher.launch_service(self._server, workers=workers)
+ self._server = common_service.ProcessLauncher(wait_interval=1.0)
+ self._server.launch_service(service, workers=workers)
@property
def host(self):
@@ -226,19 +231,12 @@ class Server(object):
return self._socket.getsockname()[1] if self._socket else self._port
def stop(self):
- if self._launcher:
- # The process launcher does not support stop or kill.
- self._launcher.running = False
- else:
- self._server.kill()
+ self._server.stop()
def wait(self):
"""Wait until all servers have completed running."""
try:
- if self._launcher:
- self._launcher.wait()
- else:
- self.pool.waitall()
+ self._server.wait()
except KeyboardInterrupt:
pass
diff --git a/openstack-common.conf b/openstack-common.conf
index 6e6c64e9e6..a3bebcc38b 100644
--- a/openstack-common.conf
+++ b/openstack-common.conf
@@ -25,13 +25,11 @@ module=periodic_task
module=policy
module=processutils
module=service
-module=sslutils
module=strutils
module=systemd
module=threadgroup
module=timeutils
module=uuidutils
-module=versionutils
# The base module to hold the copy of openstack.common
base=neutron
diff --git a/requirements.txt b/requirements.txt
index cb31cee1dd..a8b4883e84 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,26 +9,28 @@ Routes>=1.12.3,!=2.0
anyjson>=0.3.3
argparse
Babel>=1.3
-eventlet>=0.15.1
+eventlet>=0.15.2
greenlet>=0.3.2
httplib2>=0.7.5
-requests>=1.2.1,!=2.4.0
+requests>=2.2.0,!=2.4.0
iso8601>=0.1.9
jsonrpclib
Jinja2
keystonemiddleware>=1.0.0
-kombu>=2.4.8
netaddr>=0.7.12
python-neutronclient>=2.3.6,<3
SQLAlchemy>=0.8.4,<=0.8.99,>=0.9.7,<=0.9.99
WebOb>=1.2.3
-python-keystoneclient>=0.10.0
+python-keystoneclient>=0.11.1
alembic>=0.6.4
six>=1.7.0
-stevedore>=0.14
-oslo.config>=1.4.0.0a3
-oslo.db>=0.4.0 # Apache-2.0
-oslo.messaging>=1.4.0.0a3
-oslo.rootwrap>=1.3.0.0a1
+stevedore>=1.0.0 # Apache-2.0
+oslo.config>=1.4.0 # Apache-2.0
+oslo.db>=1.0.0 # Apache-2.0
+oslo.i18n>=1.0.0 # Apache-2.0
+oslo.messaging>=1.4.0
+oslo.rootwrap>=1.3.0
+oslo.serialization>=1.0.0 # Apache-2.0
+oslo.utils>=1.0.0 # Apache-2.0
python-novaclient>=2.18.0
diff --git a/setup.cfg b/setup.cfg
index 4f0697c80e..a021a4ee03 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
[metadata]
name = neutron
-version = 2014.2
+version = 2015.1
summary = OpenStack Networking
description-file =
README.rst
@@ -55,6 +55,7 @@ data_files =
etc/neutron/plugins/bigswitch/ssl/host_certs/README
etc/neutron/plugins/brocade = etc/neutron/plugins/brocade/brocade.ini
etc/neutron/plugins/cisco =
+ etc/neutron/plugins/cisco/cisco_cfg_agent.ini
etc/neutron/plugins/cisco/cisco_plugins.ini
etc/neutron/plugins/cisco/cisco_router_plugin.ini
etc/neutron/plugins/cisco/cisco_vpn_agent.ini
@@ -133,14 +134,13 @@ neutron.core_plugins =
embrane = neutron.plugins.embrane.plugins.embrane_ml2_plugin:EmbraneMl2Plugin
hyperv = neutron.plugins.hyperv.hyperv_neutron_plugin:HyperVNeutronPlugin
ibm = neutron.plugins.ibm.sdnve_neutron_plugin:SdnvePluginV2
- linuxbridge = neutron.plugins.linuxbridge.lb_neutron_plugin:LinuxBridgePluginV2
midonet = neutron.plugins.midonet.plugin:MidonetPluginV2
ml2 = neutron.plugins.ml2.plugin:Ml2Plugin
mlnx = neutron.plugins.mlnx.mlnx_plugin:MellanoxEswitchPlugin
nec = neutron.plugins.nec.nec_plugin:NECPluginV2
nuage = neutron.plugins.nuage.plugin:NuagePlugin
metaplugin = neutron.plugins.metaplugin.meta_neutron_plugin:MetaPluginV2
- oneconvergence = neutron.plugins.oneconvergence.plugin.OneConvergencePluginV2
+ oneconvergence = neutron.plugins.oneconvergence.plugin:OneConvergencePluginV2
openvswitch = neutron.plugins.openvswitch.ovs_neutron_plugin:OVSNeutronPluginV2
plumgrid = neutron.plugins.plumgrid.plumgrid_plugin.plumgrid_plugin:NeutronPluginPLUMgridV2
ryu = neutron.plugins.ryu.ryu_neutron_plugin:RyuNeutronPluginV2
diff --git a/test-requirements.txt b/test-requirements.txt
index aa8596daf4..1ff984a4ad 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -3,7 +3,7 @@
# process, which may cause wedges in the gate later.
hacking>=0.9.2,<0.10
-cliff>=1.6.0
+cliff>=1.7.0 # Apache-2.0
coverage>=3.6
discover
fixtures>=0.3.14
@@ -11,8 +11,12 @@ mock>=1.0
python-subunit>=0.0.18
ordereddict
requests-mock>=0.4.0 # Apache-2.0
-sphinx>=1.1.2,!=1.2.0,<1.3
-oslosphinx>=2.2.0.0a2
+sphinx>=1.1.2,!=1.2.0,!=1.3b1,<1.3
+oslosphinx>=2.2.0 # Apache-2.0
testrepository>=0.0.18
testtools>=0.9.34
+testscenarios>=0.4
WebTest>=2.0
+oslotest>=1.1.0 # Apache-2.0
+psycopg2
+MySQL-python
diff --git a/tox.ini b/tox.ini
index 90cc8d766c..d5a1d1386c 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = py26,py27,py33,pep8
+envlist = py26,py27,py33,py34,pep8
minversion = 1.6
skipsdist = True
@@ -64,13 +64,11 @@ commands = python setup.py build_sphinx
# E126 continuation line over-indented for hanging indent
# E128 continuation line under-indented for visual indent
# E129 visually indented line with same indent as next logical line
-# E251 unexpected spaces around keyword / parameter equals
# E265 block comment should start with ‘# ‘
# E713 test for membership should be ‘not in’
# F402 import module shadowed by loop variable
# F811 redefinition of unused variable
# F812 list comprehension redefines name from line
-# H104 file contains nothing but comments
# H237 module is removed in Python 3
# H305 imports not grouped correctly
# H307 like imports should be grouped together
@@ -79,11 +77,18 @@ commands = python setup.py build_sphinx
# H405 multi line docstring summary not separated with an empty line
# H904 Wrap long lines in parentheses instead of a backslash
# TODO(marun) H404 multi line docstring should start with a summary
-ignore = E125,E126,E128,E129,E251,E265,E713,F402,F811,F812,H104,H237,H305,H307,H401,H402,H404,H405,H904
+ignore = E125,E126,E128,E129,E265,E713,F402,F811,F812,H237,H305,H307,H401,H402,H404,H405,H904
show-source = true
builtins = _
exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,tools,.ropeproject,rally-scenarios
+[testenv:pylint]
+deps =
+ {[testenv]deps}
+ pylint
+commands =
+ pylint --rcfile=.pylintrc --output-format=colorized {posargs:neutron}
+
[hacking]
import_exceptions = neutron.openstack.common.gettextutils
local-check-factory = neutron.hacking.checks.factory